**systemd version the issue has been seen with**
> …
-<!-- **NOTE:** Do not submit bug reports about anything but the two most recently released (non-rc) systemd versions upstream! -->
-<!-- See https://github.com/systemd/systemd/releases for the list of most recent releases. -->
+<!-- **NOTE:** Do not submit bug reports about anything but the two most recently released *major* systemd versions upstream! -->
+<!-- If there have been multiple stable releases for that major version, please consider updating to a recent one before reporting an issue. -->
+<!-- When using a distro package, please make sure that the version reported is meaningful for upstream. -->
+<!-- See https://github.com/systemd/systemd-stable/releases for the list of most recent releases. -->
<!-- For older version please use distribution trackers (see https://systemd.io/CONTRIBUTING#filing-issues). -->
**Used distribution**
Michael Buesch <mbuesch@freenet.de>
Michael Hoy <rimmington@gmail.com>
Michael Olbrich <m.olbrich@pengutronix.de>
+Michael Trapp <michael.trapp@sap.com>
Michal Soltys <soltys@ziu.info> <nozo@ziu.info>
Michal Suchanek <msuchanek@suse.de>
Michal Suchanek <msuchanek@suse.de> <hramrach@gmail.com>
Michal Sekletár <msekleta@redhat.com>
Michał Szczepański <skrzatu@hotmail.com> <skrzatu@gmail.com>
Michel Kraus <github@demonsphere.de> <27o@users.noreply.github.com>
+Michele Guerini Rocco <rnhmjoj@inventati.org>
Miklos Vajna <vmiklos@frugalware.org> <vmiklos@gmail.com>
Milan Pässler <me@petabyteboy.de>
Neil Brown <neil@brown.name>
Ronald Tschalär <ronald@innovation.ch>
Jay Burger <jay.burger@fujitsu.com> <root@new-host-3.home>
Yi Gao <ymuemc@163.com>
+Weblate <noreply@weblate.org>
# Drop backported patches from the specfile, but keep the downstream-only ones
# - Patch0000-0499: backported patches from upstream
# - Patch0500-9999: downstream-only patches
- - "sed -ri '/^Patch0[0-4][0-9]{2}+\\:.+\\.patch/d' .packit_rpm/systemd.spec"
- # Build the RPMs with -Werror to catch possible compiler warnings. Since
- # --werror in meson doesn't seem to work with -Db_lto=true [0], let's use
- # -Dc_args= and -Dcpp_args= instead.
- #
- # Exceptions:
- # - use -Wno-deprecated-declarations to get around mallinfo() use in
- # basic/selinux-util.c
- # - don't use -Werror on x86 architectures, otherwise all function checks
- # will fail (with error: cast from pointer to integer of different size)
+ - "sed -ri '/^Patch0[0-4]?[0-9]{0,2}\\:.+\\.patch/d' .packit_rpm/systemd.spec"
+ # Build the RPM with --werror. Even though --werror doesn't work in all
+ # cases (see [0]), we can't use -Dc_args=/-Dcpp_args= here because of the
+ # RPM hardening macros, that use $CFLAGS/$CPPFLAGS (see [1]).
#
# [0] https://github.com/mesonbuild/meson/issues/7360
- - 'sed -i "/^CONFIGURE_OPTS=(/a%ifnarch i386 i686\n-Dc_args=\"-Werror -Wno-deprecated-declarations\" -Dcpp_args=\"-Werror -Wno-deprecated-declarations\"\n%endif" .packit_rpm/systemd.spec'
+ # [1] https://github.com/systemd/systemd/pull/18908#issuecomment-792250110
+ - 'sed -i "/^CONFIGURE_OPTS=(/a--werror" .packit_rpm/systemd.spec'
jobs:
- job: copr_build
file hierarchy of specific services, following the same rules and
constraints.
+ * Support for a new special "root=tmpfs" kernel command-line option has
+ been added. When specified, a tmpfs is mounted on /, and mount.usr=
+ should be used to point to the operating system implementation.
+
* A new configuration file /etc/veritytab may be used to configure
dm-verity integrity protection for block devices. Each line is in the
format "volume-name data-device hash-device roothash options",
unified v2 cgroup hierarchy is used, and "v1" means that legacy v1
hierarchy or the hybrid hierarchy are used.
+ * A new PrivateIPC= setting on a unit file allows executed processes to
+ be moved into a private IPC namespace, with separate System V IPC
+ identifiers and POSIX message queues.
+
+ A new IPCNamespacePath= allows the unit to be joined to an existing
+ IPC namespace.
+
* The tables of system calls in seccomp filters are now automatically
generated from kernel lists exported on
https://fedora.juszkiewicz.com.pl/syscalls.html.
GenericSegmentOffloadMaxSegments= allow capping the packet size and
the number of segments accepted in Generic Segment Offload.
+ * systemd-networkd gained support for the "B.A.T.M.A.N. advanced"
+ wireless routing protocol that operates on ISO/OSI Layer 2 only and
+ uses ethernet frames to route/bridge packets. This encompasses a new
+ "batadv" netdev Type=, a new [BatmanAdvanced] section with a bunch of
+ new settings in .netdev files, and a new BatmanAdvanced= setting in
+ .network files.
+
* systemd.network files gained a [Network] RouteTable= configuration
switch to select the routing policy table.
systemd.network files gained a [DHCPv6PrefixDelegation]
ManageTemporaryAddress= switch.
- .network files gained a new ActivationPolicy= setting which allows
- configuration how the UP state of an interface shall be managed,
+ systemd.network files gained a new ActivationPolicy= setting which
+ allows configuring how the UP state of an interface shall be managed,
i.e. whether the interface is always upped, always downed, or may be
- upped/downed by the user using "ip dev".
+ upped/downed by the user using "ip link set dev".
* The default for the Broadcast= setting in .network files has slightly
changed: the broadcast address will not be configured for wireguard
"tainted", to make it clearer that using the legacy hierarchy is not
recommended.
+ * systemd-localed will now refuse to configure a keymap which is not
+ installed in the file system. This is intended as a bug fix, but
+ could break cases where systemd-localed was used to configure the
+ keymap in advanced of it being installed. It is necessary to install
+ the keymap file first.
+
* The main git development branch has been renamed to 'main'.
* mmcblk[0-9]boot[0-9] devices will no longer be probed automatically
* portablectl gained a new "reattach" verb for detaching/reattaching a
portable service image, useful for updating images on-the-fly.
- Contributions from: Adam Nielsen, Adrian Vovk, AJ Jordan, Alan Perry,
- Alexander Batischev, Ali Abdallah, Andrew Balmos, Anita Zhang, Ansgar
- Burchardt, Antonius Frie, Ardy, Arian van Putten, Ariel Fermani, Arnaud
- T, A S Alam, Bastien Nocera, Benjamin Berg, Benjamin Robin, Björn
- Daase, chri2, Christian Ehrhardt, Christian Hesse, Christopher Obbard,
- clayton craft, corvusnix, cprn, d032747, Daan De Meyer, Daniele Medri,
- Dan Streetman, Darren Ng, David Edmundson, Deepak Rawat, Devon Pringle,
- Dmitry Borodaenko, dropsignal, Einsler Lee, Endre Szabo, Evgeny
- Vereshchagin, Fabian Affolter, Felipe Borges, feliperodriguesfr, Felix
- Stupp, Florian Hülsmann, Florian Klink, Florian Westphal, Franck Bui,
- Frantisek Sumsal, Gablegritule, Gaël PORTAY, Gaurav, Giedrius
- Statkevičius, Greg Depoire--Ferrer, Hans de Goede, heretoenhance, Iago
- López Galeiras, igo95862, Ilya Dmitrichenko, Jameer Pathan, Jan Tojnar,
- Jiehong, Jinyuan Si, John Slade, Jonathan G. Underwood, Jonathan
- McDowell, Josh Triplett, Joshua Watt, Julia Cartwright, Julien Humbert,
- Kairui Song, Karel Zak, Kevin P. Fleming, Khem Raj, Konomi, krissgjeng,
- l4gfcm, Lennart Poettering, Luca Boccassi, Luca BRUNO, Lucas
- Werkmeister, Luka Kudra, Luna Jernberg, Marc-André Lureau, Matthias
- Klumpp, Matt Turner, Michael Marley, Michal Fabik, Michał Kopeć, Michal
- Sekletár, Mike Gilbert, milovlad, moson-mo, Nick, nihilix-melix, Oğuz
- Ersen, Ondrej Mosnacek, pali, Pavel Hrdina, Pavel Sapezhko, Peter
- Hutterer, Pierre Dubouilh, Piotr Drąg, Richard Laager, rnhmjoj,
- RussianNeuroMancer, Sebastiaan van Stijn, Sergey Bugaev, shenyangyang4,
- Simonas Kazlauskas, Stefan Agner, Steve Ramage, Susant Sahani, Sven
- Mueller, Tad Fisher, Takashi Iwai, Thomas Haller, Topi Miettinen,
- Torsten Hilbrich, Tyler Hicks, Ulrich Ölmann, Vinnie Magro, Vito
- Caputo, Vlad, walbit-de, Weblate, Weblate (bot), Whired Planck, wouter
- bolsterlee, Yuri Chornoivan, Yu Watanabe, Zach Smith, Zbigniew
- Jędrzejewski-Szmek, Zmicer Turok, Дамјан Георгиевски
-
- — Warsaw, 2021-02-23
+ * Intel SGX enclave device nodes (which expose a security feature of
+ newer Intel CPUs) will now be owned by a new system group "sgx".
+
+ Contributions from: Adam Nielsen, Adrian Vovk, AJ Jordan, Alan Perry,
+ Alastair Pharo, Alexander Batischev, Ali Abdallah, Andrew Balmos,
+ Anita Zhang, Annika Wickert, Ansgar Burchardt, Antonio Terceiro,
+ Antonius Frie, Ardy, Arian van Putten, Ariel Fermani, Arnaud T,
+ A S Alam, Bastien Nocera, Benjamin Berg, Benjamin Robin, Björn Daase,
+ caoxia, Carlo Wood, Charles Lee, ChopperRob, chri2, Christian Ehrhardt,
+ Christian Hesse, Christopher Obbard, clayton craft, corvusnix, cprn,
+ Daan De Meyer, Daniele Medri, Daniel Rusek, Dan Sanders, Dan Streetman,
+ Darren Ng, David Edmundson, David Tardon, Deepak Rawat, Devon Pringle,
+ Dmitry Borodaenko, dropsignal, Einsler Lee, Endre Szabo,
+ Evgeny Vereshchagin, Fabian Affolter, Fangrui Song, Felipe Borges,
+ feliperodriguesfr, Felix Stupp, Florian Hülsmann, Florian Klink,
+ Florian Westphal, Franck Bui, Frantisek Sumsal, Gablegritule,
+ Gaël PORTAY, Gaurav, Giedrius Statkevičius, Greg Depoire-Ferrer,
+ Gustavo Costa, Hans de Goede, Hela Basa, heretoenhance, hide,
+ Iago López Galeiras, igo95862, Ilya Dmitrichenko, Jameer Pathan,
+ Jan Tojnar, Jiehong, Jinyuan Si, Joerg Behrmann, John Slade,
+ Jonathan G. Underwood, Jonathan McDowell, Josh Triplett, Joshua Watt,
+ Julia Cartwright, Julien Humbert, Kairui Song, Karel Zak,
+ Kevin Backhouse, Kevin P. Fleming, Khem Raj, Konomi, krissgjeng,
+ l4gfcm, Lajos Veres, Lennart Poettering, Lincoln Ramsay, Luca Boccassi,
+ Luca BRUNO, Lucas Werkmeister, Luka Kudra, Luna Jernberg,
+ Marc-André Lureau, Martin Wilck, Matthias Klumpp, Matt Turner,
+ Michael Gisbers, Michael Marley, Michael Trapp, Michal Fabik,
+ Michał Kopeć, Michal Koutný, Michal Sekletár, Michele Guerini Rocco,
+ Mike Gilbert, milovlad, moson-mo, Nick, nihilix-melix, Oğuz Ersen,
+ Ondrej Mosnacek, pali, Pavel Hrdina, Pavel Sapezhko, Perry Yuan,
+ Peter Hutterer, Pierre Dubouilh, Piotr Drąg, Pjotr Vertaalt,
+ Richard Laager, RussianNeuroMancer, Sam Lunt, Sebastiaan van Stijn,
+ Sergey Bugaev, shenyangyang4, simmon, Simonas Kazlauskas,
+ Slimane Selyan Amiri, Stefan Agner, Steve Ramage, Susant Sahani,
+ Sven Mueller, Tad Fisher, Takashi Iwai, Thomas Haller, Tom Shield,
+ Topi Miettinen, Torsten Hilbrich, tpgxyz, Tyler Hicks, ulf-f,
+ Ulrich Ölmann, Vincent Pelletier, Vinnie Magro, Vito Caputo, Vlad,
+ walbit-de, Whired Planck, wouter bolsterlee, Xℹ Ruoyao, Yangyang Shen,
+ Yuri Chornoivan, Yu Watanabe, Zach Smith, Zbigniew Jędrzejewski-Szmek,
+ Zmicer Turok, Дамјан Георгиевски
+
+ — Berlin, 2021-03-30
CHANGES WITH 247:
* userdbctl: "Password OK: yes" is shown even when there are no passwords
or the password is locked.
+* Get rid of nftw(). We should refuse to use such useless APIs on principle.
+
External:
* Fedora: add an rpmlint check that verifies that all unit files in the RPM are listed in %systemd_post macros.
Features:
+* maybe add a tool that displays most recent journal logs as QR code to scan
+ off screen and run it automatically on boot failures, emergency logs and
+ such. Use DRM APIs directly, see
+ https://github.com/dvdhrm/docs/blob/master/drm-howto/modeset.c for an example
+ for doing that.
+
+* pass systemd-detect-virt result to generators as env var. Modifying behaviour
+ based on whether we are virtualized or not is a pretty common thing, hence
+ maybe just pass that info along for free in an env var. We cache the result
+ anyway, so it's basically free.
+
+* systemd-repart: read LUKS encryption key from $CREDENTIALS_PATH
+
+* introduce /dev/disk/root/* symlinks that allow referencing partitions on the
+ disk the rootfs is on in a reasonably secure way.
+
+* systemd-repart: add a switch to factory reset the partition table without
+ immediately applying the new configuration again. i.e. --factory-reset=leave
+ or so. (this is useful to factory reset an image, then putting it into
+ another machine, ensuring that luks key is generated on new machine, not old)
+
+* move logind udev rules to top-level rule.d/ directory
+
+* move multiseat vid/pid matches from logind udev rule to hwdb
+
+* nspawn: default to 1:1 userns
+
+* Provide a reasonably bespoke solution for mounting host $HOME directories
+ into containers:
+ • add new option --mount-user=$USER for mounting $HOME of the user into the
+ container at the same place
+ • check /etc/passwd for UID or user name clashes. If UID clash pick a different
+ UID in container, and map via userns. If user name clash, refuse. If
+ matching user already exists use that.
+ • otherwise: write user record of specified user into /run/host/passwd or so
+ • in nss-systemd pick up user record from there and make available to system
+ With all that in place if nspawn host and container payload are up-to-date
+ enough we have a very simple way to make host users available in containers.
+
+* systemd-sysusers: pick up passwords from credentials logic, so that users can
+ easily set root user pw. enable cred inheriting for root user from PID 1, so
+ that for containers we can configure the root pw automatically via nspawn's
+ --set-credential= switch. (Also do this for systemd-firstboot)
+
* whenever we receive fds via SCM_RIGHTS make sure none got dropped due to the
reception limit the kernel silently enforces.
p[0].current_element == "log_set_max_level_realm" or
p[0].current_element == "unichar_is_valid")
};
-expression x, y;
+expression x;
+constant y;
@@
(
- ((x@p) & (y)) == (y)
"src/basic/linux/*"
# Symlinked to test-bus-vtable-cc.cc, which causes issues with the IN_SET macro
"src/libsystemd/sd-bus/test-bus-vtable.c"
+ "src/libsystemd/sd-journal/lookup3.c"
)
top="$(git rev-parse --show-toplevel)"
@@
+position p : script:python() { p[0].current_element != "test_strjoina" };
expression n, m;
expression list s;
@@
-- n = strjoina(m, s, NULL);
+- n = strjoina@p(m, s, NULL);
+ n = strjoina(m, s);
time you need that please immediately undefine `basename()`, and add a
comment about it, so that no code ever ends up using the POSIX version!
+- Never use `FILENAME_MAX`. Use `PATH_MAX` instead (for checking maximum size
+ of paths) and `NAME_MAX` (for checking maximum size of filenames).
+ `FILENAME_MAX` is not POSIX, and is a confusingly named alias for `PATH_MAX`
+ on Linux. Note the `NAME_MAX` does not include space for a trailing `NUL`,
+ but `PATH_MAX` does. UNIX FTW!
+
## Committing to git
- Commit message subject lines should be prefixed with an appropriate component
* `$SYSTEMD_SYSVRCND_PATH` — Controls where `systemd-sysv-generator` looks for
SysV init script runlevel link farms.
+
+fuzzers:
+
+* `$SYSTEMD_FUZZ_OUTPUT` — A boolean that specifies whether to write output to
+ stdout. Setting to true is useful in manual invocations, since all output is
+ suppressed by default.
+
+* `$SYSTEMD_FUZZ_RUNS` — The number of times execution should be repeated in
+ manual invocations.
+
+Note that is may be also useful to set `$SYSTEMD_LOG_LEVEL`, since all logging
+is suppressed by default.
1. Add all items to NEWS
2. Update the contributors list in NEWS (`meson compile -C build git-contrib`)
3. Update the time and place in NEWS
-4. [RC1] Update version and library numbers in `meson.build`
-5. Check dbus docs with `meson compile -C build update-dbus-docs`
-6. Tag the release: `version=vXXX-rcY && git tag -s "${version}" -m "systemd ${version}"`
-7. Do `meson compile -C build`
-8. Make sure that the version string and package string match: `build/systemctl --version`
-9. Upload the documentation: `meson compile -C build doc-sync`
-10. [FINAL] Close the github milestone and open a new one (https://github.com/systemd/systemd/milestones)
-11. "Draft" a new release on github (https://github.com/systemd/systemd/releases/new), mark "This is a pre-release" if appropriate.
-12. Check that announcement to systemd-devel, with a copy&paste from NEWS, was sent. This should happen automatically.
-13. Update IRC topic (`/msg chanserv TOPIC #systemd Version NNN released`)
-14. [FINAL] Push commits to stable, create an empty -stable branch: `git push systemd-stable origin/master:master origin/master:refs/heads/${version}-stable`, and change the default branch to latest release (https://github.com/systemd/systemd-stable/settings/branches).
+4. Update hwb (`meson compile -C build update-hwdb update-hwdb-autosuspend`)
+5. [RC1] Update version and library numbers in `meson.build`
+6. Check dbus docs with `meson compile -C build update-dbus-docs`
+7. Tag the release: `version=vXXX-rcY && git tag -s "${version}" -m "systemd ${version}"`
+8. Do `meson compile -C build`
+9. Make sure that the version string and package string match: `build/systemctl --version`
+10. Upload the documentation: `meson compile -C build doc-sync`
+11. [FINAL] Close the github milestone and open a new one (https://github.com/systemd/systemd/milestones)
+12. "Draft" a new release on github (https://github.com/systemd/systemd/releases/new), mark "This is a pre-release" if appropriate.
+13. Check that announcement to systemd-devel, with a copy&paste from NEWS, was sent. This should happen automatically.
+14. Update IRC topic (`/msg chanserv TOPIC #systemd Version NNN released`)
+15. [FINAL] Push commits to stable, create an empty -stable branch: `git push systemd-stable origin/master:master origin/master:refs/heads/${version}-stable`, and change the default branch to latest release (https://github.com/systemd/systemd-stable/settings/branches).
✓ ExecStartPre=
✓ ExecStop=
✓ ExecStopPost=
+✓ ExitType=
✓ FileDescriptorStoreMax=
✓ GuessMainPID=
✓ NonBlocking=
(typically 256 on Linux; rationale: this is how POSIX suggests to detect the
limit), `UT_NAMESIZE-1` (typically 31 on Linux; rationale: names longer than
this cannot correctly appear in `utmp`/`wtmp` and create ambiguity with login
-accounting) and `FILENAME_MAX` (4096 on Linux; rationale: user names typically
-appear in directory names, i.e. the home directory), thus MIN(256, 31, 4096) =
+accounting) and `NAME_MAX` (255 on Linux; rationale: user names typically
+appear in directory names, i.e. the home directory), thus MIN(256, 31, 255) =
31.
Note that these rules are both more strict and more relaxed than all of the
<footer class="site-footer">
- <p>© systemd, 2020</p>
+ <p>© systemd, 2021</p>
- <p><a href="https://github.com/systemd/systemd">Website source</a></p>
+ <p><a href="https://github.com/systemd/systemd/tree/main/docs">Website source</a></p>
</footer>
ID_OUI_FROM_DATABASE=Cornet Technology, Inc.
OUI:000324*
- ID_OUI_FROM_DATABASE=SANYO Consumer Electronics Co., Ltd.
+ ID_OUI_FROM_DATABASE=SANYO Techno Solutions Tottori Co., Ltd.
OUI:000325*
ID_OUI_FROM_DATABASE=Arima Computer Corp.
ID_OUI_FROM_DATABASE=Keisoku Giken Co.,Ltd.
OUI:000B3A*
- ID_OUI_FROM_DATABASE=QuStream Corporation
+ ID_OUI_FROM_DATABASE=PESA
OUI:000B3B*
ID_OUI_FROM_DATABASE=devolo AG
ID_OUI_FROM_DATABASE=Sagrad, Inc.
OUI:002289*
- ID_OUI_FROM_DATABASE=Vandelrande APC inc.
+ ID_OUI_FROM_DATABASE=Vanderlande APC inc.
OUI:00228A*
ID_OUI_FROM_DATABASE=Teratronik elektronische systeme gmbh
ID_OUI_FROM_DATABASE=Sony Interactive Entertainment Inc.
OUI:00E5E4*
- ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co., Ltd.
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:00E666*
ID_OUI_FROM_DATABASE=ARIMA Communications Corp.
OUI:00FA3B*
ID_OUI_FROM_DATABASE=CLOOS ELECTRONIC GMBH
+OUI:00FAB6*
+ ID_OUI_FROM_DATABASE=Kontakt Micro-Location Sp z o.o.
+
OUI:00FC58*
ID_OUI_FROM_DATABASE=WebSilicon Ltd.
ID_OUI_FROM_DATABASE=SYSDINE Co., Ltd.
OUI:046B25*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOM CO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:046C59*
ID_OUI_FROM_DATABASE=Intel Corporate
OUI:04714BE*
ID_OUI_FROM_DATABASE=Gimso Mobile Ltd
+OUI:047153*
+ ID_OUI_FROM_DATABASE=SERNET (SUZHOU) TECHNOLOGIES CORPORATION
+
OUI:047295*
ID_OUI_FROM_DATABASE=Apple, Inc.
OUI:04B648*
ID_OUI_FROM_DATABASE=ZENNER
+OUI:04B9E3*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
OUI:04BA1C*
ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
OUI:04EE91*
ID_OUI_FROM_DATABASE=x-fabric GmbH
+OUI:04EEEE*
+ ID_OUI_FROM_DATABASE=Laplace System Co., Ltd.
+
OUI:04F021*
ID_OUI_FROM_DATABASE=Compex Systems Pte Ltd
ID_OUI_FROM_DATABASE=SONOMA SYSTEMS
OUI:08010F*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:08028E*
ID_OUI_FROM_DATABASE=NETGEAR
OUI:0805CD*
ID_OUI_FROM_DATABASE=DongGuang EnMai Electronic Product Co.Ltd.
+OUI:0805E2*
+ ID_OUI_FROM_DATABASE=Juniper Networks
+
OUI:0808C2*
ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
OUI:086A0A*
ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
+OUI:086AC5*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:086BD1*
ID_OUI_FROM_DATABASE=Shenzhen SuperElectron Technology Co.,Ltd.
OUI:08A7C0*
ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
+OUI:08A842*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
OUI:08A8A1*
ID_OUI_FROM_DATABASE=Cyclotronics Power Concepts, Inc
OUI:0C42A1*
ID_OUI_FROM_DATABASE=Mellanox Technologies, Inc.
+OUI:0C4314*
+ ID_OUI_FROM_DATABASE=Silicon Laboratories
+
OUI:0C45BA*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
OUI:0C5F35*
ID_OUI_FROM_DATABASE=Niagara Video Corporation
+OUI:0C6046*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
+
OUI:0C6076*
ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd.
OUI:0C8D98*
ID_OUI_FROM_DATABASE=TOP EIGHT IND CORP
+OUI:0C8DCA*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
OUI:0C8DDB*
ID_OUI_FROM_DATABASE=Cisco Meraki
OUI:0C9838*
ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
+OUI:0C9A3C*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:0C9A42*
ID_OUI_FROM_DATABASE=FN-LINK TECHNOLOGY LIMITED
OUI:0CC9C6*
ID_OUI_FROM_DATABASE=Samwin Hong Kong Limited
+OUI:0CCB0C*
+ ID_OUI_FROM_DATABASE=iSYS RTS GmbH
+
OUI:0CCB85*
ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
OUI:10090C*
ID_OUI_FROM_DATABASE=Janome Sewing Machine Co., Ltd.
+OUI:1009F9*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
+
OUI:100BA9*
ID_OUI_FROM_DATABASE=Intel Corporate
ID_OUI_FROM_DATABASE=Integrated Device Technology (Malaysia) Sdn. Bhd.
OUI:1012B4*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOM CO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:1012FB*
ID_OUI_FROM_DATABASE=Hangzhou Hikvision Digital Technology Co.,Ltd.
OUI:101DC0*
ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:101EDA*
+ ID_OUI_FROM_DATABASE=INGENICO TERMINALS SAS
+
OUI:101F74*
ID_OUI_FROM_DATABASE=Hewlett Packard
OUI:10521C*
ID_OUI_FROM_DATABASE=Espressif Inc.
+OUI:105403*
+ ID_OUI_FROM_DATABASE=INTARSO GmbH
+
OUI:105611*
ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
OUI:106F3F*
ID_OUI_FROM_DATABASE=BUFFALO.INC
+OUI:106FD9*
+ ID_OUI_FROM_DATABASE=CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD.
+
OUI:106FEF*
ID_OUI_FROM_DATABASE=Ad-Sol Nissin Corp
OUI:107BA4*
ID_OUI_FROM_DATABASE=Olive & Dove Co.,Ltd.
+OUI:107BCE*
+ ID_OUI_FROM_DATABASE=Nokia
+
OUI:107BEF*
ID_OUI_FROM_DATABASE=Zyxel Communications Corporation
OUI:10E4AF*
ID_OUI_FROM_DATABASE=APR, LLC
+OUI:10E4C2*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
OUI:10E68F*
ID_OUI_FROM_DATABASE=KWANGSUNG ELECTRONICS KOREA CO.,LTD.
OUI:142233*
ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:14223B*
+ ID_OUI_FROM_DATABASE=Google, Inc.
+
OUI:1422DB*
ID_OUI_FROM_DATABASE=eero inc.
ID_OUI_FROM_DATABASE=JABIL CIRCUIT (SHANGHAI) LTD.
OUI:1469A2*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOM CO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:146A0B*
ID_OUI_FROM_DATABASE=Cypress Electronics Limited
OUI:1488E6*
ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:148919*
+ ID_OUI_FROM_DATABASE=2bps
+
OUI:14893E*
ID_OUI_FROM_DATABASE=VIXTEL TECHNOLOGIES LIMTED
OUI:148A70*
ID_OUI_FROM_DATABASE=ADS GmbH
+OUI:148C4A*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
OUI:148F21*
ID_OUI_FROM_DATABASE=Garmin International
ID_OUI_FROM_DATABASE=SOARNEX
OUI:185207*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:185253*
ID_OUI_FROM_DATABASE=Pixord Corporation
OUI:18742E*
ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
+OUI:1874E21*
+ ID_OUI_FROM_DATABASE=Sartorius Lab Instruments GmbH & Co. KG
+
+OUI:1874E25*
+ ID_OUI_FROM_DATABASE=HANGZHOU ZHOUJU ELECTRONIC TECHNOLOGICAL CO.,LTD
+
+OUI:1874E27*
+ ID_OUI_FROM_DATABASE=Sansec Technology Co.,Ltd
+
+OUI:1874E28*
+ ID_OUI_FROM_DATABASE=Kano Computing Limited
+
+OUI:1874E2C*
+ ID_OUI_FROM_DATABASE=NextGen RF Design, Inc.
+
OUI:187532*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:1878D4*
ID_OUI_FROM_DATABASE=Verizon
OUI:1C3BF3*
ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:1C3CD4*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
OUI:1C3D2F*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
ID_OUI_FROM_DATABASE=IDentytech Solutins Ltd.
OUI:1CFF59*
- ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co., Ltd.
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:20014F*
ID_OUI_FROM_DATABASE=Linea Research Ltd
OUI:201D03*
ID_OUI_FROM_DATABASE=Elatec GmbH
+OUI:201E88*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:201F31*
ID_OUI_FROM_DATABASE=Inteno Broadband Technology AB
+OUI:201F3B*
+ ID_OUI_FROM_DATABASE=Google, Inc.
+
OUI:2021A5*
ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
OUI:203CAE*
ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:203CC0*
+ ID_OUI_FROM_DATABASE=Beijing Tosee Technology Co., Ltd.
+
OUI:203D66*
ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
OUI:20C06D*
ID_OUI_FROM_DATABASE=SHENZHEN SPACETEK TECHNOLOGY CO.,LTD
+OUI:20C19B*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:20C1AF*
ID_OUI_FROM_DATABASE=i Wit Digital Co., Limited
OUI:20CD6E*
ID_OUI_FROM_DATABASE=Realme Chongqing Mobile Telecommunications Corp.,Ltd.
+OUI:20CE2A0*
+ ID_OUI_FROM_DATABASE=Annapurna labs
+
OUI:20CE2A1*
ID_OUI_FROM_DATABASE=Shanghai Digicube Info&Tech Co.,Ltd.
+OUI:20CE2A2*
+ ID_OUI_FROM_DATABASE=Jabil
+
+OUI:20CE2A3*
+ ID_OUI_FROM_DATABASE=Cuculus GmbH
+
+OUI:20CE2A4*
+ ID_OUI_FROM_DATABASE=Annapurna labs
+
+OUI:20CE2A5*
+ ID_OUI_FROM_DATABASE=Zaber Technologies Inc.
+
+OUI:20CE2A6*
+ ID_OUI_FROM_DATABASE=Radarxense BV
+
OUI:20CE2A7*
ID_OUI_FROM_DATABASE=Beijing Huadianzhongxin Tech.Co.,Ltd
+OUI:20CE2A8*
+ ID_OUI_FROM_DATABASE=Intelligraphics
+
+OUI:20CE2A9*
+ ID_OUI_FROM_DATABASE=Rugged Monitoring
+
+OUI:20CE2AA*
+ ID_OUI_FROM_DATABASE=MeshPlusPlus, Inc.
+
+OUI:20CE2AB*
+ ID_OUI_FROM_DATABASE=Swarovski Optik KG
+
+OUI:20CE2AC*
+ ID_OUI_FROM_DATABASE=Ariston Thermo s.p.a.
+
+OUI:20CE2AD*
+ ID_OUI_FROM_DATABASE=LAUDA DR R WOBSER GMBH & CO KG
+
+OUI:20CE2AE*
+ ID_OUI_FROM_DATABASE=Funkwerk Systems GmbH
+
OUI:20CEC4*
ID_OUI_FROM_DATABASE=Peraso Technologies
OUI:20CF30*
ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+OUI:20CFAE*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
OUI:20D160*
ID_OUI_FROM_DATABASE=Private
OUI:20D25F*
ID_OUI_FROM_DATABASE=SmartCap Technologies
+OUI:20D276*
+ ID_OUI_FROM_DATABASE=ITEL MOBILE LIMITED
+
OUI:20D390*
ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
OUI:242642*
ID_OUI_FROM_DATABASE=SHARP Corporation.
+OUI:2428FD*
+ ID_OUI_FROM_DATABASE=Hangzhou Hikvision Digital Technology Co.,Ltd.
+
OUI:2429FE*
ID_OUI_FROM_DATABASE=KYOCERA Corporation
ID_OUI_FROM_DATABASE=Mellanox Technologies, Inc.
OUI:248BE0*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:2491BB*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
OUI:2497ED*
ID_OUI_FROM_DATABASE=Techvision Intelligent Technology Limited
+OUI:249AC8*
+ ID_OUI_FROM_DATABASE=Shenzhen Skyworth Digital Technology CO., Ltd
+
OUI:249AD8*
ID_OUI_FROM_DATABASE=YEALINK(XIAMEN) NETWORK TECHNOLOGY CO.,LTD.
OUI:24A65E*
ID_OUI_FROM_DATABASE=zte corporation
+OUI:24A799*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
OUI:24A7DC*
ID_OUI_FROM_DATABASE=BSkyB Ltd
ID_OUI_FROM_DATABASE=Hangzhou BroadLink Technology Co.,Ltd
OUI:24E124*
- ID_OUI_FROM_DATABASE=Xiamen Ursalink Technology Co., Ltd.
+ ID_OUI_FROM_DATABASE=Xiamen Milesight IoT Co., Ltd.
OUI:24E271*
ID_OUI_FROM_DATABASE=Qingdao Hisense Communications Co.,Ltd.
OUI:280FC5*
ID_OUI_FROM_DATABASE=Beijing Leadsec Technology Co., Ltd.
+OUI:280FEB*
+ ID_OUI_FROM_DATABASE=LG Innotek
+
OUI:28101B*
ID_OUI_FROM_DATABASE=MagnaCom
OUI:2811A5*
ID_OUI_FROM_DATABASE=Bose Corporation
+OUI:2811A8*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:2811EC*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
OUI:2894AF*
ID_OUI_FROM_DATABASE=Samhwa Telecom
+OUI:2897B8*
+ ID_OUI_FROM_DATABASE=myenergi Ltd
+
OUI:28987B*
ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
OUI:28DEF6*
ID_OUI_FROM_DATABASE=bioMerieux Inc.
+OUI:28DFEB*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:28E02C*
ID_OUI_FROM_DATABASE=Apple, Inc.
OUI:28F606*
ID_OUI_FROM_DATABASE=Syes srl
+OUI:28FA19*
+ ID_OUI_FROM_DATABASE=Shenzhen Jingxun Software Telecommunication Technology Co.,Ltd
+
OUI:28FA7A*
ID_OUI_FROM_DATABASE=Zhejiang Tmall Technology Co., Ltd.
OUI:28FAA0*
ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
+OUI:28FBAE*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
OUI:28FBD3*
ID_OUI_FROM_DATABASE=Ragentek Technology Group
OUI:2C4835E*
ID_OUI_FROM_DATABASE=IROOTECH TECHNOLOGY CO.,LTD
+OUI:2C4881*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
+
OUI:2C4A11*
ID_OUI_FROM_DATABASE=Ciena Corporation
ID_OUI_FROM_DATABASE=Regenersis (Glenrothes) Ltd
OUI:2C6373*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:2C641F*
ID_OUI_FROM_DATABASE=Vizio, Inc
OUI:2C6BF5*
ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:2C6DC1*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:2C6E85*
ID_OUI_FROM_DATABASE=Intel Corporate
ID_OUI_FROM_DATABASE=PIN SHANG LED Co., LTD.
OUI:2CD141D*
- ID_OUI_FROM_DATABASE=Private
+ ID_OUI_FROM_DATABASE=Square Inc.
OUI:2CD141E*
ID_OUI_FROM_DATABASE=CITA SMART SOLUTIONS LTD
OUI:2CDDA3*
ID_OUI_FROM_DATABASE=Point Grey Research Inc.
+OUI:2CDDE9*
+ ID_OUI_FROM_DATABASE=Arista Networks
+
OUI:2CE2A8*
ID_OUI_FROM_DATABASE=DeviceDesign
OUI:2CEA7F*
ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:2CEADC*
+ ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP
+
OUI:2CEDEB*
ID_OUI_FROM_DATABASE=Alpheus Digital Company Limited
ID_OUI_FROM_DATABASE=Anacove LLC
OUI:304950D*
- ID_OUI_FROM_DATABASE=Xio Research, Inc
+ ID_OUI_FROM_DATABASE=Merlyn Mind, Inc.
OUI:304950E*
ID_OUI_FROM_DATABASE=IoTmaxx GmbH
OUI:30A023*
ID_OUI_FROM_DATABASE=ROCK PATH S.R.L
+OUI:30A176*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+
OUI:30A1FA*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
OUI:30B237*
ID_OUI_FROM_DATABASE=GD Midea Air-Conditioning Equipment Co.,Ltd.
+OUI:30B346*
+ ID_OUI_FROM_DATABASE=CJSC NORSI-TRANS
+
OUI:30B3A2*
ID_OUI_FROM_DATABASE=Shenzhen Heguang Measurement & Control Technology Co.,Ltd
OUI:34FC6F*
ID_OUI_FROM_DATABASE=ALCEA
+OUI:34FCA1*
+ ID_OUI_FROM_DATABASE=Micronet union Technology(Chengdu)Co., Ltd.
+
OUI:34FCB9*
ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
OUI:3810F0*
ID_OUI_FROM_DATABASE=Aruba, a Hewlett Packard Enterprise Company
+OUI:381428*
+ ID_OUI_FROM_DATABASE=Dell Inc.
+
OUI:38144E*
ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
OUI:38E2DD*
ID_OUI_FROM_DATABASE=zte corporation
+OUI:38E39F*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+
OUI:38E3C5*
ID_OUI_FROM_DATABASE=Taicang T&W Electronics
OUI:3C1915*
ID_OUI_FROM_DATABASE=GFI Chrono Time
+OUI:3C195E*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
OUI:3C197D*
ID_OUI_FROM_DATABASE=Ericsson AB
OUI:3C36E4*
ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:3C3712*
+ ID_OUI_FROM_DATABASE=AVM Audiovisuelles Marketing und Computersysteme GmbH
+
OUI:3C3786*
ID_OUI_FROM_DATABASE=NETGEAR
OUI:405662*
ID_OUI_FROM_DATABASE=GuoTengShengHua Electronics LTD.
+OUI:405899*
+ ID_OUI_FROM_DATABASE=Logitech Far East
+
OUI:405A9B*
ID_OUI_FROM_DATABASE=ANOVO
OUI:40C3C6*
ID_OUI_FROM_DATABASE=SnapRoute
+OUI:40C48C*
+ ID_OUI_FROM_DATABASE=N-iTUS CO.,LTD.
+
OUI:40C4D6*
ID_OUI_FROM_DATABASE=ChongQing Camyu Technology Development Co.,Ltd.
ID_OUI_FROM_DATABASE=Rubezh
OUI:40F420*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:40F4EC*
ID_OUI_FROM_DATABASE=Cisco Systems, Inc
ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
OUI:44356F*
- ID_OUI_FROM_DATABASE=Neterix
+ ID_OUI_FROM_DATABASE=Neterix Ltd
OUI:443583*
ID_OUI_FROM_DATABASE=Apple, Inc.
ID_OUI_FROM_DATABASE=Spawn Labs, Inc
OUI:4456E2*
- ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co., Ltd.
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:445829*
ID_OUI_FROM_DATABASE=Cisco SPVTG
OUI:4459E3*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:445BED*
+ ID_OUI_FROM_DATABASE=Aruba, a Hewlett Packard Enterprise Company
+
OUI:445CE9*
ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
OUI:446747*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:446752*
+ ID_OUI_FROM_DATABASE=Wistron INFOCOMM (Zhongshan) CORPORATION
+
OUI:446755*
ID_OUI_FROM_DATABASE=Orbit Irrigation
ID_OUI_FROM_DATABASE=Douglas Lighting Controls
OUI:44BA46*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:44BB3B*
ID_OUI_FROM_DATABASE=Google, Inc.
OUI:44D9E7*
ID_OUI_FROM_DATABASE=Ubiquiti Networks Inc.
+OUI:44DB60*
+ ID_OUI_FROM_DATABASE=Nanjing Baihezhengliu Technology Co., Ltd
+
OUI:44DC4E*
ID_OUI_FROM_DATABASE=ITEL MOBILE LIMITED
OUI:4805E2*
ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+OUI:48062B*
+ ID_OUI_FROM_DATABASE=Private
+
OUI:48066A*
ID_OUI_FROM_DATABASE=Tempered Networks, Inc.
OUI:48216C*
ID_OUI_FROM_DATABASE=China Mobile IOT Company Limited
+OUI:482218*
+ ID_OUI_FROM_DATABASE=Shenzhen Yipingfang Network Technology Co., Ltd.
+
OUI:482335*
ID_OUI_FROM_DATABASE=Dialog Semiconductor Hellas SA
OUI:489DD1*
ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:489EBD*
+ ID_OUI_FROM_DATABASE=HP Inc.
+
OUI:48A0F8*
ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
OUI:48E6C0*
ID_OUI_FROM_DATABASE=SIMCom Wireless Solutions Co.,Ltd.
+OUI:48E7DA*
+ ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
+
OUI:48E9F1*
ID_OUI_FROM_DATABASE=Apple, Inc.
OUI:48F8E1*
ID_OUI_FROM_DATABASE=Nokia
+OUI:48F8FF*
+ ID_OUI_FROM_DATABASE=CHENGDU KT ELECTRONIC HI-TECH CO.,LTD
+
OUI:48F925*
ID_OUI_FROM_DATABASE=Maestronic
OUI:4C3910*
ID_OUI_FROM_DATABASE=Newtek Electronics co., Ltd.
+OUI:4C3B6C*
+ ID_OUI_FROM_DATABASE=GARO AB
+
OUI:4C3B74*
ID_OUI_FROM_DATABASE=VOGTEC(H.K.) Co., Ltd
OUI:4C710D*
ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:4C7167*
+ ID_OUI_FROM_DATABASE=PoLabs d.o.o.
+
OUI:4C72B9*
ID_OUI_FROM_DATABASE=PEGATRON CORPORATION
OUI:4CD1A1*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:4CD3AF*
+ ID_OUI_FROM_DATABASE=HMD Global Oy
+
+OUI:4CD577*
+ ID_OUI_FROM_DATABASE=CHONGQING FUGUI ELECTRONICS CO.,LTD.
+
OUI:4CD637*
ID_OUI_FROM_DATABASE=Qsono Electronics Co., Ltd
OUI:4CF5A0*
ID_OUI_FROM_DATABASE=Scalable Network Technologies Inc
+OUI:4CF5DC*
+ ID_OUI_FROM_DATABASE=Hangzhou Hikvision Digital Technology Co.,Ltd.
+
OUI:4CF737*
ID_OUI_FROM_DATABASE=SamJi Electronics Co., Ltd
OUI:500959*
ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
+OUI:5009E5*
+ ID_OUI_FROM_DATABASE=Drimsys,Inc
+
OUI:500B32*
ID_OUI_FROM_DATABASE=Foxda Technology Industrial(ShenZhen)Co.,LTD
OUI:5048EB*
ID_OUI_FROM_DATABASE=BEIJING HAIHEJINSHENG NETWORK TECHNOLOGY CO. LTD.
+OUI:5049B0*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
OUI:504A5E*
ID_OUI_FROM_DATABASE=Masimo Corporation
OUI:507043*
ID_OUI_FROM_DATABASE=BSkyB Ltd
+OUI:507097*
+ ID_OUI_FROM_DATABASE=China Mobile Group Device Co.,Ltd.
+
OUI:5070E5*
ID_OUI_FROM_DATABASE=He Shan World Fair Electronics Technology Limited
OUI:508965*
ID_OUI_FROM_DATABASE=SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD.
+OUI:508A06*
+ ID_OUI_FROM_DATABASE=Tuya Smart Inc.
+
OUI:508A0F*
ID_OUI_FROM_DATABASE=SHENZHEN FISE TECHNOLOGY HOLDING CO.,LTD.
OUI:54369B*
ID_OUI_FROM_DATABASE=1Verge Internet Technology (Beijing) Co., Ltd.
+OUI:5437BB*
+ ID_OUI_FROM_DATABASE=Taicang T&W Electronics
+
OUI:543968*
ID_OUI_FROM_DATABASE=Edgewater Networks Inc
OUI:54666C*
ID_OUI_FROM_DATABASE=Shenzhen YOUHUA Technology Co., Ltd
+OUI:5466F9*
+ ID_OUI_FROM_DATABASE=ConMet
+
OUI:546751*
ID_OUI_FROM_DATABASE=Compal Broadband Networks, Inc.
OUI:54AED0*
ID_OUI_FROM_DATABASE=DASAN Networks, Inc.
+OUI:54AED2*
+ ID_OUI_FROM_DATABASE=CSL Dualcom Ltd
+
OUI:54B121*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
OUI:54BF64*
ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:54C250*
+ ID_OUI_FROM_DATABASE=Iskratel d.o.o.
+
OUI:54C33E*
ID_OUI_FROM_DATABASE=Ciena Corporation
OUI:54D163*
ID_OUI_FROM_DATABASE=MAX-TECH,INC
+OUI:54D17D*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
OUI:54D1B0*
ID_OUI_FROM_DATABASE=Universal Laser Systems, Inc
ID_OUI_FROM_DATABASE=Juniper Networks
OUI:54E061*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:54E140*
ID_OUI_FROM_DATABASE=INGENICO
OUI:581243*
ID_OUI_FROM_DATABASE=AcSiP Technology Corp.
+OUI:5813D3*
+ ID_OUI_FROM_DATABASE=Gemtek Technology Co., Ltd.
+
OUI:581626*
ID_OUI_FROM_DATABASE=Avaya Inc
OUI:582F42*
ID_OUI_FROM_DATABASE=Universal Electric Corporation
+OUI:582FF7*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+
OUI:583112*
ID_OUI_FROM_DATABASE=DRUST
OUI:584CEE*
ID_OUI_FROM_DATABASE=Digital One Technologies, Limited
+OUI:584D42*
+ ID_OUI_FROM_DATABASE=Dragos, Inc.
+
OUI:585076*
ID_OUI_FROM_DATABASE=Linear Equipamentos Eletronicos SA
OUI:589043*
ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:589153*
+ ID_OUI_FROM_DATABASE=China Mobile IOT Company Limited
+
OUI:5891CF*
ID_OUI_FROM_DATABASE=Intel Corporate
OUI:58D67A*
ID_OUI_FROM_DATABASE=TCPlink
+OUI:58D697*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
+
OUI:58D6D3*
ID_OUI_FROM_DATABASE=Dairy Cheq Inc
OUI:58FD20*
ID_OUI_FROM_DATABASE=Systemhouse Solutions AB
+OUI:58FD5D*
+ ID_OUI_FROM_DATABASE=Hangzhou Xinyun technology Co., Ltd.
+
OUI:58FDB1*
ID_OUI_FROM_DATABASE=LG Electronics
ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
OUI:5C4A1F*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:5C4A26*
ID_OUI_FROM_DATABASE=Enguity Technology Corp
ID_OUI_FROM_DATABASE=FUJITSU LIMITED
OUI:5CA176*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:5CA178*
ID_OUI_FROM_DATABASE=TableTop Media (dba Ziosk)
OUI:5CA62D*
ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:5CA721*
+ ID_OUI_FROM_DATABASE=New H3C Technologies Co., Ltd
+
OUI:5CA86A*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
OUI:5CC7D7*
ID_OUI_FROM_DATABASE=AZROAD TECHNOLOGY COMPANY LIMITED
+OUI:5CC8E3*
+ ID_OUI_FROM_DATABASE=Shintec Hozumi co.ltd.
+
OUI:5CC999*
ID_OUI_FROM_DATABASE=New H3C Technologies Co., Ltd
OUI:5CE3B6*
ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:5CE42A*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:5CE50C*
ID_OUI_FROM_DATABASE=Beijing Xiaomi Mobile Software Co., Ltd
OUI:6024C1*
ID_OUI_FROM_DATABASE=Jiangsu Zhongxun Electronic Technology Co., Ltd
+OUI:6026EF*
+ ID_OUI_FROM_DATABASE=Aruba, a Hewlett Packard Enterprise Company
+
OUI:60271C*
ID_OUI_FROM_DATABASE=VIDEOR E. Hartig GmbH
OUI:603A7C*
ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:603AAF*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
OUI:603CEE*
ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
OUI:6089B7*
ID_OUI_FROM_DATABASE=KAEL MÜHENDİSLİK ELEKTRONİK TİCARET SANAYİ LİMİTED ŞİRKETİ
+OUI:608A10*
+ ID_OUI_FROM_DATABASE=Microchip Technology Inc.
+
OUI:608B0E*
ID_OUI_FROM_DATABASE=Apple, Inc.
OUI:609B2D*
ID_OUI_FROM_DATABASE=JMACS Japan Co., Ltd.
+OUI:609BB4*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
OUI:609BC8*
ID_OUI_FROM_DATABASE=Hipad Intelligent Technology Co., Ltd.
OUI:60A4D0*
ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+OUI:60A5E2*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:60A730*
ID_OUI_FROM_DATABASE=Shenzhen Yipinfang Internet Technology Co.,Ltd
OUI:60B617*
ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:60B6E1*
+ ID_OUI_FROM_DATABASE=Texas Instruments
+
OUI:60B76E*
ID_OUI_FROM_DATABASE=Google, Inc.
OUI:60DA83*
ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
+OUI:60DB15*
+ ID_OUI_FROM_DATABASE=New H3C Technologies Co., Ltd
+
OUI:60DB2A*
ID_OUI_FROM_DATABASE=HNS
OUI:60E6BC*
ID_OUI_FROM_DATABASE=Sino-Telecom Technology Co.,Ltd.
+OUI:60E6F0*
+ ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
+
OUI:60E701*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
OUI:60F81D*
ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:60F8F2*
+ ID_OUI_FROM_DATABASE=Synaptec
+
OUI:60FA9D*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
ID_OUI_FROM_DATABASE=e-CON SYSTEMS INDIA PVT LTD
OUI:643AB1*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:643AEA*
ID_OUI_FROM_DATABASE=Cisco Systems, Inc
ID_OUI_FROM_DATABASE=Intel Corporate
OUI:645D92*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:645DD7*
ID_OUI_FROM_DATABASE=Shenzhen Lifesense Medical Electronics Co., Ltd.
OUI:64B370*
ID_OUI_FROM_DATABASE=PowerComm Solutions LLC
+OUI:64B379*
+ ID_OUI_FROM_DATABASE=Private
+
OUI:64B473*
ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
ID_OUI_FROM_DATABASE=Texas Instruments
OUI:64D02D*
- ID_OUI_FROM_DATABASE=Next Generation Integration (NGI)
+ ID_OUI_FROM_DATABASE=NEXT GENERATION INTEGRATION LIMITED (NGI)
OUI:64D154*
ID_OUI_FROM_DATABASE=Routerboard.com
ID_OUI_FROM_DATABASE=Nihon Dengyo Kousaku
OUI:68262A*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:682719*
ID_OUI_FROM_DATABASE=Microchip Technology Inc.
OUI:683A1E*
ID_OUI_FROM_DATABASE=Cisco Meraki
+OUI:683A48*
+ ID_OUI_FROM_DATABASE=SAMJIN Co., Ltd.
+
OUI:683B1E*
ID_OUI_FROM_DATABASE=Countwise LTD
OUI:68DD26*
ID_OUI_FROM_DATABASE=Shanghai Focus Vision Security Technology Co.,Ltd
+OUI:68DDD9*
+ ID_OUI_FROM_DATABASE=HMD Global Oy
+
OUI:68DFDD*
ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
OUI:68EC62*
ID_OUI_FROM_DATABASE=YODO Technology Corp. Ltd.
+OUI:68EC8A*
+ ID_OUI_FROM_DATABASE=Private
+
OUI:68ECC5*
ID_OUI_FROM_DATABASE=Intel Corporate
OUI:6C0F6A*
ID_OUI_FROM_DATABASE=JDC Tech Co., Ltd.
+OUI:6C108B*
+ ID_OUI_FROM_DATABASE=WeLink Communications
+
OUI:6C13D5*
ID_OUI_FROM_DATABASE=Cisco Systems, Inc
OUI:6C42AB*
ID_OUI_FROM_DATABASE=Subscriber Networks, Inc.
+OUI:6C433C*
+ ID_OUI_FROM_DATABASE=TECNO MOBILE LIMITED
+
OUI:6C4418*
ID_OUI_FROM_DATABASE=Zappware
OUI:6C5A34*
ID_OUI_FROM_DATABASE=Shenzhen Haitianxiong Electronic Co., Ltd.
+OUI:6C5AB0*
+ ID_OUI_FROM_DATABASE=TP-Link Corporation Limited
+
OUI:6C5AB5*
ID_OUI_FROM_DATABASE=TCL Technoly Electronics (Huizhou) Co., Ltd.
OUI:6C7660*
ID_OUI_FROM_DATABASE=KYOCERA CORPORATION
+OUI:6C79B8*
+ ID_OUI_FROM_DATABASE=Texas Instruments
+
OUI:6C81FE*
ID_OUI_FROM_DATABASE=Mitsuba Corporation
OUI:6C9354*
ID_OUI_FROM_DATABASE=Yaojin Technology (Shenzhen) Co., LTD.
+OUI:6C9466*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:6C94F8*
ID_OUI_FROM_DATABASE=Apple, Inc.
OUI:7093F8*
ID_OUI_FROM_DATABASE=Space Monkey, Inc.
+OUI:709741*
+ ID_OUI_FROM_DATABASE=Arcadyan Corporation
+
OUI:709756*
ID_OUI_FROM_DATABASE=Happyelectronics Co.,Ltd
OUI:70A66A*
ID_OUI_FROM_DATABASE=Prox Dynamics AS
+OUI:70A6CC*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:70A84C*
ID_OUI_FROM_DATABASE=MONAD., Inc.
ID_OUI_FROM_DATABASE=HKW-Elektronik GmbH
OUI:70B3D5036*
- ID_OUI_FROM_DATABASE=PARAGON ID
+ ID_OUI_FROM_DATABASE=Vema Venturi AB
OUI:70B3D5037*
ID_OUI_FROM_DATABASE=EIFFAGE ENERGIE ELECTRONIQUE
OUI:70B3D5075*
ID_OUI_FROM_DATABASE=Mo-Sys Engineering Ltd
+OUI:70B3D5076*
+ ID_OUI_FROM_DATABASE=Private Enterprise Scientific and Production Private EnterpriseSparing-Vist Center
+
OUI:70B3D5077*
ID_OUI_FROM_DATABASE=InAccess Networks SA
OUI:70B3D50E1*
ID_OUI_FROM_DATABASE=MiWave Consulting, LLC
+OUI:70B3D50E2*
+ ID_OUI_FROM_DATABASE=JESE Ltd
+
OUI:70B3D50E3*
ID_OUI_FROM_DATABASE=SinTau SrL
OUI:70B3D511D*
ID_OUI_FROM_DATABASE=Dakton Microlabs LLC
+OUI:70B3D511E*
+ ID_OUI_FROM_DATABASE=KBPR LLC
+
OUI:70B3D511F*
ID_OUI_FROM_DATABASE=Geppetto Electronics
OUI:70B3D5136*
ID_OUI_FROM_DATABASE=Miguel Corporate Services Pte Ltd
+OUI:70B3D5137*
+ ID_OUI_FROM_DATABASE=Subject Link Inc
+
OUI:70B3D5138*
ID_OUI_FROM_DATABASE=SMITEC S.p.A.
OUI:70B3D5197*
ID_OUI_FROM_DATABASE=Lattech Systems Pty Ltd
+OUI:70B3D5198*
+ ID_OUI_FROM_DATABASE=Beijing Muniulinghang Technology Co., Ltd
+
OUI:70B3D5199*
ID_OUI_FROM_DATABASE=Smart Controls LLC
OUI:70B3D51BB*
ID_OUI_FROM_DATABASE=EFENTO T P SZYDŁOWSKI K ZARĘBA SPÓŁKA JAWNA
+OUI:70B3D51BC*
+ ID_OUI_FROM_DATABASE=Flextronics International Kft
+
OUI:70B3D51BD*
ID_OUI_FROM_DATABASE=Shenzhen Siera Technology Ltd
OUI:70B3D51EB*
ID_OUI_FROM_DATABASE=Xavant
+OUI:70B3D51ED*
+ ID_OUI_FROM_DATABASE=SUS Corporation
+
OUI:70B3D51EE*
ID_OUI_FROM_DATABASE=MEGGITT
OUI:70B3D51F5*
ID_OUI_FROM_DATABASE=Martec S.p.A.
+OUI:70B3D51F6*
+ ID_OUI_FROM_DATABASE=LinkAV Technology Co., Ltd
+
OUI:70B3D51F7*
ID_OUI_FROM_DATABASE=Morgan Schaffer Inc.
OUI:70B3D51FA*
ID_OUI_FROM_DATABASE=EBZ SysTec GmbH
+OUI:70B3D51FB*
+ ID_OUI_FROM_DATABASE=Crane-elec. Co., LTD.
+
OUI:70B3D51FC*
ID_OUI_FROM_DATABASE=Guan Show Technologe Co., Ltd.
OUI:70B3D520A*
ID_OUI_FROM_DATABASE=Golden Grid Systems
+OUI:70B3D520B*
+ ID_OUI_FROM_DATABASE=KST technology
+
OUI:70B3D520C*
ID_OUI_FROM_DATABASE=Siemens Healthcare Diagnostics
OUI:70B3D5222*
ID_OUI_FROM_DATABASE=Marioff Corporation Oy
+OUI:70B3D5223*
+ ID_OUI_FROM_DATABASE=Research Laboratory of Design Automation, Ltd.
+
OUI:70B3D5224*
ID_OUI_FROM_DATABASE=Urbana Smart Solutions Pte Ltd
OUI:70B3D5270*
ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
+OUI:70B3D5271*
+ ID_OUI_FROM_DATABASE=Code Blue Corporation
+
OUI:70B3D5272*
ID_OUI_FROM_DATABASE=TELECOM SANTE
OUI:70B3D5297*
ID_OUI_FROM_DATABASE=Grossenbacher Systeme AG
+OUI:70B3D5298*
+ ID_OUI_FROM_DATABASE=Reflexion Medical
+
OUI:70B3D5299*
ID_OUI_FROM_DATABASE=KMtronic ltd
OUI:70B3D52B5*
ID_OUI_FROM_DATABASE=Dosepack India LLP
+OUI:70B3D52B6*
+ ID_OUI_FROM_DATABASE=HLT Micro
+
OUI:70B3D52B7*
ID_OUI_FROM_DATABASE=Matrix Orbital Corporation
OUI:70B3D52C5*
ID_OUI_FROM_DATABASE=MECT SRL
+OUI:70B3D52C6*
+ ID_OUI_FROM_DATABASE=AM General Contractor
+
OUI:70B3D52C7*
ID_OUI_FROM_DATABASE=Worldsensing
OUI:70B3D5314*
ID_OUI_FROM_DATABASE=Grau Elektronik GmbH
+OUI:70B3D5315*
+ ID_OUI_FROM_DATABASE=Private
+
OUI:70B3D5316*
ID_OUI_FROM_DATABASE=Austco Marketing & Service (USA) ltd.
OUI:70B3D5317*
ID_OUI_FROM_DATABASE=Iotopia Solutions
+OUI:70B3D5318*
+ ID_OUI_FROM_DATABASE=Exemplar Medical, LLC
+
OUI:70B3D5319*
ID_OUI_FROM_DATABASE=ISO/TC 22/SC 31
OUI:70B3D5332*
ID_OUI_FROM_DATABASE=InnoSenT
+OUI:70B3D5333*
+ ID_OUI_FROM_DATABASE=Orlaco Products B.V.
+
OUI:70B3D5334*
ID_OUI_FROM_DATABASE=Dokuen Co. Ltd.
OUI:70B3D5339*
ID_OUI_FROM_DATABASE=Sierra Nevada Corporation
+OUI:70B3D533A*
+ ID_OUI_FROM_DATABASE=AudioTEC LLC
+
OUI:70B3D533B*
ID_OUI_FROM_DATABASE=Seal Shield, LLC
OUI:70B3D538D*
ID_OUI_FROM_DATABASE=IMP-TELEKOMUNIKACIJE DOO
+OUI:70B3D538E*
+ ID_OUI_FROM_DATABASE=China Telecom Fufu Information Technology CO.,LTD
+
OUI:70B3D538F*
ID_OUI_FROM_DATABASE=Sorynorydotcom Inc
OUI:70B3D53B5*
ID_OUI_FROM_DATABASE=Preston Industries dba PolyScience
+OUI:70B3D53B6*
+ ID_OUI_FROM_DATABASE=MedRx, Inc
+
OUI:70B3D53B7*
ID_OUI_FROM_DATABASE=Paul Scherrer Institut (PSI)
OUI:70B3D5410*
ID_OUI_FROM_DATABASE=Avant Technologies, Inc
+OUI:70B3D5411*
+ ID_OUI_FROM_DATABASE=Mi-Fi Networks Pvt Ltd
+
OUI:70B3D5412*
ID_OUI_FROM_DATABASE=TATTILE SRL
OUI:70B3D544F*
ID_OUI_FROM_DATABASE=Velvac Incorporated
+OUI:70B3D5451*
+ ID_OUI_FROM_DATABASE=Perform3-D LLC
+
OUI:70B3D5452*
ID_OUI_FROM_DATABASE=ITALIANA PONTI RADIO SRL
OUI:70B3D54CA*
ID_OUI_FROM_DATABASE=PCB Piezotronics
+OUI:70B3D54CB*
+ ID_OUI_FROM_DATABASE=Cucos Retail Systems GmbH
+
OUI:70B3D54CC*
ID_OUI_FROM_DATABASE=FRESENIUS MEDICAL CARE
OUI:70B3D54CF*
ID_OUI_FROM_DATABASE=GREEN HOUSE CO., LTD.
+OUI:70B3D54D0*
+ ID_OUI_FROM_DATABASE=Codewerk GmbH
+
OUI:70B3D54D1*
ID_OUI_FROM_DATABASE=Contraves Advanced Devices Sdn. Bhd.
OUI:70B3D54E5*
ID_OUI_FROM_DATABASE=viZaar industrial imaging AG
+OUI:70B3D54E6*
+ ID_OUI_FROM_DATABASE=Santa Barbara Imaging Systems
+
OUI:70B3D54E7*
ID_OUI_FROM_DATABASE=Digital Domain
OUI:70B3D54EC*
ID_OUI_FROM_DATABASE=Hangzhou Youshi Industry Co., Ltd.
+OUI:70B3D54ED*
+ ID_OUI_FROM_DATABASE=Panoramic Power
+
OUI:70B3D54EE*
ID_OUI_FROM_DATABASE=NOA Co., Ltd.
OUI:70B3D55B2*
ID_OUI_FROM_DATABASE=Peter Huber Kaeltemaschinenbau AG
+OUI:70B3D55B3*
+ ID_OUI_FROM_DATABASE=STENTORIUS by ADI
+
OUI:70B3D55B4*
ID_OUI_FROM_DATABASE=Systems Technologies
OUI:70B3D55CD*
ID_OUI_FROM_DATABASE=MVT Video Technologies R + H Maedler GbR
+OUI:70B3D55CE*
+ ID_OUI_FROM_DATABASE=IP Devices
+
OUI:70B3D55CF*
ID_OUI_FROM_DATABASE=PROEL TSI s.r.l.
OUI:70B3D5684*
ID_OUI_FROM_DATABASE=LECO Corporation
+OUI:70B3D5685*
+ ID_OUI_FROM_DATABASE=LDA Audiotech
+
OUI:70B3D5686*
ID_OUI_FROM_DATABASE=Access Protocol Pty Ltd
OUI:70B3D5697*
ID_OUI_FROM_DATABASE=Alazar Technologies Inc.
+OUI:70B3D5698*
+ ID_OUI_FROM_DATABASE=ZIEHL-ABEGG SE
+
OUI:70B3D5699*
ID_OUI_FROM_DATABASE=Flextronics International Kft
ID_OUI_FROM_DATABASE=Altaneos
OUI:70B3D569B*
- ID_OUI_FROM_DATABASE=Horizon Co., Ltd
+ ID_OUI_FROM_DATABASE=HORIZON.INC
OUI:70B3D569C*
ID_OUI_FROM_DATABASE=Keepen
OUI:70B3D571E*
ID_OUI_FROM_DATABASE=Motec Pty Ltd
+OUI:70B3D571F*
+ ID_OUI_FROM_DATABASE=Grayshift
+
OUI:70B3D5720*
ID_OUI_FROM_DATABASE=Jeio Tech
ID_OUI_FROM_DATABASE=Swiss Audio
OUI:70B3D5736*
- ID_OUI_FROM_DATABASE=Jabil, Inc.
+ ID_OUI_FROM_DATABASE=Jabil
OUI:70B3D5737*
ID_OUI_FROM_DATABASE=SD Biosensor
OUI:70B3D57E5*
ID_OUI_FROM_DATABASE=Megaflex Oy
+OUI:70B3D57E6*
+ ID_OUI_FROM_DATABASE=11811347 CANADA Inc.
+
OUI:70B3D57E7*
ID_OUI_FROM_DATABASE=Atessa, Inc.
OUI:70B3D581E*
ID_OUI_FROM_DATABASE=Novathings
+OUI:70B3D581F*
+ ID_OUI_FROM_DATABASE=CAR-connect GmbH
+
OUI:70B3D5820*
ID_OUI_FROM_DATABASE=Becker Nachrichtentechnik GmbH
OUI:70B3D58D5*
ID_OUI_FROM_DATABASE=Guangzhou Wanglu
+OUI:70B3D58D6*
+ ID_OUI_FROM_DATABASE=Beijing Xiansheng Technology Co., Ltd
+
OUI:70B3D58D7*
ID_OUI_FROM_DATABASE=Schneider Electric Motion USA
OUI:70B3D5964*
ID_OUI_FROM_DATABASE=Visility
+OUI:70B3D5965*
+ ID_OUI_FROM_DATABASE=LINEAGE POWER PVT LTD.,
+
OUI:70B3D5966*
ID_OUI_FROM_DATABASE=dA Tomato Limited
OUI:70B3D5969*
ID_OUI_FROM_DATABASE=Emtel System Sp. z o.o.
+OUI:70B3D596A*
+ ID_OUI_FROM_DATABASE=Anello Photonics
+
OUI:70B3D596B*
ID_OUI_FROM_DATABASE=FOCAL-JMLab
OUI:70B3D59D7*
ID_OUI_FROM_DATABASE=KM OptoElektronik GmbH
+OUI:70B3D59D8*
+ ID_OUI_FROM_DATABASE=JOLANYEE Technology Co., Ltd.
+
OUI:70B3D59D9*
ID_OUI_FROM_DATABASE=ATX Networks Corp
OUI:70B3D5A0B*
ID_OUI_FROM_DATABASE=ambiHome GmbH
+OUI:70B3D5A0C*
+ ID_OUI_FROM_DATABASE=Lumiplan Duhamel
+
OUI:70B3D5A0D*
ID_OUI_FROM_DATABASE=Globalcom Engineering SPA
OUI:70B3D5A13*
ID_OUI_FROM_DATABASE=Uplevel Systems Inc
+OUI:70B3D5A14*
+ ID_OUI_FROM_DATABASE=aelettronica group srl
+
OUI:70B3D5A15*
ID_OUI_FROM_DATABASE=Intercore GmbH
OUI:70B3D5A62*
ID_OUI_FROM_DATABASE=Environexus
+OUI:70B3D5A63*
+ ID_OUI_FROM_DATABASE=DesignA Electronics Limited
+
OUI:70B3D5A64*
ID_OUI_FROM_DATABASE=Newshine
OUI:70B3D5A8E*
ID_OUI_FROM_DATABASE=OMESH CITY GROUP
+OUI:70B3D5A8F*
+ ID_OUI_FROM_DATABASE=VK Integrated Systems
+
OUI:70B3D5A90*
ID_OUI_FROM_DATABASE=ERA a.s.
OUI:70B3D5ACD*
ID_OUI_FROM_DATABASE=CRDE
+OUI:70B3D5ACE*
+ ID_OUI_FROM_DATABASE=FARHO DOMOTICA SL
+
OUI:70B3D5ACF*
ID_OUI_FROM_DATABASE=APG Cash Drawer, LLC
OUI:70B3D5AFC*
ID_OUI_FROM_DATABASE=BAE Systems
+OUI:70B3D5AFD*
+ ID_OUI_FROM_DATABASE=dongsheng
+
OUI:70B3D5AFE*
ID_OUI_FROM_DATABASE=MESOTECHNIC
OUI:70B3D5B9F*
ID_OUI_FROM_DATABASE=Yuksek Kapasite Radyolink Sistemleri San. ve Tic. A.S.
+OUI:70B3D5BA0*
+ ID_OUI_FROM_DATABASE=Season Electronics Ltd
+
OUI:70B3D5BA1*
ID_OUI_FROM_DATABASE=Cathwell AS
OUI:70B3D5BF6*
ID_OUI_FROM_DATABASE=comtac AG
+OUI:70B3D5BF7*
+ ID_OUI_FROM_DATABASE=Fischer Connectors
+
OUI:70B3D5BF8*
ID_OUI_FROM_DATABASE=RCH ITALIA SPA
OUI:70B3D5C18*
ID_OUI_FROM_DATABASE=Sanmina Israel
+OUI:70B3D5C19*
+ ID_OUI_FROM_DATABASE=Zumbach Electronic AG
+
OUI:70B3D5C1A*
ID_OUI_FROM_DATABASE=Xylon
OUI:70B3D5C70*
ID_OUI_FROM_DATABASE=Magnetek
+OUI:70B3D5C71*
+ ID_OUI_FROM_DATABASE=The Engineerix Group
+
OUI:70B3D5C72*
ID_OUI_FROM_DATABASE=Scharco Elektronik GmbH
OUI:70B3D5CE5*
ID_OUI_FROM_DATABASE=GridBridge Inc
+OUI:70B3D5CE6*
+ ID_OUI_FROM_DATABASE=Dynim Oy
+
OUI:70B3D5CE7*
ID_OUI_FROM_DATABASE=June Automation Singapore Pte. Ltd.
OUI:70B3D5D12*
ID_OUI_FROM_DATABASE=FIDELTRONIK POLAND SP. Z O.O.
+OUI:70B3D5D13*
+ ID_OUI_FROM_DATABASE=IRT Technologies
+
OUI:70B3D5D14*
ID_OUI_FROM_DATABASE=LIGPT
OUI:70B3D5D5C*
ID_OUI_FROM_DATABASE=Critical Link LLC
+OUI:70B3D5D5D*
+ ID_OUI_FROM_DATABASE=SEASONS 4 INC
+
OUI:70B3D5D5E*
ID_OUI_FROM_DATABASE=Barcelona Smart Technologies
OUI:70B3D5DCF*
ID_OUI_FROM_DATABASE=KLS Netherlands B.V.
+OUI:70B3D5DD0*
+ ID_OUI_FROM_DATABASE=Deep Secure Limited
+
OUI:70B3D5DD1*
ID_OUI_FROM_DATABASE=em-tec GmbH
ID_OUI_FROM_DATABASE=Tiab Limited
OUI:70B3D5DF7*
- ID_OUI_FROM_DATABASE=Refecor Oy
+ ID_OUI_FROM_DATABASE=ScopeSensor Oy
OUI:70B3D5DF8*
ID_OUI_FROM_DATABASE=RMA Mess- und Regeltechnik GmbH & Co.KG
OUI:70B3D5E02*
ID_OUI_FROM_DATABASE=YEHL & JORDAN LLC
+OUI:70B3D5E03*
+ ID_OUI_FROM_DATABASE=MBJ
+
OUI:70B3D5E04*
ID_OUI_FROM_DATABASE=Combilent
+OUI:70B3D5E05*
+ ID_OUI_FROM_DATABASE=Lobaro GmbH
+
OUI:70B3D5E06*
ID_OUI_FROM_DATABASE=System West dba ICS Electronics
OUI:70B3D5E0D*
ID_OUI_FROM_DATABASE=Sigma Connectivity AB
+OUI:70B3D5E0E*
+ ID_OUI_FROM_DATABASE=VulcanForms
+
OUI:70B3D5E0F*
ID_OUI_FROM_DATABASE=Vtron Pty Ltd
OUI:70B3D5E5E*
ID_OUI_FROM_DATABASE=Critical Link LLC
+OUI:70B3D5E5F*
+ ID_OUI_FROM_DATABASE=CesiumAstro Inc.
+
OUI:70B3D5E60*
ID_OUI_FROM_DATABASE=Davitor AB
OUI:70B3D5EA9*
ID_OUI_FROM_DATABASE=Zhuhai Lonl electric Co.,Ltd.
+OUI:70B3D5EAA*
+ ID_OUI_FROM_DATABASE=Druck Ltd.
+
OUI:70B3D5EAB*
ID_OUI_FROM_DATABASE=APEN GROUP SpA (VAT IT08767740155)
OUI:70B3D5EBF*
ID_OUI_FROM_DATABASE=AUTOMATICA Y REGULACION S.A.
+OUI:70B3D5EC0*
+ ID_OUI_FROM_DATABASE=ProtoConvert Pty Ltd
+
OUI:70B3D5EC1*
ID_OUI_FROM_DATABASE=Xafax Nederland bv
OUI:70B3D5ED5*
ID_OUI_FROM_DATABASE=hangzhou battle link technology Co.,Ltd
+OUI:70B3D5ED6*
+ ID_OUI_FROM_DATABASE=Metrasens Limited
+
OUI:70B3D5ED7*
ID_OUI_FROM_DATABASE=WAVE
OUI:70B3D5F3F*
ID_OUI_FROM_DATABASE=comtac AG
+OUI:70B3D5F40*
+ ID_OUI_FROM_DATABASE=HORIZON.INC
+
OUI:70B3D5F41*
ID_OUI_FROM_DATABASE=DUEVI SRL
OUI:70B3D5F73*
ID_OUI_FROM_DATABASE=ASL Holdings
+OUI:70B3D5F74*
+ ID_OUI_FROM_DATABASE=TESSA AGRITECH SRL
+
OUI:70B3D5F75*
ID_OUI_FROM_DATABASE=Enlaps
OUI:70B921*
ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+OUI:70B950*
+ ID_OUI_FROM_DATABASE=Texas Instruments
+
OUI:70BAEF*
ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
OUI:745C9F*
ID_OUI_FROM_DATABASE=TCT mobile ltd
+OUI:745D68*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+
OUI:745E1C*
ID_OUI_FROM_DATABASE=PIONEER CORPORATION
OUI:74CE56*
ID_OUI_FROM_DATABASE=Packet Force Technology Limited Company
+OUI:74CF00*
+ ID_OUI_FROM_DATABASE=Shenzhen SuperElectron Technology Co.,Ltd.
+
OUI:74D02B*
ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
OUI:74E1B6*
ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:74E20C*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
+
OUI:74E277*
ID_OUI_FROM_DATABASE=Vizmonet Pte Ltd
ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
OUI:7847E3*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOM CO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:784859*
ID_OUI_FROM_DATABASE=Hewlett Packard
OUI:7885F4*
ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+OUI:7886B6*
+ ID_OUI_FROM_DATABASE=Shenzhen YOUHUA Technology Co., Ltd
+
OUI:78870D*
ID_OUI_FROM_DATABASE=Unifiedgateways India Private Limited
ID_OUI_FROM_DATABASE=INTER SALES A/S
OUI:78B84B*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:78B8D6*
ID_OUI_FROM_DATABASE=Zebra Technologies Inc.
OUI:78BAF9*
ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:78BB88*
+ ID_OUI_FROM_DATABASE=Maxio Technology (Hangzhou) Ltd.
+
OUI:78BC1A*
ID_OUI_FROM_DATABASE=Cisco Systems, Inc
ID_OUI_FROM_DATABASE=ShenZhen TuLing Robot CO.,LTD
OUI:78C2C06*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:78C2C07*
ID_OUI_FROM_DATABASE=Guangzhou Hongcai Stage Equipment co.,ltd
OUI:78D6B2*
ID_OUI_FROM_DATABASE=Toshiba
+OUI:78D6DC*
+ ID_OUI_FROM_DATABASE=Motorola (Wuhan) Mobility Technologies Communication Co., Ltd.
+
OUI:78D6F0*
ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
OUI:7C2664*
ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+OUI:7C27BC*
+ ID_OUI_FROM_DATABASE=Hui Zhou Gaoshengda Technology Co.,LTD
+
OUI:7C2A31*
ID_OUI_FROM_DATABASE=Intel Corporate
OUI:7C3D2B*
ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+OUI:7C3E74*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
OUI:7C3E9D*
ID_OUI_FROM_DATABASE=PATECH
OUI:7C70BCF*
ID_OUI_FROM_DATABASE=Private
+OUI:7C70DB*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:7C7176*
ID_OUI_FROM_DATABASE=Wuxi iData Technology Company Ltd.
OUI:7C8306*
ID_OUI_FROM_DATABASE=Glen Dimplex Nordic as
+OUI:7C8530*
+ ID_OUI_FROM_DATABASE=Nokia
+
OUI:7C8956*
ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
ID_OUI_FROM_DATABASE=Aplex Technology Inc.
OUI:7CCC1F*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:7CCCB8*
ID_OUI_FROM_DATABASE=Intel Corporate
OUI:7CF429*
ID_OUI_FROM_DATABASE=NUUO Inc.
+OUI:7CF462*
+ ID_OUI_FROM_DATABASE=BEIJING HUAWOO TECHNOLOGIES CO.LTD
+
OUI:7CF666*
ID_OUI_FROM_DATABASE=Tuya Smart Inc.
ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
OUI:8048A5*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:804971*
ID_OUI_FROM_DATABASE=Apple, Inc.
OUI:80647A*
ID_OUI_FROM_DATABASE=Ola Sense Inc
+OUI:806559*
+ ID_OUI_FROM_DATABASE=EM Microelectronic
+
OUI:80656D*
ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
OUI:80B624*
ID_OUI_FROM_DATABASE=IVS
+OUI:80B655*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:80B686*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
OUI:80CC12*
ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+OUI:80CC9C*
+ ID_OUI_FROM_DATABASE=NETGEAR
+
OUI:80CE62*
ID_OUI_FROM_DATABASE=Hewlett Packard
OUI:84EB3E*
ID_OUI_FROM_DATABASE=Vivint Smart Home
+OUI:84EBEF*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
OUI:84ED33*
ID_OUI_FROM_DATABASE=BBMC Co.,Ltd
OUI:88A084*
ID_OUI_FROM_DATABASE=Formation Data Systems
+OUI:88A0BE*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
OUI:88A25E*
ID_OUI_FROM_DATABASE=Juniper Networks
OUI:88AE1D*
ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
+OUI:88AEDD*
+ ID_OUI_FROM_DATABASE=EliteGroup Computer Systems Co., LTD
+
OUI:88B111*
ID_OUI_FROM_DATABASE=Intel Corporate
OUI:88C663*
ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:88C9B30*
+ ID_OUI_FROM_DATABASE=ADOPT NETTECH PVT LTD
+
+OUI:88C9B31*
+ ID_OUI_FROM_DATABASE=Cervoz Technology Co; Ltd.
+
+OUI:88C9B32*
+ ID_OUI_FROM_DATABASE=shenzhen franklin ESS technology CO.,Ltd
+
+OUI:88C9B33*
+ ID_OUI_FROM_DATABASE=Fortive Setra-ICG(Tianjin)Co.,Ltd
+
+OUI:88C9B34*
+ ID_OUI_FROM_DATABASE=Hasbro Inc
+
+OUI:88C9B35*
+ ID_OUI_FROM_DATABASE=Brabender Technologie GmbH & Co, KG
+
+OUI:88C9B36*
+ ID_OUI_FROM_DATABASE=Hugo Techno
+
+OUI:88C9B37*
+ ID_OUI_FROM_DATABASE=Robert Bosch JuP1
+
+OUI:88C9B38*
+ ID_OUI_FROM_DATABASE=Divelbiss Corporation
+
+OUI:88C9B39*
+ ID_OUI_FROM_DATABASE=Richbeam (Beijing) Technology Co., Ltd.
+
+OUI:88C9B3A*
+ ID_OUI_FROM_DATABASE=Gefran Drive & Motion srl
+
+OUI:88C9B3B*
+ ID_OUI_FROM_DATABASE=Shenzhen MMUI Co.,Ltd
+
+OUI:88C9B3C*
+ ID_OUI_FROM_DATABASE=Shenzhen Viewsmart Technology Co.,Ltd
+
+OUI:88C9B3D*
+ ID_OUI_FROM_DATABASE=Origins Technology Limited
+
+OUI:88C9B3E*
+ ID_OUI_FROM_DATABASE=Sercomm Corporation.
+
OUI:88C9D0*
ID_OUI_FROM_DATABASE=LG Electronics (Mobile Communications)
OUI:88F872*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:88FCA6*
+ ID_OUI_FROM_DATABASE=devolo AG
+
OUI:88FD15*
ID_OUI_FROM_DATABASE=LINEEYE CO., LTD
OUI:8C6422*
ID_OUI_FROM_DATABASE=Sony Mobile Communications Inc
+OUI:8C64A2*
+ ID_OUI_FROM_DATABASE=OnePlus Technology (Shenzhen) Co., Ltd
+
OUI:8C64D4*
ID_OUI_FROM_DATABASE=Hyeco Smart Tech Co.,Ltd
OUI:8C68C8*
ID_OUI_FROM_DATABASE=zte corporation
+OUI:8C6A8D*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
+
OUI:8C6AE4*
ID_OUI_FROM_DATABASE=Viogem Limited
OUI:8C941F*
ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:8C94CC*
+ ID_OUI_FROM_DATABASE=SFR
+
OUI:8C94CF*
ID_OUI_FROM_DATABASE=Encell Technology, Inc.
OUI:8CA2FD*
ID_OUI_FROM_DATABASE=Starry, Inc.
+OUI:8CA399*
+ ID_OUI_FROM_DATABASE=SERVERCOM (INDIA) PRIVATE LIMITED
+
OUI:8CA5A1*
ID_OUI_FROM_DATABASE=Oregano Systems - Design & Consulting GmbH
OUI:8CFCA0*
ID_OUI_FROM_DATABASE=Shenzhen Smart Device Technology Co., LTD.
+OUI:8CFD15*
+ ID_OUI_FROM_DATABASE=Imagine Marketing Private Limited
+
OUI:8CFD18*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
OUI:9068C3*
ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+OUI:906976*
+ ID_OUI_FROM_DATABASE=Withrobot Inc.
+
OUI:906CAC*
ID_OUI_FROM_DATABASE=Fortinet, Inc.
OUI:907F61*
ID_OUI_FROM_DATABASE=Chicony Electronics Co., Ltd.
+OUI:908060*
+ ID_OUI_FROM_DATABASE=Nilfisk A/S
+
OUI:90808F*
ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
ID_OUI_FROM_DATABASE=HDR10+ Technologies, LLC
OUI:908674*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:90869B*
ID_OUI_FROM_DATABASE=zte corporation
OUI:9094E4*
ID_OUI_FROM_DATABASE=D-Link International
+OUI:9096F3*
+ ID_OUI_FROM_DATABASE=BUFFALO.INC
+
OUI:9097D5*
ID_OUI_FROM_DATABASE=Espressif Inc.
OUI:948FEE*
ID_OUI_FROM_DATABASE=Verizon Telematics
+OUI:949010*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
OUI:949034*
ID_OUI_FROM_DATABASE=SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD
OUI:94A7BC*
ID_OUI_FROM_DATABASE=BodyMedia, Inc.
+OUI:94AA0A*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+
OUI:94AAB8*
ID_OUI_FROM_DATABASE=Joview(Beijing) Technology Co. Ltd.
OUI:9843DA*
ID_OUI_FROM_DATABASE=INTERTECH
+OUI:9843FA*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:9844B6*
ID_OUI_FROM_DATABASE=INFRANOR SAS
OUI:984914*
ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
+OUI:98499F*
+ ID_OUI_FROM_DATABASE=Domo Tactical Communications
+
OUI:9849E1*
ID_OUI_FROM_DATABASE=Boeing Defence Australia
OUI:987BF3*
ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:987DDD*
+ ID_OUI_FROM_DATABASE=China Mobile Group Device Co.,Ltd.
+
OUI:987E46*
ID_OUI_FROM_DATABASE=Emizon Networks Limited
OUI:98F058*
ID_OUI_FROM_DATABASE=Lynxspring, Incl.
+OUI:98F083*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
OUI:98F0AB*
ID_OUI_FROM_DATABASE=Apple, Inc.
OUI:98F199*
ID_OUI_FROM_DATABASE=NEC Platforms, Ltd.
+OUI:98F217*
+ ID_OUI_FROM_DATABASE=Castlenet Technology Inc.
+
OUI:98F2B3*
ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
ID_OUI_FROM_DATABASE=BSkyB Ltd
OUI:9C32A9*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:9C32CE*
ID_OUI_FROM_DATABASE=CANON INC.
OUI:9C5A44*
ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
+OUI:9C5A81*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
+
OUI:9C5B96*
ID_OUI_FROM_DATABASE=NMR Corporation
ID_OUI_FROM_DATABASE=Panasonic Corporation of North America
OUI:9C6121*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:9C62AB*
ID_OUI_FROM_DATABASE=Sumavision Technologies Co.,Ltd
ID_OUI_FROM_DATABASE=Espressif Inc.
OUI:9C9C40*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:9C9D5D*
ID_OUI_FROM_DATABASE=Raden Inc
OUI:9C9D7E*
ID_OUI_FROM_DATABASE=Beijing Xiaomi Mobile Software Co., Ltd
+OUI:9C9E71*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
OUI:9CA10A*
ID_OUI_FROM_DATABASE=SCLE SFE
OUI:A09F10*
ID_OUI_FROM_DATABASE=SHENZHEN BILIAN ELECTRONIC CO.,LTD
+OUI:A0A0DC*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
OUI:A0A130*
ID_OUI_FROM_DATABASE=DLI Taiwan Branch office
OUI:A0B045*
ID_OUI_FROM_DATABASE=Halong Mining
+OUI:A0B086*
+ ID_OUI_FROM_DATABASE=Hirschmann Automation and Control GmbH
+
OUI:A0B100*
ID_OUI_FROM_DATABASE=ShenZhen Cando Electronics Co.,Ltd
OUI:A0D635*
ID_OUI_FROM_DATABASE=WBS Technology
+OUI:A0D722*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
OUI:A0D795*
ID_OUI_FROM_DATABASE=Apple, Inc.
OUI:A0E6F8*
ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:A0E70B*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:A0E9DB*
ID_OUI_FROM_DATABASE=Ningbo FreeWings Technologies Co.,Ltd
OUI:A429B7*
ID_OUI_FROM_DATABASE=bluesky
+OUI:A42A71*
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
+
OUI:A42B8C*
ID_OUI_FROM_DATABASE=NETGEAR
OUI:A453EED*
ID_OUI_FROM_DATABASE=SSK CORPORATION
+OUI:A45590*
+ ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
+
OUI:A45602*
ID_OUI_FROM_DATABASE=fenglian Technology Co.,Ltd.
OUI:A47760*
ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:A47806*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
OUI:A47886*
ID_OUI_FROM_DATABASE=Avaya Inc
ID_OUI_FROM_DATABASE=Ubee Interactive Co., Limited
OUI:A4D094*
- ID_OUI_FROM_DATABASE=Erwin Peters Systemtechnik GmbH
+ ID_OUI_FROM_DATABASE=VIVAVIS AG
OUI:A4D18C*
ID_OUI_FROM_DATABASE=Apple, Inc.
OUI:A4D578*
ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:A4D73C*
+ ID_OUI_FROM_DATABASE=Seiko Epson Corporation
+
OUI:A4D795*
ID_OUI_FROM_DATABASE=Wingtech Mobile Communications Co.,Ltd
OUI:A82066*
ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:A82316*
+ ID_OUI_FROM_DATABASE=Nokia
+
OUI:A823FE*
ID_OUI_FROM_DATABASE=LG Electronics
ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
OUI:A8556A*
- ID_OUI_FROM_DATABASE=Pocketnet Technology Inc.
+ ID_OUI_FROM_DATABASE=3S System Technology Inc.
OUI:A8574E*
ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
OUI:A86405*
ID_OUI_FROM_DATABASE=nimbus 9, Inc
+OUI:A864F1*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:A865B2*
ID_OUI_FROM_DATABASE=DONGGUAN YISHANG ELECTRONIC TECHNOLOGY CO., LIMITED
OUI:A875E2*
ID_OUI_FROM_DATABASE=Aventura Technologies, Inc.
+OUI:A87650*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
OUI:A8776F*
ID_OUI_FROM_DATABASE=Zonoff
OUI:AC7409*
ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited
+OUI:AC74B1*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:AC74C4*
ID_OUI_FROM_DATABASE=Maytronics Ltd.
OUI:AC9572*
ID_OUI_FROM_DATABASE=Jovision Technology Co., Ltd.
+OUI:AC976C*
+ ID_OUI_FROM_DATABASE=Greenliant
+
OUI:AC9929*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
OUI:ACD657*
ID_OUI_FROM_DATABASE=Shaanxi GuoLian Digital TV Technology Co.,Ltd.
+OUI:ACD829*
+ ID_OUI_FROM_DATABASE=Bouffalo Lab (Nanjing) Co., Ltd.
+
OUI:ACD9D6*
ID_OUI_FROM_DATABASE=tci GmbH
OUI:ACE069*
ID_OUI_FROM_DATABASE=ISAAC Instruments
+OUI:ACE14F*
+ ID_OUI_FROM_DATABASE=Autonomic Controls, Inc.
+
OUI:ACE215*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
ID_OUI_FROM_DATABASE=Shenzhen Baojia Battery Technology Co., Ltd.
OUI:ACE77B*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:ACE87B*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
OUI:B02680*
ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:B027CF*
+ ID_OUI_FROM_DATABASE=Extreme Networks, Inc.
+
OUI:B02A1F*
ID_OUI_FROM_DATABASE=Wingtech Group (HongKong)Limited
OUI:B0A737*
ID_OUI_FROM_DATABASE=Roku, Inc.
+OUI:B0A7B9*
+ ID_OUI_FROM_DATABASE=TP-Link Corporation Limited
+
OUI:B0A86E*
ID_OUI_FROM_DATABASE=Juniper Networks
OUI:B0D7CC*
ID_OUI_FROM_DATABASE=Tridonic GmbH & Co KG
+OUI:B0D888*
+ ID_OUI_FROM_DATABASE=Panasonic Corporation Automotive
+
OUI:B0DA00*
ID_OUI_FROM_DATABASE=CERA ELECTRONIQUE
OUI:B8114B*
ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:B81332*
+ ID_OUI_FROM_DATABASE=AMPAK Technology,Inc.
+
OUI:B813E9*
ID_OUI_FROM_DATABASE=Trace Live Network
OUI:B81413*
ID_OUI_FROM_DATABASE=Keen High Holding(HK) Ltd.
+OUI:B8145C*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
OUI:B814DB*
ID_OUI_FROM_DATABASE=OHSUNG
ID_OUI_FROM_DATABASE=Guangzhou Horizontal Information & Network Integration Co. Ltd
OUI:B8224F*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:B82410*
ID_OUI_FROM_DATABASE=Magneti Marelli Slovakia s.r.o.
OUI:B8259A*
ID_OUI_FROM_DATABASE=Thalmic Labs
+OUI:B825B5*
+ ID_OUI_FROM_DATABASE=Trakm8 Ltd
+
OUI:B8266C*
ID_OUI_FROM_DATABASE=ANOV France
OUI:B89F09*
ID_OUI_FROM_DATABASE=Wistron Neweb Corporation
+OUI:B8A14A*
+ ID_OUI_FROM_DATABASE=Raisecom Technology CO.,LTD
+
OUI:B8A175*
ID_OUI_FROM_DATABASE=Roku, Inc.
OUI:B8B42E*
ID_OUI_FROM_DATABASE=Gionee Communication Equipment Co,Ltd.ShenZhen
+OUI:B8B77D*
+ ID_OUI_FROM_DATABASE=Guangdong Transtek Medical Electronics CO.,Ltd
+
OUI:B8B7D7*
ID_OUI_FROM_DATABASE=2GIG Technologies
OUI:B8D526*
ID_OUI_FROM_DATABASE=Zyxel Communications Corporation
+OUI:B8D56B*
+ ID_OUI_FROM_DATABASE=Mirka Ltd.
+
OUI:B8D6F6*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
OUI:BCA13A*
ID_OUI_FROM_DATABASE=SES-imagotag
+OUI:BCA37F*
+ ID_OUI_FROM_DATABASE=Rail-Mil Sp. z o.o. Sp. K.
+
OUI:BCA4E1*
ID_OUI_FROM_DATABASE=Nabto
OUI:BCEC5D*
ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:BCECA0*
+ ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD.
+
OUI:BCEE7B*
ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
ID_OUI_FROM_DATABASE=Apple, Inc.
OUI:C01B23*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOM CO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:C01C30*
ID_OUI_FROM_DATABASE=Shenzhen WIFI-3L Technology Co.,Ltd
OUI:C02250*
ID_OUI_FROM_DATABASE=Koss Corporation
+OUI:C0238D*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
OUI:C02506*
ID_OUI_FROM_DATABASE=AVM GmbH
OUI:C03B8F*
ID_OUI_FROM_DATABASE=Minicom Digital Signage
+OUI:C03C04*
+ ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
+
OUI:C03C59*
ID_OUI_FROM_DATABASE=Intel Corporate
ID_OUI_FROM_DATABASE=Mobiwire Mobiles (NingBo) Co., LTD
OUI:C0CC42*
- ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co., Ltd.
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:C0CCF8*
ID_OUI_FROM_DATABASE=Apple, Inc.
OUI:C0F991*
ID_OUI_FROM_DATABASE=GME Standard Communications P/L
+OUI:C0F9B0*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
+OUI:C0FBF90*
+ ID_OUI_FROM_DATABASE=Xerox Corporation
+
+OUI:C0FBF91*
+ ID_OUI_FROM_DATABASE=LIXIL Corporation
+
+OUI:C0FBF92*
+ ID_OUI_FROM_DATABASE=Dongguan Chuan OptoElectronics Limited
+
+OUI:C0FBF93*
+ ID_OUI_FROM_DATABASE=SHENZHEN HEQIANG ELECTRONICS LIMITED
+
+OUI:C0FBF94*
+ ID_OUI_FROM_DATABASE=Minato Advanced Technologies inc
+
+OUI:C0FBF95*
+ ID_OUI_FROM_DATABASE=HAGUENET
+
+OUI:C0FBF96*
+ ID_OUI_FROM_DATABASE=IVT corporation
+
+OUI:C0FBF97*
+ ID_OUI_FROM_DATABASE=LongSung Technology (Shanghai) Co.,Ltd.
+
+OUI:C0FBF98*
+ ID_OUI_FROM_DATABASE=Dongmengling
+
+OUI:C0FBF99*
+ ID_OUI_FROM_DATABASE=zxsolution
+
+OUI:C0FBF9A*
+ ID_OUI_FROM_DATABASE=Tiandi(Changzhou) Automation Co., Ltd.
+
+OUI:C0FBF9B*
+ ID_OUI_FROM_DATABASE=SHENZHEN COMIX HST CLOUD COMPUTING CO., LTD.
+
+OUI:C0FBF9C*
+ ID_OUI_FROM_DATABASE=SHENZHEN ELSKY TECHNOLOGY CO., LTD
+
+OUI:C0FBF9D*
+ ID_OUI_FROM_DATABASE=Dropbeats Technology Co., Ltd.
+
+OUI:C0FBF9E*
+ ID_OUI_FROM_DATABASE=Navitas Digital Safety Ltd
+
OUI:C0FD84*
ID_OUI_FROM_DATABASE=zte corporation
OUI:C421C8*
ID_OUI_FROM_DATABASE=KYOCERA CORPORATION
+OUI:C42360*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:C4237A*
ID_OUI_FROM_DATABASE=WhizNets Inc.
OUI:C45DD8*
ID_OUI_FROM_DATABASE=HDMI Forum
+OUI:C45E5C*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
OUI:C46044*
ID_OUI_FROM_DATABASE=Everex Electronics Limited
OUI:C4741E*
ID_OUI_FROM_DATABASE=zte corporation
+OUI:C47469*
+ ID_OUI_FROM_DATABASE=BT9
+
OUI:C474F8*
ID_OUI_FROM_DATABASE=Hot Pepper, Inc.
OUI:C477AF*
ID_OUI_FROM_DATABASE=Advanced Digital Broadcast SA
+OUI:C478A2*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
OUI:C47B2F*
ID_OUI_FROM_DATABASE=Beijing JoinHope Image Technology Ltd.
OUI:C47F51*
ID_OUI_FROM_DATABASE=Inventek Systems
+OUI:C48025*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
+OUI:C4808A*
+ ID_OUI_FROM_DATABASE=Cloud Diagnostics Canada ULC
+
OUI:C4823F*
ID_OUI_FROM_DATABASE=Fujian Newland Auto-ID Tech. Co,.Ltd.
ID_OUI_FROM_DATABASE=Mciao Technologies, Inc.
OUI:C4A151*
- ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co., Ltd.
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:C4A366*
ID_OUI_FROM_DATABASE=zte corporation
OUI:C4FF1F*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:C4FF22*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
OUI:C4FFBC0*
ID_OUI_FROM_DATABASE=Danego BV
OUI:C803F5*
ID_OUI_FROM_DATABASE=Ruckus Wireless
+OUI:C8059E*
+ ID_OUI_FROM_DATABASE=Hefei Symboltek Co.,Ltd
+
OUI:C80718*
ID_OUI_FROM_DATABASE=TDSi
OUI:C850E9*
ID_OUI_FROM_DATABASE=Raisecom Technology CO., LTD
+OUI:C85142*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
OUI:C85195*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
OUI:C89CDC*
ID_OUI_FROM_DATABASE=Elitegroup Computer Systems Co.,Ltd.
+OUI:C89D18*
+ ID_OUI_FROM_DATABASE=Huawei Device Co., Ltd.
+
OUI:C89F1D*
ID_OUI_FROM_DATABASE=SHENZHEN COMMUNICATION TECHNOLOGIES CO.,LTD
OUI:C8BCE5*
ID_OUI_FROM_DATABASE=Sense Things Japan INC.
+OUI:C8BD69*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
OUI:C8BE19*
ID_OUI_FROM_DATABASE=D-Link International
OUI:C8F406*
ID_OUI_FROM_DATABASE=Avaya Inc
+OUI:C8F5D60*
+ ID_OUI_FROM_DATABASE=MEIRYO TECHNICA CORPORATION
+
+OUI:C8F5D61*
+ ID_OUI_FROM_DATABASE=Valeo Interior Controls (Shenzhen) Co.,Ltd
+
+OUI:C8F5D62*
+ ID_OUI_FROM_DATABASE=Qbic Technology Co., Ltd
+
+OUI:C8F5D63*
+ ID_OUI_FROM_DATABASE=BBPOS International Limited
+
+OUI:C8F5D64*
+ ID_OUI_FROM_DATABASE=EVOTOR LLC
+
+OUI:C8F5D65*
+ ID_OUI_FROM_DATABASE=Pinmicro K K
+
+OUI:C8F5D66*
+ ID_OUI_FROM_DATABASE=Jabil
+
+OUI:C8F5D67*
+ ID_OUI_FROM_DATABASE=Oscars Pro
+
+OUI:C8F5D68*
+ ID_OUI_FROM_DATABASE=Yarward Electronics Co., Ltd.
+
+OUI:C8F5D69*
+ ID_OUI_FROM_DATABASE=Shanghai Mo xiang Network Technology CO.,Ltd
+
+OUI:C8F5D6A*
+ ID_OUI_FROM_DATABASE=HENAN FOXSTAR DIGITAL DISPLAY Co.,Ltd.
+
+OUI:C8F5D6B*
+ ID_OUI_FROM_DATABASE=United Barcode Systems
+
+OUI:C8F5D6C*
+ ID_OUI_FROM_DATABASE=Eltako GmbH
+
+OUI:C8F5D6D*
+ ID_OUI_FROM_DATABASE=Volansys technologies pvt ltd
+
+OUI:C8F5D6E*
+ ID_OUI_FROM_DATABASE=HEITEC AG
+
OUI:C8F650*
ID_OUI_FROM_DATABASE=Apple, Inc.
OUI:CC0CDA*
ID_OUI_FROM_DATABASE=Miljovakt AS
+OUI:CC0DE7*
+ ID_OUI_FROM_DATABASE=B METERS S.R.L.
+
OUI:CC0DEC*
ID_OUI_FROM_DATABASE=Cisco SPVTG
OUI:CC14A6*
ID_OUI_FROM_DATABASE=Yichun MyEnergy Domain, Inc
+OUI:CC1531*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:CC167E*
ID_OUI_FROM_DATABASE=Cisco Systems, Inc
ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO., LTD.
OUI:CC3ADF*
- ID_OUI_FROM_DATABASE=Private
+ ID_OUI_FROM_DATABASE=Neptune Technology Group Inc.
OUI:CC3B27*
ID_OUI_FROM_DATABASE=TECNO MOBILE LIMITED
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
OUI:CCA260*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:CCA374*
ID_OUI_FROM_DATABASE=Guangdong Guanglian Electronic Technology Co.Ltd
OUI:CCB55A*
ID_OUI_FROM_DATABASE=Fraunhofer ITWM
+OUI:CCB5D1*
+ ID_OUI_FROM_DATABASE=Beijing Xiaomi Mobile Software Co., Ltd
+
OUI:CCB691*
ID_OUI_FROM_DATABASE=NECMagnusCommunications
OUI:D016B4*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:D01769*
+ ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd.
+
OUI:D0176A*
ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
OUI:D01CBB*
ID_OUI_FROM_DATABASE=Beijing Ctimes Digital Technology Co., Ltd.
+OUI:D01E1D*
+ ID_OUI_FROM_DATABASE=SaiNXT Technologies LLP
+
OUI:D021AC*
ID_OUI_FROM_DATABASE=Yo Labs LLC
OUI:D03311*
ID_OUI_FROM_DATABASE=Apple, Inc.
+OUI:D035E5*
+ ID_OUI_FROM_DATABASE=EM Microelectronic
+
OUI:D03742*
ID_OUI_FROM_DATABASE=Yulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd
OUI:D03E5C*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:D03E7D*
+ ID_OUI_FROM_DATABASE=CHIPSEA TECHNOLOGIES (SHENZHEN) CORP.
+
OUI:D03FAA*
ID_OUI_FROM_DATABASE=Apple, Inc.
OUI:D046DC*
ID_OUI_FROM_DATABASE=Southwest Research Institute
+OUI:D047C1*
+ ID_OUI_FROM_DATABASE=Elma Electronic AG
+
OUI:D048F3*
ID_OUI_FROM_DATABASE=DATTUS Inc
OUI:D0542D*
ID_OUI_FROM_DATABASE=Cambridge Industries(Group) Co.,Ltd.
+OUI:D05475*
+ ID_OUI_FROM_DATABASE=SAVI Controls
+
OUI:D05509*
ID_OUI_FROM_DATABASE=Nintendo Co.,Ltd
OUI:D09DAB*
ID_OUI_FROM_DATABASE=TCT mobile ltd
+OUI:D09FD90*
+ ID_OUI_FROM_DATABASE=Lemei Intelligent IOT (Shenzhen) Co., Ltd
+
+OUI:D09FD91*
+ ID_OUI_FROM_DATABASE=elecgator bvba
+
+OUI:D09FD92*
+ ID_OUI_FROM_DATABASE=Westar Display Technologies
+
+OUI:D09FD93*
+ ID_OUI_FROM_DATABASE=Sanken-Densetsu Co.,LTD.
+
+OUI:D09FD94*
+ ID_OUI_FROM_DATABASE=Poten (Shanghai) Technology Co.,Ltd.
+
+OUI:D09FD95*
+ ID_OUI_FROM_DATABASE=Carbon Mobile GmbH
+
+OUI:D09FD96*
+ ID_OUI_FROM_DATABASE=Elevoc Technology Co., Ltd.
+
+OUI:D09FD97*
+ ID_OUI_FROM_DATABASE=Raymax Technology Ltd.
+
+OUI:D09FD98*
+ ID_OUI_FROM_DATABASE=Queclink Wireless Solutions Co., Ltd.
+
+OUI:D09FD99*
+ ID_OUI_FROM_DATABASE=ENTTEC Pty Ltd.
+
+OUI:D09FD9A*
+ ID_OUI_FROM_DATABASE=Eurolan Ltd
+
+OUI:D09FD9B*
+ ID_OUI_FROM_DATABASE=Cablewireless Laboratory Co., Ltd
+
+OUI:D09FD9C*
+ ID_OUI_FROM_DATABASE=Fujian Newland Auto-ID Tech. Co,.Ltd.
+
+OUI:D09FD9D*
+ ID_OUI_FROM_DATABASE=Shenzhen eloT Technology Co.,Ltd
+
+OUI:D09FD9E*
+ ID_OUI_FROM_DATABASE=Minibems Ltd
+
OUI:D0A0D6*
ID_OUI_FROM_DATABASE=Chengdu TD Tech Ltd.
OUI:D40598*
ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
+OUI:D40868*
+ ID_OUI_FROM_DATABASE=Beijing Lanxum Computer Technology CO.,LTD.
+
OUI:D40AA9*
ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
OUI:D44165*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:D443A8*
ID_OUI_FROM_DATABASE=Changzhou Haojie Electric Co., Ltd.
OUI:D453AF*
ID_OUI_FROM_DATABASE=VIGO System S.A.
+OUI:D4548B*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:D45556*
ID_OUI_FROM_DATABASE=Fiber Mountain Inc.
OUI:D89EF3*
ID_OUI_FROM_DATABASE=Dell Inc.
+OUI:D8A011*
+ ID_OUI_FROM_DATABASE=WiZ
+
OUI:D8A01D*
ID_OUI_FROM_DATABASE=Espressif Inc.
OUI:DC028E*
ID_OUI_FROM_DATABASE=zte corporation
+OUI:DC0398*
+ ID_OUI_FROM_DATABASE=LG Innotek
+
OUI:DC052F*
ID_OUI_FROM_DATABASE=National Products Inc.
OUI:DC2008*
ID_OUI_FROM_DATABASE=ASD Electronics Ltd
+OUI:DC2148*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
+OUI:DC215C*
+ ID_OUI_FROM_DATABASE=Intel Corporate
+
OUI:DC21B9*
ID_OUI_FROM_DATABASE=Sentec Co.Ltd
ID_OUI_FROM_DATABASE=Universal Global Scientific Industrial Co., Ltd.
OUI:E04FBD*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:E0508B*
ID_OUI_FROM_DATABASE=Zhejiang Dahua Technology Co., Ltd.
ID_OUI_FROM_DATABASE=OMB Guitars LLC
OUI:E05A9F8*
- ID_OUI_FROM_DATABASE=Fujian Newland Auto-ID Tech. Co.,Ltd.
+ ID_OUI_FROM_DATABASE=Fujian Newland Auto-ID Tech. Co,.Ltd.
OUI:E05A9F9*
ID_OUI_FROM_DATABASE=Gemalto Document Readers
ID_OUI_FROM_DATABASE=zte corporation
OUI:E0C63C*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:E0C6B3*
ID_OUI_FROM_DATABASE=MilDef AB
OUI:E405F8*
ID_OUI_FROM_DATABASE=Bytedance
+OUI:E408E7*
+ ID_OUI_FROM_DATABASE=Quectel Wireless Solutions Co.,Ltd.
+
+OUI:E40CFD*
+ ID_OUI_FROM_DATABASE=GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD
+
OUI:E40EEE*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
OUI:E8056D*
ID_OUI_FROM_DATABASE=Nortel Networks
+OUI:E805DC*
+ ID_OUI_FROM_DATABASE=Verifone Inc.
+
OUI:E80688*
ID_OUI_FROM_DATABASE=Apple, Inc.
OUI:E85BF0*
ID_OUI_FROM_DATABASE=Imaging Diagnostics
+OUI:E85C0A*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
OUI:E85D6B*
ID_OUI_FROM_DATABASE=Luminate Wireless
OUI:E8C1D7*
ID_OUI_FROM_DATABASE=Philips
+OUI:E8C1E8*
+ ID_OUI_FROM_DATABASE=Shenzhen Xiao Bi En Culture Education Technology Co.,Ltd.
+
OUI:E8C229*
ID_OUI_FROM_DATABASE=H-Displays (MSC) Bhd
OUI:E8D8D1*
ID_OUI_FROM_DATABASE=HP Inc.
+OUI:E8DA00*
+ ID_OUI_FROM_DATABASE=Kivo Technology, Inc.
+
OUI:E8DA20*
ID_OUI_FROM_DATABASE=Nintendo Co.,Ltd
OUI:EC086B*
ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD.
+OUI:EC08E5*
+ ID_OUI_FROM_DATABASE=Motorola Mobility LLC, a Lenovo Company
+
OUI:EC0BAE*
ID_OUI_FROM_DATABASE=Hangzhou BroadLink Technology Co.,Ltd
OUI:EC8A4C*
ID_OUI_FROM_DATABASE=zte corporation
+OUI:EC8AC4*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
+
OUI:EC8AC7*
ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
ID_OUI_FROM_DATABASE=HD DIGITAL TECH CO., LTD.
OUI:ECF8EB*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:ECFA03*
ID_OUI_FROM_DATABASE=FCA
ID_OUI_FROM_DATABASE=Hewlett Packard
OUI:F092B4*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:F0933A*
ID_OUI_FROM_DATABASE=NxtConect
OUI:F0C77F*
ID_OUI_FROM_DATABASE=Texas Instruments
+OUI:F0C814*
+ ID_OUI_FROM_DATABASE=SHENZHEN BILIAN ELECTRONIC CO.,LTD
+
OUI:F0C850*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
OUI:F44E05*
ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+OUI:F44E38*
+ ID_OUI_FROM_DATABASE=Olibra LLC
+
OUI:F44EE3*
ID_OUI_FROM_DATABASE=Intel Corporate
OUI:F4600D*
ID_OUI_FROM_DATABASE=Panoptic Technology, Inc
+OUI:F46077*
+ ID_OUI_FROM_DATABASE=Texas Instruments
+
OUI:F460E2*
ID_OUI_FROM_DATABASE=Xiaomi Communications Co Ltd
OUI:F46349*
ID_OUI_FROM_DATABASE=Diffon Corporation
+OUI:F463E7*
+ ID_OUI_FROM_DATABASE=Nanjing Maxon O.E. Tech. Co., LTD
+
OUI:F4645D*
ID_OUI_FROM_DATABASE=Toshiba
OUI:F46F4E*
ID_OUI_FROM_DATABASE=Echowell
+OUI:F46FA4*
+ ID_OUI_FROM_DATABASE=Physik Instrumente GmbH & Co. KG
+
OUI:F46FED*
ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
OUI:F4BFA8*
ID_OUI_FROM_DATABASE=Juniper Networks
+OUI:F4C02F*
+ ID_OUI_FROM_DATABASE=BlueBite
+
OUI:F4C114*
ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
OUI:F4E3FB*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+OUI:F4E451*
+ ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
+
OUI:F4E4AD*
ID_OUI_FROM_DATABASE=zte corporation
OUI:F88E85*
ID_OUI_FROM_DATABASE=Comtrend Corporation
+OUI:F88EA1*
+ ID_OUI_FROM_DATABASE=Edgecore Networks Corporation
+
OUI:F88F07*
ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
OUI:F8B95A*
ID_OUI_FROM_DATABASE=LG Innotek
+OUI:F8BAE6*
+ ID_OUI_FROM_DATABASE=Nokia
+
OUI:F8BBBF*
ID_OUI_FROM_DATABASE=eero inc.
ID_OUI_FROM_DATABASE=Visteon corp
OUI:FC372B*
- ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD
+ ID_OUI_FROM_DATABASE=Sichuan Tianyi Comheart Telecom Co.,LTD
OUI:FC3964*
ID_OUI_FROM_DATABASE=ITEL MOBILE LIMITED
OUI:FC923B*
ID_OUI_FROM_DATABASE=Nokia Corporation
+OUI:FC9257*
+ ID_OUI_FROM_DATABASE=Renesas Electronics (Penang) Sdn. Bhd.
+
OUI:FC9435*
ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD
acpi:AUTH*:
ID_VENDOR_FROM_DATABASE=AuthenTec
+acpi:BABA*:
+ ID_VENDOR_FROM_DATABASE=Alibaba Co., Ltd.
+
acpi:BOOT*:
ID_VENDOR_FROM_DATABASE=Coreboot Project
acpi:EXAR*:
ID_VENDOR_FROM_DATABASE=Exar Corporation
+acpi:FRMW*:
+ ID_VENDOR_FROM_DATABASE=Framework Computer LLC
+
acpi:FRSC*:
ID_VENDOR_FROM_DATABASE=Freescale, Inc
acpi:IPHI*:
ID_VENDOR_FROM_DATABASE=Inphi Corporation
+acpi:JSYS*:
+ ID_VENDOR_FROM_DATABASE=Juniper Systems, Inc.
+
acpi:KIOX*:
ID_VENDOR_FROM_DATABASE=Kionix, Inc.
acpi:PIXA*:
ID_VENDOR_FROM_DATABASE=PixArt imaging inc.
+acpi:PNSO*:
+ ID_VENDOR_FROM_DATABASE=Pensando Systems, Inc.
+
acpi:QCOM*:
ID_VENDOR_FROM_DATABASE=Qualcomm Inc
acpi:RZSN*:
ID_VENDOR_FROM_DATABASE=Rozsnyó, s.r.o.
+acpi:SECC*:
+ ID_VENDOR_FROM_DATABASE=Seiko Epson Corporation
+
acpi:SHRP*:
ID_VENDOR_FROM_DATABASE=Sharp Corporation
ID_VENDOR_FROM_DATABASE=Algolith Inc.
acpi:ALP*:
- ID_VENDOR_FROM_DATABASE=Alps Electric Company Ltd
+ ID_VENDOR_FROM_DATABASE=ALPS ALPINE CO., LTD.
acpi:ALR*:
ID_VENDOR_FROM_DATABASE=Advanced Logic
ID_VENDOR_FROM_DATABASE=AppliAdata
acpi:APE*:
- ID_VENDOR_FROM_DATABASE=Alpine Electronics, Inc.
+ ID_VENDOR_FROM_DATABASE=ALPS ALPINE CO., LTD.
acpi:APG*:
ID_VENDOR_FROM_DATABASE=Horner Electric Inc
ID_VENDOR_FROM_DATABASE=August Home, Inc.
acpi:AUI*:
- ID_VENDOR_FROM_DATABASE=Alps Electric Inc
+ ID_VENDOR_FROM_DATABASE=ALPS ALPINE CO., LTD.
acpi:AUO*:
ID_VENDOR_FROM_DATABASE=AU Optronics
acpi:CLO*:
ID_VENDOR_FROM_DATABASE=Clone Computers
+acpi:CLR*:
+ ID_VENDOR_FROM_DATABASE=Clover Electronics
+
acpi:CLT*:
ID_VENDOR_FROM_DATABASE=automated computer control systems
acpi:CNC*:
ID_VENDOR_FROM_DATABASE=Alvedon Computers Ltd
+acpi:CND*:
+ ID_VENDOR_FROM_DATABASE=Micro-Star Int'l Co., Ltd.
+
acpi:CNE*:
ID_VENDOR_FROM_DATABASE=Cine-tal
acpi:CRL*:
ID_VENDOR_FROM_DATABASE=Creative Logic
+acpi:CRM*:
+ ID_VENDOR_FROM_DATABASE=CORSAIR MEMORY Inc.
+
acpi:CRN*:
ID_VENDOR_FROM_DATABASE=Cornerstone Imaging
acpi:KTN*:
ID_VENDOR_FROM_DATABASE=Katron Tech Inc
+acpi:KTS*:
+ ID_VENDOR_FROM_DATABASE=Kyokko Communication System Co., Ltd.
+
acpi:KUR*:
ID_VENDOR_FROM_DATABASE=Kurta Corporation
acpi:NWC*:
ID_VENDOR_FROM_DATABASE=NW Computer Engineering
+acpi:NWL*:
+ ID_VENDOR_FROM_DATABASE=Newline Interactive Inc.
+
acpi:NWP*:
ID_VENDOR_FROM_DATABASE=NovaWeb Technologies Inc
acpi:TMM*:
ID_VENDOR_FROM_DATABASE=Time Management, Inc.
+acpi:TMO*:
+ ID_VENDOR_FROM_DATABASE=Terumo Corporation
+
acpi:TMR*:
ID_VENDOR_FROM_DATABASE=Taicom International Inc
---- 20-acpi-vendor.hwdb.base 2021-02-12 15:42:10.664053745 +0100
-+++ 20-acpi-vendor.hwdb 2021-02-12 15:42:10.706054210 +0100
+--- 20-acpi-vendor.hwdb.base 2021-03-30 13:03:54.632421502 +0200
++++ 20-acpi-vendor.hwdb 2021-03-30 13:03:54.650421692 +0200
@@ -3,6 +3,8 @@
# Data imported from:
# https://uefi.org/uefi-pnp-export
acpi:AMDI*:
ID_VENDOR_FROM_DATABASE=AMD
-@@ -295,6 +294,9 @@
+@@ -310,6 +309,9 @@
acpi:AAA*:
ID_VENDOR_FROM_DATABASE=Avolites Ltd
acpi:AAE*:
ID_VENDOR_FROM_DATABASE=Anatek Electronics Inc.
-@@ -322,6 +324,9 @@
+@@ -337,6 +339,9 @@
acpi:ABO*:
ID_VENDOR_FROM_DATABASE=D-Link Systems Inc
acpi:ABS*:
ID_VENDOR_FROM_DATABASE=Abaco Systems, Inc.
-@@ -367,7 +372,7 @@
+@@ -382,7 +387,7 @@
acpi:ACO*:
ID_VENDOR_FROM_DATABASE=Allion Computer Inc.
ID_VENDOR_FROM_DATABASE=Aspen Tech Inc
acpi:ACR*:
-@@ -640,6 +645,9 @@
+@@ -655,6 +660,9 @@
acpi:AMT*:
ID_VENDOR_FROM_DATABASE=AMT International Industry
acpi:AMX*:
ID_VENDOR_FROM_DATABASE=AMX LLC
-@@ -688,6 +696,9 @@
+@@ -703,6 +711,9 @@
acpi:AOA*:
ID_VENDOR_FROM_DATABASE=AOpen Inc.
acpi:AOE*:
ID_VENDOR_FROM_DATABASE=Advanced Optics Electronics, Inc.
-@@ -697,6 +708,9 @@
+@@ -712,6 +723,9 @@
acpi:AOT*:
ID_VENDOR_FROM_DATABASE=Alcatel
acpi:APC*:
ID_VENDOR_FROM_DATABASE=American Power Conversion
-@@ -872,7 +886,7 @@
- ID_VENDOR_FROM_DATABASE=Alps Electric Inc
+@@ -887,7 +901,7 @@
+ ID_VENDOR_FROM_DATABASE=ALPS ALPINE CO., LTD.
acpi:AUO*:
- ID_VENDOR_FROM_DATABASE=DO NOT USE - AUO
acpi:AUR*:
ID_VENDOR_FROM_DATABASE=Aureal Semiconductor
-@@ -952,6 +966,9 @@
+@@ -967,6 +981,9 @@
acpi:AXE*:
ID_VENDOR_FROM_DATABASE=Axell Corporation
acpi:AXI*:
ID_VENDOR_FROM_DATABASE=American Magnetics
-@@ -1102,6 +1119,9 @@
+@@ -1117,6 +1134,9 @@
acpi:BML*:
ID_VENDOR_FROM_DATABASE=BIOMED Lab
acpi:BMS*:
ID_VENDOR_FROM_DATABASE=BIOMEDISYS
-@@ -1114,6 +1134,9 @@
+@@ -1129,6 +1149,9 @@
acpi:BNO*:
ID_VENDOR_FROM_DATABASE=Bang & Olufsen
acpi:BNS*:
ID_VENDOR_FROM_DATABASE=Boulder Nonlinear Systems
-@@ -1357,6 +1380,9 @@
+@@ -1372,6 +1395,9 @@
acpi:CHA*:
ID_VENDOR_FROM_DATABASE=Chase Research PLC
acpi:CHD*:
ID_VENDOR_FROM_DATABASE=ChangHong Electric Co.,Ltd
-@@ -1513,6 +1539,9 @@
+@@ -1534,6 +1560,9 @@
acpi:COD*:
ID_VENDOR_FROM_DATABASE=CODAN Pty. Ltd.
acpi:COI*:
ID_VENDOR_FROM_DATABASE=Codec Inc.
-@@ -1919,7 +1948,7 @@
+@@ -1943,7 +1972,7 @@
ID_VENDOR_FROM_DATABASE=Dragon Information Technology
acpi:DJE*:
acpi:DJP*:
ID_VENDOR_FROM_DATABASE=Maygay Machines, Ltd
-@@ -2251,6 +2280,9 @@
+@@ -2275,6 +2304,9 @@
acpi:EIN*:
ID_VENDOR_FROM_DATABASE=Elegant Invention
acpi:EKA*:
ID_VENDOR_FROM_DATABASE=MagTek Inc.
-@@ -2512,6 +2544,9 @@
+@@ -2536,6 +2568,9 @@
acpi:FCG*:
ID_VENDOR_FROM_DATABASE=First International Computer Ltd
acpi:FCS*:
ID_VENDOR_FROM_DATABASE=Focus Enhancements, Inc.
-@@ -2885,7 +2920,7 @@
+@@ -2909,7 +2944,7 @@
ID_VENDOR_FROM_DATABASE=General Standards Corporation
acpi:GSM*:
acpi:GSN*:
ID_VENDOR_FROM_DATABASE=Grandstream Networks, Inc.
-@@ -2986,6 +3021,9 @@
+@@ -3010,6 +3045,9 @@
acpi:HEC*:
ID_VENDOR_FROM_DATABASE=Hisense Electric Co., Ltd.
acpi:HEL*:
ID_VENDOR_FROM_DATABASE=Hitachi Micro Systems Europe Ltd
-@@ -3115,6 +3153,9 @@
+@@ -3139,6 +3177,9 @@
acpi:HSD*:
ID_VENDOR_FROM_DATABASE=HannStar Display Corp
acpi:HSM*:
ID_VENDOR_FROM_DATABASE=AT&T Microelectronics
-@@ -3238,6 +3279,9 @@
+@@ -3262,6 +3303,9 @@
acpi:ICI*:
ID_VENDOR_FROM_DATABASE=Infotek Communication Inc
acpi:ICM*:
ID_VENDOR_FROM_DATABASE=Intracom SA
-@@ -3334,6 +3378,9 @@
+@@ -3358,6 +3402,9 @@
acpi:IKE*:
ID_VENDOR_FROM_DATABASE=Ikegami Tsushinki Co. Ltd.
acpi:IKS*:
ID_VENDOR_FROM_DATABASE=Ikos Systems Inc
-@@ -3379,6 +3426,9 @@
+@@ -3403,6 +3450,9 @@
acpi:IMT*:
ID_VENDOR_FROM_DATABASE=Inmax Technology Corporation
acpi:INA*:
ID_VENDOR_FROM_DATABASE=Inventec Corporation
-@@ -3886,6 +3936,9 @@
+@@ -3913,6 +3963,9 @@
acpi:LAN*:
ID_VENDOR_FROM_DATABASE=Sodeman Lancom Inc
acpi:LAS*:
ID_VENDOR_FROM_DATABASE=LASAT Comm. A/S
-@@ -3931,6 +3984,9 @@
+@@ -3958,6 +4011,9 @@
acpi:LED*:
ID_VENDOR_FROM_DATABASE=Long Engineering Design Inc
acpi:LEG*:
ID_VENDOR_FROM_DATABASE=Legerity, Inc
-@@ -3946,6 +4002,9 @@
+@@ -3973,6 +4029,9 @@
acpi:LGC*:
ID_VENDOR_FROM_DATABASE=Logic Ltd
acpi:LGI*:
ID_VENDOR_FROM_DATABASE=Logitech Inc
-@@ -4000,6 +4059,9 @@
+@@ -4027,6 +4086,9 @@
acpi:LND*:
ID_VENDOR_FROM_DATABASE=Land Computer Company Ltd
acpi:LNK*:
ID_VENDOR_FROM_DATABASE=Link Tech Inc
-@@ -4034,7 +4096,7 @@
+@@ -4061,7 +4123,7 @@
ID_VENDOR_FROM_DATABASE=Design Technology
acpi:LPL*:
acpi:LSC*:
ID_VENDOR_FROM_DATABASE=LifeSize Communications
-@@ -4210,6 +4272,9 @@
+@@ -4237,6 +4299,9 @@
acpi:MCX*:
ID_VENDOR_FROM_DATABASE=Millson Custom Solutions Inc.
acpi:MDA*:
ID_VENDOR_FROM_DATABASE=Media4 Inc
-@@ -4450,6 +4515,9 @@
+@@ -4477,6 +4542,9 @@
acpi:MOM*:
ID_VENDOR_FROM_DATABASE=Momentum Data Systems
acpi:MOS*:
ID_VENDOR_FROM_DATABASE=Moses Corporation
-@@ -4678,6 +4746,9 @@
+@@ -4705,6 +4773,9 @@
acpi:NAL*:
ID_VENDOR_FROM_DATABASE=Network Alchemy
acpi:NAT*:
ID_VENDOR_FROM_DATABASE=NaturalPoint Inc.
-@@ -5185,6 +5256,9 @@
+@@ -5215,6 +5286,9 @@
acpi:PCX*:
ID_VENDOR_FROM_DATABASE=PC Xperten
acpi:PDM*:
ID_VENDOR_FROM_DATABASE=Psion Dacom Plc.
-@@ -5248,9 +5322,6 @@
+@@ -5278,9 +5352,6 @@
acpi:PHE*:
ID_VENDOR_FROM_DATABASE=Philips Medical Systems Boeblingen GmbH
acpi:PHL*:
ID_VENDOR_FROM_DATABASE=Philips Consumer Electronics Company
-@@ -5338,9 +5409,6 @@
+@@ -5368,9 +5439,6 @@
acpi:PNL*:
ID_VENDOR_FROM_DATABASE=Panelview, Inc.
acpi:PNR*:
ID_VENDOR_FROM_DATABASE=Planar Systems, Inc.
-@@ -5476,15 +5544,9 @@
+@@ -5506,15 +5574,9 @@
acpi:PTS*:
ID_VENDOR_FROM_DATABASE=Plain Tree Systems Inc
acpi:PVG*:
ID_VENDOR_FROM_DATABASE=Proview Global Co., Ltd
-@@ -5800,9 +5862,6 @@
+@@ -5830,9 +5892,6 @@
acpi:RTI*:
ID_VENDOR_FROM_DATABASE=Rancho Tech Inc
acpi:RTL*:
ID_VENDOR_FROM_DATABASE=Realtek Semiconductor Company Ltd
-@@ -5968,9 +6027,6 @@
+@@ -5998,9 +6057,6 @@
acpi:SEE*:
ID_VENDOR_FROM_DATABASE=SeeColor Corporation
acpi:SEI*:
ID_VENDOR_FROM_DATABASE=Seitz & Associates Inc
-@@ -6430,6 +6486,9 @@
+@@ -6460,6 +6516,9 @@
acpi:SVD*:
ID_VENDOR_FROM_DATABASE=SVD Computer
acpi:SVI*:
ID_VENDOR_FROM_DATABASE=Sun Microsystems
-@@ -6514,6 +6573,9 @@
+@@ -6544,6 +6603,9 @@
acpi:SZM*:
ID_VENDOR_FROM_DATABASE=Shenzhen MTC Co., Ltd
acpi:TAA*:
ID_VENDOR_FROM_DATABASE=Tandberg
-@@ -6604,6 +6666,9 @@
+@@ -6634,6 +6696,9 @@
acpi:TDG*:
ID_VENDOR_FROM_DATABASE=Six15 Technologies
acpi:TDM*:
ID_VENDOR_FROM_DATABASE=Tandem Computer Europe Inc
-@@ -6646,6 +6711,9 @@
+@@ -6676,6 +6741,9 @@
acpi:TEV*:
ID_VENDOR_FROM_DATABASE=Televés, S.A.
acpi:TEZ*:
ID_VENDOR_FROM_DATABASE=Tech Source Inc.
-@@ -6763,9 +6831,6 @@
+@@ -6796,9 +6864,6 @@
acpi:TNC*:
ID_VENDOR_FROM_DATABASE=TNC Industrial Company Ltd
acpi:TNM*:
ID_VENDOR_FROM_DATABASE=TECNIMAGEN SA
-@@ -7072,14 +7137,14 @@
+@@ -7105,14 +7170,14 @@
acpi:UNC*:
ID_VENDOR_FROM_DATABASE=Unisys Corporation
acpi:UNI*:
ID_VENDOR_FROM_DATABASE=Uniform Industry Corp.
-@@ -7114,6 +7179,9 @@
+@@ -7147,6 +7212,9 @@
acpi:USA*:
ID_VENDOR_FROM_DATABASE=Utimaco Safeware AG
acpi:USD*:
ID_VENDOR_FROM_DATABASE=U.S. Digital Corporation
-@@ -7360,9 +7428,6 @@
+@@ -7393,9 +7461,6 @@
acpi:WAL*:
ID_VENDOR_FROM_DATABASE=Wave Access
acpi:WAV*:
ID_VENDOR_FROM_DATABASE=Wavephore
-@@ -7487,7 +7552,7 @@
+@@ -7520,7 +7585,7 @@
ID_VENDOR_FROM_DATABASE=WyreStorm Technologies LLC
acpi:WYS*:
acpi:WYT*:
ID_VENDOR_FROM_DATABASE=Wooyoung Image & Information Co.,Ltd.
-@@ -7501,9 +7566,6 @@
+@@ -7534,9 +7599,6 @@
acpi:XDM*:
ID_VENDOR_FROM_DATABASE=XDM Ltd.
acpi:XES*:
ID_VENDOR_FROM_DATABASE=Extreme Engineering Solutions, Inc.
-@@ -7534,9 +7596,6 @@
+@@ -7567,9 +7629,6 @@
acpi:XNT*:
ID_VENDOR_FROM_DATABASE=XN Technologies, Inc.
acpi:XQU*:
ID_VENDOR_FROM_DATABASE=SHANGHAI SVA-DAV ELECTRONICS CO., LTD
-@@ -7603,6 +7662,9 @@
+@@ -7636,6 +7695,9 @@
acpi:ZBX*:
ID_VENDOR_FROM_DATABASE=Zebax Technologies
pci:v00001000d00000072sv00001000sd000030B0*
ID_MODEL_FROM_DATABASE=SAS2008 PCI-Express Fusion-MPT SAS-2 [Falcon] (9200-8e [LSI SAS 6Gb/s SAS/SATA PCIe x8 External HBA])
+pci:v00001000d00000072sv00001014sd000003CA*
+ ID_MODEL_FROM_DATABASE=SAS2008 PCI-Express Fusion-MPT SAS-2 [Falcon] (IBM 6Gb SAS HBA [9212-4i4e])
+
pci:v00001000d00000072sv00001028sd00001F1C*
ID_MODEL_FROM_DATABASE=SAS2008 PCI-Express Fusion-MPT SAS-2 [Falcon] (6Gbps SAS HBA Adapter)
pci:v00001000d000010E2*
ID_MODEL_FROM_DATABASE=MegaRAID 12GSAS/PCIe Secure SAS39xx
+pci:v00001000d000010E2sv00001000sd00004000*
+ ID_MODEL_FROM_DATABASE=MegaRAID 12GSAS/PCIe Secure SAS39xx (MegaRAID 9560-16i)
+
+pci:v00001000d000010E2sv00001000sd00004010*
+ ID_MODEL_FROM_DATABASE=MegaRAID 12GSAS/PCIe Secure SAS39xx (MegaRAID 9560-8i)
+
+pci:v00001000d000010E2sv00001000sd00004020*
+ ID_MODEL_FROM_DATABASE=MegaRAID 12GSAS/PCIe Secure SAS39xx (MegaRAID 9580-8i8e)
+
+pci:v00001000d000010E2sv00001000sd000040B0*
+ ID_MODEL_FROM_DATABASE=MegaRAID 12GSAS/PCIe Secure SAS39xx (MegaRAID 9562-16i)
+
pci:v00001000d000010E2sv00001028sd00001AE0*
ID_MODEL_FROM_DATABASE=MegaRAID 12GSAS/PCIe Secure SAS39xx (PERC H755 Adapter)
pci:v00001002d000015D8sv0000103Csd00008615*
ID_MODEL_FROM_DATABASE=Picasso (Pavilion Laptop 15-cw1xxx)
+pci:v00001002d000015D8sv000017AAsd00003181*
+ ID_MODEL_FROM_DATABASE=Picasso (ThinkCentre M75n IoT)
+
pci:v00001002d000015D8sv000017AAsd00005124*
ID_MODEL_FROM_DATABASE=Picasso (ThinkPad E595)
ID_MODEL_FROM_DATABASE=R423 [Radeon X800 XT]
pci:v00001002d00006600*
- ID_MODEL_FROM_DATABASE=Mars [Radeon HD 8670A/8670M/8750M]
+ ID_MODEL_FROM_DATABASE=Mars [Radeon HD 8670A/8670M/8750M / R7 M370]
pci:v00001002d00006600sv0000103Csd00001952*
- ID_MODEL_FROM_DATABASE=Mars [Radeon HD 8670A/8670M/8750M] (ProBook 455 G1)
+ ID_MODEL_FROM_DATABASE=Mars [Radeon HD 8670A/8670M/8750M / R7 M370] (ProBook 455 G1)
pci:v00001002d00006601*
ID_MODEL_FROM_DATABASE=Mars [Radeon HD 8730M]
ID_MODEL_FROM_DATABASE=Oland GL [FirePro W2100 / Barco MXRT 2600]
pci:v00001002d00006610*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250/350]
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X OEM / R7 250/350/350X OEM]
pci:v00001002d00006610sv00001019sd00000030*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250/350] (Radeon HD 8670)
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X OEM / R7 250/350/350X OEM] (Radeon HD 8670)
+
+pci:v00001002d00006610sv00001028sd00000081*
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X OEM / R7 250/350/350X OEM] (Radeon R7 350X OEM)
+
+pci:v00001002d00006610sv00001028sd00000083*
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X OEM / R7 250/350/350X OEM] (Radeon R5 340X OEM)
pci:v00001002d00006610sv00001028sd00002120*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250/350] (Radeon R7 250)
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X OEM / R7 250/350/350X OEM] (Radeon R7 250)
pci:v00001002d00006610sv00001028sd00002322*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250/350] (Radeon R7 250)
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X OEM / R7 250/350/350X OEM] (Radeon R7 250)
pci:v00001002d00006610sv00001462sd00002910*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250/350] (Radeon HD 8670)
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X OEM / R7 250/350/350X OEM] (Radeon HD 8670)
pci:v00001002d00006610sv00001462sd00002911*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250/350] (Radeon HD 8670)
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X OEM / R7 250/350/350X OEM] (Radeon HD 8670)
pci:v00001002d00006610sv0000148Csd00007350*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250/350] (Radeon R7 350)
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X OEM / R7 250/350/350X OEM] (Radeon R7 350)
pci:v00001002d00006610sv00001642sd00003C81*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250/350] (Radeon HD 8670)
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X OEM / R7 250/350/350X OEM] (Radeon HD 8670)
pci:v00001002d00006610sv00001642sd00003C91*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250/350] (Radeon HD 8670)
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X OEM / R7 250/350/350X OEM] (Radeon HD 8670)
pci:v00001002d00006610sv00001642sd00003F09*
- ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250/350] (Radeon R7 350)
+ ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R5 340X OEM / R7 250/350/350X OEM] (Radeon R7 350)
pci:v00001002d00006611*
ID_MODEL_FROM_DATABASE=Oland [Radeon HD 8570 / R5 430 OEM / R7 240/340 / Radeon 520 OEM]
+pci:v00001002d00006611sv00001028sd00001001*
+ ID_MODEL_FROM_DATABASE=Oland [Radeon HD 8570 / R5 430 OEM / R7 240/340 / Radeon 520 OEM] (Radeon R5 430 OEM (1024 MByte))
+
+pci:v00001002d00006611sv00001028sd00001002*
+ ID_MODEL_FROM_DATABASE=Oland [Radeon HD 8570 / R5 430 OEM / R7 240/340 / Radeon 520 OEM] (Radeon R5 430 OEM (2048 MByte))
+
+pci:v00001002d00006611sv00001028sd00001711*
+ ID_MODEL_FROM_DATABASE=Oland [Radeon HD 8570 / R5 430 OEM / R7 240/340 / Radeon 520 OEM] (R5 430 OEM (2048 MByte))
+
pci:v00001002d00006611sv00001028sd0000210B*
ID_MODEL_FROM_DATABASE=Oland [Radeon HD 8570 / R5 430 OEM / R7 240/340 / Radeon 520 OEM] (Radeon R5 240 OEM)
+pci:v00001002d00006611sv00001028sd00002121*
+ ID_MODEL_FROM_DATABASE=Oland [Radeon HD 8570 / R5 430 OEM / R7 240/340 / Radeon 520 OEM] (Radeon HD 8570 OEM)
+
+pci:v00001002d00006611sv000010CFsd00001889*
+ ID_MODEL_FROM_DATABASE=Oland [Radeon HD 8570 / R5 430 OEM / R7 240/340 / Radeon 520 OEM] (Radeon HD 8570 OEM)
+
pci:v00001002d00006611sv00001642sd00001869*
ID_MODEL_FROM_DATABASE=Oland [Radeon HD 8570 / R5 430 OEM / R7 240/340 / Radeon 520 OEM] (Radeon 520 OEM)
ID_MODEL_FROM_DATABASE=Turks GL [FirePro V4900]
pci:v00001002d00006749sv000015C3sd00002B06*
- ID_MODEL_FROM_DATABASE=Turks GL [FirePro V4900] (MED-X4900)
+ ID_MODEL_FROM_DATABASE=Turks GL [FirePro V4900] (MED-X4900 (EIZO))
pci:v00001002d0000674A*
ID_MODEL_FROM_DATABASE=Turks GL [FirePro V3900]
ID_MODEL_FROM_DATABASE=Turks XT [Radeon HD 6670/7670] (Radeon HD 6670)
pci:v00001002d00006759*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550]
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230]
pci:v00001002d00006759sv0000103Csd00003130*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 6570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 6570)
pci:v00001002d00006759sv00001043sd00000403*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 6570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 6570)
pci:v00001002d00006759sv00001462sd00002500*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 6570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 6570)
pci:v00001002d00006759sv00001462sd00002509*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 7570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 7570)
pci:v00001002d00006759sv0000148Csd00007570*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 7570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 7570)
pci:v00001002d00006759sv00001642sd00003A67*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 6570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 6570)
pci:v00001002d00006759sv00001682sd00003280*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 7570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 7570)
pci:v00001002d00006759sv00001682sd00003530*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 8550)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 8550)
+
+pci:v00001002d00006759sv00001682sd00005230*
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon R5 230 series)
+
+pci:v00001002d00006759sv00001682sd00006450*
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 6450 series)
pci:v00001002d00006759sv0000174Bsd00007570*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 7570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 7570)
+
+pci:v00001002d00006759sv0000174Bsd00008550*
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD8550 OEM)
+
+pci:v00001002d00006759sv0000174Bsd00008570*
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD8550 OEM)
pci:v00001002d00006759sv0000174Bsd0000E142*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 6570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 6570)
pci:v00001002d00006759sv0000174Bsd0000E181*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 6570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 6570)
+
+pci:v00001002d00006759sv00001787sd0000A230*
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon R5 230 series)
+
+pci:v00001002d00006759sv00001787sd0000A450*
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 6450 series)
pci:v00001002d00006759sv00001B0Asd0000908F*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 6570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 6570)
pci:v00001002d00006759sv00001B0Asd00009090*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 6570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 6570)
pci:v00001002d00006759sv00001B0Asd00009091*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 6570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 6570)
pci:v00001002d00006759sv00001B0Asd00009092*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 6570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 6570)
pci:v00001002d00006759sv00001B0Asd0000909E*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 6570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 6570)
pci:v00001002d00006759sv00001B0Asd000090B5*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 7570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 7570)
pci:v00001002d00006759sv00001B0Asd000090B6*
- ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550] (Radeon HD 7570)
+ ID_MODEL_FROM_DATABASE=Turks PRO [Radeon HD 6570/7570/8550 / R5 230] (Radeon HD 7570)
pci:v00001002d0000675B*
ID_MODEL_FROM_DATABASE=Turks [Radeon HD 7600 Series]
pci:v00001002d00007312*
ID_MODEL_FROM_DATABASE=Navi 10 [Radeon Pro W5700]
+pci:v00001002d00007314*
+ ID_MODEL_FROM_DATABASE=Navi 10 USB
+
pci:v00001002d0000731F*
ID_MODEL_FROM_DATABASE=Navi 10 [Radeon RX 5600 OEM/5600 XT / 5700/5700 XT]
ID_MODEL_FROM_DATABASE=Navi 14 [Radeon Pro W5300M]
pci:v00001002d00007360*
- ID_MODEL_FROM_DATABASE=Navi 12 [Radeon Pro 5600M]
+ ID_MODEL_FROM_DATABASE=Navi 12 [Radeon Pro 5600M / V520]
+
+pci:v00001002d00007362*
+ ID_MODEL_FROM_DATABASE=Navi 12 [Radeon Pro V520]
pci:v00001002d00007388*
ID_MODEL_FROM_DATABASE=Arcturus GL-XL
pci:v00001002d0000738E*
ID_MODEL_FROM_DATABASE=Arcturus GL-XL
+pci:v00001002d000073A4*
+ ID_MODEL_FROM_DATABASE=Navi 21 USB
+
+pci:v00001002d000073AF*
+ ID_MODEL_FROM_DATABASE=Navi 21 [Radeon RX 6900 XT]
+
pci:v00001002d000073BF*
ID_MODEL_FROM_DATABASE=Navi 21 [Radeon RX 6800/6800 XT / 6900 XT]
pci:v00001002d000073C3*
ID_MODEL_FROM_DATABASE=Navi 22
+pci:v00001002d000073C4*
+ ID_MODEL_FROM_DATABASE=Navi 22 USB
+
pci:v00001002d000073DF*
- ID_MODEL_FROM_DATABASE=Navi 22
+ ID_MODEL_FROM_DATABASE=Navi 22 [Radeon RX 6700/6700 XT / 6800M]
pci:v00001002d000073E0*
ID_MODEL_FROM_DATABASE=Navi 23
-pci:v00001002d000073FF*
+pci:v00001002d000073E1*
ID_MODEL_FROM_DATABASE=Navi 23
+pci:v00001002d000073E4*
+ ID_MODEL_FROM_DATABASE=Navi 23 USB
+
+pci:v00001002d000073FF*
+ ID_MODEL_FROM_DATABASE=Navi 23 [Radeon RX 6600/6600 XT]
+
pci:v00001002d00007833*
ID_MODEL_FROM_DATABASE=RS350 Host Bridge
ID_MODEL_FROM_DATABASE=PBXGB [TGA2]
pci:v00001011d0000000F*
- ID_MODEL_FROM_DATABASE=DEFPA FDDI PCI-to-PDQ Interface Chip [PFI]
+ ID_MODEL_FROM_DATABASE=PCI-to-PDQ Interface Chip [PFI] FDDI (DEFPA)
pci:v00001011d0000000Fsv00001011sd0000DEF1*
- ID_MODEL_FROM_DATABASE=DEFPA FDDI PCI-to-PDQ Interface Chip [PFI] (FDDI controller (DEFPA))
+ ID_MODEL_FROM_DATABASE=PCI-to-PDQ Interface Chip [PFI] FDDI (DEFPA) (FDDIcontroller/PCI (DEFPA))
pci:v00001011d0000000Fsv0000103Csd0000DEF1*
- ID_MODEL_FROM_DATABASE=DEFPA FDDI PCI-to-PDQ Interface Chip [PFI] (FDDI controller (3X-DEFPA))
+ ID_MODEL_FROM_DATABASE=PCI-to-PDQ Interface Chip [PFI] FDDI (DEFPA) (FDDIcontroller/PCI (3X-DEFPA))
pci:v00001011d00000014*
ID_MODEL_FROM_DATABASE=DECchip 21041 [Tulip Pass 3]
ID_MODEL_FROM_DATABASE=DECchip 21041 [Tulip Pass 3] (DE-530+)
pci:v00001011d00000016*
- ID_MODEL_FROM_DATABASE=DGLPB [OPPO]
+ ID_MODEL_FROM_DATABASE=ATMworks 350 Adapter [OPPO] (DGLPB)
pci:v00001011d00000017*
ID_MODEL_FROM_DATABASE=PV-PCI Graphics Controller (ZLXp-L)
ID_MODEL_FROM_DATABASE=79c970 [PCnet32 LANCE] (PC7 mainboard)
pci:v00001022d00002001*
- ID_MODEL_FROM_DATABASE=79c978 [HomePNA]
+ ID_MODEL_FROM_DATABASE=Am79C978 PCnet Home (HomePNA) 1/10 PCI Ethernet Adapter [Am79C971 PHY]
pci:v00001022d00002001sv00001092sd00000A78*
- ID_MODEL_FROM_DATABASE=79c978 [HomePNA] (Multimedia Home Network Adapter)
+ ID_MODEL_FROM_DATABASE=Am79C978 PCnet Home (HomePNA) 1/10 PCI Ethernet Adapter [Am79C971 PHY] (Multimedia Home Network Adapter)
pci:v00001022d00002001sv00001668sd00000299*
- ID_MODEL_FROM_DATABASE=79c978 [HomePNA] (ActionLink Home Network Adapter)
+ ID_MODEL_FROM_DATABASE=Am79C978 PCnet Home (HomePNA) 1/10 PCI Ethernet Adapter [Am79C971 PHY] (ActionLink Home Network Adapter)
pci:v00001022d00002003*
ID_MODEL_FROM_DATABASE=Am 1771 MBW [Alchemy]
pci:v00001022d0000209A*
ID_MODEL_FROM_DATABASE=CS5536 [Geode companion] IDE
+pci:v00001022d00002625*
+ ID_MODEL_FROM_DATABASE=Am79C973 [Lance/PCI PCNet/32]
+
+pci:v00001022d00002627*
+ ID_MODEL_FROM_DATABASE=Am79C975 [Lance/PCI PCNet/32]
+
pci:v00001022d00003000*
ID_MODEL_FROM_DATABASE=ELanSC520 Microcontroller
pci:v0000106Bd00000007*
ID_MODEL_FROM_DATABASE=O'Hare I/O
+pci:v0000106Bd0000000B*
+ ID_MODEL_FROM_DATABASE=Apple Camera
+
pci:v0000106Bd0000000C*
ID_MODEL_FROM_DATABASE=DOS on Mac
ID_MODEL_FROM_DATABASE=NV35 [GeForce FX 5900XT]
pci:v000010DEd00000333*
- ID_MODEL_FROM_DATABASE=NV38 [GeForce FX 5950 Ultra]
+ ID_MODEL_FROM_DATABASE=NV38 [GeForce FX 5950 Ultra / PCX 5950]
pci:v000010DEd00000334*
ID_MODEL_FROM_DATABASE=NV35 [GeForce FX 5900ZT]
pci:v000010DEd00001F0A*
ID_MODEL_FROM_DATABASE=TU106 [GeForce GTX 1650]
+pci:v000010DEd00001F0B*
+ ID_MODEL_FROM_DATABASE=TU106 [CMP 40HX]
+
pci:v000010DEd00001F10*
ID_MODEL_FROM_DATABASE=TU106M [GeForce RTX 2070 Mobile]
pci:v000010DEd00002188*
ID_MODEL_FROM_DATABASE=TU116 [GeForce GTX 1650]
+pci:v000010DEd00002189*
+ ID_MODEL_FROM_DATABASE=TU116 [CMP 30HX]
+
pci:v000010DEd00002191*
ID_MODEL_FROM_DATABASE=TU116M [GeForce GTX 1660 Ti Mobile]
pci:v000010DEd000021D1*
ID_MODEL_FROM_DATABASE=TU116BM [GeForce GTX 1660 Ti Mobile]
+pci:v000010DEd00002200*
+ ID_MODEL_FROM_DATABASE=GA102
+
pci:v000010DEd00002204*
ID_MODEL_FROM_DATABASE=GA102 [GeForce RTX 3090]
pci:v000010DEd00002205*
- ID_MODEL_FROM_DATABASE=GA102 [GeForce RTX 3080 Ti]
+ ID_MODEL_FROM_DATABASE=GA102 [GeForce RTX 3080 20GB]
pci:v000010DEd00002206*
ID_MODEL_FROM_DATABASE=GA102 [GeForce RTX 3080]
pci:v000010DEd00002206sv00001462sd00003892*
ID_MODEL_FROM_DATABASE=GA102 [GeForce RTX 3080] (RTX 3080 10GB GAMING X TRIO)
+pci:v000010DEd00002208*
+ ID_MODEL_FROM_DATABASE=GA102 [GeForce RTX 3080 Ti]
+
pci:v000010DEd0000222B*
ID_MODEL_FROM_DATABASE=GA102 [GeForce RTX 3090 Engineering Sample]
pci:v000010DEd00002230*
ID_MODEL_FROM_DATABASE=GA102GL [RTX A6000]
+pci:v000010DEd00002231*
+ ID_MODEL_FROM_DATABASE=GA102GL
+
pci:v000010DEd00002235*
ID_MODEL_FROM_DATABASE=GA102GL [RTX A40]
pci:v000010DEd00002236*
ID_MODEL_FROM_DATABASE=GA102GL
+pci:v000010DEd00002237*
+ ID_MODEL_FROM_DATABASE=GA102GL
+
pci:v000010DEd0000223F*
ID_MODEL_FROM_DATABASE=GA102GL
pci:v000010DEd0000228B*
ID_MODEL_FROM_DATABASE=GA104 High Definition Audio Controller
+pci:v000010DEd00002302*
+ ID_MODEL_FROM_DATABASE=GA103
+
pci:v000010DEd00002321*
ID_MODEL_FROM_DATABASE=GA103
pci:v000010DEd00002583*
ID_MODEL_FROM_DATABASE=GA107 [GeForce RTX 3050]
+pci:v000010DEd000025A0*
+ ID_MODEL_FROM_DATABASE=GA107M [GeForce RTX 3050 Ti Mobile]
+
pci:v000010DEd000025A2*
- ID_MODEL_FROM_DATABASE=GA107
+ ID_MODEL_FROM_DATABASE=GA107M [GeForce RTX 3050 Mobile]
pci:v000010DEd000025A4*
ID_MODEL_FROM_DATABASE=GA107
pci:v000010ECd00008168sv00001028sd000004DA*
ID_MODEL_FROM_DATABASE=RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (Vostro 3750)
+pci:v000010ECd00008168sv00001028sd000005D7*
+ ID_MODEL_FROM_DATABASE=RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (Alienware X51 R2)
+
pci:v000010ECd00008168sv00001028sd000006F2*
ID_MODEL_FROM_DATABASE=RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (Latitude 3470)
ID_MODEL_FROM_DATABASE=K8T890CF Host Bridge
pci:v00001106d00000353*
- ID_MODEL_FROM_DATABASE=VX800 Host Bridge
+ ID_MODEL_FROM_DATABASE=VX800/820-Series Chipset Host-Bridge Controller
pci:v00001106d00000364*
ID_MODEL_FROM_DATABASE=CN896/VN896/P4M900 Host Bridge
ID_MODEL_FROM_DATABASE=VX855/VX875 Host Bridge: Host Control
pci:v00001106d00000410*
- ID_MODEL_FROM_DATABASE=VX900 Host Bridge: Host Control
+ ID_MODEL_FROM_DATABASE=VX900 Series Host Bridge: Host Control
pci:v00001106d00000415*
ID_MODEL_FROM_DATABASE=VT6415 PATA IDE Host Controller
ID_MODEL_FROM_DATABASE=VT82C576 3V [Apollo Master]
pci:v00001106d00000581*
- ID_MODEL_FROM_DATABASE=CX700/VX700 RAID Controller
+ ID_MODEL_FROM_DATABASE=CX700/VX700/VX800/820-Series Serial ATA RAID-Controller
pci:v00001106d00000581sv00001106sd00000581*
- ID_MODEL_FROM_DATABASE=CX700/VX700 RAID Controller (Wrong IDE ID)
+ ID_MODEL_FROM_DATABASE=CX700/VX700/VX800/820-Series Serial ATA RAID-Controller (Wrong IDE ID)
pci:v00001106d00000585*
ID_MODEL_FROM_DATABASE=VT82C585VP [Apollo VP1/VPX]
ID_MODEL_FROM_DATABASE=CN700/VN800/P4M800CE/Pro Host Bridge
pci:v00001106d00001324*
- ID_MODEL_FROM_DATABASE=CX700/VX700 Host Bridge
+ ID_MODEL_FROM_DATABASE=CX700/VX700-Series Error Reporting
pci:v00001106d00001327*
ID_MODEL_FROM_DATABASE=P4M890 Host Bridge
ID_MODEL_FROM_DATABASE=VX855/VX875 Error Reporting
pci:v00001106d00001410*
- ID_MODEL_FROM_DATABASE=VX900 Error Reporting
+ ID_MODEL_FROM_DATABASE=VX900 Series Error Reporting
pci:v00001106d00001571*
ID_MODEL_FROM_DATABASE=VT82C576M/VT82C586
ID_MODEL_FROM_DATABASE=CN700/VN800/P4M800CE/Pro Host Bridge
pci:v00001106d00002324*
- ID_MODEL_FROM_DATABASE=CX700/VX700 Host Bridge
+ ID_MODEL_FROM_DATABASE=CX700/VX700-Series Host Interface Control
pci:v00001106d00002327*
ID_MODEL_FROM_DATABASE=P4M890 Host Bridge
ID_MODEL_FROM_DATABASE=VX855/VX875 Host Bus Control
pci:v00001106d00002410*
- ID_MODEL_FROM_DATABASE=VX900 CPU Bus Controller
+ ID_MODEL_FROM_DATABASE=VX900 Series CPU Bus Controller
pci:v00001106d0000287A*
ID_MODEL_FROM_DATABASE=VT8251 PCI to PCI Bridge
ID_MODEL_FROM_DATABASE=CLE266
pci:v00001106d00003038*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller
pci:v00001106d00003038sv00000925sd00001234*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (onboard UHCI USB 1.1 Controller)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (onboard UHCI USB 1.1 Controller)
pci:v00001106d00003038sv00001019sd00000985*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (P6VXA Motherboard)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (P6VXA Motherboard)
pci:v00001106d00003038sv00001019sd00000A81*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (L7VTA v1.0 Motherboard (KT400-8235))
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (L7VTA v1.0 Motherboard (KT400-8235))
pci:v00001106d00003038sv00001043sd00008080*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (A7V333 motherboard)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (A7V333 motherboard)
pci:v00001106d00003038sv00001043sd0000808C*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (VT6202 USB2.0 4 port controller)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (VT62xx USB1.1 4 port controller)
pci:v00001106d00003038sv00001043sd000080A1*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (A7V8X-X motherboard)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (A7V8X-X motherboard)
pci:v00001106d00003038sv00001043sd000080ED*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (A7V600/K8V-X/A8V Deluxe motherboard)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (A7V600/K8V-X/A8V Deluxe motherboard)
pci:v00001106d00003038sv00001179sd00000001*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (Magnia Z310)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (Magnia Z310)
+
+pci:v00001106d00003038sv00001234sd00000925*
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (MVP3 USB Controller)
pci:v00001106d00003038sv00001458sd00005004*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (GA-7VAX Mainboard)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (GA-7VAX Mainboard)
pci:v00001106d00003038sv00001462sd00005901*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (KT6 Delta-FIS2R (MS-6590))
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (KT6 Delta-FIS2R (MS-6590))
pci:v00001106d00003038sv00001462sd00007020*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (K8T NEO 2 motherboard)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (K8T NEO 2 motherboard)
pci:v00001106d00003038sv00001462sd00007094*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (K8T Neo2-F V2.0)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (K8T Neo2-F V2.0)
pci:v00001106d00003038sv00001462sd00007120*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (KT4AV motherboard)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (KT4AV motherboard)
pci:v00001106d00003038sv00001462sd00007181*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (K8MM3-V mainboard)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (K8MM3-V mainboard)
pci:v00001106d00003038sv0000147Bsd00001407*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (KV8-MAX3 motherboard)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (KV8-MAX3 motherboard)
pci:v00001106d00003038sv0000182Dsd0000201D*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (CN-029 USB2.0 4 port PCI Card)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (CN-029 USB2.0 4 port PCI Card)
pci:v00001106d00003038sv00001849sd00003038*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (K7VT series Motherboards)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (K7VT series Motherboards)
pci:v00001106d00003038sv000019DAsd0000A179*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (ZBOX nano VD01)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (ZBOX nano VD01)
pci:v00001106d00003038sv00001AF4sd00001100*
- ID_MODEL_FROM_DATABASE=VT82xx/62xx UHCI USB 1.1 Controller (QEMU Virtual Machine)
+ ID_MODEL_FROM_DATABASE=VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller (QEMU Virtual Machine)
pci:v00001106d00003040*
ID_MODEL_FROM_DATABASE=VT82C586B ACPI
ID_MODEL_FROM_DATABASE=VT8615 Host Bridge
pci:v00001106d00003104*
- ID_MODEL_FROM_DATABASE=USB 2.0
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller
pci:v00001106d00003104sv00000925sd00001234*
- ID_MODEL_FROM_DATABASE=USB 2.0 (onboard EHCI USB 2.0 Controller)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (onboard EHCI USB 2.0 Controller)
pci:v00001106d00003104sv00001019sd00000A81*
- ID_MODEL_FROM_DATABASE=USB 2.0 (L7VTA v1.0 Motherboard (KT400-8235))
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (L7VTA v1.0 Motherboard (KT400-8235))
pci:v00001106d00003104sv00001043sd0000808C*
- ID_MODEL_FROM_DATABASE=USB 2.0 (A7V8X motherboard)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (A7V8X motherboard)
pci:v00001106d00003104sv00001043sd000080A1*
- ID_MODEL_FROM_DATABASE=USB 2.0 (A7V8X-X motherboard rev 1.01)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (A7V8X-X motherboard rev 1.01)
pci:v00001106d00003104sv00001043sd000080ED*
- ID_MODEL_FROM_DATABASE=USB 2.0 (A7V600/K8V-X/A8V Deluxe motherboard)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (A7V600/K8V-X/A8V Deluxe motherboard)
pci:v00001106d00003104sv00001106sd00003104*
- ID_MODEL_FROM_DATABASE=USB 2.0 (Controller)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (USB 2.0 Controller)
pci:v00001106d00003104sv00001297sd0000F641*
- ID_MODEL_FROM_DATABASE=USB 2.0 (FX41 motherboard)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (FX41 motherboard)
pci:v00001106d00003104sv00001458sd00005004*
- ID_MODEL_FROM_DATABASE=USB 2.0 (GA-7VAX Mainboard)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (GA-7VAX Mainboard)
pci:v00001106d00003104sv00001462sd00005901*
- ID_MODEL_FROM_DATABASE=USB 2.0 (KT6 Delta-FIS2R (MS-6590))
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (KT6 Delta-FIS2R (MS-6590))
pci:v00001106d00003104sv00001462sd00007020*
- ID_MODEL_FROM_DATABASE=USB 2.0 (K8T NEO 2 motherboard)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (K8T NEO 2 motherboard)
pci:v00001106d00003104sv00001462sd00007094*
- ID_MODEL_FROM_DATABASE=USB 2.0 (K8T Neo2-F V2.0)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (K8T Neo2-F V2.0)
pci:v00001106d00003104sv00001462sd00007120*
- ID_MODEL_FROM_DATABASE=USB 2.0 (KT4AV motherboard)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (KT4AV motherboard)
pci:v00001106d00003104sv00001462sd00007181*
- ID_MODEL_FROM_DATABASE=USB 2.0 (K8MM3-V mainboard)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (K8MM3-V mainboard)
pci:v00001106d00003104sv0000147Bsd00001407*
- ID_MODEL_FROM_DATABASE=USB 2.0 (KV8-MAX3 motherboard)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (KV8-MAX3 motherboard)
pci:v00001106d00003104sv0000182Dsd0000201D*
- ID_MODEL_FROM_DATABASE=USB 2.0 (CN-029 USB 2.0 4 port PCI Card)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (CN-029 USB 2.0 4 port PCI Card)
pci:v00001106d00003104sv00001849sd00003104*
- ID_MODEL_FROM_DATABASE=USB 2.0 (K7VT series Motherboards)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (K7VT series Motherboards)
pci:v00001106d00003104sv000019DAsd0000A179*
- ID_MODEL_FROM_DATABASE=USB 2.0 (ZBOX nano VD01)
+ ID_MODEL_FROM_DATABASE=USB 2.0 EHCI-Compliant Host-Controller (ZBOX nano VD01)
pci:v00001106d00003106*
ID_MODEL_FROM_DATABASE=VT6105/VT6106S [Rhine-III]
ID_MODEL_FROM_DATABASE=VT8251 PCI to ISA Bridge
pci:v00001106d00003288*
- ID_MODEL_FROM_DATABASE=VT8237A/VT8251 HDA Controller
+ ID_MODEL_FROM_DATABASE=VX900/VT8xxx High Definition Audio Controller
pci:v00001106d00003288sv000019DAsd0000A179*
- ID_MODEL_FROM_DATABASE=VT8237A/VT8251 HDA Controller (ZBOX VD01)
+ ID_MODEL_FROM_DATABASE=VX900/VT8xxx High Definition Audio Controller (ZBOX VD01)
pci:v00001106d00003290*
ID_MODEL_FROM_DATABASE=K8M890 Host Bridge
ID_MODEL_FROM_DATABASE=P4M800 Host Bridge
pci:v00001106d00003324*
- ID_MODEL_FROM_DATABASE=CX700/VX700 Host Bridge
+ ID_MODEL_FROM_DATABASE=CX700/VX700-Series DRAM Bus Control
pci:v00001106d00003327*
ID_MODEL_FROM_DATABASE=P4M890 Host Bridge
ID_MODEL_FROM_DATABASE=VT3351 Host Bridge
pci:v00001106d00003353*
- ID_MODEL_FROM_DATABASE=VX800 PCI to PCI Bridge
+ ID_MODEL_FROM_DATABASE=VX800/820 PCI to PCI Bridge
pci:v00001106d00003364*
ID_MODEL_FROM_DATABASE=CN896/VN896/P4M900 Host Bridge
+pci:v00001106d00003365*
+ ID_MODEL_FROM_DATABASE=VT630x IEEE 1394 Host Controller [Fire II/M]
+
pci:v00001106d00003371*
ID_MODEL_FROM_DATABASE=CN896/VN896/P4M900 [Chrome 9 HC]
ID_MODEL_FROM_DATABASE=VX855/VX875 DRAM Bus Control
pci:v00001106d00003410*
- ID_MODEL_FROM_DATABASE=VX900 DRAM Bus Control
+ ID_MODEL_FROM_DATABASE=VX900 Series DRAM Bus Control
pci:v00001106d00003410sv000019DAsd0000A179*
- ID_MODEL_FROM_DATABASE=VX900 DRAM Bus Control (ZBOX nano VD01)
+ ID_MODEL_FROM_DATABASE=VX900 Series DRAM Bus Control (ZBOX nano VD01)
pci:v00001106d00003432*
- ID_MODEL_FROM_DATABASE=VL80x xHCI USB 3.0 Controller
+ ID_MODEL_FROM_DATABASE=VL800/801 xHCI USB 3.0 Controller
pci:v00001106d00003456*
ID_MODEL_FROM_DATABASE=VX11 Standard Host Bridge
ID_MODEL_FROM_DATABASE=VX11 Miscellaneous Bus
pci:v00001106d00003483*
- ID_MODEL_FROM_DATABASE=VL805 USB 3.0 Host Controller
+ ID_MODEL_FROM_DATABASE=VL805/806 xHCI USB 3.0 Controller
pci:v00001106d00003A01*
ID_MODEL_FROM_DATABASE=VX11 Graphics [Chrome 645/640]
ID_MODEL_FROM_DATABASE=CN700/VN800/P4M800CE/Pro Host Bridge
pci:v00001106d00004324*
- ID_MODEL_FROM_DATABASE=CX700/VX700 Host Bridge
+ ID_MODEL_FROM_DATABASE=CX700/VX700-Series Power Management and Testing Control
pci:v00001106d00004327*
ID_MODEL_FROM_DATABASE=P4M890 Host Bridge
ID_MODEL_FROM_DATABASE=VX855/VX875 Power Management Control
pci:v00001106d00004410*
- ID_MODEL_FROM_DATABASE=VX900 Power Management and Chip Testing Control
+ ID_MODEL_FROM_DATABASE=VX900 Series Power Management and Chip Testing Control
pci:v00001106d00004410sv000019DAsd0000A179*
- ID_MODEL_FROM_DATABASE=VX900 Power Management and Chip Testing Control (ZBOX nano VD01)
+ ID_MODEL_FROM_DATABASE=VX900 Series Power Management and Chip Testing Control (ZBOX nano VD01)
pci:v00001106d00005030*
ID_MODEL_FROM_DATABASE=VT82C596 ACPI [Apollo PRO]
ID_MODEL_FROM_DATABASE=PT894 I/O APIC Interrupt Controller
pci:v00001106d00005324*
- ID_MODEL_FROM_DATABASE=VX800 Serial ATA and EIDE Controller
+ ID_MODEL_FROM_DATABASE=CX700M2/VX700/VX800/820-Series Serial ATA & EIDE-Controller
pci:v00001106d00005327*
ID_MODEL_FROM_DATABASE=P4M890 I/O APIC Interrupt Controller
ID_MODEL_FROM_DATABASE=VX855/VX875 APIC and Central Traffic Control
pci:v00001106d00005410*
- ID_MODEL_FROM_DATABASE=VX900 APIC and Central Traffic Control
+ ID_MODEL_FROM_DATABASE=VX900 Series APIC and Central Traffic Control
pci:v00001106d00006100*
ID_MODEL_FROM_DATABASE=VT85C100A [Rhine II]
ID_MODEL_FROM_DATABASE=VX855/VX875 Scratch Registers
pci:v00001106d00006410*
- ID_MODEL_FROM_DATABASE=VX900 Scratch Registers
+ ID_MODEL_FROM_DATABASE=VX900 Series Scratch Registers
pci:v00001106d00006410sv000019DAsd0000A179*
- ID_MODEL_FROM_DATABASE=VX900 Scratch Registers (ZBOX nano VD01)
+ ID_MODEL_FROM_DATABASE=VX900 Series Scratch Registers (ZBOX nano VD01)
pci:v00001106d00007122*
ID_MODEL_FROM_DATABASE=VX900 Graphics [Chrome9 HD]
ID_MODEL_FROM_DATABASE=CN700/VN800/P4M800CE/Pro Host Bridge
pci:v00001106d00007324*
- ID_MODEL_FROM_DATABASE=CX700/VX700 Host Bridge
+ ID_MODEL_FROM_DATABASE=CX700/VX700-Series North-South Module Interface Control
pci:v00001106d00007327*
ID_MODEL_FROM_DATABASE=P4M890 Host Bridge
ID_MODEL_FROM_DATABASE=VX855/VX875 North-South Module Interface Control
pci:v00001106d00007410*
- ID_MODEL_FROM_DATABASE=VX900 North-South Module Interface Control
+ ID_MODEL_FROM_DATABASE=VX900 Series North-South Module Interface Control
pci:v00001106d00007410sv000019DAsd0000A179*
- ID_MODEL_FROM_DATABASE=VX900 North-South Module Interface Control (ZBOX nano VD01)
+ ID_MODEL_FROM_DATABASE=VX900 Series North-South Module Interface Control (ZBOX nano VD01)
pci:v00001106d00008231*
ID_MODEL_FROM_DATABASE=VT8231 [PCI-to-ISA Bridge]
ID_MODEL_FROM_DATABASE=VT8363/8365 [KT133/KM133 AGP]
pci:v00001106d00008324*
- ID_MODEL_FROM_DATABASE=CX700/VX700 PCI to ISA Bridge
+ ID_MODEL_FROM_DATABASE=CX700/VX700-Series Bus Control and Power Management
pci:v00001106d00008353*
ID_MODEL_FROM_DATABASE=VX800/VX820 Bus Control and Power Management
ID_MODEL_FROM_DATABASE=VX855/VX875 Bus Control and Power Management
pci:v00001106d00008410*
- ID_MODEL_FROM_DATABASE=VX900 Bus Control and Power Management
+ ID_MODEL_FROM_DATABASE=VX900 Series Bus Control and Power Management
pci:v00001106d00008410sv000019DAsd0000A179*
- ID_MODEL_FROM_DATABASE=VX900 Bus Control and Power Management (ZBOX VD01)
+ ID_MODEL_FROM_DATABASE=VX900 Series Bus Control and Power Management (ZBOX VD01)
pci:v00001106d00008500*
ID_MODEL_FROM_DATABASE=KLE133/PLE133/PLE133T
ID_MODEL_FROM_DATABASE=KM266/P4M266/P4M266A/P4N266 [S3 ProSavageDDR]
pci:v00001106d00009001*
- ID_MODEL_FROM_DATABASE=VX900 Serial ATA Controller
+ ID_MODEL_FROM_DATABASE=VX900 Series Serial-ATA Controller
pci:v00001106d00009082*
ID_MODEL_FROM_DATABASE=Standard AHCI 1.0 SATA Controller
ID_MODEL_FROM_DATABASE=USB3.0 Controller
pci:v00001106d00009530*
- ID_MODEL_FROM_DATABASE=Secure Digital Memory Card Controller
+ ID_MODEL_FROM_DATABASE=VX800/820/900 Series Secure Digital Memory Card Controller
pci:v00001106d000095D0*
- ID_MODEL_FROM_DATABASE=SDIO Host Controller
+ ID_MODEL_FROM_DATABASE=VX800/820/900 Series SDIO Host Controller
pci:v00001106d0000A208*
ID_MODEL_FROM_DATABASE=PT890 PCI to PCI Bridge Controller
ID_MODEL_FROM_DATABASE=P4M890 PCI to PCI Bridge Controller
pci:v00001106d0000A353*
- ID_MODEL_FROM_DATABASE=VX8xx South-North Module Interface Control
+ ID_MODEL_FROM_DATABASE=VX8xx/900 Series South-North Module Interface Control
pci:v00001106d0000A364*
ID_MODEL_FROM_DATABASE=CN896/VN896/P4M900 PCI to PCI Bridge Controller
pci:v00001106d0000A409*
- ID_MODEL_FROM_DATABASE=VX855/VX875 USB Device Controller
+ ID_MODEL_FROM_DATABASE=VX855/VX875/VX900 Series USB Device Controller
pci:v00001106d0000A410*
- ID_MODEL_FROM_DATABASE=VX900 PCI Express Root Port 0
+ ID_MODEL_FROM_DATABASE=VX900 Series PCI Express Root Port 0
pci:v00001106d0000B091*
ID_MODEL_FROM_DATABASE=VT8633 [Apollo Pro266 AGP]
ID_MODEL_FROM_DATABASE=VT8237/8251 PCI bridge [K8M890/K8T800/K8T890 South] (KV8-MAX3 motherboard)
pci:v00001106d0000B198*
- ID_MODEL_FROM_DATABASE=VT8237/VX700 PCI Bridge
+ ID_MODEL_FROM_DATABASE=VT8237/CX700/VX700-Series PCI to PCI Bridge
pci:v00001106d0000B213*
ID_MODEL_FROM_DATABASE=VPX/VPX2 I/O APIC Interrupt Controller
ID_MODEL_FROM_DATABASE=VX855/VX875/VX900 PCI to PCI Bridge
pci:v00001106d0000B410*
- ID_MODEL_FROM_DATABASE=VX900 PCI Express Root Port 1
+ ID_MODEL_FROM_DATABASE=VX900 Series PCI Express Root Port 1
pci:v00001106d0000B999*
ID_MODEL_FROM_DATABASE=[K8T890 North / VT8237 South] PCI Bridge
ID_MODEL_FROM_DATABASE=PT900 PCI to PCI Bridge Controller
pci:v00001106d0000C353*
- ID_MODEL_FROM_DATABASE=VX800/VX820 PCI Express Root Port
+ ID_MODEL_FROM_DATABASE=VX800/820-Series PCI-Express Root (PCI-to-PCI Virtual Bridge)
pci:v00001106d0000C364*
ID_MODEL_FROM_DATABASE=CN896/VN896/P4M900 PCI to PCI Bridge Controller
ID_MODEL_FROM_DATABASE=VX855/VX875 EIDE Controller
pci:v00001106d0000C410*
- ID_MODEL_FROM_DATABASE=VX900 PCI Express Root Port 2
+ ID_MODEL_FROM_DATABASE=VX900 Series PCI Express Root Port 2
pci:v00001106d0000D104*
ID_MODEL_FROM_DATABASE=VT8237R USB UDCI Controller
ID_MODEL_FROM_DATABASE=PT900 PCI to PCI Bridge Controller
pci:v00001106d0000D410*
- ID_MODEL_FROM_DATABASE=VX900 PCI Express Root Port 3
+ ID_MODEL_FROM_DATABASE=VX900 Series PCI Express Root Port 3
pci:v00001106d0000E208*
ID_MODEL_FROM_DATABASE=PT890 PCI to PCI Bridge Controller
ID_MODEL_FROM_DATABASE=PT900 PCI to PCI Bridge Controller
pci:v00001106d0000E353*
- ID_MODEL_FROM_DATABASE=VX800/VX820 PCI Express Root Port
+ ID_MODEL_FROM_DATABASE=VX800/820-Series PCI-Express Root Port 0
pci:v00001106d0000E410*
- ID_MODEL_FROM_DATABASE=VX900 PCI Express Physical Layer Electrical Sub-block
+ ID_MODEL_FROM_DATABASE=VX900 Series PCI Express Physical Layer Electrical Sub-block
pci:v00001106d0000F208*
ID_MODEL_FROM_DATABASE=PT890 PCI to PCI Bridge Controller
ID_MODEL_FROM_DATABASE=PT900 PCI to PCI Bridge Controller
pci:v00001106d0000F353*
- ID_MODEL_FROM_DATABASE=VX800/VX820 PCI Express Root Port
+ ID_MODEL_FROM_DATABASE=VX800/820-Series PCI-Express Root Port 1
+
+pci:v00001106d0000F410*
+ ID_MODEL_FROM_DATABASE=VX900 Series PCI UART Port 0-3
pci:v00001107*
ID_VENDOR_FROM_DATABASE=Stratus Computers
ID_MODEL_FROM_DATABASE=POET PSDMS Device
pci:v00001135*
- ID_VENDOR_FROM_DATABASE=Fuji Xerox Co Ltd
+ ID_VENDOR_FROM_DATABASE=FUJIFILM Business Innovation Corp.
pci:v00001135d00000001*
ID_MODEL_FROM_DATABASE=Printer controller
pci:v000011AB*
ID_VENDOR_FROM_DATABASE=Marvell Technology Group Ltd.
+pci:v000011ABd00000100*
+ ID_MODEL_FROM_DATABASE=88F3700 [Armada 3700 Family] ARM SoC
+
pci:v000011ABd00000146*
ID_MODEL_FROM_DATABASE=GT-64010/64010A System Controller
pci:v000011ABd00006485*
ID_MODEL_FROM_DATABASE=MV64460/64461/64462 System Controller, Revision B
+pci:v000011ABd00006820*
+ ID_MODEL_FROM_DATABASE=88F6820 [Armada 385] ARM SoC
+
+pci:v000011ABd00006828*
+ ID_MODEL_FROM_DATABASE=88F6828 [Armada 388] ARM SoC
+
pci:v000011ABd00007042*
ID_MODEL_FROM_DATABASE=88SX7042 PCI-e 4-port SATA-II
ID_MODEL_FROM_DATABASE=LNE100TX
pci:v000011ADd00000002sv00001385sd0000F004*
- ID_MODEL_FROM_DATABASE=LNE100TX (FA310TX)
+ ID_MODEL_FROM_DATABASE=LNE100TX (FA310/TX LAN 10/100 PCI Ethernet Adapter)
pci:v000011ADd00000002sv00002646sd0000F002*
ID_MODEL_FROM_DATABASE=LNE100TX (KNE110TX EtheRx Fast Ethernet)
pci:v000011F8d00008546*
ID_MODEL_FROM_DATABASE=PM8546 B-FEIP PSX 96xG3 PCIe Storage Switch
+pci:v000011F8d00008562*
+ ID_MODEL_FROM_DATABASE=PM8562 Switchtec PFX-L 32xG3 Fanout-Lite PCIe Gen3 Switch
+
pci:v000011F9*
ID_VENDOR_FROM_DATABASE=I-Cube Inc
pci:v00001414d00000002*
ID_MODEL_FROM_DATABASE=MN-130 (ADMtek Centaur-P based)
+pci:v00001414d0000008C*
+ ID_MODEL_FROM_DATABASE=Basic Render Driver
+
pci:v00001414d00005353*
ID_MODEL_FROM_DATABASE=Hyper-V virtual VGA
pci:v0000144Dd0000A824sv00001028sd00002099*
ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (EMC PowerEdge Express Flash Ent NVMe AGN SED RI U.2 Gen4 7.68TB)
+pci:v0000144Dd0000A824sv00001028sd00002118*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN FIPS MU U.2 1.6TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002119*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN MU U.2 1.6TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002120*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN FIPS MU U.2 3.2T)
+
+pci:v0000144Dd0000A824sv00001028sd00002121*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN MU U.2 3.2TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002122*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN FIPS MU U.2 6.4TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002123*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN MU U.2 6.4TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002124*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN FIPS MU U.2 6.4TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002125*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN MU U.2 12.8TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002126*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN FIPS RI U.2 1.92TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002127*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN RI U.2 1.92TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002128*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN FIPS RI U.2 3.84TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002129*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN RI U.2 3.84TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002130*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN FIPS RI U.2 7.68TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002131*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN RI U.2 7.68TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002132*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN FIPS RI U.2 15.36TB)
+
+pci:v0000144Dd0000A824sv00001028sd00002133*
+ ID_MODEL_FROM_DATABASE=NVMe SSD Controller PM173X (Ent NVMe v2 AGN RI U.2 15.36TB)
+
pci:v0000144Dd0000ECEC*
ID_MODEL_FROM_DATABASE=Exynos 8895 PCIe Root Complex
pci:v00001458*
ID_VENDOR_FROM_DATABASE=Gigabyte Technology Co., Ltd
+pci:v00001458d00003483*
+ ID_MODEL_FROM_DATABASE=USB 3.0 Controller (VIA VL80x-based xHCI Controller)
+
pci:v00001459*
ID_VENDOR_FROM_DATABASE=DOOIN Electronics
pci:v00001462*
ID_VENDOR_FROM_DATABASE=Micro-Star International Co., Ltd. [MSI]
+pci:v00001462d00003483*
+ ID_MODEL_FROM_DATABASE=MSI USB 3.0 (VIA VL80x-based xHCI USB Controller)
+
pci:v00001462d0000AAF0*
ID_MODEL_FROM_DATABASE=Radeon RX 580 Gaming X 8G
ID_MODEL_FROM_DATABASE=NetXtreme BCM5705M_2 Gigabit Ethernet (LifeBook E8010D)
pci:v000014E4d0000165F*
- ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 2-port Gigabit Ethernet PCIe
+ ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 Gigabit Ethernet PCIe
pci:v000014E4d0000165Fsv00001028sd000004F7*
- ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 2-port Gigabit Ethernet PCIe (PowerEdge R320 server)
+ ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 Gigabit Ethernet PCIe (PowerEdge R320 server)
pci:v000014E4d0000165Fsv00001028sd000008FD*
- ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 2-port Gigabit Ethernet PCIe (PowerEdge R6515/R7515 LOM)
+ ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 Gigabit Ethernet PCIe (PowerEdge R6515/R7515 LOM)
pci:v000014E4d0000165Fsv00001028sd000008FF*
- ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 2-port Gigabit Ethernet PCIe (PowerEdge Rx5xx LOM Board)
+ ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 Gigabit Ethernet PCIe (PowerEdge Rx5xx LOM Board)
pci:v000014E4d0000165Fsv00001028sd00000900*
- ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 2-port Gigabit Ethernet PCIe (PowerEdge C6525 LOM)
+ ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 Gigabit Ethernet PCIe (PowerEdge C6525 LOM)
pci:v000014E4d0000165Fsv0000103Csd00001786*
- ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 2-port Gigabit Ethernet PCIe (NC332T Adapter)
+ ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 Gigabit Ethernet PCIe (NC332T Adapter)
pci:v000014E4d0000165Fsv0000103Csd0000193D*
- ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 2-port Gigabit Ethernet PCIe (NC332i Adapter)
+ ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 Gigabit Ethernet PCIe (NC332i Adapter)
pci:v000014E4d0000165Fsv0000103Csd00002133*
- ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 2-port Gigabit Ethernet PCIe (NC332i Adapter)
+ ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 Gigabit Ethernet PCIe (NC332i Adapter)
pci:v000014E4d0000165Fsv0000103Csd000022E8*
- ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 2-port Gigabit Ethernet PCIe (NC332i Adapter)
+ ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 Gigabit Ethernet PCIe (NC332i Adapter)
pci:v000014E4d0000165Fsv0000103Csd000022EB*
- ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 2-port Gigabit Ethernet PCIe (NC332i Adapter)
+ ID_MODEL_FROM_DATABASE=NetXtreme BCM5720 Gigabit Ethernet PCIe (NC332i Adapter)
pci:v000014E4d00001662*
ID_MODEL_FROM_DATABASE=NetXtreme II BCM57712 10 Gigabit Ethernet
pci:v000014E4d000016D6*
ID_MODEL_FROM_DATABASE=BCM57412 NetXtreme-E 10Gb RDMA Ethernet Controller
+pci:v000014E4d000016D6sv000014E4sd00001202*
+ ID_MODEL_FROM_DATABASE=BCM57412 NetXtreme-E 10Gb RDMA Ethernet Controller (BCM957412M4122C OCP 1x25G Type1 wRoCE)
+
pci:v000014E4d000016D6sv000014E4sd00004120*
ID_MODEL_FROM_DATABASE=BCM57412 NetXtreme-E 10Gb RDMA Ethernet Controller (NetXtreme E-Series Advanced Dual-port 10Gb SFP+ Ethernet Network Daughter Card)
pci:v000014E4d000016D7*
ID_MODEL_FROM_DATABASE=BCM57414 NetXtreme-E 10Gb/25Gb RDMA Ethernet Controller
-pci:v000014E4d000016D7sv000014E4sd00001202*
- ID_MODEL_FROM_DATABASE=BCM57414 NetXtreme-E 10Gb/25Gb RDMA Ethernet Controller (BCM957412M4122C OCP 1x25G Type1 wRoCE)
-
pci:v000014E4d000016D7sv000014E4sd00001402*
ID_MODEL_FROM_DATABASE=BCM57414 NetXtreme-E 10Gb/25Gb RDMA Ethernet Controller (BCM957414A4142CC 10Gb/25Gb Ethernet PCIe)
pci:v000014E4d00001750sv000014E4sd00005208*
ID_MODEL_FROM_DATABASE=BCM57508 NetXtreme-E 10Gb/25Gb/40Gb/50Gb/100Gb/200Gb Ethernet (NetXtreme-E Dual-port 100G QSFP56 Ethernet OCP 3.0 Adapter (BCM957508-N2100G))
+pci:v000014E4d00001750sv000014E4sd0000DF24*
+ ID_MODEL_FROM_DATABASE=BCM57508 NetXtreme-E 10Gb/25Gb/40Gb/50Gb/100Gb/200Gb Ethernet (BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz Ethernet)
+
pci:v000014E4d00001751*
ID_MODEL_FROM_DATABASE=BCM57504 NetXtreme-E 10Gb/25Gb/40Gb/50Gb/100Gb/200Gb Ethernet
pci:v000014E4d00001802*
ID_MODEL_FROM_DATABASE=BCM57508 NetXtreme-E Ethernet Partition
+pci:v000014E4d00001802sv000014E4sd0000DF24*
+ ID_MODEL_FROM_DATABASE=BCM57508 NetXtreme-E Ethernet Partition (BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz Ethernet Partition)
+
pci:v000014E4d00001803*
ID_MODEL_FROM_DATABASE=BCM57502 NetXtreme-E RDMA Partition
ID_MODEL_FROM_DATABASE=BCM57504 NetXtreme-E RDMA Partition
pci:v000014E4d00001805*
- ID_MODEL_FROM_DATABASE=BCM57508 NetXtreme-E RDMA Partition
+ ID_MODEL_FROM_DATABASE=BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz RDMA Partition
+
+pci:v000014E4d00001805sv000014E4sd0000DF24*
+ ID_MODEL_FROM_DATABASE=BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz RDMA Partition (NetXtreme-E NGM2100D BCM57508 2x100G KR Mezz RDMA Partition)
pci:v000014E4d00001806*
ID_MODEL_FROM_DATABASE=BCM5750X NetXtreme-E Ethernet Virtual Function
+pci:v000014E4d00001806sv000014E4sd0000DF24*
+ ID_MODEL_FROM_DATABASE=BCM5750X NetXtreme-E Ethernet Virtual Function (BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz Ethernet Virtual Function)
+
pci:v000014E4d00001807*
ID_MODEL_FROM_DATABASE=BCM5750X NetXtreme-E RDMA Virtual Function
+pci:v000014E4d00001807sv000014E4sd0000DF24*
+ ID_MODEL_FROM_DATABASE=BCM5750X NetXtreme-E RDMA Virtual Function (BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz RDMA Virtual Function)
+
+pci:v000014E4d00001808*
+ ID_MODEL_FROM_DATABASE=BCM5750X NetXtreme-E Ethernet Virtual Function
+
+pci:v000014E4d00001808sv000014E4sd0000DF24*
+ ID_MODEL_FROM_DATABASE=BCM5750X NetXtreme-E Ethernet Virtual Function (BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz Ethernet Virtual Function)
+
+pci:v000014E4d00001809*
+ ID_MODEL_FROM_DATABASE=BCM5750X NetXtreme-E RDMA Virtual Function
+
+pci:v000014E4d00001809sv000014E4sd0000DF24*
+ ID_MODEL_FROM_DATABASE=BCM5750X NetXtreme-E RDMA Virtual Function (BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz RDMA Virtual Function)
+
pci:v000014E4d00002711*
ID_MODEL_FROM_DATABASE=BCM2711 PCIe Bridge
pci:v00001542d00009272*
ID_MODEL_FROM_DATABASE=Pulse Width Modulator Card
+pci:v00001542d00009273*
+ ID_MODEL_FROM_DATABASE=RCIM-IV Real-Time Clock & Interrupt Module (PCIe)
+
pci:v00001542d00009277*
ID_MODEL_FROM_DATABASE=5 Volt Delta Sigma Converter Card
pci:v000015B3d00001015sv0000193Dsd0000100A*
ID_MODEL_FROM_DATABASE=MT27710 Family [ConnectX-4 Lx] (620F-B)
+pci:v000015B3d00001015sv0000193Dsd00001023*
+ ID_MODEL_FROM_DATABASE=MT27710 Family [ConnectX-4 Lx] (NIC-ETH540F-LP-2P)
+
pci:v000015B3d00001015sv0000193Dsd00001031*
ID_MODEL_FROM_DATABASE=MT27710 Family [ConnectX-4 Lx] (NIC-ETH640i-Mb-2x25G)
+pci:v000015B3d00001015sv0000193Dsd00001083*
+ ID_MODEL_FROM_DATABASE=MT27710 Family [ConnectX-4 Lx] (NIC-ETH640F-3S-2P)
+
+pci:v000015B3d00001015sv0000193Dsd00001084*
+ ID_MODEL_FROM_DATABASE=MT27710 Family [ConnectX-4 Lx] (NIC-ETH540F-3S-2P)
+
pci:v000015B3d00001016*
ID_MODEL_FROM_DATABASE=MT27710 Family [ConnectX-4 Lx Virtual Function]
pci:v0000168Ad0000C051*
ID_MODEL_FROM_DATABASE=CryptoServer Se-Series Gen2 Hardware Security Module
+pci:v0000168Ad0000C070*
+ ID_MODEL_FROM_DATABASE=u.trust Anchor Hardware Security Module cs7.2 Series
+
+pci:v0000168Ad0000C071*
+ ID_MODEL_FROM_DATABASE=u.trust Anchor Hardware Security Module cs7.3 Series
+
+pci:v0000168Ad0000C072*
+ ID_MODEL_FROM_DATABASE=u.trust Anchor Hardware Security Module cs7.3 Series Virtual Function
+
pci:v0000168C*
ID_VENDOR_FROM_DATABASE=Qualcomm Atheros
pci:v0000173B*
ID_VENDOR_FROM_DATABASE=Altima (nee Broadcom)
+pci:v0000173Bd00000001*
+ ID_MODEL_FROM_DATABASE=AC1002 PCI Gigabit Ethernet controller
+
pci:v0000173Bd000003E8*
ID_MODEL_FROM_DATABASE=AC1000 Gigabit Ethernet
pci:v000017AA*
ID_VENDOR_FROM_DATABASE=Lenovo
+pci:v000017AAd00003181*
+ ID_MODEL_FROM_DATABASE=ThinkCentre M75n IoT
+
pci:v000017AAd0000402B*
ID_MODEL_FROM_DATABASE=Intel 82599ES 10Gb 2-port Server Adapter X520-2
pci:v00001B21d00002142*
ID_MODEL_FROM_DATABASE=ASM2142 USB 3.1 Host Controller
+pci:v00001B21d00002142sv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=ASM2142 USB 3.1 Host Controller (H270 PC MATE)
+
pci:v00001B21d00003242*
ID_MODEL_FROM_DATABASE=ASM3242 USB 3.2 Host Controller
pci:v00001B4B*
ID_VENDOR_FROM_DATABASE=Marvell Technology Group Ltd.
+pci:v00001B4Bd00000100*
+ ID_MODEL_FROM_DATABASE=88F3700 [Armada 3700 Family] ARM SoC
+
pci:v00001B4Bd00000640*
ID_MODEL_FROM_DATABASE=88SE9128 SATA III 6Gb/s RAID Controller
pci:v00001BD0d00001005*
ID_MODEL_FROM_DATABASE=PE1000 (Multi-Protocol PCIe/104 Interface Card)
+pci:v00001BD0d00001006*
+ ID_MODEL_FROM_DATABASE=webCS Wireless Aircraft Communications Server
+
+pci:v00001BD0d00001007*
+ ID_MODEL_FROM_DATABASE=AB3000 Series Rugged Computer (Series N)
+
+pci:v00001BD0d00001008*
+ ID_MODEL_FROM_DATABASE=ME1000 mPCIe Avionics Interface Card
+
+pci:v00001BD0d0000100A*
+ ID_MODEL_FROM_DATABASE=NG1 Series Avionics Converter
+
pci:v00001BD0d00001101*
ID_MODEL_FROM_DATABASE=OmniBus II PCIe Multi-Protocol Interface Card
pci:v00001BD0d00001103*
ID_MODEL_FROM_DATABASE=OmniBus II cPCIe/PXIe Multi-Protocol Interface Card
+pci:v00001BD0d00001200*
+ ID_MODEL_FROM_DATABASE=NG3 Series Mil-Std-1553 Interface
+
+pci:v00001BD0d00001201*
+ ID_MODEL_FROM_DATABASE=NG3 Series ARINC 429 Interface
+
+pci:v00001BD0d00001202*
+ ID_MODEL_FROM_DATABASE=NG3 Series Avionics Discrete & Serial Interface
+
+pci:v00001BD0d00001203*
+ ID_MODEL_FROM_DATABASE=NG3 Series Avionics Discrete Interface
+
pci:v00001BD4*
ID_VENDOR_FROM_DATABASE=Inspur Electronic Information Industry Co., Ltd.
pci:v00001C1Fd0000001D*
ID_MODEL_FROM_DATABASE=Vega
+pci:v00001C1Fd0000001F*
+ ID_MODEL_FROM_DATABASE=FD940
+
pci:v00001C28*
ID_VENDOR_FROM_DATABASE=Lite-On IT Corp. / Plextor
pci:v00001C5Cd00001327*
ID_MODEL_FROM_DATABASE=BC501 NVMe Solid State Drive 512GB
+pci:v00001C5Cd00001339*
+ ID_MODEL_FROM_DATABASE=BC511
+
pci:v00001C5Cd00001504*
ID_MODEL_FROM_DATABASE=SC300 512GB M.2 2280 SATA Solid State Drive
pci:v00001CE4d0000000B*
ID_MODEL_FROM_DATABASE=ExaNIC V9P
+pci:v00001CE4d0000000C*
+ ID_MODEL_FROM_DATABASE=ExaNIC V9P-3
+
pci:v00001CE4d00000100*
ID_MODEL_FROM_DATABASE=ExaDISK FX1
ID_MODEL_FROM_DATABASE=Codensity T408 Video Encoding-Decoding Accelerator
pci:v00001D87*
- ID_VENDOR_FROM_DATABASE=Fuzhou Rockchip Electronics Co., Ltd
+ ID_VENDOR_FROM_DATABASE=Rockchip Electronics Co., Ltd
pci:v00001D87d00000100*
ID_MODEL_FROM_DATABASE=RK3399 PCI Express Root Port
pci:v00001D87d00001808*
ID_MODEL_FROM_DATABASE=RK1808 Neural Network Processor Card
+pci:v00001D87d00003566*
+ ID_MODEL_FROM_DATABASE=RK3568 Remote Signal Processor
+
pci:v00001D8F*
ID_VENDOR_FROM_DATABASE=Enyx
ID_MODEL_FROM_DATABASE=TRM-S1040 [DC-315 / DC-395 series]
pci:v00001DE1d00002020*
- ID_MODEL_FROM_DATABASE=DC-390
+ ID_MODEL_FROM_DATABASE=DC-390 Series SCSI Adapter [AMD Am53C974]
pci:v00001DE1d0000690C*
ID_MODEL_FROM_DATABASE=690c
pci:v00001DF3d00000206sv00001DF3sd00000001*
ID_MODEL_FROM_DATABASE=ACE-NIC200 Programmable Network Accelerator (ENA2200F)
+pci:v00001DF3d00000207*
+ ID_MODEL_FROM_DATABASE=ACE-NIC50RN Programmable Network Accelerator
+
+pci:v00001DF3d00000208*
+ ID_MODEL_FROM_DATABASE=ACE-NIC100RN Programmable Network Accelerator
+
pci:v00001DF7*
ID_VENDOR_FROM_DATABASE=opencpi.org
pci:v00001EB1d00001001*
ID_MODEL_FROM_DATABASE=Video Accelerator
+pci:v00001ED3*
+ ID_VENDOR_FROM_DATABASE=Yeston
+
pci:v00001ED8*
ID_VENDOR_FROM_DATABASE=Digiteq Automotive
pci:v00002646d00000010*
ID_MODEL_FROM_DATABASE=HyperX Predator PCIe AHCI SSD
+pci:v00002646d00002262*
+ ID_MODEL_FROM_DATABASE=KC2000 NVMe SSD
+
pci:v00002646d00002263*
ID_MODEL_FROM_DATABASE=A2000 NVMe SSD
ID_MODEL_FROM_DATABASE=CH355 PCI Quad Serial Port Controller
pci:v0000434E*
- ID_VENDOR_FROM_DATABASE=CAST Navigation LLC
+ ID_VENDOR_FROM_DATABASE=Cornelis Networks
+
+pci:v000043BC*
+ ID_VENDOR_FROM_DATABASE=Tiger Lake-H PCIe Root Port #5
pci:v00004444*
ID_VENDOR_FROM_DATABASE=Internext Compression Inc
pci:v00008086d00000412*
ID_MODEL_FROM_DATABASE=Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller
+pci:v00008086d00000412sv00001028sd000005D7*
+ ID_MODEL_FROM_DATABASE=Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller (Alienware X51 R2)
+
pci:v00008086d00000412sv0000103Csd00001998*
ID_MODEL_FROM_DATABASE=Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller (EliteDesk 800 G1)
pci:v00008086d000006B0*
ID_MODEL_FROM_DATABASE=Comet Lake PCI Express Root Port #9
+pci:v00008086d000006BD*
+ ID_MODEL_FROM_DATABASE=Comet Lake PCIe Port #6
+
pci:v00008086d000006C0*
ID_MODEL_FROM_DATABASE=Comet Lake PCI Express Root Port #17
pci:v00008086d000006C8*
ID_MODEL_FROM_DATABASE=Comet Lake PCH cAVS
+pci:v00008086d000006D2*
+ ID_MODEL_FROM_DATABASE=Comet Lake SATA AHCI Controller
+
pci:v00008086d000006E0*
ID_MODEL_FROM_DATABASE=Comet Lake HECI Controller
+pci:v00008086d000006E3*
+ ID_MODEL_FROM_DATABASE=Comet Lake Keyboard and Text (KT) Redirection
+
pci:v00008086d000006E8*
ID_MODEL_FROM_DATABASE=Comet Lake PCH Serial IO I2C Controller #0
pci:v00008086d00000B60sv00008086sd00008008*
ID_MODEL_FROM_DATABASE=NVMe DC SSD [3DNAND, Sentinel Rock Controller] (NVMe Datacenter SSD [3DNAND] SE 2.5" U.2 (P5510))
+pci:v00008086d00000B60sv00008086sd00008D08*
+ ID_MODEL_FROM_DATABASE=NVMe DC SSD [3DNAND, Sentinel Rock Controller] (NVMe Datacenter SSD [3DNAND] VE 2.5" U.2 (P5316))
+
+pci:v00008086d00000B60sv00008086sd00008D1D*
+ ID_MODEL_FROM_DATABASE=NVMe DC SSD [3DNAND, Sentinel Rock Controller] (NVMe Datacenter SSD [3DNAND] VE E1.L 9.5/18mm (P5316))
+
pci:v00008086d00000BE0*
ID_MODEL_FROM_DATABASE=Atom Processor D2xxx/N2xxx Integrated Graphics Controller
pci:v00008086d00000C00*
ID_MODEL_FROM_DATABASE=4th Gen Core Processor DRAM Controller
+pci:v00008086d00000C00sv00001028sd000005D7*
+ ID_MODEL_FROM_DATABASE=4th Gen Core Processor DRAM Controller (Alienware X51 R2)
+
pci:v00008086d00000C00sv0000103Csd00001998*
ID_MODEL_FROM_DATABASE=4th Gen Core Processor DRAM Controller (EliteDesk 800 G1)
pci:v00008086d00001521sv0000193Dsd00001007*
ID_MODEL_FROM_DATABASE=I350 Gigabit Network Connection (360T-L)
+pci:v00008086d00001521sv0000193Dsd00001080*
+ ID_MODEL_FROM_DATABASE=I350 Gigabit Network Connection (NIC-ETH360T-3S-4P)
+
pci:v00008086d00001521sv00001BD4sd0000001D*
ID_MODEL_FROM_DATABASE=I350 Gigabit Network Connection (1G base-T QP EP014Ti1 Adapter)
pci:v00008086d00001572sv0000193Dsd00001021*
ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (NIC-ETH561F-sL-2x10G)
+pci:v00008086d00001572sv0000193Dsd00001081*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (NIC-ETH561F-3S-2P)
+
pci:v00008086d00001572sv000019E5sd0000D11C*
ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (Ethernet 2-port X710 10Gb SFP+ Adapter SP330)
+pci:v00008086d00001572sv00001BD4sd00000042*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (10G SFP+ DP EP102Fi4 Adapter)
+
pci:v00008086d00001572sv00001BD4sd00000056*
ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (Ethernet Network Adapter X710-BM2 for OCP NIC 3.0)
pci:v00008086d00001592sv00008086sd0000000D*
ID_MODEL_FROM_DATABASE=Ethernet Controller E810-C for QSFP (Ethernet Network Adapter E810-L-Q2 for OCP 3.0)
+pci:v00008086d00001592sv00008086sd0000000E*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller E810-C for QSFP (Ethernet Network Adapter E810-2C-Q2)
+
pci:v00008086d00001593*
ID_MODEL_FROM_DATABASE=Ethernet Controller E810-C for SFP
pci:v00008086d000015B8*
ID_MODEL_FROM_DATABASE=Ethernet Connection (2) I219-V
+pci:v00008086d000015B8sv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection (2) I219-V (H270 PC MATE)
+
pci:v00008086d000015B9*
ID_MODEL_FROM_DATABASE=Ethernet Connection (3) I219-LM
pci:v00008086d000015FFsv00001137sd000002DA*
ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GBASE-T (Ethernet Network Adapter X710-T4L OCP 3.0)
+pci:v00008086d000015FFsv0000193Dsd00001082*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GBASE-T (NIC-ETH565T-3S-2P)
+
pci:v00008086d000015FFsv00008086sd00000000*
ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GBASE-T (Ethernet Network Adapter X710-TL)
pci:v00008086d00001911sv00001028sd00000869*
ID_MODEL_FROM_DATABASE=Xeon E3-1200 v5/v6 / E3-1500 v5 / 6th/7th/8th Gen Core Processor Gaussian Mixture Model (Vostro 3470)
+pci:v00008086d00001911sv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=Xeon E3-1200 v5/v6 / E3-1500 v5 / 6th/7th/8th Gen Core Processor Gaussian Mixture Model (H270 PC MATE)
+
pci:v00008086d00001911sv000017AAsd00002247*
ID_MODEL_FROM_DATABASE=Xeon E3-1200 v5/v6 / E3-1500 v5 / 6th/7th/8th Gen Core Processor Gaussian Mixture Model (ThinkPad T570)
pci:v00008086d000024F0sv00001CB8sd00000004*
ID_MODEL_FROM_DATABASE=Omni-Path HFI Silicon 100 Series [discrete] (Omni-Path HFI Adapter 100 Series, 1 Port, PCIe x16, TC4600E QSFP28)
+pci:v00008086d000024F0sv0000434Esd00000001*
+ ID_MODEL_FROM_DATABASE=Omni-Path HFI Silicon 100 Series [discrete] (Omni-Path HFI 100 Series, 1 Port, OCP 3.0 Adapter)
+
pci:v00008086d000024F0sv00008086sd00002628*
ID_MODEL_FROM_DATABASE=Omni-Path HFI Silicon 100 Series [discrete] (Omni-Path HFI Adapter 100 Series, 1 Port, PCIe x16)
pci:v00008086d0000277D*
ID_MODEL_FROM_DATABASE=82975X PCI Express Root Port
+pci:v00008086d00002780*
+ ID_MODEL_FROM_DATABASE=82915G/GV/GL/910GL [Grantsdale] Graphics Device
+
pci:v00008086d00002782*
ID_MODEL_FROM_DATABASE=82915G Integrated Graphics Controller
pci:v00008086d0000423Dsv00008086sd00001316*
ID_MODEL_FROM_DATABASE=WiMAX/WiFi Link 5150 (ABG)
+pci:v00008086d0000438B*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-H LPC/eSPI Controller
+
+pci:v00008086d000043A3*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-H SMBus Controller
+
+pci:v00008086d000043A4*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-H SPI Controller
+
+pci:v00008086d000043B0*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-H PCI Express Root Port #9
+
+pci:v00008086d000043BC*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-H PCI Express Root Port #5
+
+pci:v00008086d000043C8*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-H HD Audio Controller
+
+pci:v00008086d000043E0*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-H Management Engine Interface
+
+pci:v00008086d000043E8*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-H Serial IO I2C Controller #0
+
+pci:v00008086d000043ED*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-H USB 3.2 Gen 2x1 xHCI Host Controller
+
+pci:v00008086d000043EF*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-H Shared SRAM
+
+pci:v00008086d000043F0*
+ ID_MODEL_FROM_DATABASE=Wi-Fi 6 AX201
+
pci:v00008086d0000444E*
ID_MODEL_FROM_DATABASE=Turbo Memory Controller
pci:v00008086d00005502*
ID_MODEL_FROM_DATABASE=Ethernet Controller (2) I225-LMvP
+pci:v00008086d00005504*
+ ID_MODEL_FROM_DATABASE=Ethernet Controller I226-K
+
pci:v00008086d00005845*
ID_MODEL_FROM_DATABASE=QEMU NVM Express Controller
pci:v00008086d0000590Fsv00001462sd00007A68*
ID_MODEL_FROM_DATABASE=Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers (B250 KRAIT GAMING (MS-7A68))
+pci:v00008086d0000590Fsv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers (H270 PC MATE)
+
pci:v00008086d00005910*
ID_MODEL_FROM_DATABASE=Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
pci:v00008086d00005912*
ID_MODEL_FROM_DATABASE=HD Graphics 630
+pci:v00008086d00005912sv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=HD Graphics 630 (H270 PC MATE)
+
pci:v00008086d00005914*
ID_MODEL_FROM_DATABASE=Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
pci:v00008086d00008C02*
ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family 6-port SATA Controller 1 [AHCI mode]
+pci:v00008086d00008C02sv00001028sd000005D7*
+ ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family 6-port SATA Controller 1 [AHCI mode] (Alienware X51 R2)
+
pci:v00008086d00008C02sv0000103Csd00001998*
ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family 6-port SATA Controller 1 [AHCI mode] (EliteDesk 800 G1)
pci:v00008086d00008C20*
ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset High Definition Audio Controller
+pci:v00008086d00008C20sv00001028sd000005D7*
+ ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset High Definition Audio Controller (Alienware X51 R2)
+
pci:v00008086d00008C20sv0000103Csd00001909*
ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset High Definition Audio Controller (ZBook 15)
pci:v00008086d00008C22*
ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family SMBus Controller
+pci:v00008086d00008C22sv00001028sd000005D7*
+ ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family SMBus Controller (Alienware X51 R2)
+
pci:v00008086d00008C22sv0000103Csd00001909*
ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family SMBus Controller (ZBook 15)
pci:v00008086d00008C26*
ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family USB EHCI #1
+pci:v00008086d00008C26sv00001028sd000005D7*
+ ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family USB EHCI #1 (Alienware X51 R2)
+
pci:v00008086d00008C26sv0000103Csd00001909*
ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family USB EHCI #1 (ZBook 15)
pci:v00008086d00008C2D*
ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family USB EHCI #2
+pci:v00008086d00008C2Dsv00001028sd000005D7*
+ ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family USB EHCI #2 (Alienware X51 R2)
+
pci:v00008086d00008C2Dsv0000103Csd00001909*
ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family USB EHCI #2 (ZBook 15)
pci:v00008086d00008C31*
ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family USB xHCI
+pci:v00008086d00008C31sv00001028sd000005D7*
+ ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family USB xHCI (Alienware X51 R2)
+
pci:v00008086d00008C31sv0000103Csd00001909*
ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family USB xHCI (ZBook 15)
pci:v00008086d00008C3A*
ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family MEI Controller #1
+pci:v00008086d00008C3Asv00001028sd000005D7*
+ ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family MEI Controller #1 (Alienware X51 R2)
+
pci:v00008086d00008C3Asv0000103Csd00001909*
ID_MODEL_FROM_DATABASE=8 Series/C220 Series Chipset Family MEI Controller #1 (ZBook 15)
pci:v00008086d00008C4A*
ID_MODEL_FROM_DATABASE=H87 Express LPC Controller
+pci:v00008086d00008C4Asv00001028sd000005D7*
+ ID_MODEL_FROM_DATABASE=H87 Express LPC Controller (Alienware X51 R2)
+
pci:v00008086d00008C4B*
ID_MODEL_FROM_DATABASE=HM87 Express LPC Controller
pci:v00008086d000096A1*
ID_MODEL_FROM_DATABASE=Integrated RAID
+pci:v00008086d00009A01*
+ ID_MODEL_FROM_DATABASE=11th Gen Core Processor PCIe Controller #1
+
pci:v00008086d00009A03*
ID_MODEL_FROM_DATABASE=TigerLake-LP Dynamic Tuning Processor Participant
pci:v00008086d00009A0D*
ID_MODEL_FROM_DATABASE=Tiger Lake-LP Telemetry Aggregator
+pci:v00008086d00009A0F*
+ ID_MODEL_FROM_DATABASE=11th Gen Core Processor PCIe Controller #0
+
+pci:v00008086d00009A11*
+ ID_MODEL_FROM_DATABASE=GNA Scoring Accelerator module
+
pci:v00008086d00009A13*
ID_MODEL_FROM_DATABASE=Tiger Lake-LP Thunderbolt 4 USB Controller
pci:v00008086d00009A25*
ID_MODEL_FROM_DATABASE=Tiger Lake-LP Thunderbolt 4 PCI Express Root Port #1
+pci:v00008086d00009A26*
+ ID_MODEL_FROM_DATABASE=11th Gen Core Processor Host Bridge/DRAM Registers
+
pci:v00008086d00009A27*
ID_MODEL_FROM_DATABASE=Tiger Lake-LP Thunderbolt 4 PCI Express Root Port #2
pci:v00008086d00009A33*
ID_MODEL_FROM_DATABASE=Tiger Lake Trace Hub
+pci:v00008086d00009A36*
+ ID_MODEL_FROM_DATABASE=11th Gen Core Processor Host Bridge/DRAM Registers
+
pci:v00008086d00009A49*
ID_MODEL_FROM_DATABASE=TigerLake GT2 [Iris Xe Graphics]
+pci:v00008086d00009A60*
+ ID_MODEL_FROM_DATABASE=TigerLake GT2 [Iris Xe Graphics]
+
+pci:v00008086d00009A68*
+ ID_MODEL_FROM_DATABASE=Tiger Lake-H UHD Graphics
+
pci:v00008086d00009B41*
ID_MODEL_FROM_DATABASE=CometLake-U GT2 [UHD Graphics]
pci:v00008086d0000A282*
ID_MODEL_FROM_DATABASE=200 Series PCH SATA controller [AHCI mode]
+pci:v00008086d0000A282sv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=200 Series PCH SATA controller [AHCI mode] (H270 PC MATE)
+
pci:v00008086d0000A286*
ID_MODEL_FROM_DATABASE=200 Series PCH SATA controller [RAID mode]
pci:v00008086d0000A294*
ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #5
+pci:v00008086d0000A294sv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #5 (H270 PC MATE)
+
pci:v00008086d0000A295*
ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #6
pci:v00008086d0000A296*
ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #7
+pci:v00008086d0000A296sv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #7 (H270 PC MATE)
+
pci:v00008086d0000A297*
ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #8
pci:v00008086d0000A298*
ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #9
+pci:v00008086d0000A298sv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #9 (H270 PC MATE)
+
pci:v00008086d0000A299*
ID_MODEL_FROM_DATABASE=200 Series PCH PCI Express Root Port #10
pci:v00008086d0000A2A1*
ID_MODEL_FROM_DATABASE=200 Series/Z370 Chipset Family Power Management Controller
+pci:v00008086d0000A2A1sv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=200 Series/Z370 Chipset Family Power Management Controller (H270 PC MATE)
+
pci:v00008086d0000A2A3*
ID_MODEL_FROM_DATABASE=200 Series/Z370 Chipset Family SMBus Controller
+pci:v00008086d0000A2A3sv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=200 Series/Z370 Chipset Family SMBus Controller (H270 PC MATE)
+
pci:v00008086d0000A2A4*
ID_MODEL_FROM_DATABASE=200 Series/Z370 Chipset Family SPI Controller
pci:v00008086d0000A2AF*
ID_MODEL_FROM_DATABASE=200 Series/Z370 Chipset Family USB 3.0 xHCI Controller
+pci:v00008086d0000A2AFsv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=200 Series/Z370 Chipset Family USB 3.0 xHCI Controller (H270 PC MATE)
+
pci:v00008086d0000A2B1*
ID_MODEL_FROM_DATABASE=200 Series PCH Thermal Subsystem
+pci:v00008086d0000A2B1sv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=200 Series PCH Thermal Subsystem (H270 PC MATE)
+
pci:v00008086d0000A2BA*
ID_MODEL_FROM_DATABASE=200 Series PCH CSME HECI #1
+pci:v00008086d0000A2BAsv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=200 Series PCH CSME HECI #1 (H270 PC MATE)
+
pci:v00008086d0000A2BB*
ID_MODEL_FROM_DATABASE=200 Series PCH CSME HECI #2
pci:v00008086d0000A2C4*
ID_MODEL_FROM_DATABASE=200 Series PCH LPC Controller (H270)
+pci:v00008086d0000A2C4sv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=200 Series PCH LPC Controller (H270) (H270 PC MATE)
+
pci:v00008086d0000A2C5*
ID_MODEL_FROM_DATABASE=200 Series PCH LPC Controller (Z270)
pci:v00008086d0000A2F0*
ID_MODEL_FROM_DATABASE=200 Series PCH HD Audio
+pci:v00008086d0000A2F0sv00001462sd00007A72*
+ ID_MODEL_FROM_DATABASE=200 Series PCH HD Audio (H270 PC MATE)
+
+pci:v00008086d0000A2F0sv00001462sd0000FA72*
+ ID_MODEL_FROM_DATABASE=200 Series PCH HD Audio (H270 PC MATE)
+
pci:v00008086d0000A304*
ID_MODEL_FROM_DATABASE=H370 Chipset LPC/eSPI Controller
pci:v00008086d0000A328*
ID_MODEL_FROM_DATABASE=Cannon Lake PCH Serial IO UART Host Controller
+pci:v00008086d0000A32B*
+ ID_MODEL_FROM_DATABASE=Cannon Lake PCH SPI Host Controller
+
pci:v00008086d0000A32C*
ID_MODEL_FROM_DATABASE=Cannon Lake PCH PCI Express Root Port #21
pci:v00008086d0000F1A5*
ID_MODEL_FROM_DATABASE=SSD 600P Series
+pci:v00008086d0000F1A5sv00008086sd0000390A*
+ ID_MODEL_FROM_DATABASE=SSD 600P Series (SSDPEKKW256G7 256GB)
+
pci:v00008086d0000F1A6*
ID_MODEL_FROM_DATABASE=SSD Pro 7600p/760p/E 6100p Series
pci:v00009902d00000003*
ID_MODEL_FROM_DATABASE=SG1010 Starfabric Switch and PCI Bridge
+pci:v00009A11*
+ ID_VENDOR_FROM_DATABASE=Tiger Lake-H Gaussian & Neural Accelerator
+
pci:v00009D32*
ID_VENDOR_FROM_DATABASE=Beijing Starblaze Technology Co. Ltd.
pci:v0000F1D0d0000EB25*
ID_MODEL_FROM_DATABASE=Corvid 44 12g
+pci:v0000F1D0d0000EB26*
+ ID_MODEL_FROM_DATABASE=T-Tap Pro
+
pci:v0000F1D0d0000EFAC*
ID_MODEL_FROM_DATABASE=Xena SD-MM/SD-22-MM
usb:v3344p3744*
ID_MODEL_FROM_DATABASE=OEM PC Remote
+usb:v3384*
+ ID_VENDOR_FROM_DATABASE=System76
+
+usb:v3384p0000*
+ ID_MODEL_FROM_DATABASE=Thelio Io (thelio-io)
+
+usb:v3384p0001*
+ ID_MODEL_FROM_DATABASE=Launch Configurable Keyboard (launch_1)
+
usb:v348F*
ID_VENDOR_FROM_DATABASE=ISY
# SPDX-License-Identifier: LGPL-2.1-or-later
# This file has been generated using fprint-list-udev-hwdb with all drivers enabled
-# Supported by libfprint driver upektc_img
-usb:v147Ep2016*
-usb:v147Ep2020*
- ID_AUTOSUSPEND=1
-
-# Supported by libfprint driver vfs5011
-usb:v138Ap0010*
-usb:v138Ap0011*
-usb:v138Ap0015*
-usb:v138Ap0017*
-usb:v138Ap0018*
- ID_AUTOSUSPEND=1
-
-# Supported by libfprint driver aes3500
-usb:v08FFp5731*
- ID_AUTOSUSPEND=1
-
-# Supported by libfprint driver aes4000
-usb:v5501p08FF*
- ID_AUTOSUSPEND=1
-
# Supported by libfprint driver aes1610
usb:v08FFp1600*
ID_AUTOSUSPEND=1
usb:v08FFp168F*
ID_AUTOSUSPEND=1
+# Supported by libfprint driver aes2501
+usb:v08FFp2500*
+usb:v08FFp2580*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver aes2550
+usb:v08FFp2550*
+usb:v08FFp2810*
+ ID_AUTOSUSPEND=1
+
# Supported by libfprint driver aes2660
usb:v08FFp2660*
usb:v08FFp2680*
usb:v08FFp2691*
ID_AUTOSUSPEND=1
-# Supported by libfprint driver aes2501
-usb:v08FFp2500*
-usb:v08FFp2580*
- ID_AUTOSUSPEND=1
-
-# Supported by libfprint driver aes2550
-usb:v08FFp2550*
-usb:v08FFp2810*
- ID_AUTOSUSPEND=1
-
-# Supported by libfprint driver vfs101
-usb:v138Ap0001*
- ID_AUTOSUSPEND=1
-
-# Supported by libfprint driver vfs301
-usb:v138Ap0005*
-usb:v138Ap0008*
- ID_AUTOSUSPEND=1
-
-# Supported by libfprint driver vfs0050
-usb:v138Ap0050*
- ID_AUTOSUSPEND=1
-
-# Supported by libfprint driver etes603
-usb:v1C7Ap0603*
- ID_AUTOSUSPEND=1
-
-# Supported by libfprint driver vcom5s
-usb:v061Ap0110*
+# Supported by libfprint driver aes3500
+usb:v08FFp5731*
ID_AUTOSUSPEND=1
-# Supported by libfprint driver synaptics
-usb:v06CBp00BD*
-usb:v06CBp00E9*
-usb:v06CBp00DF*
-usb:v06CBp00F9*
-usb:v06CBp00FC*
-usb:v06CBp00C2*
-usb:v06CBp00C9*
-usb:v06CBp00E7*
+# Supported by libfprint driver aes4000
+usb:v5501p08FF*
ID_AUTOSUSPEND=1
# Supported by libfprint driver elan
usb:v04F3p0C4D*
ID_AUTOSUSPEND=1
+# Supported by libfprint driver etes603
+usb:v1C7Ap0603*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver goodixmoc
+usb:v27C6p5840*
+usb:v27C6p6496*
+usb:v27C6p60A2*
+usb:v27C6p63AC*
+usb:v27C6p639C*
+usb:v27C6p6594*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver synaptics
+usb:v06CBp00BD*
+usb:v06CBp00E9*
+usb:v06CBp00DF*
+usb:v06CBp00F9*
+usb:v06CBp00FC*
+usb:v06CBp00C2*
+usb:v06CBp00C9*
+usb:v06CBp0100*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver upeksonly
+usb:v147Ep2016*
+usb:v147Ep1000*
+usb:v147Ep1001*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver upektc
+usb:v0483p2015*
+usb:v147Ep3001*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver upektc_img
+usb:v147Ep2020*
+ ID_AUTOSUSPEND=1
+
# Supported by libfprint driver uru4000
usb:v045Ep00BC*
usb:v045Ep00BD*
usb:v05BAp000A*
ID_AUTOSUSPEND=1
-# Supported by libfprint driver upektc
-usb:v0483p2015*
-usb:v147Ep3001*
+# Supported by libfprint driver vcom5s
+usb:v061Ap0110*
ID_AUTOSUSPEND=1
-# Supported by libfprint driver upeksonly
-usb:v147Ep1000*
-usb:v147Ep1001*
+# Supported by libfprint driver vfs0050
+usb:v138Ap0050*
ID_AUTOSUSPEND=1
-# Supported by libfprint driver goodixmoc
-usb:v27C6p5840*
-usb:v27C6p6496*
-usb:v27C6p60A2*
-usb:v27C6p63AC*
-usb:v27C6p639C*
+# Supported by libfprint driver vfs101
+usb:v138Ap0001*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver vfs301
+usb:v138Ap0005*
+usb:v138Ap0008*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver vfs5011
+usb:v138Ap0010*
+usb:v138Ap0011*
+usb:v138Ap0015*
+usb:v138Ap0017*
+usb:v138Ap0018*
+ ID_AUTOSUSPEND=1
+
+# Supported by libfprint driver vfs7552
+usb:v138Ap0091*
ID_AUTOSUSPEND=1
# Known unsupported devices
usb:v04F3p0C4C*
usb:v04F3p0C4F*
usb:v04F3p0C57*
+usb:v04F3p0C5E*
usb:v04F3p2706*
usb:v06CBp0081*
usb:v06CBp0088*
usb:v06CBp00B7*
usb:v06CBp00BB*
usb:v06CBp00BE*
+usb:v06CBp00C4*
usb:v06CBp00CB*
usb:v06CBp00D8*
usb:v06CBp00DA*
usb:v0A5Cp5801*
usb:v0A5Cp5805*
usb:v0A5Cp5834*
+usb:v0A5Cp5840*
+usb:v0A5Cp5841*
+usb:v0A5Cp5842*
usb:v0A5Cp5843*
+usb:v0A5Cp5845*
usb:v10A5p0007*
usb:v1188p9545*
usb:v138Ap0007*
usb:v138Ap003D*
usb:v138Ap003F*
usb:v138Ap0090*
-usb:v138Ap0091*
usb:v138Ap0092*
usb:v138Ap0094*
usb:v138Ap0097*
# Dell Latitude E7470
evdev:name:AlpsPS/2 ALPS DualPoint TouchPad:dmi:bvn*:bvr*:bd*:svnDellInc.:pnLatitudeE7470:*
- EVDEV_ABS_00=29:2930:30
- EVDEV_ABS_01=26:1533:29
- EVDEV_ABS_35=29:2930:30
- EVDEV_ABS_36=26:1533:29
+ EVDEV_ABS_00=29:2930:30:16
+ EVDEV_ABS_01=26:1533:29:16
+ EVDEV_ABS_35=29:2930:30:16
+ EVDEV_ABS_36=26:1533:29:16
# Dell Precision 5510
evdev:name:SynPS/2 Synaptics TouchPad:dmi:bvn*:bvr*:bd*:svnDellInc.:pnPrecision5510:*
KEYBOARD_KEY_100150=f20 # Mic mute toggle, should be micmute
# Dell Latitude privacy microphone mute
-evdev:name:Dell Privacy Driver:dmi:bvn*:bvr*:bd*:svnDell*:pnLatitude*:sku0A3E:*
+evdev:name:Dell Privacy Driver:dmi:bvn*:bvr*:bd*:svnDell*:pnLatitude*:*
KEYBOARD_KEY_12001=f20 # Mic mute toggle, should be micmute
###########################################################
sensor:modalias:acpi:SMO8500*:dmi:bvnLENOVO:*:pvrLenovoMIIX3-830:*
ACCEL_MOUNT_MATRIX=-1, 0, 0; 0, 1, 0; 0, 0, 1
-# IdeaPad D330
+# IdeaPad D330 and D330-10IGM
sensor:modalias:acpi:BOSC0200*:dmi:*:svnLENOVO:pn81H3:*
+sensor:modalias:acpi:BOSC0200*:dmi:*:svnLENOVO:*:cvrLenovoideapadD330-10IGM:*
ACCEL_MOUNT_MATRIX=0, 1, 0; -1, 0, 0; 0, 0, 1
# IdeaPad Miix 300
MOUSE_WHEEL_CLICK_COUNT=24
MOUSE_WHEEL_CLICK_COUNT_HORIZONTAL=14
-# Logitech MX Ergo (via Bluetooth)
+# Logitech MX Ergo
+mouse:usb:v046dp406f:name:Logitech MX Ergo:*
+mouse:usb:v046dpc52b:name:Logitech Unifying Device. Wireless PID:406f:*
mouse:bluetooth:v046dpb01d:name:MX Ergo Mouse:*
ID_INPUT_TRACKBALL=1
--- /dev/null
+Files in this directory specify a description of hardware devices, in the form
+of mappings from modalias-like keys (which identify specific hardware devices)
+to udev properties.
+
+Files in this directory are not read by udev directly. Instead,
+man:systemd-hwdb(8) compiles them into a binary database.
+
+See man:hwdb(7) for an overview of the configuration file format, and
+man:systemd-udevd.service(8) for a description of the udev daemon.
+
+Use 'systemd-analyze cat-config udev/hwdb.d' to display the effective config.
<tr class="even"><td>CHENGDU HAIGUANG IC DESIGN CO., LTD</td><td>HYGO</td><td>07/15/2020</td> </tr>
<tr class="odd"><td>PixArt imaging inc.</td><td>PIXA</td><td>07/15/2020</td> </tr>
<tr class="even"><td>Loongson Technology Corporation Limited</td><td>LOON</td><td>09/10/2020</td> </tr>
+ <tr class="odd"><td>Seiko Epson Corporation</td><td>SECC</td><td>02/16/2021</td> </tr>
+ <tr class="even"><td>Alibaba Co., Ltd.</td><td>BABA</td><td>02/02/2021</td> </tr>
+ <tr class="odd"><td>Juniper Systems, Inc.</td><td>JSYS</td><td>03/18/2021</td> </tr>
+ <tr class="even"><td>Framework Computer LLC</td><td>FRMW</td><td>03/22/2021</td> </tr>
+ <tr class="odd"><td>Pensando Systems, Inc.</td><td>PNSO</td><td>03/24/2021</td> </tr>
</tbody>
</table>
</body>
ShenZhen GuangDong 518067\r
CN\r
\r
-18-52-07 (hex) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-185207 (base 16) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
- FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
00-00-62 (hex) BULL HN INFORMATION SYSTEMS\r
000062 (base 16) BULL HN INFORMATION SYSTEMS\r
300 CONCORD ROAD M/S 864A\r
Cupertino CA 95014\r
US\r
\r
-E0-C6-3C (hex) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-E0C63C (base 16) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
- FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
00-0C-46 (hex) Allied Telesyn Inc.\r
000C46 (base 16) Allied Telesyn Inc.\r
960 Stewart Drive, Suite B\r
Westlake Village CA 91362\r
US\r
\r
-08-01-0F (hex) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-08010F (base 16) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
- FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
94-18-82 (hex) Hewlett Packard Enterprise\r
941882 (base 16) Hewlett Packard Enterprise\r
8000 Foothills Blvd.\r
Dublin 12\r
IE\r
\r
-64-D0-2D (hex) Next Generation Integration (NGI)\r
-64D02D (base 16) Next Generation Integration (NGI)\r
- 137 rue de Versailles\r
- Le Chesnay 78150\r
- FR\r
-\r
90-51-3F (hex) Elettronica Santerno SpA\r
90513F (base 16) Elettronica Santerno SpA\r
Via della Concia 7\r
Shanghai Yang Pu District 200433\r
CN\r
\r
-C0-CC-42 (hex) Sichuan Tianyi Comheart Telecom Co., Ltd.\r
-C0CC42 (base 16) Sichuan Tianyi Comheart Telecom Co., Ltd.\r
- No.198,First Section,Snow Mountain Avenue, Jinyuan Town, Dayi County\r
- Chengdu Sichuan 611330\r
- CN\r
-\r
24-1A-E6 (hex) Huawei Device Co., Ltd.\r
241AE6 (base 16) Huawei Device Co., Ltd.\r
No.2 of Xincheng Road, Songshan Lake Zone\r
Kulim Kedah 09000\r
MY\r
\r
+80-65-59 (hex) EM Microelectronic\r
+806559 (base 16) EM Microelectronic\r
+ Rue des Sors 3\r
+ Marin-Epagnier Neuchatel 2074\r
+ CH\r
+\r
+D0-47-C1 (hex) Elma Electronic AG\r
+D047C1 (base 16) Elma Electronic AG\r
+ Hofstrasse 93\r
+ Wetzikon Zuerich 8620\r
+ CH\r
+\r
+C0-CC-42 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+C0CC42 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ No.198,First Section,Snow Mountain Avenue, Jinyuan Town, Dayi County\r
+ Chengdu Sichuan 611330\r
+ CN\r
+\r
+C4-23-60 (hex) Intel Corporate\r
+C42360 (base 16) Intel Corporate\r
+ Lot 8, Jalan Hi-Tech 2/3 \r
+ Kulim Kedah 09000\r
+ MY\r
+\r
+08-01-0F (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+08010F (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+18-52-07 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+185207 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+E0-C6-3C (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+E0C63C (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+DC-21-5C (hex) Intel Corporate\r
+DC215C (base 16) Intel Corporate\r
+ Lot 8, Jalan Hi-Tech 2/3 \r
+ Kulim Kedah 09000\r
+ MY\r
+\r
+BC-EC-A0 (hex) COMPAL INFORMATION (KUNSHAN) CO., LTD. \r
+BCECA0 (base 16) COMPAL INFORMATION (KUNSHAN) CO., LTD. \r
+ NO. 25, THE 3RD Street KUNSHAN EXPORT PROCESSING ZONE \r
+ KUNSHAN SUZHOU 215300\r
+ CN\r
+\r
+F8-BA-E6 (hex) Nokia\r
+F8BAE6 (base 16) Nokia\r
+ 600 March Road\r
+ Kanata Ontario K2K 2E6\r
+ CA\r
+\r
+58-FD-5D (hex) Hangzhou Xinyun technology Co., Ltd.\r
+58FD5D (base 16) Hangzhou Xinyun technology Co., Ltd.\r
+ Room 803, Block 8, Singapore Science & Technology Park\r
+ Hangzhou Zhejiang 310018\r
+ CN\r
+\r
+24-A7-99 (hex) Huawei Device Co., Ltd.\r
+24A799 (base 16) Huawei Device Co., Ltd.\r
+ No.2 of Xincheng Road, Songshan Lake Zone\r
+ Dongguan Guangdong 523808\r
+ CN\r
+\r
+7C-3E-74 (hex) Huawei Device Co., Ltd.\r
+7C3E74 (base 16) Huawei Device Co., Ltd.\r
+ No.2 of Xincheng Road, Songshan Lake Zone\r
+ Dongguan Guangdong 523808\r
+ CN\r
+\r
+A4-55-90 (hex) Xiaomi Communications Co Ltd\r
+A45590 (base 16) Xiaomi Communications Co Ltd\r
+ The Rainbow City of China Resources\r
+ NO.68, Qinghe Middle Street Haidian District, Beijing 100085\r
+ CN\r
+\r
+14-89-19 (hex) 2bps\r
+148919 (base 16) 2bps\r
+ #1502 , T-dong, Pungrim I-want, 170, Seohyeon-ro\r
+ Seongnam-si Gyeonggi-do 13590\r
+ KR\r
+\r
+4C-71-67 (hex) PoLabs d.o.o.\r
+4C7167 (base 16) PoLabs d.o.o.\r
+ Volavlje 30\r
+ Ljubljana 1000\r
+ SI\r
+\r
+04-71-53 (hex) SERNET (SUZHOU) TECHNOLOGIES CORPORATION\r
+047153 (base 16) SERNET (SUZHOU) TECHNOLOGIES CORPORATION\r
+ NO.8 Tangzhuang Road,Suzhou Industrial Park,Su ZhouCity,JiangSu Province,China\r
+ Suzhou 215021\r
+ CN\r
+\r
+48-E7-DA (hex) AzureWave Technology Inc.\r
+48E7DA (base 16) AzureWave Technology Inc.\r
+ 8F., No. 94, Baozhong Rd.\r
+ New Taipei City Taiwan 231\r
+ TW\r
+\r
+40-C4-8C (hex) N-iTUS CO.,LTD.\r
+40C48C (base 16) N-iTUS CO.,LTD.\r
+ NiTUS 85, Deokcheon-ro\r
+ Anyang-si Gyeonggi-do, Korea 14086\r
+ KR\r
+\r
+48-22-18 (hex) Shenzhen Yipingfang Network Technology Co., Ltd.\r
+482218 (base 16) Shenzhen Yipingfang Network Technology Co., Ltd.\r
+ 21 / F, Kangjia R & D building, No.28, Keji South 12th Road, Nanshan District, Shenzhen City, Guangdong Province, China\r
+ Shenzhen Nanshan District 518000\r
+ CN\r
+\r
+E4-0C-FD (hex) GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
+E40CFD (base 16) GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
+ NO.18 HAIBIN ROAD,\r
+ DONG GUAN GUANG DONG 523860\r
+ CN\r
+\r
+58-D6-97 (hex) GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
+58D697 (base 16) GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
+ NO.18 HAIBIN ROAD,\r
+ DONG GUAN GUANG DONG 523860\r
+ CN\r
+\r
+54-37-BB (hex) Taicang T&W Electronics\r
+5437BB (base 16) Taicang T&W Electronics\r
+ 89# Jiang Nan RD\r
+ Suzhou Jiangsu 215412\r
+ CN\r
+\r
+60-F8-F2 (hex) Synaptec\r
+60F8F2 (base 16) Synaptec\r
+ 204 George Street\r
+ Glasgow G1 1XW\r
+ GB\r
+\r
+AC-74-B1 (hex) Intel Corporate\r
+AC74B1 (base 16) Intel Corporate\r
+ Lot 8, Jalan Hi-Tech 2/3 \r
+ Kulim Kedah 09000\r
+ MY\r
+\r
+30-A1-76 (hex) Fiberhome Telecommunication Technologies Co.,LTD\r
+30A176 (base 16) Fiberhome Telecommunication Technologies Co.,LTD\r
+ No.5 DongXin Road\r
+ Wuhan Hubei 430074\r
+ CN\r
+\r
+F4-E4-51 (hex) HUAWEI TECHNOLOGIES CO.,LTD\r
+F4E451 (base 16) HUAWEI TECHNOLOGIES CO.,LTD\r
+ No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+ Dongguan 523808\r
+ CN\r
+\r
+1C-3C-D4 (hex) HUAWEI TECHNOLOGIES CO.,LTD\r
+1C3CD4 (base 16) HUAWEI TECHNOLOGIES CO.,LTD\r
+ No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+ Dongguan 523808\r
+ CN\r
+\r
+F4-60-77 (hex) Texas Instruments\r
+F46077 (base 16) Texas Instruments\r
+ 12500 TI Blvd\r
+ Dallas TX 75243\r
+ US\r
+\r
+24-9A-C8 (hex) Shenzhen Skyworth Digital Technology CO., Ltd\r
+249AC8 (base 16) Shenzhen Skyworth Digital Technology CO., Ltd\r
+ 4F,Block A, Skyworth?Building,\r
+ Shenzhen Guangdong 518057\r
+ CN\r
+\r
+C0-3C-04 (hex) Sagemcom Broadband SAS\r
+C03C04 (base 16) Sagemcom Broadband SAS\r
+ 250, route de l'Empereur\r
+ Rueil Malmaison Cedex hauts de seine 92848\r
+ FR\r
+\r
+A4-D7-3C (hex) Seiko Epson Corporation\r
+A4D73C (base 16) Seiko Epson Corporation\r
+ 2070 Kotobuki Koaka\r
+ Matsumoto-shi Nagano-ken 399-8702\r
+ JP\r
+\r
+2C-48-81 (hex) vivo Mobile Communication Co., Ltd.\r
+2C4881 (base 16) vivo Mobile Communication Co., Ltd.\r
+ #283,BBK Road\r
+ Wusha,Chang'An DongGuan City,Guangdong, 523860\r
+ CN\r
+\r
+60-26-EF (hex) Aruba, a Hewlett Packard Enterprise Company\r
+6026EF (base 16) Aruba, a Hewlett Packard Enterprise Company\r
+ 3333 Scott Blvd\r
+ Santa Clara CA 95054\r
+ US\r
+\r
+F8-8E-A1 (hex) Edgecore Networks Corporation\r
+F88EA1 (base 16) Edgecore Networks Corporation\r
+ 1 Creation RD 3.\r
+ Hsinchu 30077\r
+ TW\r
+\r
+7C-85-30 (hex) Nokia\r
+7C8530 (base 16) Nokia\r
+ 600 March Road\r
+ Kanata Ontario K2K 2E6\r
+ CA\r
+\r
+64-D0-2D (hex) NEXT GENERATION INTEGRATION LIMITED (NGI)\r
+64D02D (base 16) NEXT GENERATION INTEGRATION LIMITED (NGI)\r
+ Unit 1102, 11 / F, 29 Austin Road, TSIM SHA TSUI\r
+ KOWLOON Hong Kong 999077\r
+ HK\r
+\r
+24-28-FD (hex) Hangzhou Hikvision Digital Technology Co.,Ltd.\r
+2428FD (base 16) Hangzhou Hikvision Digital Technology Co.,Ltd.\r
+ No.555 Qianmo Road\r
+ Hangzhou Zhejiang 310052\r
+ CN\r
+\r
+88-AE-DD (hex) EliteGroup Computer Systems Co., LTD\r
+88AEDD (base 16) EliteGroup Computer Systems Co., LTD\r
+ No. 239, Sec. 2, Ti ding Blvd.\r
+ Taipei City 11493\r
+ TW\r
+\r
+A0-E7-0B (hex) Intel Corporate\r
+A0E70B (base 16) Intel Corporate\r
+ Lot 8, Jalan Hi-Tech 2/3 \r
+ Kulim Kedah 09000\r
+ MY\r
+\r
+B0-D8-88 (hex) Panasonic Corporation Automotive\r
+B0D888 (base 16) Panasonic Corporation Automotive\r
+ 5652\r
+ Matsumoto City Nagano 399-8730\r
+ JP\r
+\r
+F4-63-E7 (hex) Nanjing Maxon O.E. Tech. Co., LTD\r
+F463E7 (base 16) Nanjing Maxon O.E. Tech. Co., LTD\r
+ 6/F, Building A3, Zidong International Creative Park, Zidong Road, Qixia District, Nanjing\r
+ NAN JING JIANG SU 210000\r
+ CN\r
+\r
+04-EE-EE (hex) Laplace System Co., Ltd.\r
+04EEEE (base 16) Laplace System Co., Ltd.\r
+ 1-245 Kyo-machi\r
+ Fushimi, Kyoto Kyoto 6128083\r
+ JP\r
+\r
+6C-10-8B (hex) WeLink Communications\r
+6C108B (base 16) WeLink Communications\r
+ 4186 N Red Maple Court\r
+ Lehi UT 84043\r
+ US\r
+\r
9C-FF-C2 (hex) AVI Systems GmbH\r
9CFFC2 (base 16) AVI Systems GmbH\r
Dr. Franz Wilhelmstraße 2A\r
Cupertino CA 95014\r
US\r
\r
-5C-A1-76 (hex) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-5CA176 (base 16) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
- FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
58-38-79 (hex) RICOH COMPANY, LTD.\r
583879 (base 16) RICOH COMPANY, LTD.\r
1005, Shimo-ogino\r
shenzhen guangdong 518057\r
CN\r
\r
-E0-4F-BD (hex) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-E04FBD (base 16) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
- FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
7C-EB-AE (hex) Ridgeline Instruments\r
7CEBAE (base 16) Ridgeline Instruments\r
4803 Innovation Drive, Suite 3B\r
000 0000\r
IL\r
\r
-9C-61-21 (hex) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-9C6121 (base 16) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
- FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
00-A0-C6 (hex) Qualcomm Inc.\r
00A0C6 (base 16) Qualcomm Inc.\r
6455 LUSK BLVD\r
Beijing 100000\r
CN\r
\r
-AC-E7-7B (hex) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-ACE77B (base 16) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
- FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
2C-36-A0 (hex) Capisco Limited\r
2C36A0 (base 16) Capisco Limited\r
PO Box 938\r
Chandler AZ 85224\r
US\r
\r
-64-5D-92 (hex) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-645D92 (base 16) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
- FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road, Chengdu, Sichuan\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
38-BC-1A (hex) MEIZU Technology Co., Ltd.\r
38BC1A (base 16) MEIZU Technology Co., Ltd.\r
MEIZU Tech Bldg., Technology & Innovation Coast\r
Hefei Anhui 230088\r
CN\r
\r
-CC-A2-60 (hex) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-CCA260 (base 16) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
- FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
7C-57-4E (hex) COBI GmbH\r
7C574E (base 16) COBI GmbH\r
Solmsstrasse 4\r
San Francisco CA 94103\r
US\r
\r
-40-F4-20 (hex) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-40F420 (base 16) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
- FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
34-A2-A2 (hex) HUAWEI TECHNOLOGIES CO.,LTD\r
34A2A2 (base 16) HUAWEI TECHNOLOGIES CO.,LTD\r
No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
Olathe KS 66061\r
US\r
\r
-A4-D0-94 (hex) Erwin Peters Systemtechnik GmbH\r
-A4D094 (base 16) Erwin Peters Systemtechnik GmbH\r
- Josef Baumann Strasse 37\r
- Bochum D44805\r
- DE\r
-\r
88-23-64 (hex) Watchnet DVR Inc\r
882364 (base 16) Watchnet DVR Inc\r
Unit 5 - 351 Ferrier St.\r
\r
KR\r
\r
-00-03-24 (hex) SANYO Consumer Electronics Co., Ltd.\r
-000324 (base 16) SANYO Consumer Electronics Co., Ltd.\r
- 7-101 Tachikawa-cho\r
- Tottori City 680-8634\r
- JP\r
-\r
00-02-BF (hex) dotRocket, Inc.\r
0002BF (base 16) dotRocket, Inc.\r
1901 S. Bascom, Suite 300\r
Kulim Kedah 09000\r
MY\r
\r
-44-56-E2 (hex) Sichuan Tianyi Comheart Telecom Co., Ltd.\r
-4456E2 (base 16) Sichuan Tianyi Comheart Telecom Co., Ltd.\r
- No.198,First Section,Snow Mountain Avenue, Jinyuan Town, Dayi County\r
- Chengdu Sichuan 611330\r
- CN\r
-\r
68-EC-C5 (hex) Intel Corporate\r
68ECC5 (base 16) Intel Corporate\r
Lot 8, Jalan Hi-Tech 2/3 \r
San Jose CA 94568\r
US\r
\r
+3C-37-12 (hex) AVM Audiovisuelles Marketing und Computersysteme GmbH\r
+3C3712 (base 16) AVM Audiovisuelles Marketing und Computersysteme GmbH\r
+ Alt-Moabit 95\r
+ Berlin Berlin 10559\r
+ DE\r
+\r
+80-B6-55 (hex) Intel Corporate\r
+80B655 (base 16) Intel Corporate\r
+ Lot 8, Jalan Hi-Tech 2/3 \r
+ Kulim Kedah 09000\r
+ MY\r
+\r
+0C-CB-0C (hex) iSYS RTS GmbH\r
+0CCB0C (base 16) iSYS RTS GmbH\r
+ Moosacher Str. 88\r
+ Munich Bavaria 80809\r
+ DE\r
+\r
+44-56-E2 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+4456E2 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ No.198,First Section,Snow Mountain Avenue, Jinyuan Town, Dayi County\r
+ Chengdu Sichuan 611330\r
+ CN\r
+\r
+54-AE-D2 (hex) CSL Dualcom Ltd\r
+54AED2 (base 16) CSL Dualcom Ltd\r
+ Salamander Quay West, Park Lane\r
+ Harefield Middlesex UB9 6NZ\r
+ GB\r
+\r
+F4-6F-A4 (hex) Physik Instrumente GmbH & Co. KG\r
+F46FA4 (base 16) Physik Instrumente GmbH & Co. KG\r
+ Auf der Roemerstr. 1\r
+ Karlsruhe 76228\r
+ DE\r
+\r
+C4-74-69 (hex) BT9\r
+C47469 (base 16) BT9\r
+ Dolev 33\r
+ Tefen 2495900\r
+ IL\r
+\r
+64-5D-92 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+645D92 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road, Chengdu, Sichuan\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+9C-61-21 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+9C6121 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+E0-4F-BD (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+E04FBD (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+40-F4-20 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+40F420 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+CC-A2-60 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+CCA260 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+AC-E7-7B (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ACE77B (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+4C-D3-AF (hex) HMD Global Oy\r
+4CD3AF (base 16) HMD Global Oy\r
+ Bertel Jungin aukio 9\r
+ Espoo 02600\r
+ FI\r
+\r
+C8-51-42 (hex) Samsung Electronics Co.,Ltd\r
+C85142 (base 16) Samsung Electronics Co.,Ltd\r
+ #94-1, Imsoo-Dong\r
+ Gumi Gyeongbuk 730-350\r
+ KR\r
+\r
+CC-0D-E7 (hex) B METERS S.R.L.\r
+CC0DE7 (base 16) B METERS S.R.L.\r
+ VIA FRIULI 3\r
+ GONARS UDINE 33050\r
+ IT\r
+\r
+5C-A1-76 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+5CA176 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+10-E4-C2 (hex) Samsung Electronics Co.,Ltd\r
+10E4C2 (base 16) Samsung Electronics Co.,Ltd\r
+ #94-1, Imsoo-Dong\r
+ Gumi Gyeongbuk 730-350\r
+ KR\r
+\r
+0C-8D-CA (hex) Samsung Electronics Co.,Ltd\r
+0C8DCA (base 16) Samsung Electronics Co.,Ltd\r
+ #94-1, Imsoo-Dong\r
+ Gumi Gyeongbuk 730-350\r
+ KR\r
+\r
+58-2F-F7 (hex) Sagemcom Broadband SAS\r
+582FF7 (base 16) Sagemcom Broadband SAS\r
+ 250, route de l'Empereur\r
+ Rueil Malmaison Cedex hauts de seine 92848\r
+ FR\r
+\r
+8C-FD-15 (hex) Imagine Marketing Private Limited\r
+8CFD15 (base 16) Imagine Marketing Private Limited\r
+ 501B, Shri Guru Har Krishan Bhavan Charat Singh Colony Road, Chakala, Andheri East,\r
+ Mumbai Maharashtra 400093\r
+ IN\r
+\r
+AC-D8-29 (hex) Bouffalo Lab (Nanjing) Co., Ltd.\r
+ACD829 (base 16) Bouffalo Lab (Nanjing) Co., Ltd.\r
+ 5F, Gongxiang Space, No.100 Tuanjie Road, Nanjing, China\r
+ Nanjing Jiangsu 211800\r
+ CN\r
+\r
+68-3A-48 (hex) SAMJIN Co., Ltd.\r
+683A48 (base 16) SAMJIN Co., Ltd.\r
+ 199-6, Anyang 7-dong, Manan-gu\r
+ Anyang-si Gyeonggi-do 430-817\r
+ KR\r
+\r
+B0-27-CF (hex) Extreme Networks, Inc.\r
+B027CF (base 16) Extreme Networks, Inc.\r
+ 6480 Via Del Oro\r
+ San Jose CA 95119\r
+ US\r
+\r
+14-22-3B (hex) Google, Inc.\r
+14223B (base 16) Google, Inc.\r
+ 1600 Amphitheatre Parkway\r
+ Mountain View CA 94043\r
+ US\r
+\r
+48-F8-FF (hex) CHENGDU KT ELECTRONIC HI-TECH CO.,LTD\r
+48F8FF (base 16) CHENGDU KT ELECTRONIC HI-TECH CO.,LTD\r
+ No.9, 3rd Wuke Road, Wuhou District\r
+ Chengdu Sichuan Province 610045\r
+ CN\r
+\r
+E8-C1-E8 (hex) Shenzhen Xiao Bi En Culture Education Technology Co.,Ltd.\r
+E8C1E8 (base 16) Shenzhen Xiao Bi En Culture Education Technology Co.,Ltd.\r
+ 4GH Unit,Block D,Central Avenue,Intersection of Xixiang Avenue and Baoyuan Road,Labor Community,Xixiang Street,Baoan District\r
+ Shenzhen China 518102\r
+ CN\r
+\r
+2C-DD-E9 (hex) Arista Networks\r
+2CDDE9 (base 16) Arista Networks\r
+ 5453 Great America Parkway\r
+ Santa Clara CA 95054\r
+ US\r
+\r
+70-97-41 (hex) Arcadyan Corporation\r
+709741 (base 16) Arcadyan Corporation\r
+ No.8, Sec.2, Guangfu Rd.\r
+ Hsinchu City Hsinchu 30071\r
+ TW\r
+\r
+C4-FF-22 (hex) Huawei Device Co., Ltd.\r
+C4FF22 (base 16) Huawei Device Co., Ltd.\r
+ No.2 of Xincheng Road, Songshan Lake Zone\r
+ Dongguan Guangdong 523808\r
+ CN\r
+\r
+A0-A0-DC (hex) Huawei Device Co., Ltd.\r
+A0A0DC (base 16) Huawei Device Co., Ltd.\r
+ No.2 of Xincheng Road, Songshan Lake Zone\r
+ Dongguan Guangdong 523808\r
+ CN\r
+\r
+C4-80-8A (hex) Cloud Diagnostics Canada ULC\r
+C4808A (base 16) Cloud Diagnostics Canada ULC\r
+ 72 Victoria St. S., Unit 100\r
+ Kitchener Ontario N2G 4Y9\r
+ CA\r
+\r
+E4-08-E7 (hex) Quectel Wireless Solutions Co.,Ltd.\r
+E408E7 (base 16) Quectel Wireless Solutions Co.,Ltd.\r
+ 7th Floor, Hongye Building, No.1801 Hongmei Road, Xuhui District\r
+ Shanghai 200233\r
+ CN\r
+\r
+7C-70-DB (hex) Intel Corporate\r
+7C70DB (base 16) Intel Corporate\r
+ Lot 8, Jalan Hi-Tech 2/3 \r
+ Kulim Kedah 09000\r
+ MY\r
+\r
+8C-94-CC (hex) SFR\r
+8C94CC (base 16) SFR\r
+ 12 rue jean-philippe Rameau CS 80001\r
+ La plaine saint denis FRANCE 93634\r
+ FR\r
+\r
+60-DB-15 (hex) New H3C Technologies Co., Ltd\r
+60DB15 (base 16) New H3C Technologies Co., Ltd\r
+ 466 Changhe Road, Binjiang District\r
+ Hangzhou Zhejiang 310052\r
+ CN\r
+\r
+5C-A7-21 (hex) New H3C Technologies Co., Ltd\r
+5CA721 (base 16) New H3C Technologies Co., Ltd\r
+ 466 Changhe Road, Binjiang District\r
+ Hangzhou Zhejiang 310052\r
+ CN\r
+\r
+98-F2-17 (hex) Castlenet Technology Inc.\r
+98F217 (base 16) Castlenet Technology Inc.\r
+ 5F., No. 10, Daye Rd., Beitou Dist.\r
+ Taipei City 112030\r
+ TW\r
+\r
+6C-43-3C (hex) TECNO MOBILE LIMITED\r
+6C433C (base 16) TECNO MOBILE LIMITED\r
+ ROOMS 05-15, 13A/F., SOUTH TOWER, WORLD FINANCE CENTRE, HARBOUR CITY, 17 CANTON ROAD, TSIM SHA TSUI, KOWLOON, HONG KONG\r
+ Hong Kong Hong Kong 999077\r
+ HK\r
+\r
+44-5B-ED (hex) Aruba, a Hewlett Packard Enterprise Company\r
+445BED (base 16) Aruba, a Hewlett Packard Enterprise Company\r
+ 3333 Scott Blvd\r
+ Santa Clara CA 95054\r
+ US\r
+\r
+70-A6-CC (hex) Intel Corporate\r
+70A6CC (base 16) Intel Corporate\r
+ Lot 8, Jalan Hi-Tech 2/3 \r
+ Kulim Kedah 09000\r
+ MY\r
+\r
+84-EB-EF (hex) Cisco Systems, Inc\r
+84EBEF (base 16) Cisco Systems, Inc\r
+ 80 West Tasman Drive\r
+ San Jose CA 94568\r
+ US\r
+\r
+90-80-60 (hex) Nilfisk A/S\r
+908060 (base 16) Nilfisk A/S\r
+ Kornmarksvej 1\r
+ Broendby 2605\r
+ DK\r
+\r
+10-09-F9 (hex) Amazon Technologies Inc.\r
+1009F9 (base 16) Amazon Technologies Inc.\r
+ P.O Box 8102 \r
+ Reno NV 89507\r
+ US\r
+\r
+D0-3E-7D (hex) CHIPSEA TECHNOLOGIES (SHENZHEN) CORP.\r
+D03E7D (base 16) CHIPSEA TECHNOLOGIES (SHENZHEN) CORP.\r
+ 9F,BLOCK A,GARDEN CITY DIGITAL BUILDING,NO.1079 NANHAI ROAD,NANSHAN DISTRICT\r
+ SHEN ZHEN GUANG DONG 518000\r
+ CN\r
+\r
+6C-79-B8 (hex) Texas Instruments\r
+6C79B8 (base 16) Texas Instruments\r
+ 12500 TI Blvd\r
+ Dallas TX 75243\r
+ US\r
+\r
+A4-D0-94 (hex) VIVAVIS AG\r
+A4D094 (base 16) VIVAVIS AG\r
+ Nobelstr. 18\r
+ Ettlingen D-76375\r
+ DE\r
+\r
+8C-A3-99 (hex) SERVERCOM (INDIA) PRIVATE LIMITED\r
+8CA399 (base 16) SERVERCOM (INDIA) PRIVATE LIMITED\r
+ E-43/1 OKHLA INDUSTRIAL AREA PHASE-II NEW DELHI SOUTH DELHI\r
+ NEW DELHI NA\r
+ IN\r
+\r
+D4-54-8B (hex) Intel Corporate\r
+D4548B (base 16) Intel Corporate\r
+ Lot 8, Jalan Hi-Tech 2/3 \r
+ Kulim Kedah 09000\r
+ MY\r
+\r
+60-A5-E2 (hex) Intel Corporate\r
+60A5E2 (base 16) Intel Corporate\r
+ Lot 8, Jalan Hi-Tech 2/3 \r
+ Kulim Kedah 09000\r
+ MY\r
+\r
+FC-92-57 (hex) Renesas Electronics (Penang) Sdn. Bhd.\r
+FC9257 (base 16) Renesas Electronics (Penang) Sdn. Bhd.\r
+ Phase 3, Bayan Lepas FIZ\r
+ Bayan Lepas Penang 11900\r
+ MY\r
+\r
+90-69-76 (hex) Withrobot Inc.\r
+906976 (base 16) Withrobot Inc.\r
+ #1001, Seoul Forest M-tower, 31, Ttukseom-ro 1-gil, Seongdong-gu\r
+ Seoul Seoul 04778\r
+ KR\r
+\r
+60-B6-E1 (hex) Texas Instruments\r
+60B6E1 (base 16) Texas Instruments\r
+ 12500 TI Blvd\r
+ Dallas TX 75243\r
+ US\r
+\r
+D0-1E-1D (hex) SaiNXT Technologies LLP\r
+D01E1D (base 16) SaiNXT Technologies LLP\r
+ Shop No. 7, Sonawala Building, 1st Floor, Proctor Road, Grant Road (E)\r
+ Mumbai Maharashtra 400007\r
+ IN\r
+\r
+A8-23-16 (hex) Nokia\r
+A82316 (base 16) Nokia\r
+ 600 March Road\r
+ Kanata Ontario K2K 2E6\r
+ CA\r
+\r
+38-E3-9F (hex) Motorola Mobility LLC, a Lenovo Company\r
+38E39F (base 16) Motorola Mobility LLC, a Lenovo Company\r
+ 222 West Merchandise Mart Plaza\r
+ Chicago IL 60654\r
+ US\r
+\r
+A4-2A-71 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+A42A71 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ No.198,First Section,Snow Mountain Avenue, Jinyuan Town, Dayi County\r
+ Chengdu Sichuan 611330\r
+ CN\r
+\r
+44-67-52 (hex) Wistron INFOCOMM (Zhongshan) CORPORATION\r
+446752 (base 16) Wistron INFOCOMM (Zhongshan) CORPORATION\r
+ 15 Cuiwei Road, Cuiheng New District\r
+ zhongshan Guangdong 528400\r
+ CN\r
+\r
+78-BB-88 (hex) Maxio Technology (Hangzhou) Ltd.\r
+78BB88 (base 16) Maxio Technology (Hangzhou) Ltd.\r
+ 6F, Building C, No.459 Qianmo Road, Juguang Center\r
+ Hangzhou Zhejiang 310051\r
+ CN\r
+\r
+A8-64-F1 (hex) Intel Corporate\r
+A864F1 (base 16) Intel Corporate\r
+ Lot 8, Jalan Hi-Tech 2/3 \r
+ Kulim Kedah 09000\r
+ MY\r
+\r
+58-4D-42 (hex) Dragos, Inc.\r
+584D42 (base 16) Dragos, Inc.\r
+ 1745 Dorsey Rd, Suite R\r
+ Hanover MD 21076\r
+ US\r
+\r
+60-8A-10 (hex) Microchip Technology Inc.\r
+608A10 (base 16) Microchip Technology Inc.\r
+ 2355 W. Chandler Blvd.\r
+ Chandler AZ 85224\r
+ US\r
+\r
+10-6F-D9 (hex) CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD.\r
+106FD9 (base 16) CLOUD NETWORK TECHNOLOGY SINGAPORE PTE. LTD.\r
+ B22 Building,NO.51 Tongle Road, Shajing Town, Jiangnan District, Nanning, Guangxi Province, China\r
+ Nanning Guangxi 530007\r
+ CN\r
+\r
+00-03-24 (hex) SANYO Techno Solutions Tottori Co., Ltd.\r
+000324 (base 16) SANYO Techno Solutions Tottori Co., Ltd.\r
+ 7-101 Tachikawa-cho\r
+ Tottori City 680-8634\r
+ JP\r
+\r
84-80-94 (hex) Meter, Inc.\r
848094 (base 16) Meter, Inc.\r
148 Townsend St\r
Dongguan 523808\r
CN\r
\r
-CC-3A-DF (hex) Private\r
-CC3ADF (base 16) Private\r
-\r
38-EF-E3 (hex) INGENICO TERMINALS SAS\r
38EFE3 (base 16) INGENICO TERMINALS SAS\r
28-32 BOULEVARD DE GRENELLE\r
Piscataway NJ 08554\r
US\r
\r
-78-47-E3 (hex) SICHUAN TIANYI COMHEART TELECOM CO.,LTD\r
-7847E3 (base 16) SICHUAN TIANYI COMHEART TELECOM CO.,LTD\r
- NO.198 FIRST SECTION,SNOW MOUNTAIN AVENUE, JINYUAN TOWN, DAYI COUNTY, \r
- CHENGDU SICHUAN 611330\r
- CN\r
-\r
6C-9B-C0 (hex) Chemoptics Inc.\r
6C9BC0 (base 16) Chemoptics Inc.\r
261, Techno 2-ro, Yuseong-gu\r
Nishi-ku, Fukuoka-shi Fukuoka 819-0373\r
JP\r
\r
-F0-92-B4 (hex) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-F092B4 (base 16) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
- FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
E8-DF-70 (hex) AVM Audiovisuelles Marketing und Computersysteme GmbH\r
E8DF70 (base 16) AVM Audiovisuelles Marketing und Computersysteme GmbH\r
Alt-Moabit 95\r
Shenzhen Guangdong 518057\r
CN\r
\r
-EC-F8-EB (hex) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-ECF8EB (base 16) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
- FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
70-7D-95 (hex) Shenzhen City LinwlanTechnology Co. Ltd.\r
707D95 (base 16) Shenzhen City LinwlanTechnology Co. Ltd.\r
106 village road , manhole street Baoan district .\r
Sunnyvale CA 94089\r
US\r
\r
-2C-63-73 (hex) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-2C6373 (base 16) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
- FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
24-A7-DC (hex) BSkyB Ltd\r
24A7DC (base 16) BSkyB Ltd\r
130 Kings Road\r
Shenzhen Guangdong 518107\r
CN\r
\r
-8C-4D-EA (hex) Cerio Corporation\r
-8C4DEA (base 16) Cerio Corporation\r
- 5F., No.88, Mincyuan Rd., Sindian City\r
- Taipei County 23141\r
- TW\r
-\r
24-BA-30 (hex) Technical Consumer Products, Inc.\r
24BA30 (base 16) Technical Consumer Products, Inc.\r
325 Campus Drive\r
Shenzhen Guangdong 518057\r
CN\r
\r
-A8-55-6A (hex) Pocketnet Technology Inc.\r
-A8556A (base 16) Pocketnet Technology Inc.\r
- Suite B, 7F., No. 550, Ruie Kwang Rd., Neihu District,\r
- Taipei 11429\r
- TW\r
-\r
B4-C8-10 (hex) UMPI Elettronica\r
B4C810 (base 16) UMPI Elettronica\r
Via Respighi, 15\r
Yokohama Kanagawa 224-0037\r
JP\r
\r
-00-0B-3A (hex) QuStream Corporation\r
-000B3A (base 16) QuStream Corporation\r
- 3305 Breckinridge Blvd.\r
- Duluth Georgia 30096\r
- US\r
-\r
00-0B-33 (hex) Vivato Technologies\r
000B33 (base 16) Vivato Technologies\r
444 Cedros Ave\r
Shenzhen Guangdong 518000\r
CN\r
\r
-C4-A1-51 (hex) Sichuan Tianyi Comheart Telecom Co., Ltd.\r
-C4A151 (base 16) Sichuan Tianyi Comheart Telecom Co., Ltd.\r
- No.198,First Section,Snow Mountain Avenue, Jinyuan Town, Dayi County\r
- Chengdu Sichuan 611330\r
- CN\r
-\r
10-E7-7A (hex) STMicrolectronics International NV\r
10E77A (base 16) STMicrolectronics International NV\r
39, Chemin du Champ-des-Filles\r
Riga Riga LV1009\r
LV\r
\r
+88-E0-56 (hex) HUAWEI TECHNOLOGIES CO.,LTD\r
+88E056 (base 16) HUAWEI TECHNOLOGIES CO.,LTD\r
+ No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+ Dongguan 523808\r
+ CN\r
+\r
+D0-7D-33 (hex) Huawei Device Co., Ltd.\r
+D07D33 (base 16) Huawei Device Co., Ltd.\r
+ No.2 of Xincheng Road, Songshan Lake Zone\r
+ Dongguan Guangdong 523808\r
+ CN\r
+\r
+C0-E1-BE (hex) HUAWEI TECHNOLOGIES CO.,LTD\r
+C0E1BE (base 16) HUAWEI TECHNOLOGIES CO.,LTD\r
+ No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+ Dongguan 523808\r
+ CN\r
+\r
+D0-35-E5 (hex) EM Microelectronic\r
+D035E5 (base 16) EM Microelectronic\r
+ Rue des Sors 3\r
+ Marin-Epagnier Neuchatel 2074\r
+ CH\r
+\r
+90-96-F3 (hex) BUFFALO.INC\r
+9096F3 (base 16) BUFFALO.INC\r
+ AKAMONDORI Bld.,30-20,Ohsu 3-chome,Naka-ku\r
+ Nagoya Aichi Pref. 460-8315\r
+ JP\r
+\r
54-0E-58 (hex) GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
540E58 (base 16) GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
NO.18 HAIBIN ROAD,\r
Dongguan Guangdong 523808\r
CN\r
\r
-D0-7D-33 (hex) Huawei Device Co., Ltd.\r
-D07D33 (base 16) Huawei Device Co., Ltd.\r
+C4-A1-51 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+C4A151 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ No.198,First Section,Snow Mountain Avenue, Jinyuan Town, Dayi County\r
+ Chengdu Sichuan 611330\r
+ CN\r
+\r
+78-47-E3 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+7847E3 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ NO.198 FIRST SECTION,SNOW MOUNTAIN AVENUE, JINYUAN TOWN, DAYI COUNTY, \r
+ CHENGDU SICHUAN 611330\r
+ CN\r
+\r
+EC-F8-EB (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ECF8EB (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+F0-92-B4 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+F092B4 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+F4-4E-38 (hex) Olibra LLC\r
+F44E38 (base 16) Olibra LLC\r
+ 45 legin dr\r
+ creskill NJ 07626\r
+ US\r
+\r
+2C-63-73 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+2C6373 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+A0-D7-22 (hex) Samsung Electronics Co.,Ltd\r
+A0D722 (base 16) Samsung Electronics Co.,Ltd\r
+ #94-1, Imsoo-Dong\r
+ Gumi Gyeongbuk 730-350\r
+ KR\r
+\r
+50-49-B0 (hex) Samsung Electronics Co.,Ltd\r
+5049B0 (base 16) Samsung Electronics Co.,Ltd\r
+ #94-1, Imsoo-Dong\r
+ Gumi Gyeongbuk 730-350\r
+ KR\r
+\r
+E8-05-DC (hex) Verifone Inc.\r
+E805DC (base 16) Verifone Inc.\r
+ 2560 North First Street, Suite 220\r
+ San Jose CA 95131\r
+ US\r
+\r
+10-7B-CE (hex) Nokia\r
+107BCE (base 16) Nokia\r
+ 600 March Road\r
+ Kanata Ontario K2K 2E6\r
+ CA\r
+\r
+C8-05-9E (hex) Hefei Symboltek Co.,Ltd\r
+C8059E (base 16) Hefei Symboltek Co.,Ltd\r
+ Standard factory building 2 layer,Tianmen Lake 1#,No.36 Fairview Avenue District Econmic Development Zone Hefei, Anhui \r
+ Hefei Anhui 230601\r
+ CN\r
+\r
+34-FC-A1 (hex) Micronet union Technology(Chengdu)Co., Ltd.\r
+34FCA1 (base 16) Micronet union Technology(Chengdu)Co., Ltd.\r
+ No.502, Building 5, No. 528, Yuefei Road, Shibantan Street, Xindu District\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+28-97-B8 (hex) myenergi Ltd\r
+2897B8 (base 16) myenergi Ltd\r
+ Church View Business Centre, Binbrook\r
+ Market Rasen Lincolnshire LN8 6BY\r
+ GB\r
+\r
+48-06-2B (hex) Private\r
+48062B (base 16) Private\r
+\r
+B0-A7-B9 (hex) TP-Link Corporation Limited\r
+B0A7B9 (base 16) TP-Link Corporation Limited\r
+ Room 901,9/F.New East Ocean Centre, 9 Science Museum Road\r
+ Tsim Sha Tsui Kowloon 999077\r
+ HK\r
+\r
+6C-5A-B0 (hex) TP-Link Corporation Limited\r
+6C5AB0 (base 16) TP-Link Corporation Limited\r
+ Room 901,9/F.New East Ocean Centre, 9 Science Museum Road\r
+ Tsim Sha Tsui Kowloon 999077\r
+ HK\r
+\r
+4C-F5-DC (hex) Hangzhou Hikvision Digital Technology Co.,Ltd.\r
+4CF5DC (base 16) Hangzhou Hikvision Digital Technology Co.,Ltd.\r
+ No.555 Qianmo Road\r
+ Hangzhou Zhejiang 310052\r
+ CN\r
+\r
+60-E6-F0 (hex) Wistron Neweb Corporation\r
+60E6F0 (base 16) Wistron Neweb Corporation\r
+ No.20,Park Avenue II,Hsinchu Science Park\r
+ Hsin-Chu R.O.C. 308\r
+ TW\r
+\r
+20-1F-3B (hex) Google, Inc.\r
+201F3B (base 16) Google, Inc.\r
+ 1600 Amphitheatre Parkway\r
+ Mountain View CA 94043\r
+ US\r
+\r
+B8-25-B5 (hex) Trakm8 Ltd\r
+B825B5 (base 16) Trakm8 Ltd\r
+ 4 Roman Park, Roman Way\r
+ Coleshill West Midlands B46 1HG\r
+ GB\r
+\r
+20-D2-76 (hex) ITEL MOBILE LIMITED\r
+20D276 (base 16) ITEL MOBILE LIMITED\r
+ RM B3 & B4 BLOCK B, KO FAI INDUSTRIAL BUILDING NO.7 KO FAI ROAD, YAU TONG, KLN, H.K\r
+ Hong Kong KOWLOON 999077\r
+ HK\r
+\r
+08-A8-42 (hex) Huawei Device Co., Ltd.\r
+08A842 (base 16) Huawei Device Co., Ltd.\r
No.2 of Xincheng Road, Songshan Lake Zone\r
Dongguan Guangdong 523808\r
CN\r
\r
-C0-E1-BE (hex) HUAWEI TECHNOLOGIES CO.,LTD\r
-C0E1BE (base 16) HUAWEI TECHNOLOGIES CO.,LTD\r
- No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
- Dongguan 523808\r
+C8-F5-D6 (hex) IEEE Registration Authority\r
+C8F5D6 (base 16) IEEE Registration Authority\r
+ 445 Hoes Lane\r
+ Piscataway NJ 08554\r
+ US\r
+\r
+40-58-99 (hex) Logitech Far East\r
+405899 (base 16) Logitech Far East\r
+ #2 Creation Rd. 4,\r
+ Hsinchu 300\r
+ TW\r
+\r
+8C-4D-EA (hex) Cerio Corporation\r
+8C4DEA (base 16) Cerio Corporation\r
+ 4F.-3., No.192, Sec. 2, Zhongxing Rd., Xindian Dist.\r
+ New Taipei City 231\r
+ TW\r
+\r
+98-43-FA (hex) Intel Corporate\r
+9843FA (base 16) Intel Corporate\r
+ Lot 8, Jalan Hi-Tech 2/3 \r
+ Kulim Kedah 09000\r
+ MY\r
+\r
+94-AA-0A (hex) Fiberhome Telecommunication Technologies Co.,LTD\r
+94AA0A (base 16) Fiberhome Telecommunication Technologies Co.,LTD\r
+ No.5 DongXin Road\r
+ Wuhan Hubei 430074\r
CN\r
\r
-88-E0-56 (hex) HUAWEI TECHNOLOGIES CO.,LTD\r
-88E056 (base 16) HUAWEI TECHNOLOGIES CO.,LTD\r
+7C-F4-62 (hex) BEIJING HUAWOO TECHNOLOGIES CO.LTD\r
+7CF462 (base 16) BEIJING HUAWOO TECHNOLOGIES CO.LTD\r
+ A411-3, floor 3, block A, 9 Shangdi 3rd Street, Haidian District, Beijing\r
+ beijing 100094\r
+ CN\r
+\r
+04-B9-E3 (hex) Samsung Electronics Co.,Ltd\r
+04B9E3 (base 16) Samsung Electronics Co.,Ltd\r
+ 129, Samsung-ro, Youngtongl-Gu\r
+ Suwon Gyeonggi-Do 16677\r
+ KR\r
+\r
+C4-5E-5C (hex) HUAWEI TECHNOLOGIES CO.,LTD\r
+C45E5C (base 16) HUAWEI TECHNOLOGIES CO.,LTD\r
No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
Dongguan 523808\r
CN\r
\r
+E8-5C-0A (hex) Cisco Systems, Inc\r
+E85C0A (base 16) Cisco Systems, Inc\r
+ 80 West Tasman Drive\r
+ San Jose CA 94568\r
+ US\r
+\r
+70-B9-50 (hex) Texas Instruments\r
+70B950 (base 16) Texas Instruments\r
+ 12500 TI Blvd\r
+ Dallas TX 75243\r
+ US\r
+\r
+D0-9F-D9 (hex) IEEE Registration Authority\r
+D09FD9 (base 16) IEEE Registration Authority\r
+ 445 Hoes Lane\r
+ Piscataway NJ 08554\r
+ US\r
+\r
+A0-B0-86 (hex) Hirschmann Automation and Control GmbH\r
+A0B086 (base 16) Hirschmann Automation and Control GmbH\r
+ Stuttgarter Straße 45-51\r
+ Neckartenzlingen D-72654\r
+ DE\r
+\r
+30-B3-46 (hex) CJSC NORSI-TRANS\r
+30B346 (base 16) CJSC NORSI-TRANS\r
+ B.Novodmitrovskaya, 12/15 floor 2 r. 36\r
+ Moscow MOSCOW 127015\r
+ RU\r
+\r
+20-C1-9B (hex) Intel Corporate\r
+20C19B (base 16) Intel Corporate\r
+ Lot 8, Jalan Hi-Tech 2/3 \r
+ Kulim Kedah 09000\r
+ MY\r
+\r
+2C-6D-C1 (hex) Intel Corporate\r
+2C6DC1 (base 16) Intel Corporate\r
+ Lot 8, Jalan Hi-Tech 2/3 \r
+ Kulim Kedah 09000\r
+ MY\r
+\r
+00-FA-B6 (hex) Kontakt Micro-Location Sp z o.o.\r
+00FAB6 (base 16) Kontakt Micro-Location Sp z o.o.\r
+ Stoczniowcow 3\r
+ Krakow 30-709\r
+ PL\r
+\r
+54-C2-50 (hex) Iskratel d.o.o.\r
+54C250 (base 16) Iskratel d.o.o.\r
+ Ljubljanska cesta 24a\r
+ Kranj 4000\r
+ SI\r
+\r
+00-0B-3A (hex) PESA\r
+000B3A (base 16) PESA\r
+ 103 Quality Circle, Suite 210\r
+ Huntsville AL 35806\r
+ US\r
+\r
+5C-E4-2A (hex) Intel Corporate\r
+5CE42A (base 16) Intel Corporate\r
+ Lot 8, Jalan Hi-Tech 2/3 \r
+ Kulim Kedah 09000\r
+ MY\r
+\r
+18-74-E2 (hex) IEEE Registration Authority\r
+1874E2 (base 16) IEEE Registration Authority\r
+ 445 Hoes Lane\r
+ Piscataway NJ 08554\r
+ US\r
+\r
+F0-C8-14 (hex) SHENZHEN BILIAN ELECTRONIC CO.,LTD\r
+F0C814 (base 16) SHENZHEN BILIAN ELECTRONIC CO.,LTD\r
+ NO.268? Fuqian Rd, Jutang community, Guanlan Town, Longhua New district\r
+ shenzhen guangdong 518000\r
+ CN\r
+\r
+D0-17-69 (hex) Murata Manufacturing Co., Ltd.\r
+D01769 (base 16) Murata Manufacturing Co., Ltd.\r
+ 1-10-1, Higashikotari\r
+ Nagaokakyo-shi Kyoto 617-8555\r
+ JP\r
+\r
+CC-3A-DF (hex) Neptune Technology Group Inc.\r
+CC3ADF (base 16) Neptune Technology Group Inc.\r
+ 1600 AL Highway 229 S\r
+ Tallassee AL 36078\r
+ US\r
+\r
+A8-55-6A (hex) 3S System Technology Inc.\r
+A8556A (base 16) 3S System Technology Inc.\r
+ 6F, No. 5, Ln. 16, Sec. 2, Sichuan Rd., Banqiao Dist.,\r
+ New Taipei City 220620\r
+ TW\r
+\r
+68-EC-8A (hex) Private\r
+68EC8A (base 16) Private\r
+\r
F8-D0-27 (hex) Seiko Epson Corporation\r
F8D027 (base 16) Seiko Epson Corporation\r
2070 Kotobuki Koaka\r
NO.68, Qinghe Middle Street Haidian District, Beijing 100085\r
CN\r
\r
-10-12-B4 (hex) SICHUAN TIANYI COMHEART TELECOM CO.,LTD\r
-1012B4 (base 16) SICHUAN TIANYI COMHEART TELECOM CO.,LTD\r
- NO.198 FIRST SECTION,SNOW MOUNTAIN AVENUE, JINYUAN TOWN, DAYI COUNTY, \r
- CHENGDU SICHUAN 611330\r
- CN\r
-\r
B8-2C-A0 (hex) Resideo\r
B82CA0 (base 16) Resideo\r
2 Corporate Center Dr.\r
Fürth Deutschlang 90766\r
DE\r
\r
-04-6B-25 (hex) SICHUAN TIANYI COMHEART TELECOM CO.,LTD\r
-046B25 (base 16) SICHUAN TIANYI COMHEART TELECOM CO.,LTD\r
- NO.198 FIRST SECTION,SNOW MOUNTAIN AVENUE, JINYUAN TOWN, DAYI COUNTY, \r
- CHENGDU SICHUAN 611330\r
- CN\r
-\r
98-D3-E7 (hex) Netafim L\r
98D3E7 (base 16) Netafim L\r
Kibutz Magal\r
Xinzhuang Dist., New Taipei City 24255\r
TW\r
\r
-14-69-A2 (hex) SICHUAN TIANYI COMHEART TELECOM CO.,LTD\r
-1469A2 (base 16) SICHUAN TIANYI COMHEART TELECOM CO.,LTD\r
- NO.198 FIRST SECTION,SNOW MOUNTAIN AVENUE, JINYUAN TOWN, DAYI COUNTY, \r
- CHENGDU SICHUAN 611330\r
- CN\r
-\r
54-80-28 (hex) Hewlett Packard Enterprise\r
548028 (base 16) Hewlett Packard Enterprise\r
8000 Foothills Blvd.\r
Dallas TX 75243\r
US\r
\r
-68-26-2A (hex) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-68262A (base 16) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
- FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
E8-DE-8E (hex) Integrated Device Technology (Malaysia) Sdn. Bhd.\r
E8DE8E (base 16) Integrated Device Technology (Malaysia) Sdn. Bhd.\r
Phase 3, Bayan Lepas FIZ\r
Hsin-chu Taiwan 300\r
TW\r
\r
-9C-32-A9 (hex) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-9C32A9 (base 16) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
- FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
1C-5A-0B (hex) Tegile Systems\r
1C5A0B (base 16) Tegile Systems\r
7999 Gateway Blvd Suite 120\r
NEW TAIPEI TAIWAN 23585\r
TW\r
\r
-B8-22-4F (hex) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-B8224F (base 16) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
- FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
98-00-C1 (hex) GuangZhou CREATOR Technology Co.,Ltd.(CHINA)\r
9800C1 (base 16) GuangZhou CREATOR Technology Co.,Ltd.(CHINA)\r
Level 3,Blg 6,No 9 Keji Yuan,LanYusi St,\r
Hui Zhou Guang Dong 516006\r
CN\r
\r
-90-86-74 (hex) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-908674 (base 16) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
- FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
90-17-11 (hex) Hagenuk Marinekommunikation GmbH\r
901711 (base 16) Hagenuk Marinekommunikation GmbH\r
Hamburger Chaussee 25\r
Zhubei City Hsinchu County 30265\r
TW\r
\r
-44-BA-46 (hex) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-44BA46 (base 16) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
- FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
E0-7C-13 (hex) zte corporation\r
E07C13 (base 16) zte corporation\r
12/F.,zte R&D building ,kejinan Road,Shenzhen,P.R.China\r
Zhongshan Guangdong 528437\r
CN\r
\r
-64-3A-B1 (hex) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-643AB1 (base 16) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
- FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road, Chengdu, Sichuan\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
00-1B-FE (hex) Zavio Inc.\r
001BFE (base 16) Zavio Inc.\r
No.1,Lising 1st Rd. Science Based Industrial Park,\r
Lawrenceville GA 30044\r
US\r
\r
-80-48-A5 (hex) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-8048A5 (base 16) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
- FL12,TowerB,TianYi International Hotel\r
- Chengdu Sichuan 61000\r
- CN\r
-\r
68-3E-34 (hex) MEIZU Technology Co., Ltd.\r
683E34 (base 16) MEIZU Technology Co., Ltd.\r
MEIZU Tech Bldg., Technology & Innovation Coast\r
Palo Alto CA 94303\r
US\r
\r
-00-0C-04 (hex) Tecnova\r
-000C04 (base 16) Tecnova\r
- 1486 St. Paul Ave.\r
- Gurnee Illinois 60031\r
- US\r
-\r
00-0C-01 (hex) Abatron AG\r
000C01 (base 16) Abatron AG\r
Lettenstrasse 9\r
Landquart 7302\r
CH\r
\r
-00-E5-E4 (hex) Sichuan Tianyi Comheart Telecom Co., Ltd.\r
-00E5E4 (base 16) Sichuan Tianyi Comheart Telecom Co., Ltd.\r
- No.198,First Section,Snow Mountain Avenue, Jinyuan Town, Dayi County\r
- Chengdu Sichuan 611330\r
- CN\r
-\r
E8-13-6E (hex) HUAWEI TECHNOLOGIES CO.,LTD\r
E8136E (base 16) HUAWEI TECHNOLOGIES CO.,LTD\r
No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
Hsinchu City Hsinchu 30071\r
TW\r
\r
-00-C0-6A (hex) Zahner-Elektrik Ingeborg Zahner-Schiller GmbH & Co. KG.\r
-00C06A (base 16) Zahner-Elektrik Ingeborg Zahner-Schiller GmbH & Co. KG.\r
- P.O. BOX 1846\r
- \r
- DE\r
-\r
8C-43-61 (hex) Hailo Digital Hub GmbH & Co. KG\r
8C4361 (base 16) Hailo Digital Hub GmbH & Co. KG\r
Lahnstrasse 3a\r
Dongguan 523808\r
CN\r
\r
+00-C0-6A (hex) Zahner-Elektrik Ingeborg Zahner-Schiller GmbH & Co. KG.\r
+00C06A (base 16) Zahner-Elektrik Ingeborg Zahner-Schiller GmbH & Co. KG.\r
+ Thüringer Str. 12\r
+ Kronach - Gundelsdorf Bavaria 96317\r
+ DE\r
+\r
+20-1E-88 (hex) Intel Corporate\r
+201E88 (base 16) Intel Corporate\r
+ Lot 8, Jalan Hi-Tech 2/3 \r
+ Kulim Kedah 09000\r
+ MY\r
+\r
20-CE-2A (hex) IEEE Registration Authority\r
20CE2A (base 16) IEEE Registration Authority\r
445 Hoes Lane\r
Piscataway NJ 08554\r
US\r
\r
+58-13-D3 (hex) Gemtek Technology Co., Ltd.\r
+5813D3 (base 16) Gemtek Technology Co., Ltd.\r
+ No.15-1 Zhonghua Road\r
+ Hukou Hsinchu 30352\r
+ TW\r
+\r
+00-E5-E4 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+00E5E4 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ No.198,First Section,Snow Mountain Avenue, Jinyuan Town, Dayi County\r
+ Chengdu Sichuan 611330\r
+ CN\r
+\r
+14-69-A2 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+1469A2 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ NO.198 FIRST SECTION,SNOW MOUNTAIN AVENUE, JINYUAN TOWN, DAYI COUNTY, \r
+ CHENGDU SICHUAN 611330\r
+ CN\r
+\r
+04-6B-25 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+046B25 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ NO.198 FIRST SECTION,SNOW MOUNTAIN AVENUE, JINYUAN TOWN, DAYI COUNTY, \r
+ CHENGDU SICHUAN 611330\r
+ CN\r
+\r
+10-12-B4 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+1012B4 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ NO.198 FIRST SECTION,SNOW MOUNTAIN AVENUE, JINYUAN TOWN, DAYI COUNTY, \r
+ CHENGDU SICHUAN 611330\r
+ CN\r
+\r
+9C-32-A9 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+9C32A9 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+68-26-2A (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+68262A (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+B8-22-4F (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+B8224F (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+90-86-74 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+908674 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+88-C9-B3 (hex) IEEE Registration Authority\r
+88C9B3 (base 16) IEEE Registration Authority\r
+ 445 Hoes Lane\r
+ Piscataway NJ 08554\r
+ US\r
+\r
+C8-BD-69 (hex) Samsung Electronics Co.,Ltd\r
+C8BD69 (base 16) Samsung Electronics Co.,Ltd\r
+ #94-1, Imsoo-Dong\r
+ Gumi Gyeongbuk 730-350\r
+ KR\r
+\r
+64-3A-B1 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+643AB1 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road, Chengdu, Sichuan\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+44-BA-46 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+44BA46 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+A8-76-50 (hex) Samsung Electronics Co.,Ltd\r
+A87650 (base 16) Samsung Electronics Co.,Ltd\r
+ #94-1, Imsoo-Dong\r
+ Gumi Gyeongbuk 730-350\r
+ KR\r
+\r
+54-D1-7D (hex) Samsung Electronics Co.,Ltd\r
+54D17D (base 16) Samsung Electronics Co.,Ltd\r
+ #94-1, Imsoo-Dong\r
+ Gumi Gyeongbuk 730-350\r
+ KR\r
+\r
+60-3A-AF (hex) Samsung Electronics Co.,Ltd\r
+603AAF (base 16) Samsung Electronics Co.,Ltd\r
+ #94-1, Imsoo-Dong\r
+ Gumi Gyeongbuk 730-350\r
+ KR\r
+\r
+80-48-A5 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+8048A5 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12,TowerB,TianYi International Hotel\r
+ Chengdu Sichuan 61000\r
+ CN\r
+\r
+54-66-F9 (hex) ConMet\r
+5466F9 (base 16) ConMet\r
+ 5701 SE Columbia Way\r
+ Vancouver WA 98661\r
+ US\r
+\r
+58-91-53 (hex) China Mobile IOT Company Limited\r
+589153 (base 16) China Mobile IOT Company Limited\r
+ NO.8 Yu Ma Road, NanAn Area\r
+ Chongqing Chongqing 401336\r
+ CN\r
+\r
+9C-5A-81 (hex) Xiaomi Communications Co Ltd\r
+9C5A81 (base 16) Xiaomi Communications Co Ltd\r
+ The Rainbow City of China Resources\r
+ NO.68, Qinghe Middle Street Haidian District, Beijing 100085\r
+ CN\r
+\r
+B8-13-32 (hex) AMPAK Technology,Inc.\r
+B81332 (base 16) AMPAK Technology,Inc.\r
+ 3F, No.15-1 Zhonghua Road, Hsinchu Industrail Park, Hukou,\r
+ Hsinchu Hsinchu,Taiwan R.O.C. 30352\r
+ TW\r
+\r
+98-7D-DD (hex) China Mobile Group Device Co.,Ltd.\r
+987DDD (base 16) China Mobile Group Device Co.,Ltd.\r
+ 32 Xuanwumen West Street,Xicheng District\r
+ Beijing 100053\r
+ CN\r
+\r
+44-DB-60 (hex) Nanjing Baihezhengliu Technology Co., Ltd\r
+44DB60 (base 16) Nanjing Baihezhengliu Technology Co., Ltd\r
+ Science and technology innovation center, Shiqiu street, Lishui District\r
+ Nanjing Jiangsu 211222\r
+ CN\r
+\r
+B8-B7-7D (hex) Guangdong Transtek Medical Electronics CO.,Ltd\r
+B8B77D (base 16) Guangdong Transtek Medical Electronics CO.,Ltd\r
+ Zone A, No.105 ,Dongli Road, Torch Development District Zhongshan , CN 528437 \r
+ Zhongshan Guangdong 528437\r
+ CN\r
+\r
+C4-78-A2 (hex) Huawei Device Co., Ltd.\r
+C478A2 (base 16) Huawei Device Co., Ltd.\r
+ No.2 of Xincheng Road, Songshan Lake Zone\r
+ Dongguan Guangdong 523808\r
+ CN\r
+\r
+9C-9E-71 (hex) Huawei Device Co., Ltd.\r
+9C9E71 (base 16) Huawei Device Co., Ltd.\r
+ No.2 of Xincheng Road, Songshan Lake Zone\r
+ Dongguan Guangdong 523808\r
+ CN\r
+\r
+0C-9A-3C (hex) Intel Corporate\r
+0C9A3C (base 16) Intel Corporate\r
+ Lot 8, Jalan Hi-Tech 2/3 \r
+ Kulim Kedah 09000\r
+ MY\r
+\r
+DC-21-48 (hex) Intel Corporate\r
+DC2148 (base 16) Intel Corporate\r
+ Lot 8, Jalan Hi-Tech 2/3 \r
+ Kulim Kedah 09000\r
+ MY\r
+\r
+74-CF-00 (hex) Shenzhen SuperElectron Technology Co.,Ltd.\r
+74CF00 (base 16) Shenzhen SuperElectron Technology Co.,Ltd.\r
+ 1213-1214, haosheng business center, dongbin road, nanshan street, nanshan district, shenzhen city\r
+ Shenzhen Guangdong 518000\r
+ CN\r
+\r
+2C-EA-DC (hex) ASKEY COMPUTER CORP\r
+2CEADC (base 16) ASKEY COMPUTER CORP\r
+ 10F,No.119,JIANKANG RD,ZHONGHE DIST\r
+ NEW TAIPEI TAIWAN 23585\r
+ TW\r
+\r
+AC-E1-4F (hex) Autonomic Controls, Inc.\r
+ACE14F (base 16) Autonomic Controls, Inc.\r
+ 28 Kaysal Ct\r
+ ARMONK NY 10504\r
+ US\r
+\r
+AC-97-6C (hex) Greenliant\r
+AC976C (base 16) Greenliant\r
+ 3970 Freedom Circle, Suite 100\r
+ Santa Clara CA 95054\r
+ US\r
+\r
+38-14-28 (hex) Dell Inc.\r
+381428 (base 16) Dell Inc.\r
+ One Dell Way\r
+ Round Rock TX 78682\r
+ US\r
+\r
+98-49-9F (hex) Domo Tactical Communications\r
+98499F (base 16) Domo Tactical Communications\r
+ DTC Fusion 2, 1100 Parkway\r
+ Whiteley Hampshire PO15 7AB\r
+ GB\r
+\r
+C0-23-8D (hex) Samsung Electronics Co.,Ltd\r
+C0238D (base 16) Samsung Electronics Co.,Ltd\r
+ 129, Samsung-ro, Youngtongl-Gu\r
+ Suwon Gyeonggi-Do 16677\r
+ KR\r
+\r
+28-11-A8 (hex) Intel Corporate\r
+2811A8 (base 16) Intel Corporate\r
+ Lot 8, Jalan Hi-Tech 2/3 \r
+ Kulim Kedah 09000\r
+ MY\r
+\r
+20-CF-AE (hex) Cisco Systems, Inc\r
+20CFAE (base 16) Cisco Systems, Inc\r
+ 80 West Tasman Drive\r
+ San Jose CA 94568\r
+ US\r
+\r
+C0-FB-F9 (hex) IEEE Registration Authority\r
+C0FBF9 (base 16) IEEE Registration Authority\r
+ 445 Hoes Lane\r
+ Piscataway NJ 08554\r
+ US\r
+\r
+60-9B-B4 (hex) HUAWEI TECHNOLOGIES CO.,LTD\r
+609BB4 (base 16) HUAWEI TECHNOLOGIES CO.,LTD\r
+ No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+ Dongguan 523808\r
+ CN\r
+\r
+7C-27-BC (hex) Hui Zhou Gaoshengda Technology Co.,LTD\r
+7C27BC (base 16) Hui Zhou Gaoshengda Technology Co.,LTD\r
+ No.75,Zhongkai High-Tech Development District,Huizhou\r
+ Hui Zhou Guangdong 516006\r
+ CN\r
+\r
+74-5D-68 (hex) Fiberhome Telecommunication Technologies Co.,LTD\r
+745D68 (base 16) Fiberhome Telecommunication Technologies Co.,LTD\r
+ No.5 DongXin Road\r
+ Wuhan Hubei 430074\r
+ CN\r
+\r
+EC-08-E5 (hex) Motorola Mobility LLC, a Lenovo Company\r
+EC08E5 (base 16) Motorola Mobility LLC, a Lenovo Company\r
+ 222 West Merchandise Mart Plaza\r
+ Chicago IL 60654\r
+ US\r
+\r
+80-CC-9C (hex) NETGEAR\r
+80CC9C (base 16) NETGEAR\r
+ 350 East Plumeria Drive\r
+ San Jose CA 95134\r
+ US\r
+\r
+0C-60-46 (hex) vivo Mobile Communication Co., Ltd.\r
+0C6046 (base 16) vivo Mobile Communication Co., Ltd.\r
+ #283,BBK Road\r
+ Wusha,Chang'An DongGuan City,Guangdong, 523860\r
+ CN\r
+\r
+C0-F9-B0 (hex) HUAWEI TECHNOLOGIES CO.,LTD\r
+C0F9B0 (base 16) HUAWEI TECHNOLOGIES CO.,LTD\r
+ No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+ Dongguan 523808\r
+ CN\r
+\r
+14-8C-4A (hex) HUAWEI TECHNOLOGIES CO.,LTD\r
+148C4A (base 16) HUAWEI TECHNOLOGIES CO.,LTD\r
+ No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+ Dongguan 523808\r
+ CN\r
+\r
+50-70-97 (hex) China Mobile Group Device Co.,Ltd.\r
+507097 (base 16) China Mobile Group Device Co.,Ltd.\r
+ 32 Xuanwumen West Street,Xicheng District\r
+ Beijing 100053\r
+ CN\r
+\r
+CC-15-31 (hex) Intel Corporate\r
+CC1531 (base 16) Intel Corporate\r
+ Lot 8, Jalan Hi-Tech 2/3 \r
+ Kulim Kedah 09000\r
+ MY\r
+\r
+28-0F-EB (hex) LG Innotek\r
+280FEB (base 16) LG Innotek\r
+ 26, Hanamsandan 5beon-ro\r
+ Gwangju Gwangsan-gu 506-731\r
+ KR\r
+\r
+4C-D5-77 (hex) CHONGQING FUGUI ELECTRONICS CO.,LTD.\r
+4CD577 (base 16) CHONGQING FUGUI ELECTRONICS CO.,LTD.\r
+ Building D21,No.1, East Zone 1st Road,Xiyong Town,Shapingba District\r
+ Chongqing Chongqing 401332\r
+ CN\r
+\r
+74-E2-0C (hex) Amazon Technologies Inc.\r
+74E20C (base 16) Amazon Technologies Inc.\r
+ P.O Box 8102 \r
+ Reno NV 89507\r
+ US\r
+\r
+00-0C-04 (hex) Tecnova\r
+000C04 (base 16) Tecnova\r
+ 2383 N Delany Rd\r
+ Waukegan IL 60087-1836\r
+ US\r
+\r
+10-54-03 (hex) INTARSO GmbH\r
+105403 (base 16) INTARSO GmbH\r
+ Schuchardstr. 3\r
+ Düsseldorf NRW 40595\r
+ DE\r
+\r
7C-8A-E1 (hex) COMPAL INFORMATION (KUNSHAN) CO., LTD. \r
7C8AE1 (base 16) COMPAL INFORMATION (KUNSHAN) CO., LTD. \r
NO. 25, THE 3RD Street KUNSHAN EXPORT PROCESSING ZONE \r
Shenzhen Guangdong 518000\r
CN\r
\r
-C0-1B-23 (hex) SICHUAN TIANYI COMHEART TELECOM CO.,LTD\r
-C01B23 (base 16) SICHUAN TIANYI COMHEART TELECOM CO.,LTD\r
- NO.198 FIRST SECTION,SNOW MOUNTAIN AVENUE, JINYUAN TOWN, DAYI COUNTY,\r
- CHENGDU SICHUAN 611330\r
- CN\r
-\r
B8-C7-4A (hex) GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
B8C74A (base 16) GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD\r
NO.18 HAIBIN ROAD,\r
Seongnam-si Gyeonggi-do 463-875\r
KR\r
\r
-5C-4A-1F (hex) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-5C4A1F (base 16) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
- FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
E4-8F-34 (hex) Vodafone Italia S.p.A.\r
E48F34 (base 16) Vodafone Italia S.p.A.\r
Via Lorenteggio nr. 240\r
Taipei City Neihu Dist 248\r
TW\r
\r
-24-8B-E0 (hex) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-248BE0 (base 16) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
- FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
00-24-24 (hex) Ace Axis Limited\r
002424 (base 16) Ace Axis Limited\r
602 Delta Business Park, Welton Road\r
Hangzhou Zhejiang 310052\r
CN\r
\r
-9C-9C-40 (hex) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-9C9C40 (base 16) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
- FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
A4-07-B6 (hex) Samsung Electronics Co.,Ltd\r
A407B6 (base 16) Samsung Electronics Co.,Ltd\r
#94-1, Imsoo-Dong\r
Cupertino CA 95014\r
US\r
\r
-54-E0-61 (hex) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-54E061 (base 16) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
- FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
50-3A-7D (hex) AlphaTech PLC Int’l Co., Ltd.\r
503A7D (base 16) AlphaTech PLC Int’l Co., Ltd.\r
13F., No.618, Sec. 7, New Taipei Blvd., Xinzhuang Dist., \r
San Jose CA 94568\r
US\r
\r
-18-75-32 (hex) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
-187532 (base 16) SICHUAN TIANYI COMHEART TELECOMCO., LTD\r
- FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
4C-B8-1C (hex) SAM Electronics GmbH\r
4CB81C (base 16) SAM Electronics GmbH\r
Behringstr. 120\r
HangZhou ZheJiang 310053\r
CN\r
\r
-FC-37-2B (hex) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-FC372B (base 16) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
- FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
A4-D9-A4 (hex) neXus ID Solutions AB\r
A4D9A4 (base 16) neXus ID Solutions AB\r
Telefonvägen 26\r
New Taipei City Taiwan 23585\r
TW\r
\r
-7C-CC-1F (hex) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-7CCC1F (base 16) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
- FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
18-F2-92 (hex) Shannon Systems\r
18F292 (base 16) Shannon Systems\r
Suite 1801,Wentong Building,739 Kunming Road, Yangpu, Shanghai\r
Minato-ku Tokyo 108-0075\r
JP\r
\r
-D4-41-65 (hex) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-D44165 (base 16) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
- FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road, \r
- Chengdu Sichuan 610000\r
- CN\r
-\r
E4-02-9B (hex) Intel Corporate\r
E4029B (base 16) Intel Corporate\r
Lot 8, Jalan Hi-Tech 2/3\r
Heuchelheim Hessen 35452\r
DE\r
\r
-78-B8-4B (hex) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-78B84B (base 16) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
- FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
7C-B0-C2 (hex) Intel Corporate\r
7CB0C2 (base 16) Intel Corporate\r
Lot 8, Jalan Hi-Tech 2/3\r
SEOUL 135-918\r
KR\r
\r
-44-35-6F (hex) Neterix\r
-44356F (base 16) Neterix\r
- The Printworks\r
- Chester Cheshire CH1 4RN\r
- GB\r
-\r
74-E2-77 (hex) Vizmonet Pte Ltd\r
74E277 (base 16) Vizmonet Pte Ltd\r
32,Canberra drive,#05-28\r
Middleton WI 53562\r
US\r
\r
-AC-7A-42 (hex) iConnectivity\r
-AC7A42 (base 16) iConnectivity\r
- #21, 1725 30th Ave NE\r
- Calgary Alberta T2E 7P6\r
- CA\r
-\r
70-0B-C0 (hex) Dewav Technology Company\r
700BC0 (base 16) Dewav Technology Company\r
Room 1408, Real Estate Mansion\r
North Wales PA 19454\r
US\r
\r
-00-22-89 (hex) Vandelrande APC inc.\r
-002289 (base 16) Vandelrande APC inc.\r
- 1280 Lebourgneuf Blvd.\r
- Quebec G2K 0H1\r
- CA\r
-\r
00-22-7D (hex) YE DATA INC.\r
00227D (base 16) YE DATA INC.\r
182 Shinko\r
224-0034\r
JP\r
\r
-00-08-18 (hex) Pixelworks, Inc.\r
-000818 (base 16) Pixelworks, Inc.\r
- 7700 SW Mohawk Street\r
- Tualatin OR 97062\r
- US\r
-\r
00-08-2A (hex) Powerwallz Network Security\r
00082A (base 16) Powerwallz Network Security\r
120-13160 Vanier Place,\r
Takarazuka Hyogo 665-0051\r
JP\r
\r
-24-E1-24 (hex) Xiamen Ursalink Technology Co., Ltd.\r
-24E124 (base 16) Xiamen Ursalink Technology Co., Ltd.\r
- 4/F, No. 63-2 Wanghai Road, 2nd Software Park\r
- Xiamen Fujian 361008\r
- CN\r
-\r
24-43-E2 (hex) DASAN Network Solutions\r
2443E2 (base 16) DASAN Network Solutions\r
DASAN Tower 8F, 49 Daewangpangyo-ro644beon-gil Bundang-gu\r
San Jose CA 95131\r
US\r
\r
-1C-FF-59 (hex) Sichuan Tianyi Comheart Telecom Co., Ltd.\r
-1CFF59 (base 16) Sichuan Tianyi Comheart Telecom Co., Ltd.\r
- No.198,First Section,Snow Mountain Avenue, Jinyuan Town, Dayi County\r
- Chengdu Sichuan 611330\r
- CN\r
-\r
14-13-FB (hex) HUAWEI TECHNOLOGIES CO.,LTD\r
1413FB (base 16) HUAWEI TECHNOLOGIES CO.,LTD\r
No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
Kulim Kedah 09000\r
MY\r
\r
+5C-C8-E3 (hex) Shintec Hozumi co.ltd.\r
+5CC8E3 (base 16) Shintec Hozumi co.ltd.\r
+ neura-machi 3-5-1\r
+ Miyoshi Aichi 470-0217\r
+ JP\r
+\r
18-BB-41 (hex) Huawei Device Co., Ltd.\r
18BB41 (base 16) Huawei Device Co., Ltd.\r
No.2 of Xincheng Road, Songshan Lake Zone\r
Dongguan Guangdong 523808\r
CN\r
\r
-E8-F6-54 (hex) HUAWEI TECHNOLOGIES CO.,LTD\r
-E8F654 (base 16) HUAWEI TECHNOLOGIES CO.,LTD\r
+54-F6-E2 (hex) HUAWEI TECHNOLOGIES CO.,LTD\r
+54F6E2 (base 16) HUAWEI TECHNOLOGIES CO.,LTD\r
No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
Dongguan 523808\r
CN\r
\r
-20-87-EC (hex) HUAWEI TECHNOLOGIES CO.,LTD\r
-2087EC (base 16) HUAWEI TECHNOLOGIES CO.,LTD\r
+A8-50-81 (hex) HUAWEI TECHNOLOGIES CO.,LTD\r
+A85081 (base 16) HUAWEI TECHNOLOGIES CO.,LTD\r
No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
Dongguan 523808\r
CN\r
\r
-54-F6-E2 (hex) HUAWEI TECHNOLOGIES CO.,LTD\r
-54F6E2 (base 16) HUAWEI TECHNOLOGIES CO.,LTD\r
+E8-F6-54 (hex) HUAWEI TECHNOLOGIES CO.,LTD\r
+E8F654 (base 16) HUAWEI TECHNOLOGIES CO.,LTD\r
No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
Dongguan 523808\r
CN\r
\r
-A8-50-81 (hex) HUAWEI TECHNOLOGIES CO.,LTD\r
-A85081 (base 16) HUAWEI TECHNOLOGIES CO.,LTD\r
+20-87-EC (hex) HUAWEI TECHNOLOGIES CO.,LTD\r
+2087EC (base 16) HUAWEI TECHNOLOGIES CO.,LTD\r
No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
Dongguan 523808\r
CN\r
Kulim Kedah 09000\r
MY\r
\r
+08-6A-C5 (hex) Intel Corporate\r
+086AC5 (base 16) Intel Corporate\r
+ Lot 8, Jalan Hi-Tech 2/3 \r
+ Kulim Kedah 09000\r
+ MY\r
+\r
8C-36-7A (hex) Palo Alto Networks\r
8C367A (base 16) Palo Alto Networks\r
3000 Tannery Way\r
Santa Clara CA 95054\r
US\r
+\r
+1C-FF-59 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+1CFF59 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ No.198,First Section,Snow Mountain Avenue, Jinyuan Town, Dayi County\r
+ Chengdu Sichuan 611330\r
+ CN\r
+\r
+C0-1B-23 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+C01B23 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ NO.198 FIRST SECTION,SNOW MOUNTAIN AVENUE, JINYUAN TOWN, DAYI COUNTY,\r
+ CHENGDU SICHUAN 611330\r
+ CN\r
+\r
+10-1E-DA (hex) INGENICO TERMINALS SAS\r
+101EDA (base 16) INGENICO TERMINALS SAS\r
+ 28-32 Boulevard de Grenelle\r
+ PARIS 75015\r
+ FR\r
+\r
+8C-6A-8D (hex) Technicolor CH USA Inc.\r
+8C6A8D (base 16) Technicolor CH USA Inc.\r
+ 5030 Sugarloaf Parkway Bldg 6 \r
+ Lawrenceville GA 30044\r
+ US\r
+\r
+68-DD-D9 (hex) HMD Global Oy\r
+68DDD9 (base 16) HMD Global Oy\r
+ Bertel Jungin aukio 9\r
+ Espoo 02600\r
+ FI\r
+\r
+3C-19-5E (hex) Samsung Electronics Co.,Ltd\r
+3C195E (base 16) Samsung Electronics Co.,Ltd\r
+ #94-1, Imsoo-Dong\r
+ Gumi Gyeongbuk 730-350\r
+ KR\r
+\r
+6C-94-66 (hex) Intel Corporate\r
+6C9466 (base 16) Intel Corporate\r
+ Lot 8, Jalan Hi-Tech 2/3 \r
+ Kulim Kedah 09000\r
+ MY\r
+\r
+4C-3B-6C (hex) GARO AB\r
+4C3B6C (base 16) GARO AB\r
+ Södergatan 26\r
+ Gnosjö Jönköping 33525\r
+ SE\r
+\r
+FC-37-2B (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+FC372B (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+7C-CC-1F (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+7CCC1F (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+5C-4A-1F (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+5C4A1F (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+24-8B-E0 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+248BE0 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+9C-9C-40 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+9C9C40 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+54-E0-61 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+54E061 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+18-75-32 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+187532 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12, TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+78-B8-4B (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+78B84B (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road,\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+D4-41-65 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+D44165 (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road, \r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+EC-8A-C4 (hex) Amazon Technologies Inc.\r
+EC8AC4 (base 16) Amazon Technologies Inc.\r
+ P.O Box 8102 \r
+ Reno NV 89507\r
+ US\r
+\r
+44-35-6F (hex) Neterix Ltd\r
+44356F (base 16) Neterix Ltd\r
+ Viscount House, River Lane\r
+ Chester Cheshire CH4 8RH\r
+ GB\r
+\r
+00-22-89 (hex) Vanderlande APC inc.\r
+002289 (base 16) Vanderlande APC inc.\r
+ 1280 Lebourgneuf Blvd.\r
+ Quebec G2K 0H1\r
+ CA\r
+\r
+50-8A-06 (hex) Tuya Smart Inc.\r
+508A06 (base 16) Tuya Smart Inc.\r
+ 160 Greentree Drive, Suite 101\r
+ Dover DE 19904\r
+ US\r
+\r
+D4-08-68 (hex) Beijing Lanxum Computer Technology CO.,LTD.\r
+D40868 (base 16) Beijing Lanxum Computer Technology CO.,LTD.\r
+ 3A Floor,BlockB,Technology Fortune Center,No 8 Xueqing Road,Haidian District,\r
+ Beijing Beijing 100192\r
+ CN\r
+\r
+B8-14-5C (hex) Huawei Device Co., Ltd.\r
+B8145C (base 16) Huawei Device Co., Ltd.\r
+ No.2 of Xincheng Road, Songshan Lake Zone\r
+ Dongguan Guangdong 523808\r
+ CN\r
+\r
+C8-9D-18 (hex) Huawei Device Co., Ltd.\r
+C89D18 (base 16) Huawei Device Co., Ltd.\r
+ No.2 of Xincheng Road, Songshan Lake Zone\r
+ Dongguan Guangdong 523808\r
+ CN\r
+\r
+C4-80-25 (hex) Huawei Device Co., Ltd.\r
+C48025 (base 16) Huawei Device Co., Ltd.\r
+ No.2 of Xincheng Road, Songshan Lake Zone\r
+ Dongguan Guangdong 523808\r
+ CN\r
+\r
+DC-03-98 (hex) LG Innotek\r
+DC0398 (base 16) LG Innotek\r
+ 26, Hanamsandan 5beon-ro\r
+ Gwangju Gwangsan-gu 506-731\r
+ KR\r
+\r
+E8-DA-00 (hex) Kivo Technology, Inc.\r
+E8DA00 (base 16) Kivo Technology, Inc.\r
+ 218 Main Street, Suite #724\r
+ Kirkland 98033\r
+ US\r
+\r
+78-D6-DC (hex) Motorola (Wuhan) Mobility Technologies Communication Co., Ltd.\r
+78D6DC (base 16) Motorola (Wuhan) Mobility Technologies Communication Co., Ltd.\r
+ No.19, Gaoxin 4th Road, Wuhan East Lake High-tech Zone, Wuhan\r
+ Wuhan Hubei 430000\r
+ CN\r
+\r
+0C-43-14 (hex) Silicon Laboratories\r
+0C4314 (base 16) Silicon Laboratories\r
+ 400 West Cesar Chavez Street\r
+ Austin TX 78701\r
+ US\r
+\r
+F4-C0-2F (hex) BlueBite\r
+F4C02F (base 16) BlueBite\r
+ 230, Simin-daero\r
+ Anyang-si Gyeonggi-do 14067\r
+ KR\r
+\r
+78-86-B6 (hex) Shenzhen YOUHUA Technology Co., Ltd\r
+7886B6 (base 16) Shenzhen YOUHUA Technology Co., Ltd\r
+ Room 407 Shenzhen University-town Business Park,Lishan Road,Taoyuan Street,Nanshan District\r
+ Shenzhen Guangdong 518055\r
+ CN\r
+\r
+CC-B5-D1 (hex) Beijing Xiaomi Mobile Software Co., Ltd\r
+CCB5D1 (base 16) Beijing Xiaomi Mobile Software Co., Ltd\r
+ The Rainbow City Office Building, 68 Qinghe Middle Street Haidian District\r
+ Beijing Beijing 100085\r
+ CN\r
+\r
+24-E1-24 (hex) Xiamen Milesight IoT Co., Ltd.\r
+24E124 (base 16) Xiamen Milesight IoT Co., Ltd.\r
+ 4/F, No. 63-2 Wanghai Road, 2nd Software Park\r
+ Xiamen Fujian 361008\r
+ CN\r
+\r
+28-FB-AE (hex) HUAWEI TECHNOLOGIES CO.,LTD\r
+28FBAE (base 16) HUAWEI TECHNOLOGIES CO.,LTD\r
+ No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+ Dongguan 523808\r
+ CN\r
+\r
+88-A0-BE (hex) HUAWEI TECHNOLOGIES CO.,LTD\r
+88A0BE (base 16) HUAWEI TECHNOLOGIES CO.,LTD\r
+ No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+ Dongguan 523808\r
+ CN\r
+\r
+A4-78-06 (hex) Cisco Systems, Inc\r
+A47806 (base 16) Cisco Systems, Inc\r
+ 80 West Tasman Drive\r
+ San Jose CA 94568\r
+ US\r
+\r
+D0-54-75 (hex) SAVI Controls\r
+D05475 (base 16) SAVI Controls\r
+ 2420 Tarpley Rd, Suite 205\r
+ Carrollton TX 75006\r
+ US\r
+\r
+08-05-E2 (hex) Juniper Networks\r
+0805E2 (base 16) Juniper Networks\r
+ 1133 Innovation Way\r
+ Sunnyvale CA 94089\r
+ US\r
+\r
+B8-D5-6B (hex) Mirka Ltd.\r
+B8D56B (base 16) Mirka Ltd.\r
+ Pensalavägen 210\r
+ Jeppo 66850\r
+ FI\r
+\r
+B8-A1-4A (hex) Raisecom Technology CO.,LTD\r
+B8A14A (base 16) Raisecom Technology CO.,LTD\r
+ No. 11, East Area, No. 10 Block, East Xibeiwang Road\r
+ Beijing 100094\r
+ CN\r
+\r
+BC-A3-7F (hex) Rail-Mil Sp. z o.o. Sp. K.\r
+BCA37F (base 16) Rail-Mil Sp. z o.o. Sp. K.\r
+ Kosmatki 82\r
+ Warsaw 03-982\r
+ PL\r
+\r
+00-08-18 (hex) Pixelworks, Inc.\r
+000818 (base 16) Pixelworks, Inc.\r
+ 226 Airport Parkway, Suite 595\r
+ San Jose CA 95110\r
+ US\r
+\r
+94-90-10 (hex) HUAWEI TECHNOLOGIES CO.,LTD\r
+949010 (base 16) HUAWEI TECHNOLOGIES CO.,LTD\r
+ No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+ Dongguan 523808\r
+ CN\r
+\r
+98-F0-83 (hex) HUAWEI TECHNOLOGIES CO.,LTD\r
+98F083 (base 16) HUAWEI TECHNOLOGIES CO.,LTD\r
+ No.2 Xin Cheng Road, Room R6,Songshan Lake Technology Park\r
+ Dongguan 523808\r
+ CN\r
+\r
+8C-64-A2 (hex) OnePlus Technology (Shenzhen) Co., Ltd\r
+8C64A2 (base 16) OnePlus Technology (Shenzhen) Co., Ltd\r
+ 18C02, 18C03, 18C04 ,18C05,TAIRAN BUILDING,\r
+ Shenzhen Guangdong 518000\r
+ CN\r
+\r
+28-FA-19 (hex) Shenzhen Jingxun Software Telecommunication Technology Co.,Ltd\r
+28FA19 (base 16) Shenzhen Jingxun Software Telecommunication Technology Co.,Ltd\r
+ 3/F,A5 Building Zhiyuan Community No.1001,Xueyuan Road Nanshan District\r
+ Shenzhen Guangdong 518055\r
+ CN\r
+\r
+20-3C-C0 (hex) Beijing Tosee Technology Co., Ltd.\r
+203CC0 (base 16) Beijing Tosee Technology Co., Ltd.\r
+ Room S125, 1st Floor, Building 1, No. 9, Keyuan Road, Economic Development Zone, Daxing District\r
+ beijing 102600 \r
+ CN\r
+\r
+D8-A0-11 (hex) WiZ\r
+D8A011 (base 16) WiZ\r
+ Unit 1203-5, 12/F, Tower 1, Enterprise Square, 9 Sheung Yuet Road\r
+ Kowloon Bay Hong Kong 0000\r
+ HK\r
+\r
+50-09-E5 (hex) Drimsys,Inc\r
+5009E5 (base 16) Drimsys,Inc\r
+ 147, Baumoe-ro\r
+ Seocho-gu Seoul 06752\r
+ KR\r
+\r
+64-B3-79 (hex) Private\r
+64B379 (base 16) Private\r
+\r
+28-DF-EB (hex) Intel Corporate\r
+28DFEB (base 16) Intel Corporate\r
+ Lot 8, Jalan Hi-Tech 2/3 \r
+ Kulim Kedah 09000\r
+ MY\r
+\r
+88-FC-A6 (hex) devolo AG\r
+88FCA6 (base 16) devolo AG\r
+ Charlottenburger Allee 67\r
+ Aachen NRW 52068\r
+ DE\r
+\r
+AC-7A-42 (hex) iConnectivity\r
+AC7A42 (base 16) iConnectivity\r
+ 4620 Manilla Road SE, Unit 58\r
+ Calgary Alberta T2G 4B7\r
+ CA\r
+\r
+48-9E-BD (hex) HP Inc.\r
+489EBD (base 16) HP Inc.\r
+ 10300 Energy Dr\r
+ Spring TX 77389\r
+ US\r
Palmetto Bay FL 33157\r
US\r
\r
-04-11-19 (hex) Herrick Tech Labs\r
-700000-7FFFFF (base 16) Herrick Tech Labs\r
- 20201 Century Blvd.\r
- Germantown MD 20874\r
- US\r
-\r
E8-6C-C7 (hex) Limited Liability Company M.S.Korp\r
C00000-CFFFFF (base 16) Limited Liability Company M.S.Korp\r
Mironovskaya st., 33, bldg.26, floor 4, office 5\r
Neuhausen am Rheinfall Schaffhausen 8212\r
CH\r
\r
+04-11-19 (hex) Herrick Tech Labs\r
+700000-7FFFFF (base 16) Herrick Tech Labs\r
+ 20201 Century Blvd.\r
+ Germantown MD 20874\r
+ US\r
+\r
E8-6C-C7 (hex) Lighthouse EIP\r
800000-8FFFFF (base 16) Lighthouse EIP\r
21370 Heywood Avenue\r
Lakeville MN 55044\r
US\r
\r
-E8-6C-C7 (hex) Koal Software Co., Ltd\r
-400000-4FFFFF (base 16) Koal Software Co., Ltd\r
- Floor 6, Building 4, Lane 299, Jiangchang West Road, Jing 'an District\r
- Shanghai Shanghai 200436\r
- CN\r
-\r
E8-6C-C7 (hex) Xirgo Technologies LLC\r
200000-2FFFFF (base 16) Xirgo Technologies LLC\r
188 Camino Ruiz\r
Camarillo CA 93012\r
US\r
\r
+E8-6C-C7 (hex) Koal Software Co., Ltd\r
+400000-4FFFFF (base 16) Koal Software Co., Ltd\r
+ Floor 6, Building 4, Lane 299, Jiangchang West Road, Jing 'an District\r
+ Shanghai Shanghai 200436\r
+ CN\r
+\r
24-5D-FC (hex) Cosmicnode\r
800000-8FFFFF (base 16) Cosmicnode\r
Zandstrand\r
Mail box 15123 Haifa 3508409\r
IL\r
\r
-0C-5C-B5 (hex) The Raymond Corporation\r
-500000-5FFFFF (base 16) The Raymond Corporation\r
- 22 South Canal St\r
- Greene NY 13778\r
- US\r
-\r
60-15-92 (hex) Zaptec\r
400000-4FFFFF (base 16) Zaptec\r
Richard Johnsensgate 4\r
Stavanger Rogaland N-4021\r
NO\r
\r
-1C-A0-EF (hex) Shenzhen Liandian Communication Technology Co.LTD\r
-D00000-DFFFFF (base 16) Shenzhen Liandian Communication Technology Co.LTD\r
- 1307, building A4, workshop 2, LiLang International Jewelry Industrial Park, 31 Bulan Road, xialilang community, Nanwan street, Longgang District\r
- Shenzhen Guangdong 518112\r
- CN\r
+0C-5C-B5 (hex) The Raymond Corporation\r
+500000-5FFFFF (base 16) The Raymond Corporation\r
+ 22 South Canal St\r
+ Greene NY 13778\r
+ US\r
\r
0C-5C-B5 (hex) ADI\r
B00000-BFFFFF (base 16) ADI\r
Manorville NY 11949\r
US\r
\r
+1C-A0-EF (hex) Shenzhen Liandian Communication Technology Co.LTD\r
+D00000-DFFFFF (base 16) Shenzhen Liandian Communication Technology Co.LTD\r
+ 1307, building A4, workshop 2, LiLang International Jewelry Industrial Park, 31 Bulan Road, xialilang community, Nanwan street, Longgang District\r
+ Shenzhen Guangdong 518112\r
+ CN\r
+\r
1C-A0-EF (hex) Wisnu and Supak Co.,Ltd.\r
100000-1FFFFF (base 16) Wisnu and Supak Co.,Ltd.\r
102/111-112 Mooban Sinpattanatanee,, Tessabansongkroh Road., Ladyao, Jatujak,\r
Jatujak Bangkok Metropolis 10900\r
TH\r
\r
+88-C9-B3 (hex) Shenzhen MMUI Co.,Ltd\r
+B00000-BFFFFF (base 16) Shenzhen MMUI Co.,Ltd\r
+ Shenzhen MMUI Co.,Ltd\r
+ Shenzhen Guangdong 518000\r
+ CN\r
+\r
+88-C9-B3 (hex) Robert Bosch JuP1\r
+700000-7FFFFF (base 16) Robert Bosch JuP1\r
+ Robert Bosch 1150\r
+ Juarez Chihuahua 32557\r
+ MX\r
+\r
+C8-F5-D6 (hex) Yarward Electronics Co., Ltd.\r
+800000-8FFFFF (base 16) Yarward Electronics Co., Ltd.\r
+ 9509 Qinglongshan Street\r
+ Zibo Shandong 255089\r
+ CN\r
+\r
+C8-F5-D6 (hex) Valeo Interior Controls (Shenzhen) Co.,Ltd\r
+100000-1FFFFF (base 16) Valeo Interior Controls (Shenzhen) Co.,Ltd\r
+ North Junyi Ind. Park, Huaide Vil., Fuyong Town, Baoan Dist.\r
+ Shenzhen Guangzhong 518103\r
+ CN\r
+\r
+C0-FB-F9 (hex) Dongmengling\r
+800000-8FFFFF (base 16) Dongmengling\r
+ Floor 1, pool-side building, Villa district, Jiuwei Xiange Musical Instrument Co. , Ltd. , Jiuwei community, Hangcheng Street, Bao 'an district\r
+ Shenzhen Guangdong 518000\r
+ CN\r
+\r
+C8-F5-D6 (hex) Qbic Technology Co., Ltd\r
+200000-2FFFFF (base 16) Qbic Technology Co., Ltd\r
+ 26F.-12, No.99, Sec. 1, Xintai 5th Rd., Xizhi Dist.,\r
+ New Taipei 22175\r
+ TW\r
+\r
+C8-F5-D6 (hex) EVOTOR LLC\r
+400000-4FFFFF (base 16) EVOTOR LLC\r
+ Timura Frunze Str., 24\r
+ Moscow 119021\r
+ RU\r
+\r
+C0-FB-F9 (hex) Dongguan Chuan OptoElectronics Limited\r
+200000-2FFFFF (base 16) Dongguan Chuan OptoElectronics Limited\r
+ No.43 Songshui Road,Songmushan Village, Dalang Town\r
+ Dongguan Guangdong 523795\r
+ CN\r
+\r
+C0-FB-F9 (hex) IVT corporation\r
+600000-6FFFFF (base 16) IVT corporation\r
+ 5/F, Zhongguancun Fazhan Building, No 12, Shangdi Xinxi Road, Haidian District, Beijing, 100085, P.R. CHINA\r
+ Beijing 100085\r
+ CN\r
+\r
+18-74-E2 (hex) HANGZHOU ZHOUJU ELECTRONIC TECHNOLOGICAL CO.,LTD \r
+500000-5FFFFF (base 16) HANGZHOU ZHOUJU ELECTRONIC TECHNOLOGICAL CO.,LTD \r
+ Floor 6,A Building, Xianxing Road NO.32,Xianlin Town,Yuhang District\r
+ Hangzhou Zhejiang 311122\r
+ CN\r
+\r
4C-4B-F9 (hex) Shenzhen dingsheng technology co., LTD\r
400000-4FFFFF (base 16) Shenzhen dingsheng technology co., LTD\r
Floor 3, building 5, kaijeda industrial zone, no.97, huaxing road, langkou community, dalang street, longhua district\r
Berlin 13127\r
DE\r
\r
-2C-D1-41 (hex) Private\r
-D00000-DFFFFF (base 16) Private\r
-\r
28-2C-02 (hex) Shenzhen emb-star technology co. LTD\r
200000-2FFFFF (base 16) Shenzhen emb-star technology co. LTD\r
2/f,building C,qinghu science park,qingxiang road,qinghu,longhua new district\r
Guangzhou Guangdong 510530\r
CN\r
\r
-98-27-82 (hex) Nanjing BianYu Future Home Technology Co.Ltd\r
-A00000-AFFFFF (base 16) Nanjing BianYu Future Home Technology Co.Ltd\r
- Longyu Middle Street\r
- Beijing Beijing 100085\r
- CN\r
-\r
98-27-82 (hex) Wuxi GuoYiHaiJu Technology Co.,Ltd.\r
900000-9FFFFF (base 16) Wuxi GuoYiHaiJu Technology Co.,Ltd.\r
Innovation Industrial Park E2-2F\r
hefei 230000\r
CN\r
\r
+98-27-82 (hex) Nanjing BianYu Future Home Technology Co.Ltd\r
+A00000-AFFFFF (base 16) Nanjing BianYu Future Home Technology Co.Ltd\r
+ Longyu Middle Street\r
+ Beijing Beijing 100085\r
+ CN\r
+\r
98-27-82 (hex) CATS Power design\r
800000-8FFFFF (base 16) CATS Power design\r
144 route des Vernes\r
Bangalore Karnataka 560102\r
IN\r
\r
+E8-6C-C7 (hex) Huaqin Technology Co.,Ltd\r
+700000-7FFFFF (base 16) Huaqin Technology Co.,Ltd\r
+ No. 10 Keyuan Road, Songshan Lake\r
+ Dongguan Guangdong 523808\r
+ CN\r
+\r
04-11-19 (hex) Acentury\r
100000-1FFFFF (base 16) Acentury\r
120 West Beaver Creek Road, Unit 13\r
Richmond Hill ON L4B 1L2\r
CA\r
\r
-E8-6C-C7 (hex) Huaqin Technology Co.,Ltd\r
-700000-7FFFFF (base 16) Huaqin Technology Co.,Ltd\r
- No. 10 Keyuan Road, Songshan Lake\r
- Dongguan Guangdong 523808\r
- CN\r
+E8-6C-C7 (hex) CoxSpace\r
+A00000-AFFFFF (base 16) CoxSpace\r
+ 858ho, Business Support Hub, 815, Daewangpangyo-ro Sujeong-gu\r
+ Seongnam Kyeonggi-do 13449\r
+ KR\r
\r
38-B8-EB (hex) Sirin Mobile Technologies\r
700000-7FFFFF (base 16) Sirin Mobile Technologies\r
Schaffhausen 8200\r
CH\r
\r
-24-5D-FC (hex) CompanyDeep\r
-000000-0FFFFF (base 16) CompanyDeep\r
- 122, Ross Street\r
- Cambridge Cambridgeshire CB13BU\r
- GB\r
-\r
24-5D-FC (hex) TORGOVYY DOM TEHNOLOGIY LLC\r
900000-9FFFFF (base 16) TORGOVYY DOM TEHNOLOGIY LLC\r
Gospytalnaya 10, ap. 109, village Selyatino, city Naro-Fominsk,\r
Moscow Moscow Region 143345\r
RU\r
\r
-E8-6C-C7 (hex) CoxSpace\r
-A00000-AFFFFF (base 16) CoxSpace\r
- 858ho, Business Support Hub, 815, Daewangpangyo-ro Sujeong-gu\r
- Seongnam Kyeonggi-do 13449\r
- KR\r
-\r
24-5D-FC (hex) ContactProximity Inc\r
500000-5FFFFF (base 16) ContactProximity Inc\r
241 Arlington Street #966\r
Acton MA 01720\r
US\r
\r
-F0-23-B9 (hex) Shenyang Ali Technology Company Limited\r
-D00000-DFFFFF (base 16) Shenyang Ali Technology Company Limited\r
- No.17-5, Wensu Street\r
- Dongling District Shenyang Liaoning Province 110168\r
- CN\r
+24-5D-FC (hex) CompanyDeep\r
+000000-0FFFFF (base 16) CompanyDeep\r
+ 122, Ross Street\r
+ Cambridge Cambridgeshire CB13BU\r
+ GB\r
\r
24-5D-FC (hex) Guangzhou Lango Electronics Technology Co.,Ltd.\r
600000-6FFFFF (base 16) Guangzhou Lango Electronics Technology Co.,Ltd.\r
Guangzhou Guangdong 510336\r
CN\r
\r
+F0-23-B9 (hex) Shenyang Ali Technology Company Limited\r
+D00000-DFFFFF (base 16) Shenyang Ali Technology Company Limited\r
+ No.17-5, Wensu Street\r
+ Dongling District Shenyang Liaoning Province 110168\r
+ CN\r
+\r
0C-5C-B5 (hex) Hunan Newman Car NetworKing Technology Co.,Ltd\r
C00000-CFFFFF (base 16) Hunan Newman Car NetworKing Technology Co.,Ltd\r
128 Lixiang East Road,ChangshaEconomic and Technological Development Zone\r
Shanghai Shanghai 201135\r
CN\r
\r
+1C-A0-EF (hex) Tangshan Liulin Automation Equipment Co., Ltd.\r
+000000-0FFFFF (base 16) Tangshan Liulin Automation Equipment Co., Ltd.\r
+ Building 110-3, No.410 Huoju Road, High-tech Zone\r
+ Tangshan City Hebei Province 063000\r
+ CN\r
+\r
1C-A0-EF (hex) LLC Gagar.In\r
C00000-CFFFFF (base 16) LLC Gagar.In\r
Rybnikov Pereulok 1\r
Chengdu 610000\r
CN\r
\r
-1C-A0-EF (hex) Tangshan Liulin Automation Equipment Co., Ltd.\r
-000000-0FFFFF (base 16) Tangshan Liulin Automation Equipment Co., Ltd.\r
- Building 110-3, No.410 Huoju Road, High-tech Zone\r
- Tangshan City Hebei Province 063000\r
- CN\r
-\r
1C-A0-EF (hex) Leviathan Solutions Ltd.\r
400000-4FFFFF (base 16) Leviathan Solutions Ltd.\r
Abel Jeno utca 23\r
Shanghai Minhang District 201103\r
CN\r
\r
+20-CE-2A (hex) Intelligraphics\r
+800000-8FFFFF (base 16) Intelligraphics\r
+ 11615 Angus Road, Suite #104L\r
+ Austin TX 78759\r
+ US\r
+\r
+2C-D1-41 (hex) Square Inc.\r
+D00000-DFFFFF (base 16) Square Inc.\r
+ 1455 Market St.\r
+ San Francisco CA 94103\r
+ US\r
+\r
+88-C9-B3 (hex) shenzhen franklin ESS technology CO.,Ltd\r
+200000-2FFFFF (base 16) shenzhen franklin ESS technology CO.,Ltd\r
+ 102, 61 Liuxian Rd 2, Baoan Dst., Shenzhen\r
+ shenzhen 518000\r
+ CN\r
+\r
+88-C9-B3 (hex) Cervoz Technology Co; Ltd.\r
+100000-1FFFFF (base 16) Cervoz Technology Co; Ltd.\r
+ 8F; No.10, Aly6, Ln.235, Baociao Rd; \r
+ Sindian Dist. New Taipei City 23145\r
+ TW\r
+\r
+C8-F5-D6 (hex) Oscars Pro\r
+700000-7FFFFF (base 16) Oscars Pro\r
+ A 45, 1st Floor, Sector 4\r
+ Noida Uttar Pradesh 201301\r
+ IN\r
+\r
+C8-F5-D6 (hex) Pinmicro K K\r
+500000-5FFFFF (base 16) Pinmicro K K\r
+ Kanda Jimbocho, 2-20-13\r
+ Chiyoda Ku Tokyo 1010051\r
+ JP\r
+\r
+D0-9F-D9 (hex) Shenzhen eloT Technology Co.,Ltd\r
+D00000-DFFFFF (base 16) Shenzhen eloT Technology Co.,Ltd\r
+ North Wing of 2/F, Block 2, Viseen Technology & Business Park, No.43 Gaoxin South Ring Road\r
+ Shenzhen Guangdong 518000\r
+ CN\r
+\r
+C0-FB-F9 (hex) Tiandi(Changzhou) Automation Co., Ltd.\r
+A00000-AFFFFF (base 16) Tiandi(Changzhou) Automation Co., Ltd.\r
+ Tiandi(Changzhou) Automation Co., Ltd.\r
+ Changzhou Jiangsu 213015\r
+ CN\r
+\r
+C0-FB-F9 (hex) Navitas Digital Safety Ltd\r
+E00000-EFFFFF (base 16) Navitas Digital Safety Ltd\r
+ 1ST FLOOR, 13 PHOENIX PARK \r
+ COALVILLE Leicestershire LE673HB\r
+ GB\r
+\r
+D0-9F-D9 (hex) Poten (Shanghai) Technology Co.,Ltd.\r
+400000-4FFFFF (base 16) Poten (Shanghai) Technology Co.,Ltd.\r
+ Rm.B,6th Fl., No.5, Caoxi Rd.251\r
+ Shanghai Shanghai 200235\r
+ CN\r
+\r
+D0-9F-D9 (hex) Raymax Technology Ltd.\r
+700000-7FFFFF (base 16) Raymax Technology Ltd.\r
+ 604, Building D, No.1001 Wen Yi Xi Road\r
+ Hangzhou China 310012\r
+ CN\r
+\r
+D0-9F-D9 (hex) Queclink Wireless Solutions Co., Ltd.\r
+800000-8FFFFF (base 16) Queclink Wireless Solutions Co., Ltd.\r
+ No.30, Lane 500, Xinlong Road, Minhang District\r
+ Shanghai 201101\r
+ CN\r
+\r
+D0-9F-D9 (hex) Fujian Newland Auto-ID Tech. Co,.Ltd.\r
+C00000-CFFFFF (base 16) Fujian Newland Auto-ID Tech. Co,.Ltd.\r
+ Newland Science & Technology Park, No.1 Rujiang West Rd,Mawei,Fuzhou, P.R.China\r
+ Fuzhou 350015\r
+ CN\r
+\r
+D0-9F-D9 (hex) Lemei Intelligent IOT (Shenzhen) Co., Ltd\r
+000000-0FFFFF (base 16) Lemei Intelligent IOT (Shenzhen) Co., Ltd\r
+ #1101, Building #1, Yishang Sanwei Inductry Park, Zhongwu, Hangcheng Street, Baoan District\r
+ Shenzhen Guangdong 518000\r
+ CN\r
+\r
+18-74-E2 (hex) Kano Computing Limited\r
+800000-8FFFFF (base 16) Kano Computing Limited\r
+ Unit 12.1 - 12.2, 11-29 Fashion Street\r
+ London E1 6PX\r
+ GB\r
+\r
20-85-93 (hex) UNILUMIN GROUP CO.,LTD\r
300000-3FFFFF (base 16) UNILUMIN GROUP CO.,LTD\r
No.112 Yongfu Rd.,BaoanDistrict,\r
Salford M5 4TH\r
GB\r
\r
-7C-CB-E2 (hex) Aplex Technology Inc.\r
-E00000-EFFFFF (base 16) Aplex Technology Inc.\r
- 2nd Floor,Tower3,District5,HongHuaLing industrial park, Nanshan District\r
- Shenzhen Guangdong 518055\r
- CN\r
-\r
24-4E-7B (hex) Nanjing Wanlida Technology Co., Ltd.\r
700000-7FFFFF (base 16) Nanjing Wanlida Technology Co., Ltd.\r
Wanlida Industry Zone, Nanjing County\r
Kaohsiung, Taiwan, R.O.C. Kaohsiung City 807\r
TW\r
\r
-30-49-50 (hex) Xio Research, Inc\r
-D00000-DFFFFF (base 16) Xio Research, Inc\r
- 405 Lexington Avenue, Suite 3504\r
- New York NY 10174\r
- US\r
-\r
D0-14-11 (hex) Realwave Inc.\r
700000-7FFFFF (base 16) Realwave Inc.\r
5857 Owens Avenue, Suite 300\r
JUVIGNY Select State 74100\r
FR\r
\r
-98-27-82 (hex) SHENZHEN HEROFUN BIO-TECH CO., LTD\r
-000000-0FFFFF (base 16) SHENZHEN HEROFUN BIO-TECH CO., LTD\r
- 7001B, 7th Floor, LaoBing Building, East Block 2, No. 3012 XingYe Road, BaoAn District\r
- Shenzhen 518100\r
+44-6F-D8 (hex) Anhui GuDao Tech\r
+600000-6FFFFF (base 16) Anhui GuDao Tech\r
+ Dangtu Qingshanhe\r
+ MaAnShan AnHui 243000\r
CN\r
\r
44-6F-D8 (hex) Annapurna labs\r
Mail box 15123 Haifa 3508409\r
IL\r
\r
-44-6F-D8 (hex) Anhui GuDao Tech\r
-600000-6FFFFF (base 16) Anhui GuDao Tech\r
- Dangtu Qingshanhe\r
- MaAnShan AnHui 243000\r
+98-27-82 (hex) SHENZHEN HEROFUN BIO-TECH CO., LTD\r
+000000-0FFFFF (base 16) SHENZHEN HEROFUN BIO-TECH CO., LTD\r
+ 7001B, 7th Floor, LaoBing Building, East Block 2, No. 3012 XingYe Road, BaoAn District\r
+ Shenzhen 518100\r
CN\r
\r
98-27-82 (hex) RayTron, INC.\r
Burbank CA 91505\r
US\r
\r
-04-11-19 (hex) Nuance Hearing Ltd.\r
-D00000-DFFFFF (base 16) Nuance Hearing Ltd.\r
- Raoul Wallenberg 24, Building A1, Floor 3\r
- Tel Aviv 6971920\r
- IL\r
+04-11-19 (hex) CyOne Security AG\r
+A00000-AFFFFF (base 16) CyOne Security AG\r
+ Hinterbergstrasse 18\r
+ Steinhausen Zug 6312\r
+ CH\r
\r
04-11-19 (hex) SUZHOU RIBAO TECHNOLOGY CO.,LTD.\r
300000-3FFFFF (base 16) SUZHOU RIBAO TECHNOLOGY CO.,LTD.\r
SUZHOU JIANGSU 215133\r
CN\r
\r
-04-11-19 (hex) CyOne Security AG\r
-A00000-AFFFFF (base 16) CyOne Security AG\r
- Hinterbergstrasse 18\r
- Steinhausen Zug 6312\r
- CH\r
+04-11-19 (hex) Nuance Hearing Ltd.\r
+D00000-DFFFFF (base 16) Nuance Hearing Ltd.\r
+ Raoul Wallenberg 24, Building A1, Floor 3\r
+ Tel Aviv 6971920\r
+ IL\r
\r
E8-6C-C7 (hex) Annapurna labs\r
E00000-EFFFFF (base 16) Annapurna labs\r
New Taipei City ??? 235\r
TW\r
\r
-0C-5C-B5 (hex) Annapurna labs\r
-400000-4FFFFF (base 16) Annapurna labs\r
- Matam Scientific Industries Center, Building 8.2\r
- Mail box 15123 Haifa 3508409\r
- IL\r
-\r
60-15-92 (hex) RTDS Technologies Inc.\r
100000-1FFFFF (base 16) RTDS Technologies Inc.\r
100-150 Innovation Drive\r
Winnipeg Manitoba R3T 2E1\r
CA\r
\r
-60-15-92 (hex) Annapurna labs\r
-E00000-EFFFFF (base 16) Annapurna labs\r
- Matam Scientific Industries Center, Building 8.2\r
- Mail box 15123 Haifa 3508409\r
- IL\r
-\r
60-15-92 (hex) JIANGSU SUNFY TECHNOLOGIES HOLDING CO.,LTD.\r
900000-9FFFFF (base 16) JIANGSU SUNFY TECHNOLOGIES HOLDING CO.,LTD.\r
Building 6, No. 1088, Jiangcheng Road, Sutong Technology Industrial Park\r
Kaohsiung City Taiwan 807\r
TW\r
\r
+60-15-92 (hex) Annapurna labs\r
+E00000-EFFFFF (base 16) Annapurna labs\r
+ Matam Scientific Industries Center, Building 8.2\r
+ Mail box 15123 Haifa 3508409\r
+ IL\r
+\r
+0C-5C-B5 (hex) Annapurna labs\r
+400000-4FFFFF (base 16) Annapurna labs\r
+ Matam Scientific Industries Center, Building 8.2\r
+ Mail box 15123 Haifa 3508409\r
+ IL\r
+\r
0C-5C-B5 (hex) Shenzhen C & D Electronics Co., Ltd.\r
800000-8FFFFF (base 16) Shenzhen C & D Electronics Co., Ltd.\r
9th FIoor, Building 9, No.1 Qingxiang road, BaoNeng Science and TechnoIogy Industrial Park, Longhua New District\r
7/F, Unify Commercial & Ind. Bldg., 31 Tai Yip Street, Kwun Tong Hong Kong 999077\r
HK\r
\r
-0C-5C-B5 (hex) Colordeve International\r
-900000-9FFFFF (base 16) Colordeve International\r
- 601, block B, Logistics Park, Yihong Road, Yantian village, Fenggang Town, DG, GD, China\r
- Dongguan City 523702\r
- CN\r
-\r
0C-5C-B5 (hex) Energybox Limited\r
700000-7FFFFF (base 16) Energybox Limited\r
8/F., Green 18, HK Science Park\r
NEW TAIPEI CITY TAIWAN 235\r
TW\r
\r
+0C-5C-B5 (hex) Colordeve International\r
+900000-9FFFFF (base 16) Colordeve International\r
+ 601, block B, Logistics Park, Yihong Road, Yantian village, Fenggang Town, DG, GD, China\r
+ Dongguan City 523702\r
+ CN\r
+\r
20-CE-2A (hex) Beijing Huadianzhongxin Tech.Co.,Ltd\r
700000-7FFFFF (base 16) Beijing Huadianzhongxin Tech.Co.,Ltd\r
Room 318,the 3rd Floorl,Xingtianhaiyuan Building,Xianghuangqi East Rd,Nongda South Rd, Haidian District,Beijing,P.R.C\r
Bei Jing 100193\r
CN\r
\r
+20-CE-2A (hex) Ariston Thermo s.p.a.\r
+C00000-CFFFFF (base 16) Ariston Thermo s.p.a.\r
+ Via Aristide Merloni 45\r
+ Fabriano Ancona 60044\r
+ IT\r
+\r
+20-CE-2A (hex) Jabil\r
+200000-2FFFFF (base 16) Jabil\r
+ 10560 Dr M.L.K. Jr St N, St.\r
+ St. Petersburg 33716\r
+ US\r
+\r
+88-C9-B3 (hex) ADOPT NETTECH PVT LTD\r
+000000-0FFFFF (base 16) ADOPT NETTECH PVT LTD\r
+ A - 11, OKHLA INDUSTRIAL AREA, PHASE - I, \r
+ NEW DELHI DELHI 110020\r
+ IN\r
+\r
+7C-CB-E2 (hex) Aplex Technology Inc.\r
+E00000-EFFFFF (base 16) Aplex Technology Inc.\r
+ 501-5B01,Xintianxia phase 2 building,Wankecheng community,Bantian township,Longgang district\r
+ Shenzhen City Guangdong 518129\r
+ CN\r
+\r
+88-C9-B3 (hex) Gefran Drive & Motion srl\r
+A00000-AFFFFF (base 16) Gefran Drive & Motion srl\r
+ Via Carducci 24\r
+ Gerenzano (VA) Varese 21040\r
+ IT\r
+\r
+C8-F5-D6 (hex) Jabil\r
+600000-6FFFFF (base 16) Jabil\r
+ 10560 Dr M.L.K. Jr St N, St.\r
+ St. Petersburg 33716\r
+ US\r
+\r
+C8-F5-D6 (hex) Volansys technologies pvt ltd\r
+D00000-DFFFFF (base 16) Volansys technologies pvt ltd\r
+ Block A-7th Floor, Safal Profitaire, Corporate Road, Prahaladnagar\r
+ Ahmedabad Gujarat 380015\r
+ IN\r
+\r
+C0-FB-F9 (hex) HAGUENET\r
+500000-5FFFFF (base 16) HAGUENET\r
+ Nieuwe Parklaan 17\r
+ The Hague 2597 LA\r
+ NL\r
+\r
+C0-FB-F9 (hex) LIXIL Corporation\r
+100000-1FFFFF (base 16) LIXIL Corporation\r
+ 2-1-1 Ojima, Koto-ku\r
+ Tokyo Select Stat 136-8535\r
+ JP\r
+\r
+C0-FB-F9 (hex) SHENZHEN COMIX HST CLOUD COMPUTING CO., LTD.\r
+B00000-BFFFFF (base 16) SHENZHEN COMIX HST CLOUD COMPUTING CO., LTD.\r
+ 1408? Qiancheng Commercial Center, No. 5 Haicheng Road, Mabu Community, Xixiang Sub-district, Bao'an District\r
+ Shenzhen Guangdong 518000\r
+ CN\r
+\r
+C0-FB-F9 (hex) SHENZHEN HEQIANG ELECTRONICS LIMITED\r
+300000-3FFFFF (base 16) SHENZHEN HEQIANG ELECTRONICS LIMITED\r
+ ROOM F7, 6TH FLOOR, A1 BUILDING, RED BOX LOFT, NO. 3 SOUTH HUANCHENG ROAD, LONGGANG DISTRICT,\r
+ SHENZHEN GUANGDONG 518129\r
+ CN\r
+\r
+D0-9F-D9 (hex) Carbon Mobile GmbH\r
+500000-5FFFFF (base 16) Carbon Mobile GmbH\r
+ Winterfeldtstr. 21\r
+ Berlin 10781\r
+ DE\r
+\r
+D0-9F-D9 (hex) ENTTEC Pty Ltd.\r
+900000-9FFFFF (base 16) ENTTEC Pty Ltd.\r
+ po box 4051\r
+ ringwood vic 3134\r
+ AU\r
+\r
+D0-9F-D9 (hex) elecgator bvba\r
+100000-1FFFFF (base 16) elecgator bvba\r
+ Heerbaan, 308\r
+ Beringen Limburg 3582\r
+ BE\r
+\r
+D0-9F-D9 (hex) Minibems Ltd\r
+E00000-EFFFFF (base 16) Minibems Ltd\r
+ Oxford Point, 19 Oxford Road\r
+ Bournemouth BH88GS\r
+ GB\r
+\r
+30-49-50 (hex) Merlyn Mind, Inc.\r
+D00000-DFFFFF (base 16) Merlyn Mind, Inc.\r
+ 405 Lexington Avenue, Suite 3504\r
+ New York NY 10174\r
+ US\r
+\r
4C-4B-F9 (hex) Shandong Linkotech Electronic Co., Ltd.\r
600000-6FFFFF (base 16) Shandong Linkotech Electronic Co., Ltd.\r
22nd Floor, Building 2, Aosheng Building, No.1166 Xinyi Street, High-tech Zone\r
Shenzhen Guangdong 518101\r
CN\r
\r
-E0-5A-9F (hex) Fujian Newland Auto-ID Tech. Co.,Ltd.\r
-800000-8FFFFF (base 16) Fujian Newland Auto-ID Tech. Co.,Ltd.\r
- Newland Science & Technology Park, No.1 Rujiang West Rd,Mawei,Fuzhou, P.R.China\r
- Fuzhou Fujian 350015\r
- CN\r
-\r
4C-BC-98 (hex) Charge-Amps AB\r
000000-0FFFFF (base 16) Charge-Amps AB\r
GUSTAV III:S BOULEVARD 42, 8TR\r
Beijing 100070\r
CN\r
\r
-40-11-75 (hex) disguise Technologies Limited\r
-C00000-CFFFFF (base 16) disguise Technologies Limited\r
- 88-89 Blackfriars Rd\r
- London South Bank SE1 8HA,\r
- GB\r
-\r
44-6F-D8 (hex) Global Telecom Engineering, Inc\r
800000-8FFFFF (base 16) Global Telecom Engineering, Inc\r
17901 Von Karman Ave, Suite 600\r
Irvine CA 92614\r
US\r
\r
+40-11-75 (hex) disguise Technologies Limited\r
+C00000-CFFFFF (base 16) disguise Technologies Limited\r
+ 88-89 Blackfriars Rd\r
+ London South Bank SE1 8HA,\r
+ GB\r
+\r
74-F8-DB (hex) Avantree Corporation\r
900000-9FFFFF (base 16) Avantree Corporation\r
175 Bernal road Ste 106\r
Philadelphia PA 19106\r
US\r
\r
-E8-6C-C7 (hex) Shenzhen Rongda Computer Co.,Ltd\r
-500000-5FFFFF (base 16) Shenzhen Rongda Computer Co.,Ltd\r
- 905, Block B, DuoCaiKeChuan Park, No.5 Guanle Road\r
- Longhua District Shenzhen, Guangdong 518110\r
- CN\r
-\r
E8-6C-C7 (hex) Hangzhou Lanxum Security Technology Co., Ltd\r
900000-9FFFFF (base 16) Hangzhou Lanxum Security Technology Co., Ltd\r
Room 402, Block A, 4th Floor, Building 3, No. 351 changhe Road, Changhe Street, Binjiang District\r
Changsha 410007\r
CN\r
\r
-24-5D-FC (hex) Dodge\r
-E00000-EFFFFF (base 16) Dodge\r
- 6040 Ponders Court\r
- Greenville SC 29615\r
- US\r
-\r
-60-15-92 (hex) insensiv GmbH\r
-A00000-AFFFFF (base 16) insensiv GmbH\r
- Auf dem Esch 28\r
- Bielefeld Nordrhein-Westfalen 33619\r
- DE\r
+E8-6C-C7 (hex) Shenzhen Rongda Computer Co.,Ltd\r
+500000-5FFFFF (base 16) Shenzhen Rongda Computer Co.,Ltd\r
+ 905, Block B, DuoCaiKeChuan Park, No.5 Guanle Road\r
+ Longhua District Shenzhen, Guangdong 518110\r
+ CN\r
\r
00-55-DA (hex) Nanoleaf\r
500000-5FFFFF (base 16) Nanoleaf\r
Toronto Ontario M5A 1E1\r
CA\r
\r
+24-5D-FC (hex) Dodge\r
+E00000-EFFFFF (base 16) Dodge\r
+ 6040 Ponders Court\r
+ Greenville SC 29615\r
+ US\r
+\r
60-15-92 (hex) EDA Technology Co.,LTD\r
200000-2FFFFF (base 16) EDA Technology Co.,LTD\r
Room 301, Building 24, Shengchuang Enterprise Park,No.1661 Jialuo Road, Jiading District\r
Shanghai Shanghai 201822\r
CN\r
\r
+60-15-92 (hex) insensiv GmbH\r
+A00000-AFFFFF (base 16) insensiv GmbH\r
+ Auf dem Esch 28\r
+ Bielefeld Nordrhein-Westfalen 33619\r
+ DE\r
+\r
60-15-92 (hex) REMOWIRELESS COMMUNICATION INTERNATIONAL CO.,LIMITED\r
D00000-DFFFFF (base 16) REMOWIRELESS COMMUNICATION INTERNATIONAL CO.,LIMITED\r
REMOWIRELESS RM1111,HONGYI BUILDING NO.2158 WANYUAN ROAD\r
Dubai United Arab Emirates 33964\r
AE\r
\r
+0C-5C-B5 (hex) Munters Europe AB\r
+E00000-EFFFFF (base 16) Munters Europe AB\r
+ Borgarfjordsgatan 16\r
+ Kista 16440\r
+ SE\r
+\r
+0C-5C-B5 (hex) HongKong Blossom Limited\r
+200000-2FFFFF (base 16) HongKong Blossom Limited\r
+ B1715,Jiansheng Building,No. 1 Pingji Road, NanWan Street Longgang\r
+ Shenzhen 518112\r
+ CN\r
+\r
1C-A0-EF (hex) Sequent AG\r
300000-3FFFFF (base 16) Sequent AG\r
Eptingerstrasse 3\r
Taipei Taiwan (R.O.C.) 114\r
TW\r
\r
-0C-5C-B5 (hex) HongKong Blossom Limited\r
-200000-2FFFFF (base 16) HongKong Blossom Limited\r
- B1715,Jiansheng Building,No. 1 Pingji Road, NanWan Street Longgang\r
- Shenzhen 518112\r
- CN\r
-\r
-0C-5C-B5 (hex) Munters Europe AB\r
-E00000-EFFFFF (base 16) Munters Europe AB\r
- Borgarfjordsgatan 16\r
- Kista 16440\r
- SE\r
-\r
1C-A0-EF (hex) tec5AG\r
700000-7FFFFF (base 16) tec5AG\r
Weisskirchener Strasse 2-6\r
Steinbach Hessen 61449\r
DE\r
\r
+20-CE-2A (hex) MeshPlusPlus, Inc.\r
+A00000-AFFFFF (base 16) MeshPlusPlus, Inc.\r
+ 935 W. Chestnut St., Suite #505\r
+ Chicago IL 60642\r
+ US\r
+\r
+20-CE-2A (hex) LAUDA DR R WOBSER GMBH & CO KG\r
+D00000-DFFFFF (base 16) LAUDA DR R WOBSER GMBH & CO KG\r
+ Pfarrstrasse 41/43\r
+ Lauda-Koenigshofen 97922\r
+ DE\r
+\r
+20-CE-2A (hex) Rugged Monitoring\r
+900000-9FFFFF (base 16) Rugged Monitoring\r
+ 1415 Frank-Carrel, Suite 230\r
+ Quebec City Quebec G1N4N7\r
+ CA\r
+\r
+20-CE-2A (hex) Zaber Technologies Inc.\r
+500000-5FFFFF (base 16) Zaber Technologies Inc.\r
+ #2 - 605 West Kent Ave. N.\r
+ Vancouver B.C. V6P 6T7\r
+ CA\r
+\r
+20-CE-2A (hex) Swarovski Optik KG\r
+B00000-BFFFFF (base 16) Swarovski Optik KG\r
+ Daniel Swarovski Street 70\r
+ Absam 6067\r
+ AT\r
+\r
+88-C9-B3 (hex) Brabender Technologie GmbH & Co, KG\r
+500000-5FFFFF (base 16) Brabender Technologie GmbH & Co, KG\r
+ Kulturstrasse 49\r
+ Duisburg 47055\r
+ DE\r
+\r
+20-CE-2A (hex) Funkwerk Systems GmbH\r
+E00000-EFFFFF (base 16) Funkwerk Systems GmbH\r
+ Im Funkwerk 5\r
+ Koelleda 99625\r
+ DE\r
+\r
+88-C9-B3 (hex) Hasbro Inc\r
+400000-4FFFFF (base 16) Hasbro Inc\r
+ 1027 Newport Ave\r
+ Pawtucket RI 02861\r
+ US\r
+\r
+88-C9-B3 (hex) Sercomm Corporation.\r
+E00000-EFFFFF (base 16) Sercomm Corporation.\r
+ 3F,No.81,Yu-Yih Rd.,Chu-Nan Chen\r
+ Miao-Lih Hsuan 115\r
+ TW\r
+\r
+88-C9-B3 (hex) Divelbiss Corporation\r
+800000-8FFFFF (base 16) Divelbiss Corporation\r
+ 9778 Mount Gilead Road\r
+ Fredericktown OH 43019\r
+ US\r
+\r
+88-C9-B3 (hex) Origins Technology Limited\r
+D00000-DFFFFF (base 16) Origins Technology Limited\r
+ 18 Xinzhong St Dushiyangguang4-1106, Dongcheng\r
+ Beijing 100027\r
+ CN\r
+\r
+C8-F5-D6 (hex) Shanghai Mo xiang Network Technology CO.,Ltd\r
+900000-9FFFFF (base 16) Shanghai Mo xiang Network Technology CO.,Ltd\r
+ Room#418-421, ShaHeXiLi, 2-2 XiLi North Road, LiCheng Community, Xili Street, NanShan District\r
+ Shenzhen Guangdong 518071\r
+ CN\r
+\r
+C8-F5-D6 (hex) United Barcode Systems\r
+B00000-BFFFFF (base 16) United Barcode Systems\r
+ Av. Progres 56, Pol. Ind. els Garrofers\r
+ Vilassar de Mar Barcelona 08340\r
+ ES\r
+\r
+C8-F5-D6 (hex) Eltako GmbH\r
+C00000-CFFFFF (base 16) Eltako GmbH\r
+ Hofener Straße 54\r
+ Fellbach BW 70736\r
+ DE\r
+\r
+C0-FB-F9 (hex) SHENZHEN ELSKY TECHNOLOGY CO., LTD\r
+C00000-CFFFFF (base 16) SHENZHEN ELSKY TECHNOLOGY CO., LTD\r
+ 1F BUILDING 2# ASIA INDUSTIAL PARK BANTIAN STREET LONGGANG DISTRICT \r
+ SHENZHEN GUANGDONG 518000\r
+ CN\r
+\r
+C0-FB-F9 (hex) Dropbeats Technology Co., Ltd.\r
+D00000-DFFFFF (base 16) Dropbeats Technology Co., Ltd.\r
+ Room 304, Building 4?Juli Road ? Pudong New District\r
+ Shanghai Shanghai 201203\r
+ CN\r
+\r
+D0-9F-D9 (hex) Elevoc Technology Co., Ltd.\r
+600000-6FFFFF (base 16) Elevoc Technology Co., Ltd.\r
+ 5/F,Unit B,Block12,ShenZhenwan Science and Technology Ecological Garden,Nanshan Dist.\r
+ Shenzhen Guangdong 518000\r
+ CN\r
+\r
+D0-9F-D9 (hex) Eurolan Ltd\r
+A00000-AFFFFF (base 16) Eurolan Ltd\r
+ jk. Drujba 1, ul. 5028, do bl. 15\r
+ Sofia Sofia (stolitsa) 1592\r
+ BG\r
+\r
+E0-5A-9F (hex) Fujian Newland Auto-ID Tech. Co,.Ltd.\r
+800000-8FFFFF (base 16) Fujian Newland Auto-ID Tech. Co,.Ltd.\r
+ Newland Science & Technology Park, No.1 Rujiang West Rd,Mawei,Fuzhou, P.R.China\r
+ Fuzhou Fujian 350015\r
+ CN\r
+\r
+18-74-E2 (hex) NextGen RF Design, Inc.\r
+C00000-CFFFFF (base 16) NextGen RF Design, Inc.\r
+ 2130 Howard Dr W\r
+ North Mankato MN 56003\r
+ US\r
+\r
+18-74-E2 (hex) Sartorius Lab Instruments GmbH & Co. KG\r
+100000-1FFFFF (base 16) Sartorius Lab Instruments GmbH & Co. KG\r
+ Otto-Brenner-Straße 20\r
+ Goettingen 37079\r
+ DE\r
+\r
+D0-9F-D9 (hex) Sanken-Densetsu Co.,LTD.\r
+300000-3FFFFF (base 16) Sanken-Densetsu Co.,LTD.\r
+ 677 Shimoakasaka-Ohnohara\r
+ Kawagoe-Shi Saitama 350-1155\r
+ JP\r
+\r
20-85-93 (hex) Great Lite International\r
700000-7FFFFF (base 16) Great Lite International\r
11F., No.207-2, Sec. 3, Beixin Rd., Xindian Dist.,\r
Wuhan Hubei 42000\r
CN\r
\r
-78-C2-C0 (hex) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
-600000-6FFFFF (base 16) SICHUAN TIANYI COMHEART TELECOMCO.,LTD\r
- FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road, Chengdu, Sichuan\r
- Chengdu Sichuan 610000\r
- CN\r
-\r
8C-19-2D (hex) Elcon AB\r
E00000-EFFFFF (base 16) Elcon AB\r
Hyttrisvagen 27\r
Cambridge Cambridgeshire CB23 8AR\r
GB\r
\r
+04-11-19 (hex) CEITA COMMUNICATION TECHNOLOGY CO.,LTD\r
+500000-5FFFFF (base 16) CEITA COMMUNICATION TECHNOLOGY CO.,LTD\r
+ 611, Renbao Building, 32 Baolong Road, Changlong Community, Buji Street, Longgang District\r
+ Shenzhen Guangdong 518000\r
+ CN\r
+\r
98-27-82 (hex) KRISTECH Krzysztof Kajstura\r
C00000-CFFFFF (base 16) KRISTECH Krzysztof Kajstura\r
Porzeczkowa 12\r
Beijing Beijing 100015\r
CN\r
\r
-04-11-19 (hex) CEITA COMMUNICATION TECHNOLOGY CO.,LTD\r
-500000-5FFFFF (base 16) CEITA COMMUNICATION TECHNOLOGY CO.,LTD\r
- 611, Renbao Building, 32 Baolong Road, Changlong Community, Buji Street, Longgang District\r
- Shenzhen Guangdong 518000\r
+E8-6C-C7 (hex) ASSA ABLOY(GuangZhou) Smart Technology Co., Ltd\r
+100000-1FFFFF (base 16) ASSA ABLOY(GuangZhou) Smart Technology Co., Ltd\r
+ Plant Building 5, 106 Xieshi Highway, Shibi 1st Village\r
+ Guangzhou GuangDong 511495\r
CN\r
\r
-24-5D-FC (hex) Shenzhen Hailuck Electronic Technology CO.,LTD\r
-300000-3FFFFF (base 16) Shenzhen Hailuck Electronic Technology CO.,LTD\r
- 2/F, building 19, Baotian industrial zone, the Third Baotian Road, Bao'an district\r
- Shenzhen GuangDong 518101\r
+04-11-19 (hex) Haerbin Donglin Technology Co., Ltd.\r
+C00000-CFFFFF (base 16) Haerbin Donglin Technology Co., Ltd.\r
+ Room 2, Floor 1, Unit 6, Building 2,Yuanshi Street 35, Nangang District\r
+ Haerbin Heilongjiang 150000\r
CN\r
\r
04-11-19 (hex) Bolicom Innovation Technology (BeiJing) Co.,LTD.\r
Bei Jing 100000\r
CN\r
\r
-04-11-19 (hex) Haerbin Donglin Technology Co., Ltd.\r
-C00000-CFFFFF (base 16) Haerbin Donglin Technology Co., Ltd.\r
- Room 2, Floor 1, Unit 6, Building 2,Yuanshi Street 35, Nangang District\r
- Haerbin Heilongjiang 150000\r
+24-5D-FC (hex) Shenzhen Hailuck Electronic Technology CO.,LTD\r
+300000-3FFFFF (base 16) Shenzhen Hailuck Electronic Technology CO.,LTD\r
+ 2/F, building 19, Baotian industrial zone, the Third Baotian Road, Bao'an district\r
+ Shenzhen GuangDong 518101\r
CN\r
\r
E8-6C-C7 (hex) MORNSUN Guangzhou Science & Technology Co., Ltd.\r
GuangZhou GuangDong 510000\r
CN\r
\r
-E8-6C-C7 (hex) ASSA ABLOY(GuangZhou) Smart Technology Co., Ltd\r
-100000-1FFFFF (base 16) ASSA ABLOY(GuangZhou) Smart Technology Co., Ltd\r
- Plant Building 5, 106 Xieshi Highway, Shibi 1st Village\r
- Guangzhou GuangDong 511495\r
- CN\r
-\r
24-5D-FC (hex) ONLY\r
B00000-BFFFFF (base 16) ONLY\r
1F., No. 16, Ln. 76, Zhongyang N. Rd., Sanchong Dist\r
Austin TX 78754\r
US\r
\r
+1C-A0-EF (hex) Atlas Aerospace\r
+900000-9FFFFF (base 16) Atlas Aerospace\r
+ Ulbrokas 19a\r
+ Riga Riga LV-1021\r
+ LV\r
+\r
0C-5C-B5 (hex) Zhengzhou coal machinery hydraulic electric control Co.,Ltd\r
A00000-AFFFFF (base 16) Zhengzhou coal machinery hydraulic electric control Co.,Ltd\r
167 Jingkai 9th Street, Zhengzhou Economic Development Zone\r
Zhengzhou 45000\r
CN\r
\r
+1C-A0-EF (hex) Henrich Electronics Corporation\r
+A00000-AFFFFF (base 16) Henrich Electronics Corporation\r
+ 225 Deming Place\r
+ Westmont 60559\r
+ US\r
+\r
+1C-A0-EF (hex) BMK professional electronics GmbH\r
+B00000-BFFFFF (base 16) BMK professional electronics GmbH\r
+ Werner-von-Siemens-Straße 6\r
+ Augsburg 86159\r
+ DE\r
+\r
1C-A0-EF (hex) Nanjing Bilin Intelligent Identification Technology Co.,Ltd\r
500000-5FFFFF (base 16) Nanjing Bilin Intelligent Identification Technology Co.,Ltd\r
No.9 Bancang Street\r
SHENZHEN 518000\r
CN\r
\r
-1C-A0-EF (hex) BMK professional electronics GmbH\r
-B00000-BFFFFF (base 16) BMK professional electronics GmbH\r
- Werner-von-Siemens-Straße 6\r
- Augsburg 86159\r
+1C-A0-EF (hex) RDA Microelectronics Technologies (Shanghai) Co. , Ltd\r
+E00000-EFFFFF (base 16) RDA Microelectronics Technologies (Shanghai) Co. , Ltd\r
+ Room 336, No.3, Lane 2288, Zuchongzhi Road, Pudong Area\r
+ Shanghai Shanghai 200120\r
+ CN\r
+\r
+20-CE-2A (hex) Annapurna labs\r
+000000-0FFFFF (base 16) Annapurna labs\r
+ Matam Scientific Industries Center, Building 8.2\r
+ Mail box 15123 Haifa 3508409\r
+ IL\r
+\r
+20-CE-2A (hex) Cuculus GmbH\r
+300000-3FFFFF (base 16) Cuculus GmbH\r
+ Lindenstr. 9 -11\r
+ Ilmenau Thuringia 98693\r
DE\r
\r
-1C-A0-EF (hex) Atlas Aerospace\r
-900000-9FFFFF (base 16) Atlas Aerospace\r
- Ulbrokas 19a\r
- Riga Riga LV-1021\r
- LV\r
+20-CE-2A (hex) Annapurna labs\r
+400000-4FFFFF (base 16) Annapurna labs\r
+ Matam Scientific Industries Center, Building 8.2\r
+ Mail box 15123 Haifa 3508409\r
+ IL\r
\r
-1C-A0-EF (hex) Henrich Electronics Corporation\r
-A00000-AFFFFF (base 16) Henrich Electronics Corporation\r
- 225 Deming Place\r
- Westmont 60559\r
+20-CE-2A (hex) Radarxense BV\r
+600000-6FFFFF (base 16) Radarxense BV\r
+ Kwekerijweg, 2A\r
+ Zeist Nederland 3709 JA\r
+ NL\r
+\r
+78-C2-C0 (hex) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+600000-6FFFFF (base 16) Sichuan Tianyi Comheart Telecom Co.,LTD\r
+ FL12,TowerB,Tianyi international Hotel,No.2 West Section One, Second Ring Road, Chengdu, Sichuan\r
+ Chengdu Sichuan 610000\r
+ CN\r
+\r
+88-C9-B3 (hex) Shenzhen Viewsmart Technology Co.,Ltd\r
+C00000-CFFFFF (base 16) Shenzhen Viewsmart Technology Co.,Ltd\r
+ Room 10C?Floor 10,South China Navigation Building, No.7 North Langshan Road,Nanshan District, Shenzhen, China.\r
+ SHENZHEN 518000\r
+ CN\r
+\r
+88-C9-B3 (hex) Hugo Techno\r
+600000-6FFFFF (base 16) Hugo Techno\r
+ F92 Green Park\r
+ New Delhi Delhi 110016\r
+ IN\r
+\r
+88-C9-B3 (hex) Richbeam (Beijing) Technology Co., Ltd.\r
+900000-9FFFFF (base 16) Richbeam (Beijing) Technology Co., Ltd.\r
+ 2608, Tower A, Tianzuo International, No.12, Zhongguancun South Street, Haidian District\r
+ Beijing Beijing 100081\r
+ CN\r
+\r
+C8-F5-D6 (hex) HENAN FOXSTAR DIGITAL DISPLAY Co.,Ltd.\r
+A00000-AFFFFF (base 16) HENAN FOXSTAR DIGITAL DISPLAY Co.,Ltd.\r
+ No. 7 Bldg., Yulong Block, Longsheng Road, Optronic Industry Area, Nanyang,Henan,P.R.China\r
+ Nanyang 473000\r
+ CN\r
+\r
+C8-F5-D6 (hex) MEIRYO TECHNICA CORPORATION\r
+000000-0FFFFF (base 16) MEIRYO TECHNICA CORPORATION\r
+ 2039-1,Shimoi, Shimoi-cho\r
+ Owariasahi-city Aichi 488-0052\r
+ JP\r
+\r
+C0-FB-F9 (hex) Minato Advanced Technologies inc\r
+400000-4FFFFF (base 16) Minato Advanced Technologies inc\r
+ 4105, Minami Yamata-cho, Tsuzuki-ku,\r
+ YOKOHAMA Kanagawa 224-0026\r
+ JP\r
+\r
+C0-FB-F9 (hex) LongSung Technology (Shanghai) Co.,Ltd. \r
+700000-7FFFFF (base 16) LongSung Technology (Shanghai) Co.,Ltd. \r
+ Room 606, Block B, Bldg. 1, No. 3000 Longdong Avenue., Zhangjiang Hi-Tech Park, Pudong District\r
+ ShangHai 201203\r
+ CN\r
+\r
+C8-F5-D6 (hex) HEITEC AG\r
+E00000-EFFFFF (base 16) HEITEC AG\r
+ Güterbahnhofstrasse 5\r
+ Erlangen Please select state 91052\r
+ DE\r
+\r
+C8-F5-D6 (hex) BBPOS International Limited\r
+300000-3FFFFF (base 16) BBPOS International Limited\r
+ Suite 1602, Tower 2, Nina Tower, 8 Yeung Uk Road, Tsuen Wan, NT\r
+ Hong Kong China 00000\r
+ HK\r
+\r
+88-C9-B3 (hex) Fortive Setra-ICG(Tianjin)Co.,Ltd\r
+300000-3FFFFF (base 16) Fortive Setra-ICG(Tianjin)Co.,Ltd\r
+ 28 weiwu Road,Micro-electronics Industrial Park,Xiqing District Tianjin,P,R,China\r
+ Tianjin 300380\r
+ CN\r
+\r
+C0-FB-F9 (hex) Xerox Corporation\r
+000000-0FFFFF (base 16) Xerox Corporation\r
+ 800 Phillips Rd, Mailstop 0207-2Z\r
+ Webster NY 14580\r
US\r
\r
-1C-A0-EF (hex) RDA Microelectronics Technologies (Shanghai) Co. , Ltd\r
-E00000-EFFFFF (base 16) RDA Microelectronics Technologies (Shanghai) Co. , Ltd\r
- Room 336, No.3, Lane 2288, Zuchongzhi Road, Pudong Area\r
- Shanghai Shanghai 200120\r
+C0-FB-F9 (hex) zxsolution\r
+900000-9FFFFF (base 16) zxsolution\r
+ nanshan shenzhen\r
+ shenzhen 518000\r
+ CN\r
+\r
+D0-9F-D9 (hex) Westar Display Technologies\r
+200000-2FFFFF (base 16) Westar Display Technologies\r
+ 4 Research Park Dr\r
+ St Charles MO 63304\r
+ US\r
+\r
+18-74-E2 (hex) Sansec Technology Co.,Ltd\r
+700000-7FFFFF (base 16) Sansec Technology Co.,Ltd\r
+ Bejing Chaoyang District Guangshun North Street Hostpital No.16 No.2 building 14 room 1406\r
+ Bejing Bejing 100102\r
+ CN\r
+\r
+D0-9F-D9 (hex) Cablewireless Laboratory Co., Ltd\r
+B00000-BFFFFF (base 16) Cablewireless Laboratory Co., Ltd\r
+ Room 218, Block E1, Yuanchenxin Building, 12 Yumin Road, Chaoyang District\r
+ Beijing 100029\r
CN\r
Niemce lubelskie 21-025\r
PL\r
\r
-70-B3-D5 (hex) Aplex Technology Inc.\r
-9B1000-9B1FFF (base 16) Aplex Technology Inc.\r
- 2nd Floor,Tower3,District5,HongHuaLing industrial park, Nanshan District\r
- Shenzhen Guangdong 518055\r
- CN\r
-\r
70-B3-D5 (hex) Netemera Sp. z o.o.\r
CA4000-CA4FFF (base 16) Netemera Sp. z o.o.\r
Ostrobramska 83/1208A\r
Gävle Gavleborg 80647\r
SE\r
\r
-70-B3-D5 (hex) Jabil, Inc.\r
-736000-736FFF (base 16) Jabil, Inc.\r
- 888 Executive Center Dr. W.\r
- St.Petersubrg FL 33702\r
- US\r
-\r
70-B3-D5 (hex) Power Electronics Espana, S.L.\r
632000-632FFF (base 16) Power Electronics Espana, S.L.\r
C/ Leonardo Da Vinci, 24-26\r
TAIPEI 11560\r
TW\r
\r
-70-B3-D5 (hex) EBZ SysTec GmbH\r
-1FA000-1FAFFF (base 16) EBZ SysTec GmbH\r
- Bleicherstraße 7\r
- Ravensburg DE 88212\r
- DE\r
-\r
70-B3-D5 (hex) nexgenwave\r
5BD000-5BDFFF (base 16) nexgenwave\r
1209 sicox tower, 484 Dunchon-daero, jungwon-gu\r
Sungnam-si gyeonggi-do 13229\r
KR\r
\r
+70-B3-D5 (hex) EBZ SysTec GmbH\r
+1FA000-1FAFFF (base 16) EBZ SysTec GmbH\r
+ Bleicherstraße 7\r
+ Ravensburg DE 88212\r
+ DE\r
+\r
70-B3-D5 (hex) TRIOPTICS\r
A11000-A11FFF (base 16) TRIOPTICS\r
Strandbaddamm 6\r
Wedel Schleswig-Holstein 22880\r
DE\r
\r
-70-B3-D5 (hex) Lockheed Martin - THAAD\r
-9EE000-9EEFFF (base 16) Lockheed Martin - THAAD\r
- 4800 Bradford Drive\r
- Huntsville AL 35805\r
- US\r
-\r
-70-B3-D5 (hex) TT Group SRL\r
-BD7000-BD7FFF (base 16) TT Group SRL\r
- Via Pazzano 112\r
- Roma RM 00118\r
- IT\r
-\r
70-B3-D5 (hex) SIAME\r
66E000-66EFFF (base 16) SIAME\r
RUE DES MATHEMATIQUES\r
GROMBALIA 8030\r
TN\r
\r
-70-B3-D5 (hex) Stecomp\r
-EE0000-EE0FFF (base 16) Stecomp\r
- Bollaarsdijk 11\r
- Brielle 3231LA\r
- NL\r
+70-B3-D5 (hex) Lockheed Martin - THAAD\r
+9EE000-9EEFFF (base 16) Lockheed Martin - THAAD\r
+ 4800 Bradford Drive\r
+ Huntsville AL 35805\r
+ US\r
\r
70-B3-D5 (hex) Plenty Unlimited Inc\r
D04000-D04FFF (base 16) Plenty Unlimited Inc\r
South San Francisco CA 94080\r
US\r
\r
+70-B3-D5 (hex) TT Group SRL\r
+BD7000-BD7FFF (base 16) TT Group SRL\r
+ Via Pazzano 112\r
+ Roma RM 00118\r
+ IT\r
+\r
70-B3-D5 (hex) Aliter Technologies\r
586000-586FFF (base 16) Aliter Technologies\r
Turcianska 16\r
Bratislava 82109\r
SK\r
\r
+70-B3-D5 (hex) Stecomp\r
+EE0000-EE0FFF (base 16) Stecomp\r
+ Bollaarsdijk 11\r
+ Brielle 3231LA\r
+ NL\r
+\r
70-B3-D5 (hex) TORGOVYY DOM TEHNOLOGIY LLC\r
7C0000-7C0FFF (base 16) TORGOVYY DOM TEHNOLOGIY LLC\r
Gospytalnaya 10, ap. 109, village Selyatino, city Naro-Fominsk,\r
Moscow Moscow Region 143345\r
RU\r
\r
-70-B3-D5 (hex) Automata GmbH & Co. KG\r
-19D000-19DFFF (base 16) Automata GmbH & Co. KG\r
- Gewerbering 5\r
- Ried Bavaria 86510\r
- DE\r
-\r
70-B3-D5 (hex) XJ ELECTRIC CO., LTD.\r
F26000-F26FFF (base 16) XJ ELECTRIC CO., LTD.\r
#1298 XUJI AVENUE\r
XUCHANG HENAN 461000\r
CN\r
\r
+70-B3-D5 (hex) Automata GmbH & Co. KG\r
+19D000-19DFFF (base 16) Automata GmbH & Co. KG\r
+ Gewerbering 5\r
+ Ried Bavaria 86510\r
+ DE\r
+\r
70-B3-D5 (hex) Topic Embedded Products B.V.\r
63D000-63DFFF (base 16) Topic Embedded Products B.V.\r
Materiaalweg 4\r
Furth Bavaria 82041\r
DE\r
\r
+70-B3-D5 (hex) Hubbell Power Systems\r
+DDA000-DDAFFF (base 16) Hubbell Power Systems\r
+ 353 Powerville Road\r
+ Boonton Township NJ 07005\r
+ US\r
+\r
+70-B3-D5 (hex) Potter Electric Signal Co. LLC\r
+6D5000-6D5FFF (base 16) Potter Electric Signal Co. LLC\r
+ 1609 Park 370 Place\r
+ Hazelwood MO 63042\r
+ US\r
+\r
70-B3-D5 (hex) Jiangsu Etern Compamy Limited\r
DA0000-DA0FFF (base 16) Jiangsu Etern Compamy Limited\r
No. 1788 fenhu Guo Dao Road, Foho New&High-tech Industrial Development Zone, Wujiang\r
WEST PERTH WA 6005\r
AU\r
\r
-70-B3-D5 (hex) Hubbell Power Systems\r
-DDA000-DDAFFF (base 16) Hubbell Power Systems\r
- 353 Powerville Road\r
- Boonton Township NJ 07005\r
- US\r
-\r
-70-B3-D5 (hex) Potter Electric Signal Co. LLC\r
-6D5000-6D5FFF (base 16) Potter Electric Signal Co. LLC\r
- 1609 Park 370 Place\r
- Hazelwood MO 63042\r
- US\r
-\r
70-B3-D5 (hex) Master Meter Inc.\r
A9F000-A9FFFF (base 16) Master Meter Inc.\r
101 Regency Pkwy\r
Helsinki 00130\r
FI\r
\r
-70-B3-D5 (hex) OMNISENSING PHOTONICS LLC\r
-70D000-70DFFF (base 16) OMNISENSING PHOTONICS LLC\r
- 8015 Four Quarter Road\r
- Ellicott City MD 21043\r
- US\r
+70-B3-D5 (hex) S Labs sp. z o.o.\r
+C53000-C53FFF (base 16) S Labs sp. z o.o.\r
+ Dworska 1a/1u\r
+ Kraków Lesser Poland 30-314\r
+ PL\r
\r
70-B3-D5 (hex) Torion Plasma Corporation\r
B70000-B70FFF (base 16) Torion Plasma Corporation\r
Barrie Ontario L4N9S3\r
CA\r
\r
-70-B3-D5 (hex) Horizon Co., Ltd\r
-69B000-69BFFF (base 16) Horizon Co., Ltd\r
- 1600 Aza-Shironoshita Asahi\r
- Shin Asahi-cho Takashima, Shiga 520-1501\r
- JP\r
-\r
-70-B3-D5 (hex) S Labs sp. z o.o.\r
-C53000-C53FFF (base 16) S Labs sp. z o.o.\r
- Dworska 1a/1u\r
- Kraków Lesser Poland 30-314\r
- PL\r
+70-B3-D5 (hex) OMNISENSING PHOTONICS LLC\r
+70D000-70DFFF (base 16) OMNISENSING PHOTONICS LLC\r
+ 8015 Four Quarter Road\r
+ Ellicott City MD 21043\r
+ US\r
\r
70-B3-D5 (hex) Smart Systems LLC\r
746000-746FFF (base 16) Smart Systems LLC\r
Radeburg 01471\r
DE\r
\r
+70-B3-D5 (hex) Leviathan Solutions Ltd.\r
+A69000-A69FFF (base 16) Leviathan Solutions Ltd.\r
+ Abel Jeno utca 23\r
+ Budapest 1113\r
+ HU\r
+\r
70-B3-D5 (hex) BluB0X Security, Inc.\r
16D000-16DFFF (base 16) BluB0X Security, Inc.\r
9 Bartlet Street Suite 334\r
Andover MA 01810\r
US\r
\r
-70-B3-D5 (hex) Leviathan Solutions Ltd.\r
-A69000-A69FFF (base 16) Leviathan Solutions Ltd.\r
- Abel Jeno utca 23\r
- Budapest 1113\r
- HU\r
+70-B3-D5 (hex) biosilver .co.,ltd\r
+D21000-D21FFF (base 16) biosilver .co.,ltd\r
+ 2-14-4, shinyokohama\r
+ yokohama kanagawa 2220033\r
+ JP\r
\r
70-B3-D5 (hex) ACD Elekronik GmbH\r
D6D000-D6DFFF (base 16) ACD Elekronik GmbH\r
Achstetten 88480\r
DE\r
\r
-70-B3-D5 (hex) biosilver .co.,ltd\r
-D21000-D21FFF (base 16) biosilver .co.,ltd\r
- 2-14-4, shinyokohama\r
- yokohama kanagawa 2220033\r
- JP\r
+70-B3-D5 (hex) Network Integrity Systems\r
+9FF000-9FFFFF (base 16) Network Integrity Systems\r
+ 1937 Tate Blvd. SE\r
+ Hickory NC 28602\r
+ US\r
\r
70-B3-D5 (hex) Vemco Sp. z o. o.\r
D45000-D45FFF (base 16) Vemco Sp. z o. o.\r
Gdansk 80-435\r
PL\r
\r
-70-B3-D5 (hex) Network Integrity Systems\r
-9FF000-9FFFFF (base 16) Network Integrity Systems\r
- 1937 Tate Blvd. SE\r
- Hickory NC 28602\r
+70-B3-D5 (hex) Beijing Xiansheng Technology Co., Ltd\r
+8D6000-8D6FFF (base 16) Beijing Xiansheng Technology Co., Ltd\r
+ Room 02, 102-1 / F, building 32, yard 69, Yanfu Road, Fangshan District\r
+ Beijing Beijing 102488\r
+ CN\r
+\r
+70-B3-D5 (hex) Subject Link Inc\r
+137000-137FFF (base 16) Subject Link Inc\r
+ 9F-1, No. 77, Sec 4. Nanjing E. Rd., SongShan Dist.\r
+ Taipei City Taiwan 105406\r
+ TW\r
+\r
+70-B3-D5 (hex) Crane-elec. Co., LTD.\r
+1FB000-1FBFFF (base 16) Crane-elec. Co., LTD.\r
+ Tamakushicho-higashi 3-3-97\r
+ Higashi osaka OSAKA 5780932\r
+ JP\r
+\r
+70-B3-D5 (hex) Jabil\r
+736000-736FFF (base 16) Jabil\r
+ 888 Executive Center Dr. W.\r
+ St.Petersubrg FL 33702\r
+ US\r
+\r
+70-B3-D5 (hex) AudioTEC LLC\r
+33A000-33AFFF (base 16) AudioTEC LLC\r
+ 108 Scott Street\r
+ Ripon WI 54971\r
+ US\r
+\r
+70-B3-D5 (hex) IRT Technologies\r
+D13000-D13FFF (base 16) IRT Technologies\r
+ 5580 BOULEVARD THIMENS\r
+ Saint-Laurent Quebec H4R 2K9\r
+ CA\r
+\r
+70-B3-D5 (hex) 11811347 CANADA Inc.\r
+7E6000-7E6FFF (base 16) 11811347 CANADA Inc.\r
+ 1215 13th St SE, Suite 114\r
+ Calgary AB T2G 3J4\r
+ CA\r
+\r
+70-B3-D5 (hex) Season Electronics Ltd\r
+BA0000-BA0FFF (base 16) Season Electronics Ltd\r
+ 600 Nest Business Park \r
+ Havant Hampshire PO9 5TL\r
+ GB\r
+\r
+70-B3-D5 (hex) KST technology\r
+20B000-20BFFF (base 16) KST technology\r
+ KST B/D 4-5, Wiryeseong-daero 12-gil\r
+ Songpa-gu Seoul 05636\r
+ KR\r
+\r
+70-B3-D5 (hex) Aplex Technology Inc.\r
+9B1000-9B1FFF (base 16) Aplex Technology Inc.\r
+ 501-5B01,Xintianxia phase 2 building,Wankecheng community,Bantian township,Longgang district\r
+ Shenzhen City Guangdong 518129\r
+ CN\r
+\r
+70-B3-D5 (hex) Santa Barbara Imaging Systems\r
+4E6000-4E6FFF (base 16) Santa Barbara Imaging Systems\r
+ 340 Storke Road, Suite 101\r
+ Goleta CA 93117\r
+ US\r
+\r
+70-B3-D5 (hex) AM General Contractor\r
+2C6000-2C6FFF (base 16) AM General Contractor\r
+ Via Angelo Scarsellini 147\r
+ Genova Italy 16149\r
+ IT\r
+\r
+70-B3-D5 (hex) ProtoConvert Pty Ltd\r
+EC0000-EC0FFF (base 16) ProtoConvert Pty Ltd\r
+ 2 Clyden Court\r
+ Burwood East Victoria 3151\r
+ AU\r
+\r
+70-B3-D5 (hex) Reflexion Medical\r
+298000-298FFF (base 16) Reflexion Medical\r
+ Reflexion Medical 25841 Industrial Blvd.\r
+ Hayward CA 94545\r
+ US\r
+\r
+70-B3-D5 (hex) Zumbach Electronic AG\r
+C19000-C19FFF (base 16) Zumbach Electronic AG\r
+ Hauptstrasse 93\r
+ Orpund Bern 2552\r
+ CH\r
+\r
+70-B3-D5 (hex) Lobaro GmbH\r
+E05000-E05FFF (base 16) Lobaro GmbH\r
+ Stadtdeich 7\r
+ Hamburg 20097\r
+ DE\r
+\r
+70-B3-D5 (hex) LDA Audiotech\r
+685000-685FFF (base 16) LDA Audiotech\r
+ C/Severo Ochoa, 31\r
+ Malaga Malaga 29590\r
+ ES\r
+\r
+70-B3-D5 (hex) HORIZON.INC\r
+69B000-69BFFF (base 16) HORIZON.INC\r
+ 1600 Aza-Shironoshita Asahi\r
+ Shin Asahi-cho Takashima, Shiga 520-1501\r
+ JP\r
+\r
+70-B3-D5 (hex) aelettronica group srl\r
+A14000-A14FFF (base 16) aelettronica group srl\r
+ via matteotti,22\r
+ gaggiano milano 20083\r
+ IT\r
+\r
+70-B3-D5 (hex) MedRx, Inc\r
+3B6000-3B6FFF (base 16) MedRx, Inc\r
+ 1200 Starkey Rd Ste.105\r
+ Largo FL 33771\r
US\r
\r
+70-B3-D5 (hex) ZIEHL-ABEGG SE\r
+698000-698FFF (base 16) ZIEHL-ABEGG SE\r
+ Heinz-Ziehl-Strasse 1\r
+ Kuenzelsau 74653\r
+ DE\r
+\r
+70-B3-D5 (hex) Vema Venturi AB\r
+036000-036FFF (base 16) Vema Venturi AB\r
+ Johan på gårdas gata 5A\r
+ Gothenburg Västra Götaland 41250\r
+ SE\r
+\r
70-B3-D5 (hex) EVCO SPA\r
A80000-A80FFF (base 16) EVCO SPA\r
VIA FELTRE N. 81\r
Seongnam Kyeonggi-do 462-806\r
KR\r
\r
-70-B3-D5 (hex) Aplex Technology Inc.\r
-35F000-35FFFF (base 16) Aplex Technology Inc.\r
- 2Q , NanYouTianAn industrial park Tower4 ,Nanshan District\r
- Shenzhen Guangdong 518054\r
- CN\r
-\r
70-B3-D5 (hex) Emka Technologies\r
AF1000-AF1FFF (base 16) Emka Technologies\r
59 bd General Martial Valin\r
Shenzhen Guangdong 518109\r
CN\r
\r
-70-B3-D5 (hex) MiraeSignal Co., Ltd\r
-38C000-38CFFF (base 16) MiraeSignal Co., Ltd\r
- #701,C-dong Bundang Techno Park Pangyoro 744\r
- Bundang-gu Sungnam-si Kyungkido 13510\r
- KR\r
-\r
70-B3-D5 (hex) on-systems limited\r
5B7000-5B7FFF (base 16) on-systems limited\r
615A Jubilee Road\r
Glebe NSW 2037\r
AU\r
\r
+70-B3-D5 (hex) MiraeSignal Co., Ltd\r
+38C000-38CFFF (base 16) MiraeSignal Co., Ltd\r
+ #701,C-dong Bundang Techno Park Pangyoro 744\r
+ Bundang-gu Sungnam-si Kyungkido 13510\r
+ KR\r
+\r
70-B3-D5 (hex) LEIDOS\r
004000-004FFF (base 16) LEIDOS\r
1121 W Reeves\r
Ridgecrest CA 93555\r
US\r
\r
-70-B3-D5 (hex) Avionica \r
-CC0000-CC0FFF (base 16) Avionica \r
- 9941 West Jessamine St\r
- Miami FL 33157 \r
- US\r
-\r
70-B3-D5 (hex) Swiss Timing LTD\r
725000-725FFF (base 16) Swiss Timing LTD\r
Rue de l'Envers 1\r
Corgemont 2606\r
CH\r
\r
+70-B3-D5 (hex) Avionica \r
+CC0000-CC0FFF (base 16) Avionica \r
+ 9941 West Jessamine St\r
+ Miami FL 33157 \r
+ US\r
+\r
70-B3-D5 (hex) RoyalShield Technologies India Private Limited\r
F1B000-F1BFFF (base 16) RoyalShield Technologies India Private Limited\r
B-116, DDA Sheds, Okhla Industrial Area, Okhla Phase -I\r
HAYWARD CA 94544\r
US\r
\r
+70-B3-D5 (hex) Nordson Corporation\r
+50B000-50BFFF (base 16) Nordson Corporation\r
+ 11475 Lakefield Dr\r
+ Duluth GA 30097\r
+ US\r
+\r
+70-B3-D5 (hex) Jeio Tech \r
+720000-720FFF (base 16) Jeio Tech \r
+ 19 Alexander Road, Suite 7\r
+ Billerica MA 01821\r
+ US\r
+\r
70-B3-D5 (hex) BAB TECHNOLOGIE GmbH\r
E19000-E19FFF (base 16) BAB TECHNOLOGIE GmbH\r
Hoerder Burgstr.18\r
Marlborough CT 06447\r
US\r
\r
-70-B3-D5 (hex) Nordson Corporation\r
-50B000-50BFFF (base 16) Nordson Corporation\r
- 11475 Lakefield Dr\r
- Duluth GA 30097\r
- US\r
-\r
70-B3-D5 (hex) Done Design Inc\r
928000-928FFF (base 16) Done Design Inc\r
930 Delray Drive\r
Forest Hill MD 21050\r
US\r
\r
-70-B3-D5 (hex) Jeio Tech \r
-720000-720FFF (base 16) Jeio Tech \r
- 19 Alexander Road, Suite 7\r
- Billerica MA 01821\r
- US\r
-\r
70-B3-D5 (hex) TESCAN Brno, s.r.o.\r
812000-812FFF (base 16) TESCAN Brno, s.r.o.\r
Libusina tr.1\r
Brno 62300\r
CZ\r
\r
+70-B3-D5 (hex) LINEAGE POWER PVT LTD.,\r
+965000-965FFF (base 16) LINEAGE POWER PVT LTD.,\r
+ 30-A1, KIADB, 1ST PHASE INDUSTRIAL ESTATE,KUMBALGODU, BANGALORE-MYSORE ROAD\r
+ BANGALORE KARNATAKA 560074\r
+ IN\r
+\r
+70-B3-D5 (hex) China Telecom Fufu Information Technology CO.,LTD\r
+38E000-38EFFF (base 16) China Telecom Fufu Information Technology CO.,LTD\r
+ 22 Shuitou Road, Doumen,Fuzhou\r
+ Fuzhou FuJian 350013\r
+ CN\r
+\r
+70-B3-D5 (hex) Dynim Oy\r
+CE6000-CE6FFF (base 16) Dynim Oy\r
+ Kirkkokatu 5b\r
+ Oulu 90100\r
+ FI\r
+\r
+70-B3-D5 (hex) Beijing Muniulinghang Technology Co., Ltd\r
+198000-198FFF (base 16) Beijing Muniulinghang Technology Co., Ltd\r
+ C9001 Kangjianbaosheng Square C, No.8 Heiquan Road, Haidian District,\r
+ Beijing 100192\r
+ CN\r
+\r
+70-B3-D5 (hex) Aplex Technology Inc.\r
+35F000-35FFFF (base 16) Aplex Technology Inc.\r
+ 501-5B01,Xintianxia phase 2 building,Wankecheng community,Bantian township,Longgang district\r
+ Shenzhen City Guangdong 518129\r
+ CN\r
+\r
+70-B3-D5 (hex) TESSA AGRITECH SRL\r
+F74000-F74FFF (base 16) TESSA AGRITECH SRL\r
+ VIA ALLA CASCATA, 56\r
+ Trento Trento 38123\r
+ IT\r
+\r
+70-B3-D5 (hex) CAR-connect GmbH\r
+81F000-81FFFF (base 16) CAR-connect GmbH\r
+ Am Egelingsberg 8\r
+ Leiferde Niedersachsen 38542\r
+ DE\r
+\r
+70-B3-D5 (hex) MBJ\r
+E03000-E03FFF (base 16) MBJ\r
+ Jochim-Klindt-Straße 7\r
+ Ahrensburg Schleswig Holstein 22926\r
+ DE\r
+\r
+70-B3-D5 (hex) Code Blue Corporation \r
+271000-271FFF (base 16) Code Blue Corporation \r
+ 259 Hedcor Street\r
+ Holland MI 49423\r
+ US\r
+\r
+70-B3-D5 (hex) Fischer Connectors\r
+BF7000-BF7FFF (base 16) Fischer Connectors\r
+ 11 Waterberry drive\r
+ Waterlooville Hampshire PO7 7YH\r
+ GB\r
+\r
+70-B3-D5 (hex) VK Integrated Systems\r
+A8F000-A8FFFF (base 16) VK Integrated Systems\r
+ 810 Crossland Ave\r
+ Clarksville TN 37040\r
+ US\r
+\r
70-B3-D5 (hex) System West dba ICS Electronics\r
E06000-E06FFF (base 16) System West dba ICS Electronics\r
7034 Commerce Circle Suite A\r
Aarhus N 8200\r
DK\r
\r
-70-B3-D5 (hex) Aplex Technology Inc.\r
-906000-906FFF (base 16) Aplex Technology Inc.\r
- 2nd Floor,Tower3,District5,HongHuaLing industrial park, Nanshan District\r
- Shenzhen Guangdong 518055\r
- CN\r
-\r
70-B3-D5 (hex) Zoe Medical\r
721000-721FFF (base 16) Zoe Medical\r
460 Boston Street\r
Seven Hills NSW 1730\r
AU\r
\r
+00-1B-C5 (hex) OctoGate IT Security Systems GmbH\r
+030000-030FFF (base 16) OctoGate IT Security Systems GmbH\r
+ Klingender Strasse 5\r
+ Paderborn NRW 33100\r
+ DE\r
+\r
70-B3-D5 (hex) AKASAKATEC INC.\r
D83000-D83FFF (base 16) AKASAKATEC INC.\r
3F Marina Plaza 4-2\r
Oberhasli ZH CH-8156\r
CH\r
\r
-00-1B-C5 (hex) OctoGate IT Security Systems GmbH\r
-030000-030FFF (base 16) OctoGate IT Security Systems GmbH\r
- Klingender Strasse 5\r
- Paderborn NRW 33100\r
+70-B3-D5 (hex) REO AG\r
+AD0000-AD0FFF (base 16) REO AG\r
+ Brühlerstr. 100\r
+ Solingen 42657\r
DE\r
\r
70-B3-D5 (hex) Array Technologies Inc.\r
Glastonbury 06033\r
US\r
\r
-70-B3-D5 (hex) REO AG\r
-AD0000-AD0FFF (base 16) REO AG\r
- Brühlerstr. 100\r
- Solingen 42657\r
- DE\r
-\r
70-B3-D5 (hex) ejoin, s.r.o.\r
44C000-44CFFF (base 16) ejoin, s.r.o.\r
Sturova 1\r
Halsenbach 56283\r
DE\r
\r
-70-B3-D5 (hex) Guan Show Technologe Co., Ltd.\r
-46D000-46DFFF (base 16) Guan Show Technologe Co., Ltd.\r
- No.127, Jianguo 1st Rd., Lingya Dist.\r
- Kaohsiung City 802\r
- TW\r
-\r
70-B3-D5 (hex) Foxtrot Research Corp\r
604000-604FFF (base 16) Foxtrot Research Corp\r
6201 Johns Road, Suite 3\r
Tampa FL 33634\r
US\r
\r
+70-B3-D5 (hex) Guan Show Technologe Co., Ltd.\r
+46D000-46DFFF (base 16) Guan Show Technologe Co., Ltd.\r
+ No.127, Jianguo 1st Rd., Lingya Dist.\r
+ Kaohsiung City 802\r
+ TW\r
+\r
70-B3-D5 (hex) Monnit Corporation\r
A1E000-A1EFFF (base 16) Monnit Corporation\r
450 South Simmons STE 670\r
Moscow Moscow 117246\r
RU\r
\r
-70-B3-D5 (hex) SMITEC S.p.A.\r
-312000-312FFF (base 16) SMITEC S.p.A.\r
- Via Carlo Ceresa, 10\r
- San Giovanni Bianco Bergamo 24015\r
- IT\r
-\r
70-B3-D5 (hex) Sicon srl\r
690000-690FFF (base 16) Sicon srl\r
Via Sila 1/3\r
Isola Vicentina Vicenza 36033\r
IT\r
\r
+70-B3-D5 (hex) SMITEC S.p.A.\r
+312000-312FFF (base 16) SMITEC S.p.A.\r
+ Via Carlo Ceresa, 10\r
+ San Giovanni Bianco Bergamo 24015\r
+ IT\r
+\r
70-B3-D5 (hex) SCHEIBER\r
CFA000-CFAFFF (base 16) SCHEIBER\r
2 BELLEVUE\r
Ostfildern 73760\r
DE\r
\r
+70-B3-D5 (hex) Metrasens Limited\r
+ED6000-ED6FFF (base 16) Metrasens Limited\r
+ 8 Beauchamp Business Centre,, Sparrowhawk Close\r
+ Malvern Worcestershire WR14 1GL\r
+ GB\r
+\r
+70-B3-D5 (hex) Perform3-D LLC\r
+451000-451FFF (base 16) Perform3-D LLC\r
+ 411 Huronview Blvd STE 200\r
+ Ann Arbor MI 48103\r
+ US\r
+\r
+70-B3-D5 (hex) Aplex Technology Inc.\r
+906000-906FFF (base 16) Aplex Technology Inc.\r
+ 501-5B01,Xintianxia phase 2 building,Wankecheng community,Bantian township,Longgang district\r
+ Shenzhen City Guangdong 518129\r
+ CN\r
+\r
+70-B3-D5 (hex) DesignA Electronics Limited\r
+A63000-A63FFF (base 16) DesignA Electronics Limited\r
+ Unit 6\r
+ Christchurch New Zealand 8011\r
+ NZ\r
+\r
+70-B3-D5 (hex) Grayshift\r
+71F000-71FFFF (base 16) Grayshift\r
+ 931 Monroe Dr NE, Suite A102-340\r
+ Atlanta GA 30308\r
+ US\r
+\r
+70-B3-D5 (hex) dongsheng\r
+AFD000-AFDFFF (base 16) dongsheng\r
+ No. 2, Sec. 2, Beiyi Rd., Xindian Dist.,\r
+ New Taipei City 231067\r
+ TW\r
+\r
+70-B3-D5 (hex) Exemplar Medical, LLC\r
+318000-318FFF (base 16) Exemplar Medical, LLC\r
+ 4521 Wornall Road, #106\r
+ Kansas City MO 64111\r
+ US\r
+\r
+70-B3-D5 (hex) HLT Micro \r
+2B6000-2B6FFF (base 16) HLT Micro \r
+ Bld 6, 4th Park, Xitian, GM Distinct\r
+ shenzhen 511088\r
+ CN\r
+\r
+70-B3-D5 (hex) Cucos Retail Systems GmbH\r
+4CB000-4CBFFF (base 16) Cucos Retail Systems GmbH\r
+ Detmolder Straße 7\r
+ Soest 59494\r
+ DE\r
+\r
70-B3-D5 (hex) YUYAMA MFG Co.,Ltd\r
BBB000-BBBFFF (base 16) YUYAMA MFG Co.,Ltd\r
3-3-1\r
FR\r
\r
70-B3-D5 (hex) Woodam Co., Ltd.\r
-C86000-C86FFF (base 16) Woodam Co., Ltd.\r
- Na 555, EZEN Mecha zone, 117 Hwanggeum-ro, Yangchon-eup\r
- Gimpo Gyeonggi-do 10048\r
- KR\r
-\r
-70-B3-D5 (hex) Aplex Technology Inc.\r
-666000-666FFF (base 16) Aplex Technology Inc.\r
- 2nd Floor,Tower3,District5,HongHuaLing industrial park, Nanshan District\r
- Shenzhen Guangdong 518055\r
- CN\r
+C86000-C86FFF (base 16) Woodam Co., Ltd.\r
+ Na 555, EZEN Mecha zone, 117 Hwanggeum-ro, Yangchon-eup\r
+ Gimpo Gyeonggi-do 10048\r
+ KR\r
\r
70-B3-D5 (hex) ATEME\r
607000-607FFF (base 16) ATEME\r
St Albans Hertfordshire AL36PF\r
GB\r
\r
-70-B3-D5 (hex) Aplex Technology Inc.\r
-106000-106FFF (base 16) Aplex Technology Inc.\r
- 2nd Floor,Tower3,District5,HongHuaLing industrial park, Nanshan District\r
- Shenzhen Guangdong 518055\r
- CN\r
-\r
70-B3-D5 (hex) EREE Electronique\r
D11000-D11FFF (base 16) EREE Electronique\r
6 avenu Dr Schweitzer\r
Paterna Valencia 46980\r
ES\r
\r
-70-B3-D5 (hex) Aplex Technology Inc.\r
-B33000-B33FFF (base 16) Aplex Technology Inc.\r
- 2Q , NanYouTianAn industrial park Tower4 ,Nanshan District\r
- Shenzhen Guangdong 518054\r
- CN\r
-\r
70-B3-D5 (hex) Aplex Technology Inc.\r
3D9000-3D9FFF (base 16) Aplex Technology Inc.\r
2Q , NanYouTianAn industrial park Tower4 ,Nanshan District\r
Dinkelsbuehl Bavaria 91550\r
DE\r
\r
-70-B3-D5 (hex) Akse srl\r
-128000-128FFF (base 16) Akse srl\r
- Via Aldo Moro, 39\r
- Reggio Emilia Italy 42124\r
- IT\r
-\r
-70-B3-D5 (hex) AXING AG\r
-CA6000-CA6FFF (base 16) AXING AG\r
- Gewerbehaus Moskau\r
- Ramsen 8262\r
- CH\r
+70-B3-D5 (hex) NAL Research Corporation\r
+1B0000-1B0FFF (base 16) NAL Research Corporation\r
+ 11100 Endeavor Ct, Suite 300\r
+ Manassas VA 20109\r
+ US\r
\r
70-B3-D5 (hex) LLC NTZ Mekhanotronika\r
6C0000-6C0FFF (base 16) LLC NTZ Mekhanotronika\r
Saint-Petersburg 198206\r
RU\r
\r
-70-B3-D5 (hex) NAL Research Corporation\r
-1B0000-1B0FFF (base 16) NAL Research Corporation\r
- 11100 Endeavor Ct, Suite 300\r
- Manassas VA 20109\r
- US\r
+70-B3-D5 (hex) AXING AG\r
+CA6000-CA6FFF (base 16) AXING AG\r
+ Gewerbehaus Moskau\r
+ Ramsen 8262\r
+ CH\r
\r
-70-B3-D5 (hex) Arwin Technology Limited\r
-8C9000-8C9FFF (base 16) Arwin Technology Limited\r
- Unit 215, 2/F, 19W, 19 Science Park West Avenue\r
- Hong Kong 0\r
- HK\r
+70-B3-D5 (hex) Akse srl\r
+128000-128FFF (base 16) Akse srl\r
+ Via Aldo Moro, 39\r
+ Reggio Emilia Italy 42124\r
+ IT\r
\r
70-B3-D5 (hex) PNETWORKS\r
EF0000-EF0FFF (base 16) PNETWORKS\r
Istanbul 34906\r
TR\r
\r
+70-B3-D5 (hex) Arwin Technology Limited\r
+8C9000-8C9FFF (base 16) Arwin Technology Limited\r
+ Unit 215, 2/F, 19W, 19 Science Park West Avenue\r
+ Hong Kong 0\r
+ HK\r
+\r
70-B3-D5 (hex) Herholdt Controls srl\r
C6B000-C6BFFF (base 16) Herholdt Controls srl\r
Via Mestre 13\r
LAVAL Quebec H7L 5C2\r
CA\r
\r
-70-B3-D5 (hex) DIC Corporation\r
-5C3000-5C3FFF (base 16) DIC Corporation\r
- DIC Building,7-20,Nihonbashi 3-chome\r
- Chuo-ku,Tokyo 103-8233\r
- JP\r
-\r
70-B3-D5 (hex) Medicomp, Inc\r
F7C000-F7CFFF (base 16) Medicomp, Inc\r
600 Atlantis Rd\r
Melbourne FL 32904\r
US\r
\r
+70-B3-D5 (hex) DIC Corporation\r
+5C3000-5C3FFF (base 16) DIC Corporation\r
+ DIC Building,7-20,Nihonbashi 3-chome\r
+ Chuo-ku,Tokyo 103-8233\r
+ JP\r
+\r
70-B3-D5 (hex) YUYAMA MFG Co.,Ltd\r
CAD000-CADFFF (base 16) YUYAMA MFG Co.,Ltd\r
3-3-1\r
TOYONAKASHI OSAKA 561-0841\r
JP\r
\r
-70-B3-D5 (hex) Shenzhen Rongda Computer Co.,Ltd\r
-289000-289FFF (base 16) Shenzhen Rongda Computer Co.,Ltd\r
- 905, Block B, DuoCaiKeChuan Park, No.5 Guanle Road\r
- Longhua District Shenzhen, Guangdong 518110\r
- CN\r
-\r
70-B3-D5 (hex) Sono-Tek Corporation\r
5C2000-5C2FFF (base 16) Sono-Tek Corporation\r
2012 Rte. 9W Bldg 3\r
Milton NY 12547\r
US\r
\r
-70-B3-D5 (hex) Breas Medical AB\r
-CF9000-CF9FFF (base 16) Breas Medical AB\r
- Företagsvägen 1\r
- Mölnlycke SE-435 33\r
- SE\r
-\r
70-B3-D5 (hex) Davitor AB\r
E60000-E60FFF (base 16) Davitor AB\r
Skordarevagen 5\r
Kalmar 39353\r
SE\r
\r
-70-B3-D5 (hex) Coloet S.r.l.\r
-713000-713FFF (base 16) Coloet S.r.l.\r
- Via Mascheroni, 20\r
- MILANO Italy 20145\r
- IT\r
+70-B3-D5 (hex) Shenzhen Rongda Computer Co.,Ltd\r
+289000-289FFF (base 16) Shenzhen Rongda Computer Co.,Ltd\r
+ 905, Block B, DuoCaiKeChuan Park, No.5 Guanle Road\r
+ Longhua District Shenzhen, Guangdong 518110\r
+ CN\r
\r
-70-B3-D5 (hex) meoENERGY\r
-7FA000-7FAFFF (base 16) meoENERGY\r
- Glacisstraße 9/1\r
- Graz 8010\r
- AT\r
+70-B3-D5 (hex) Breas Medical AB\r
+CF9000-CF9FFF (base 16) Breas Medical AB\r
+ Företagsvägen 1\r
+ Mölnlycke SE-435 33\r
+ SE\r
\r
70-B3-D5 (hex) European Synchrotron Radiation Facility\r
160000-160FFF (base 16) European Synchrotron Radiation Facility\r
Lafayette IN 47905\r
US\r
\r
+70-B3-D5 (hex) Coloet S.r.l.\r
+713000-713FFF (base 16) Coloet S.r.l.\r
+ Via Mascheroni, 20\r
+ MILANO Italy 20145\r
+ IT\r
+\r
+70-B3-D5 (hex) meoENERGY\r
+7FA000-7FAFFF (base 16) meoENERGY\r
+ Glacisstraße 9/1\r
+ Graz 8010\r
+ AT\r
+\r
70-B3-D5 (hex) VERTEL DIGITAL PRIVATE LIMITED\r
912000-912FFF (base 16) VERTEL DIGITAL PRIVATE LIMITED\r
C-98, SECTOR-10 \r
Quebec Quebec G1V 4P1\r
CA\r
\r
+70-B3-D5 (hex) IP Devices\r
+5CE000-5CEFFF (base 16) IP Devices\r
+ Etrog 72 8\r
+ Givat Zeev 9091700\r
+ IL\r
+\r
+70-B3-D5 (hex) JESE Ltd\r
+0E2000-0E2FFF (base 16) JESE Ltd\r
+ Unit 2 Gales\r
+ Newton Abbot Devon TQ13 8FD\r
+ GB\r
+\r
70-B3-D5 (hex) IDZ Ltd\r
7F6000-7F6FFF (base 16) IDZ Ltd\r
160 CITY ROAD\r
- LONDON Select One... EC1V 2NX\r
+ LONDON EC1V 2NX\r
GB\r
\r
+70-B3-D5 (hex) Private Enterprise Scientific and Production Private EnterpriseSparing-Vist Center\r
+076000-076FFF (base 16) Private Enterprise Scientific and Production Private EnterpriseSparing-Vist Center\r
+ 33 V.Velykoho Str.\r
+ Lviv 79026\r
+ UA\r
+\r
+70-B3-D5 (hex) LinkAV Technology Co., Ltd\r
+1F6000-1F6FFF (base 16) LinkAV Technology Co., Ltd\r
+ Room 401, 4F, Skyworth Digital Building, Songbai Rd, Baoan District \r
+ Shenzhen Guangdong 518108\r
+ CN\r
+\r
+70-B3-D5 (hex) Aplex Technology Inc.\r
+B33000-B33FFF (base 16) Aplex Technology Inc.\r
+ 501-5B01,Xintianxia phase 2 building,Wankecheng community,Bantian township,Longgang district\r
+ Shenzhen City Guangdong 518129\r
+ CN\r
+\r
+70-B3-D5 (hex) Aplex Technology Inc.\r
+106000-106FFF (base 16) Aplex Technology Inc.\r
+ 501-5B01,Xintianxia phase 2 building,Wankecheng community,Bantian township,Longgang district\r
+ Shenzhen City Guangdong 518129\r
+ CN\r
+\r
+70-B3-D5 (hex) Aplex Technology Inc.\r
+666000-666FFF (base 16) Aplex Technology Inc.\r
+ 501-5B01,Xintianxia phase 2 building,Wankecheng community,Bantian township,Longgang district\r
+ Shenzhen City Guangdong 518129\r
+ CN\r
+\r
+70-B3-D5 (hex) FARHO DOMOTICA SL\r
+ACE000-ACEFFF (base 16) FARHO DOMOTICA SL\r
+ POLIGONO DE TABAZA II, NAVES 9-13\r
+ TABAZA ASTURIAS 33439\r
+ ES\r
+\r
+70-B3-D5 (hex) The Engineerix Group\r
+C71000-C71FFF (base 16) The Engineerix Group\r
+ 1418 Beech Ave 119A\r
+ McAllen TX 78501\r
+ US\r
+\r
+70-B3-D5 (hex) Flextronics International Kft\r
+1BC000-1BCFFF (base 16) Flextronics International Kft\r
+ 38. Zrinyi Str.\r
+ Zalaegerszeg Zala 8900\r
+ HU\r
+\r
+70-B3-D5 (hex) Research Laboratory of Design Automation, Ltd.\r
+223000-223FFF (base 16) Research Laboratory of Design Automation, Ltd.\r
+ 8 Birzhevoy Spusk\r
+ Taganrog 347900\r
+ RU\r
+\r
+70-B3-D5 (hex) Private\r
+315000-315FFF (base 16) Private\r
+\r
+70-B3-D5 (hex) JOLANYEE Technology Co., Ltd.\r
+9D8000-9D8FFF (base 16) JOLANYEE Technology Co., Ltd.\r
+ 2F., No. 13, Sec. 1, Yonghe Rd.\r
+ Yonghe Dist., New Taipei City 234014\r
+ TW\r
+\r
+70-B3-D5 (hex) SEASONS 4 INC\r
+D5D000-D5DFFF (base 16) SEASONS 4 INC\r
+ 3601 LA GRANGE PKWY, SUITE 500\r
+ TOANO VA 23168\r
+ US\r
+\r
+70-B3-D5 (hex) VulcanForms\r
+E0E000-E0EFFF (base 16) VulcanForms\r
+ 20 North Ave.\r
+ Burlington MA 01803\r
+ US\r
+\r
70-B3-D5 (hex) DISMUNTEL SAL\r
92C000-92CFFF (base 16) DISMUNTEL SAL\r
Pol ind cotes\r
Almelo Overijssel 7602 EA\r
NL\r
\r
-70-B3-D5 (hex) Refecor Oy\r
-DF7000-DF7FFF (base 16) Refecor Oy\r
- Isokatu 8A1\r
- OULU FInland 90100\r
- FI\r
-\r
70-B3-D5 (hex) ARD\r
C89000-C89FFF (base 16) ARD\r
MICROPOLIS\r
Hangzhou Zhejiang 310000\r
CN\r
\r
-70-B3-D5 (hex) Coda Octopus Products Limited\r
-4D9000-4D9FFF (base 16) Coda Octopus Products Limited\r
- 38 S. Gyle Crescent, South Gyle Business Park\r
- Edinburgh Scotland EH12 9EB\r
- GB\r
-\r
70-B3-D5 (hex) Xirgo Technologies LLC\r
CA0000-CA0FFF (base 16) Xirgo Technologies LLC\r
188 Camino Ruiz\r
Arlington VA 22201\r
US\r
\r
+70-B3-D5 (hex) Coda Octopus Products Limited\r
+4D9000-4D9FFF (base 16) Coda Octopus Products Limited\r
+ 38 S. Gyle Crescent, South Gyle Business Park\r
+ Edinburgh Scotland EH12 9EB\r
+ GB\r
+\r
70-B3-D5 (hex) Walter Müller AG\r
0E4000-0E4FFF (base 16) Walter Müller AG\r
Russikerstrasse 37\r
Fehraltorf Zürich 8320\r
CH\r
\r
-70-B3-D5 (hex) COONTROL Tecnologia em Combustão LTDA EPP\r
-8E9000-8E9FFF (base 16) COONTROL Tecnologia em Combustão LTDA EPP\r
- RUA ABRAHAN LINCOLS, 464, Jardim América\r
- RIO DO SUL SANTA CATARINA 89160202\r
- BR\r
-\r
-70-B3-D5 (hex) Private\r
-278000-278FFF (base 16) Private\r
- 600 Atlantis Rd\r
- Melbourne FL 32904\r
- US\r
-\r
70-B3-D5 (hex) Sensoronic Co.,Ltd\r
D52000-D52FFF (base 16) Sensoronic Co.,Ltd\r
1311ho, sambo techno tower, Jomaru-ro 385beongil,\r
Bucheon-si Gyeonggi-do 14556\r
KR\r
\r
+70-B3-D5 (hex) COONTROL Tecnologia em Combustão LTDA EPP\r
+8E9000-8E9FFF (base 16) COONTROL Tecnologia em Combustão LTDA EPP\r
+ RUA ABRAHAN LINCOLS, 464, Jardim América\r
+ RIO DO SUL SANTA CATARINA 89160202\r
+ BR\r
+\r
70-B3-D5 (hex) Neusoft Reach Automotive Technology (Shenyang) Co.,Ltd\r
E42000-E42FFF (base 16) Neusoft Reach Automotive Technology (Shenyang) Co.,Ltd\r
No.2 Xinxiu Street, Hunnan District, Shenyang\r
Shenyang Liaoning 110000\r
CN\r
\r
+70-B3-D5 (hex) Private\r
+278000-278FFF (base 16) Private\r
+ 600 Atlantis Rd\r
+ Melbourne FL 32904\r
+ US\r
+\r
70-B3-D5 (hex) YUYAMA MFG Co.,Ltd\r
196000-196FFF (base 16) YUYAMA MFG Co.,Ltd\r
1-4-30\r
Augsburg 86156\r
DE\r
\r
-70-B3-D5 (hex) MB connect line GmbH Fernwartungssysteme\r
-71A000-71AFFF (base 16) MB connect line GmbH Fernwartungssysteme\r
- Winnettener Straße 6\r
- Dinkelsbuehl Bavaria 91550\r
- DE\r
-\r
70-B3-D5 (hex) Loma Systems s.r.o.\r
BC8000-BC8FFF (base 16) Loma Systems s.r.o.\r
Southwood\r
ALPIGNANO string:TO 10091\r
IT\r
\r
-70-B3-D5 (hex) CTROGERS LLC\r
-474000-474FFF (base 16) CTROGERS LLC\r
- 815 1st Ave #174\r
- Seattle WA 98104\r
- US\r
+70-B3-D5 (hex) MB connect line GmbH Fernwartungssysteme\r
+71A000-71AFFF (base 16) MB connect line GmbH Fernwartungssysteme\r
+ Winnettener Straße 6\r
+ Dinkelsbuehl Bavaria 91550\r
+ DE\r
\r
70-B3-D5 (hex) EIZO RUGGED SOLUTIONS\r
5B9000-5B9FFF (base 16) EIZO RUGGED SOLUTIONS\r
KUNGSBACKA Select State SE-43437\r
SE\r
\r
-70-B3-D5 (hex) PARAGON ID\r
-036000-036FFF (base 16) PARAGON ID\r
- Les Aubépins\r
- ARGENT SUR SAULDRE CHER 18410\r
+70-B3-D5 (hex) CTROGERS LLC\r
+474000-474FFF (base 16) CTROGERS LLC\r
+ 815 1st Ave #174\r
+ Seattle WA 98104\r
+ US\r
+\r
+70-B3-D5 (hex) Deep Secure Limited\r
+DD0000-DD0FFF (base 16) Deep Secure Limited\r
+ 1 Nimrod House, Sandys Road\r
+ Malvern Worcestershire WR14 1JJ\r
+ GB\r
+\r
+70-B3-D5 (hex) Mi-Fi Networks Pvt Ltd\r
+411000-411FFF (base 16) Mi-Fi Networks Pvt Ltd\r
+ No 13 A, Kalakshetra Road , Thiruvanmiyur \r
+ Chennai Tamil Nadu 600041\r
+ IN\r
+\r
+70-B3-D5 (hex) CesiumAstro Inc.\r
+E5F000-E5FFFF (base 16) CesiumAstro Inc.\r
+ 13412 Galleria Circle, Suite H-100\r
+ Austin TX 78738\r
+ US\r
+\r
+70-B3-D5 (hex) Druck Ltd.\r
+EAA000-EAAFFF (base 16) Druck Ltd.\r
+ Firtree Lane, Groby, Leicester\r
+ Le6 0FH England \r
+ GB\r
+\r
+70-B3-D5 (hex) Panoramic Power\r
+4ED000-4EDFFF (base 16) Panoramic Power\r
+ Atir Yeda 15\r
+ Kfar Saba 4464312\r
+ IL\r
+\r
+70-B3-D5 (hex) STENTORIUS by ADI\r
+5B3000-5B3FFF (base 16) STENTORIUS by ADI\r
+ 41 - 47 Rue des frères Lumière\r
+ Neuilly sur Marne Ile-de-France 93330\r
+ FR\r
+\r
+70-B3-D5 (hex) Codewerk GmbH\r
+4D0000-4D0FFF (base 16) Codewerk GmbH\r
+ Siemensallee 75\r
+ Karlsruhe 76187 \r
+ DE\r
+\r
+70-B3-D5 (hex) Orlaco Products B.V.\r
+333000-333FFF (base 16) Orlaco Products B.V.\r
+ Albert Plesmanstraat 42\r
+ Barneveld 3772MN\r
+ NL\r
+\r
+70-B3-D5 (hex) ScopeSensor Oy\r
+DF7000-DF7FFF (base 16) ScopeSensor Oy\r
+ Teollisuustie 1\r
+ Haukipudas 90830\r
+ FI\r
+\r
+70-B3-D5 (hex) KBPR LLC\r
+11E000-11EFFF (base 16) KBPR LLC\r
+ Raketny bulvar street 16\r
+ Moscow Select State 129164\r
+ RU\r
+\r
+70-B3-D5 (hex) Anello Photonics\r
+96A000-96AFFF (base 16) Anello Photonics\r
+ 3964 Rivermark Plaza, Suite 144\r
+ Santa Clara CA 95054\r
+ US\r
+\r
+70-B3-D5 (hex) HORIZON.INC\r
+F40000-F40FFF (base 16) HORIZON.INC\r
+ 1600 Aza-Shironoshita Asahi\r
+ Shin Asahi-cho Takashima, Shiga 520-1501\r
+ JP\r
+\r
+70-B3-D5 (hex) SUS Corporation\r
+1ED000-1EDFFF (base 16) SUS Corporation\r
+ 6F, S-patio Bldg. 14-25 Minami-cho, Suruga-ku,\r
+ Shizuoka city, Shizuoka 422-8067\r
+ JP\r
+\r
+70-B3-D5 (hex) Lumiplan Duhamel\r
+A0C000-A0CFFF (base 16) Lumiplan Duhamel\r
+ 2 rue de l'industrie\r
+ Domène Isère 38420\r
FR\r
# they are very long but quite repetitive and the parser is not very fast.
# So we don't "test" them.
hwdb_files_notest = files('''
+ README
20-dmi-id.hwdb
20-pci-vendor-model.hwdb
20-pci-classes.hwdb
#
# List of PCI ID's
#
-# Version: 2021.02.12
-# Date: 2021-02-12 03:15:01
+# Version: 2021.03.22
+# Date: 2021-03-22 03:15:01
#
# Maintained by Albert Pool, Martin Mares, and other volunteers from
# the PCI ID Project at https://pci-ids.ucw.cz/.
1000 3040 9210-8i
1000 3080 9200-8e [LSI SAS 6Gb/s SAS/SATA PCIe x8 External HBA]
1000 30b0 9200-8e [LSI SAS 6Gb/s SAS/SATA PCIe x8 External HBA]
+ 1014 03ca IBM 6Gb SAS HBA [9212-4i4e]
1028 1f1c 6Gbps SAS HBA Adapter
1028 1f1d PERC H200 Adapter
1028 1f1e PERC H200 Integrated
1d49 060e ThinkSystem RAID 940-32i 8GB Flash PCIe Gen4 12Gb Adapter
1d49 060f ThinkSystem RAID 940-8e 4GB Flash PCIe Gen4 12Gb Adapter
10e2 MegaRAID 12GSAS/PCIe Secure SAS39xx
+# 9560 16 internal port RAID controller
+ 1000 4000 MegaRAID 9560-16i
+# 9560 8 internal port RAID controller
+ 1000 4010 MegaRAID 9560-8i
+# 9580 8 internal & 8 external port RAID controller
+ 1000 4020 MegaRAID 9580-8i8e
+# MegaRAID 9562-16i 9562 16 internal port RAID controller
+ 1000 40b0 MegaRAID 9562-16i
1028 1ae0 PERC H755 Adapter
1028 1ae1 PERC H755 Front
1028 1ae2 PERC H755N Front
1561 Anubis
15d8 Picasso
103c 8615 Pavilion Laptop 15-cw1xxx
+ 17aa 3181 ThinkCentre M75n IoT
17aa 5124 ThinkPad E595
ea50 cc10 RXi2-BP
15dd Raven Ridge [Radeon Vega Series / Radeon Vega Mobile Series]
5e6d RV410 [Radeon X700] (Secondary)
148c 2117 Bravo X700 (Secondary)
5f57 R423 [Radeon X800 XT]
- 6600 Mars [Radeon HD 8670A/8670M/8750M]
+ 6600 Mars [Radeon HD 8670A/8670M/8750M / R7 M370]
103c 1952 ProBook 455 G1
6601 Mars [Radeon HD 8730M]
103c 2100 FirePro M4100
6608 Oland GL [FirePro W2100]
13cc 3d28 MXRT-2600
6609 Oland GL [FirePro W2100 / Barco MXRT 2600]
- 6610 Oland XT [Radeon HD 8670 / R7 250/350]
+ 6610 Oland XT [Radeon HD 8670 / R5 340X OEM / R7 250/350/350X OEM]
1019 0030 Radeon HD 8670
+ 1028 0081 Radeon R7 350X OEM
+ 1028 0083 Radeon R5 340X OEM
1028 2120 Radeon R7 250
1028 2322 Radeon R7 250
1462 2910 Radeon HD 8670
1642 3c91 Radeon HD 8670
1642 3f09 Radeon R7 350
6611 Oland [Radeon HD 8570 / R5 430 OEM / R7 240/340 / Radeon 520 OEM]
+ 1028 1001 Radeon R5 430 OEM (1024 MByte)
+ 1028 1002 Radeon R5 430 OEM (2048 MByte)
+# The 'AMD Radeon R5 430' instead of 240/340 is NOT a typo! It's actually correct.
+ 1028 1711 R5 430 OEM (2048 MByte)
1028 210b Radeon R5 240 OEM
+# OEM-card for Dell; verified through AMD's own drivers (*.inf) and a TPU BIOS in database
+ 1028 2121 Radeon HD 8570 OEM
+# OEM-card from Fujitsu; verified through AMD's own drivers (*.inf)
+ 10cf 1889 Radeon HD 8570 OEM
1642 1869 Radeon 520 OEM
174b 4248 Radeon R7 240 OEM
174b a240 Radeon R7 240 OEM
8086 2111 Radeon HD 6625M
6743 Whistler [Radeon E6760]
6749 Turks GL [FirePro V4900]
- 15c3 2b06 MED-X4900
+ 15c3 2b06 MED-X4900 (EIZO)
674a Turks GL [FirePro V3900]
13cc 3d22 MXRT-2500
15c3 0106 MED-X3900
174b 7670 Radeon HD 7670
174b e181 Radeon HD 6670
1787 2309 Radeon HD 6670
- 6759 Turks PRO [Radeon HD 6570/7570/8550]
+ 6759 Turks PRO [Radeon HD 6570/7570/8550 / R5 230]
103c 3130 Radeon HD 6570
1043 0403 Radeon HD 6570
1462 2500 Radeon HD 6570
1642 3a67 Radeon HD 6570
1682 3280 Radeon HD 7570
1682 3530 Radeon HD 8550
+ 1682 5230 Radeon R5 230 series
+ 1682 6450 Radeon HD 6450 series
174b 7570 Radeon HD 7570
+ 174b 8550 Radeon HD8550 OEM
+ 174b 8570 Radeon HD8550 OEM
174b e142 Radeon HD 6570
174b e181 Radeon HD 6570
+ 1787 a230 Radeon R5 230 series
+ 1787 a450 Radeon HD 6450 series
1b0a 908f Radeon HD 6570
1b0a 9090 Radeon HD 6570
1b0a 9091 Radeon HD 6570
174b e329 Radeon R9 FURY
7310 Navi 10 [Radeon Pro W5700X]
7312 Navi 10 [Radeon Pro W5700]
+ 7314 Navi 10 USB
731f Navi 10 [Radeon RX 5600 OEM/5600 XT / 5700/5700 XT]
1458 2313 Radeon RX 5700 XT Gaming OC
1682 5701 RX 5700 XT RAW II
7341 Navi 14 [Radeon Pro W5500]
7347 Navi 14 [Radeon Pro W5500M]
734f Navi 14 [Radeon Pro W5300M]
- 7360 Navi 12 [Radeon Pro 5600M]
+ 7360 Navi 12 [Radeon Pro 5600M / V520]
+ 7362 Navi 12 [Radeon Pro V520]
7388 Arcturus GL-XL
738c Arcturus GL-XL [AMD Instinct MI100]
738e Arcturus GL-XL
+ 73a4 Navi 21 USB
+ 73af Navi 21 [Radeon RX 6900 XT]
73bf Navi 21 [Radeon RX 6800/6800 XT / 6900 XT]
1eae 6701 XFX Speedster MERC 319 AMD Radeon RX 6800 XT Black
73c3 Navi 22
- 73df Navi 22
+ 73c4 Navi 22 USB
+ 73df Navi 22 [Radeon RX 6700/6700 XT / 6800M]
73e0 Navi 23
- 73ff Navi 23
+ 73e1 Navi 23
+ 73e4 Navi 23 USB
+ 73ff Navi 23 [Radeon RX 6600/6600 XT]
7833 RS350 Host Bridge
7834 RS350 [Radeon 9100 PRO/XT IGP]
7835 RS350M [Mobility Radeon 9000 IGP]
2646 0001 KNE100TX Fast Ethernet
000a 21230 Video Codec
000d PBXGB [TGA2]
- 000f DEFPA FDDI PCI-to-PDQ Interface Chip [PFI]
- 1011 def1 FDDI controller (DEFPA)
- 103c def1 FDDI controller (3X-DEFPA)
+ 000f PCI-to-PDQ Interface Chip [PFI] FDDI (DEFPA)
+ 1011 def1 FDDIcontroller/PCI (DEFPA)
+ 103c def1 FDDIcontroller/PCI (3X-DEFPA)
0014 DECchip 21041 [Tulip Pass 3]
1186 0100 DE-530+
- 0016 DGLPB [OPPO]
+ 0016 ATMworks 350 Adapter [OPPO] (DGLPB)
0017 PV-PCI Graphics Controller (ZLXp-L)
0018 Memory Channel interface
0019 DECchip 21142/43
4c53 1030 PC5 mainboard
4c53 1040 CL7 mainboard
4c53 1060 PC7 mainboard
- 2001 79c978 [HomePNA]
+# Via AMD's own technical reference on their Am79C978 NICs; https://www.amd.com/system/files/TechDocs/22206.pdf
+ 2001 Am79C978 PCnet Home (HomePNA) 1/10 PCI Ethernet Adapter [Am79C971 PHY]
1092 0a78 Multimedia Home Network Adapter
1668 0299 ActionLink Home Network Adapter
2003 Am 1771 MBW [Alchemy]
2096 CS5536 [Geode companion] UDC
2097 CS5536 [Geode companion] UOC
209a CS5536 [Geode companion] IDE
+ 2625 Am79C973 [Lance/PCI PCNet/32]
+ 2627 Am79C975 [Lance/PCI PCNet/32]
3000 ELanSC520 Microcontroller
43a0 Hudson PCI to PCI bridge (PCIE port 0)
43a1 Hudson PCI to PCI bridge (PCIE port 1)
0003 Control Video
0004 PlanB Video-In
0007 O'Hare I/O
+ 000b Apple Camera
000c DOS on Mac
000e Hydra Mac I/O
0010 Heathrow Mac I/O
0331 NV35 [GeForce FX 5900]
1043 8145 V9950GE
0332 NV35 [GeForce FX 5900XT]
- 0333 NV38 [GeForce FX 5950 Ultra]
+ 0333 NV38 [GeForce FX 5950 Ultra / PCX 5950]
0334 NV35 [GeForce FX 5900ZT]
1462 9373 FX5900ZT-VTD128 (MS-8937)
0338 NV35GL [Quadro FX 3000]
1f08 TU106 [GeForce RTX 2060 Rev. A]
1f09 TU106 [GeForce GTX 1660 SUPER]
1f0a TU106 [GeForce GTX 1650]
+ 1f0b TU106 [CMP 40HX]
1f10 TU106M [GeForce RTX 2070 Mobile]
1f11 TU106M [GeForce RTX 2060 Mobile]
1f12 TU106M [GeForce RTX 2060 Max-Q]
2184 TU116 [GeForce GTX 1660]
2187 TU116 [GeForce GTX 1650 SUPER]
2188 TU116 [GeForce GTX 1650]
+ 2189 TU116 [CMP 30HX]
2191 TU116M [GeForce GTX 1660 Ti Mobile]
2192 TU116M [GeForce GTX 1650 Ti Mobile]
21ae TU116GL
21c2 TU116
21c4 TU116 [GeForce GTX 1660 SUPER]
21d1 TU116BM [GeForce GTX 1660 Ti Mobile]
+ 2200 GA102
2204 GA102 [GeForce RTX 3090]
- 2205 GA102 [GeForce RTX 3080 Ti]
+ 2205 GA102 [GeForce RTX 3080 20GB]
2206 GA102 [GeForce RTX 3080]
10de 1467 GA102 [GeForce RTX 3080]
10de 146d GA102 [GeForce RTX 3080 20GB]
1462 3892 RTX 3080 10GB GAMING X TRIO
+ 2208 GA102 [GeForce RTX 3080 Ti]
222b GA102 [GeForce RTX 3090 Engineering Sample]
222f GA102 [GeForce RTX 3080 11GB / 12GB Engineering Sample]
2230 GA102GL [RTX A6000]
+ 2231 GA102GL
2235 GA102GL [RTX A40]
2236 GA102GL
+ 2237 GA102GL
223f GA102GL
228b GA104 High Definition Audio Controller
+ 2302 GA103
2321 GA103
2482 GA104 [GeForce RTX 3070 Ti]
2484 GA104 [GeForce RTX 3070]
252f GA106 [GeForce RTX 3060 Engineering Sample]
2560 GA106M [GeForce RTX 3060 Mobile / Max-Q]
2583 GA107 [GeForce RTX 3050]
- 25a2 GA107
+ 25a0 GA107M [GeForce RTX 3050 Ti Mobile]
+ 25a2 GA107M [GeForce RTX 3050 Mobile]
25a4 GA107
25af GA107 [GeForce RTX 3050 Engineering Sample]
10df Emulex Corporation
1028 0283 Vostro 220
1028 04b2 Vostro 3350
1028 04da Vostro 3750
+ 1028 05d7 Alienware X51 R2
1028 06f2 Latitude 3470
1028 06f3 Latitude 3570
1028 0869 Vostro 3470
0336 K8M890CE Host Bridge
0340 PT900 Host Bridge
0351 K8T890CF Host Bridge
- 0353 VX800 Host Bridge
+ 0353 VX800/820-Series Chipset Host-Bridge Controller
0364 CN896/VN896/P4M900 Host Bridge
1043 81ce P5VD2-VM mothervoard
0391 VT8371 [KX133]
0409 VX855/VX875 Host Bridge: Host Control
- 0410 VX900 Host Bridge: Host Control
+ 0410 VX900 Series Host Bridge: Host Control
0415 VT6415 PATA IDE Host Controller
1043 838f Motherboard
0501 VT8501 [Apollo MVP4]
# probably all K7VT2/4*/6
1849 0571 K7VT series Motherboards
0576 VT82C576 3V [Apollo Master]
- 0581 CX700/VX700 RAID Controller
+ 0581 CX700/VX700/VX800/820-Series Serial ATA RAID-Controller
# Upgrade bios to get correct ID: 5324 instead of 0581
1106 0581 Wrong IDE ID
0585 VT82C585VP [Apollo VP1/VPX]
1296 P4M800 Host Bridge
1308 PT894 Host Bridge
1314 CN700/VN800/P4M800CE/Pro Host Bridge
- 1324 CX700/VX700 Host Bridge
+ 1324 CX700/VX700-Series Error Reporting
1327 P4M890 Host Bridge
1336 K8M890CE Host Bridge
1340 PT900 Host Bridge
1353 VX800/VX820 Error Reporting
1364 CN896/VN896/P4M900 Host Bridge
1409 VX855/VX875 Error Reporting
- 1410 VX900 Error Reporting
+ 1410 VX900 Series Error Reporting
1571 VT82C576M/VT82C586
1595 VT82C595/97 [Apollo VP2/97]
1732 VT1732 [Envy24 II] PCI Multi-Channel Audio Controller
2296 P4M800 Host Bridge
2308 PT894 Host Bridge
2314 CN700/VN800/P4M800CE/Pro Host Bridge
- 2324 CX700/VX700 Host Bridge
+ 2324 CX700/VX700-Series Host Interface Control
2327 P4M890 Host Bridge
2336 K8M890CE Host Bridge
2340 PT900 Host Bridge
2353 VX800/VX820 Host Bus Control
2364 CN896/VN896/P4M900 Host Bridge
2409 VX855/VX875 Host Bus Control
- 2410 VX900 CPU Bus Controller
+ 2410 VX900 Series CPU Bus Controller
287a VT8251 PCI to PCI Bridge
287b VT8251 Host Bridge
287c VT8251 PCIE Root Port
287d VT8251 PCIE Root Port
287e VT8237/8251 Ultra VLINK Controller
3022 CLE266
- 3038 VT82xx/62xx UHCI USB 1.1 Controller
+ 3038 VT82xx/62xx/VX700/8x0/900 UHCI USB 1.1 Controller
0925 1234 onboard UHCI USB 1.1 Controller
1019 0985 P6VXA Motherboard
1019 0a81 L7VTA v1.0 Motherboard (KT400-8235)
1043 8080 A7V333 motherboard
- 1043 808c VT6202 USB2.0 4 port controller
+ 1043 808c VT62xx USB1.1 4 port controller
1043 80a1 A7V8X-X motherboard
1043 80ed A7V600/K8V-X/A8V Deluxe motherboard
1179 0001 Magnia Z310
+ 1234 0925 MVP3 USB Controller
1458 5004 GA-7VAX Mainboard
1462 5901 KT6 Delta-FIS2R (MS-6590)
1462 7020 K8T NEO 2 motherboard
3101 VT8653 Host Bridge
3102 VT8662 Host Bridge
3103 VT8615 Host Bridge
- 3104 USB 2.0
+ 3104 USB 2.0 EHCI-Compliant Host-Controller
0925 1234 onboard EHCI USB 2.0 Controller
1019 0a81 L7VTA v1.0 Motherboard (KT400-8235)
1043 808c A7V8X motherboard
3269 KT880 Host Bridge
3282 K8T800Pro Host Bridge
3287 VT8251 PCI to ISA Bridge
- 3288 VT8237A/VT8251 HDA Controller
+ 3288 VX900/VT8xxx High Definition Audio Controller
19da a179 ZBOX VD01
3290 K8M890 Host Bridge
3296 P4M800 Host Bridge
- 3324 CX700/VX700 Host Bridge
+ 3324 CX700/VX700-Series DRAM Bus Control
3327 P4M890 Host Bridge
3336 K8M890CE Host Bridge
3337 VT8237A PCI to ISA Bridge
3344 CN700/P4M800 Pro/P4M800 CE/VN800 Graphics [S3 UniChrome Pro]
3349 VT8251 AHCI/SATA 4-Port Controller
3351 VT3351 Host Bridge
- 3353 VX800 PCI to PCI Bridge
+ 3353 VX800/820 PCI to PCI Bridge
3364 CN896/VN896/P4M900 Host Bridge
+ 3365 VT630x IEEE 1394 Host Controller [Fire II/M]
3371 CN896/VN896/P4M900 [Chrome 9 HC]
3372 VT8237S PCI to ISA Bridge
337a VT8237A PCI to PCI Bridge
1043 8374 M5A88-V EVO
1043 8384 P8P67 Deluxe Motherboard
3409 VX855/VX875 DRAM Bus Control
- 3410 VX900 DRAM Bus Control
+ 3410 VX900 Series DRAM Bus Control
19da a179 ZBOX nano VD01
- 3432 VL80x xHCI USB 3.0 Controller
+ 3432 VL800/801 xHCI USB 3.0 Controller
3456 VX11 Standard Host Bridge
345b VX11 Miscellaneous Bus
- 3483 VL805 USB 3.0 Host Controller
+ 3483 VL805/806 xHCI USB 3.0 Controller
3a01 VX11 Graphics [Chrome 645/640]
4149 VIA VT6420 (ATA133) Controller
4204 K8M800 Host Bridge
4296 P4M800 Host Bridge
4308 PT894 Host Bridge
4314 CN700/VN800/P4M800CE/Pro Host Bridge
- 4324 CX700/VX700 Host Bridge
+ 4324 CX700/VX700-Series Power Management and Testing Control
4327 P4M890 Host Bridge
4336 K8M890CE Host Bridge
4340 PT900 Host Bridge
4353 VX800/VX820 Power Management Control
4364 CN896/VN896/P4M900 Host Bridge
4409 VX855/VX875 Power Management Control
- 4410 VX900 Power Management and Chip Testing Control
+ 4410 VX900 Series Power Management and Chip Testing Control
19da a179 ZBOX nano VD01
5030 VT82C596 ACPI [Apollo PRO]
5122 VX855/VX875 Chrome 9 HCM Integrated Graphics
5287 VT8251 Serial ATA Controller
5290 K8M890 I/O APIC Interrupt Controller
5308 PT894 I/O APIC Interrupt Controller
- 5324 VX800 Serial ATA and EIDE Controller
+ 5324 CX700M2/VX700/VX800/820-Series Serial ATA & EIDE-Controller
5327 P4M890 I/O APIC Interrupt Controller
5336 K8M890CE I/O APIC Interrupt Controller
5340 PT900 I/O APIC Interrupt Controller
5364 CN896/VN896/P4M900 I/O APIC Interrupt Controller
5372 VT8237/8251 Serial ATA Controller
5409 VX855/VX875 APIC and Central Traffic Control
- 5410 VX900 APIC and Central Traffic Control
+ 5410 VX900 Series APIC and Central Traffic Control
6100 VT85C100A [Rhine II]
6287 SATA RAID Controller
6290 K8M890CE Host Bridge
6353 VX800/VX820 Scratch Registers
6364 CN896/VN896/P4M900 Security Device
6409 VX855/VX875 Scratch Registers
- 6410 VX900 Scratch Registers
+ 6410 VX900 Series Scratch Registers
19da a179 ZBOX nano VD01
7122 VX900 Graphics [Chrome9 HD]
7204 K8M800 Host Bridge
7296 P4M800 Host Bridge
7308 PT894 Host Bridge
7314 CN700/VN800/P4M800CE/Pro Host Bridge
- 7324 CX700/VX700 Host Bridge
+ 7324 CX700/VX700-Series North-South Module Interface Control
7327 P4M890 Host Bridge
7336 K8M890CE Host Bridge
7340 PT900 Host Bridge
7353 VX800/VX820 North-South Module Interface Control
7364 CN896/VN896/P4M900 Host Bridge
7409 VX855/VX875 North-South Module Interface Control
- 7410 VX900 North-South Module Interface Control
+ 7410 VX900 Series North-South Module Interface Control
19da a179 ZBOX nano VD01
8231 VT8231 [PCI-to-ISA Bridge]
8235 VT8235 ACPI
8305 VT8363/8365 [KT133/KM133 AGP]
- 8324 CX700/VX700 PCI to ISA Bridge
+ 8324 CX700/VX700-Series Bus Control and Power Management
8353 VX800/VX820 Bus Control and Power Management
8391 VT8371 [KX133 AGP]
8400 MVP4
8409 VX855/VX875 Bus Control and Power Management
- 8410 VX900 Bus Control and Power Management
+ 8410 VX900 Series Bus Control and Power Management
19da a179 ZBOX VD01
8500 KLE133/PLE133/PLE133T
8501 VT8501 [Apollo MVP4 AGP]
8a26 KL133/KL133A/KM133/KM133A [S3 ProSavage]
8d01 PN133/PN133T [S3 Twister]
8d04 KM266/P4M266/P4M266A/P4N266 [S3 ProSavageDDR]
- 9001 VX900 Serial ATA Controller
+ 9001 VX900 Series Serial-ATA Controller
9082 Standard AHCI 1.0 SATA Controller
9140 HDMI Audio Device
9201 USB3.0 Controller
- 9530 Secure Digital Memory Card Controller
- 95d0 SDIO Host Controller
+ 9530 VX800/820/900 Series Secure Digital Memory Card Controller
+ 95d0 VX800/820/900 Series SDIO Host Controller
a208 PT890 PCI to PCI Bridge Controller
a238 K8T890 PCI to PCI Bridge Controller
a327 P4M890 PCI to PCI Bridge Controller
- a353 VX8xx South-North Module Interface Control
+ a353 VX8xx/900 Series South-North Module Interface Control
a364 CN896/VN896/P4M900 PCI to PCI Bridge Controller
- a409 VX855/VX875 USB Device Controller
- a410 VX900 PCI Express Root Port 0
+ a409 VX855/VX875/VX900 Series USB Device Controller
+ a410 VX900 Series PCI Express Root Port 0
b091 VT8633 [Apollo Pro266 AGP]
b099 VT8366/A/7 [Apollo KT266/A/333 AGP]
b101 VT8653 AGP Bridge
b168 VT8235 PCI Bridge
b188 VT8237/8251 PCI bridge [K8M890/K8T800/K8T890 South]
147b 1407 KV8-MAX3 motherboard
- b198 VT8237/VX700 PCI Bridge
+ b198 VT8237/CX700/VX700-Series PCI to PCI Bridge
b213 VPX/VPX2 I/O APIC Interrupt Controller
b353 VX855/VX875/VX900 PCI to PCI Bridge
- b410 VX900 PCI Express Root Port 1
+ b410 VX900 Series PCI Express Root Port 1
b999 [K8T890 North / VT8237 South] PCI Bridge
c208 PT890 PCI to PCI Bridge Controller
c238 K8T890 PCI to PCI Bridge Controller
c327 P4M890 PCI to PCI Bridge Controller
c340 PT900 PCI to PCI Bridge Controller
- c353 VX800/VX820 PCI Express Root Port
+ c353 VX800/820-Series PCI-Express Root (PCI-to-PCI Virtual Bridge)
c364 CN896/VN896/P4M900 PCI to PCI Bridge Controller
c409 VX855/VX875 EIDE Controller
- c410 VX900 PCI Express Root Port 2
+ c410 VX900 Series PCI Express Root Port 2
d104 VT8237R USB UDCI Controller
d208 PT890 PCI to PCI Bridge Controller
d213 VPX/VPX2 PCI to PCI Bridge Controller
d238 K8T890 PCI to PCI Bridge Controller
d340 PT900 PCI to PCI Bridge Controller
- d410 VX900 PCI Express Root Port 3
+ d410 VX900 Series PCI Express Root Port 3
e208 PT890 PCI to PCI Bridge Controller
e238 K8T890 PCI to PCI Bridge Controller
e340 PT900 PCI to PCI Bridge Controller
- e353 VX800/VX820 PCI Express Root Port
- e410 VX900 PCI Express Physical Layer Electrical Sub-block
+ e353 VX800/820-Series PCI-Express Root Port 0
+ e410 VX900 Series PCI Express Physical Layer Electrical Sub-block
f208 PT890 PCI to PCI Bridge Controller
f238 K8T890 PCI to PCI Bridge Controller
f340 PT900 PCI to PCI Bridge Controller
- f353 VX800/VX820 PCI Express Root Port
+ f353 VX800/820-Series PCI-Express Root Port 1
+ f410 VX900 Series PCI UART Port 0-3
1107 Stratus Computers
0576 VIA VT82C570MV [Apollo] (Wrong vendor ID!)
1108 Proteon, Inc.
0002 Dual PCI to RapidIO Bridge
000b POET Serial RapidIO Bridge
000d POET PSDMS Device
-1135 Fuji Xerox Co Ltd
+1135 FUJIFILM Business Innovation Corp.
0001 Printer controller
1136 Momentum Data Systems
0002 PCI-JTAG
11aa Actel
# Nee Galileo Technology, Inc.
11ab Marvell Technology Group Ltd.
+ 0100 88F3700 [Armada 3700 Family] ARM SoC
0146 GT-64010/64010A System Controller
0f53 88E6318 Link Street network controller
11ab MV88SE614x SATA II PCI-E controller
6480 MV64460/64461/64462 System Controller
1775 c200 C2K CompactPCI single board computer
6485 MV64460/64461/64462 System Controller, Revision B
+ 6820 88F6820 [Armada 385] ARM SoC
+ 6828 88F6828 [Armada 388] ARM SoC
7042 88SX7042 PCI-e 4-port SATA-II
16b8 434b Tempo SATA E4P
7810 MV78100 [Discovery Innovation] ARM SoC
11ad 0003 LNE100TX
11ad f003 LNE100TX
11ad ffff LNE100TX
- 1385 f004 FA310TX
+ 1385 f004 FA310/TX LAN 10/100 PCI Ethernet Adapter
2646 f002 KNE110TX EtheRx Fast Ethernet
c115 LNE100TX [Linksys EtherFast 10/100]
11ad c001 LNE100TX [ver 2.0]
8073 PM8073 Tachyon SPCve 12G 16-port SAS/SATA controller
8531 PM8531 PFX 24xG3 Fanout PCIe Switches
8546 PM8546 B-FEIP PSX 96xG3 PCIe Storage Switch
+ 8562 PM8562 Switchtec PFX-L 32xG3 Fanout-Lite PCIe Gen3 Switch
11f9 I-Cube Inc
11fa Kasan Electronics Company, Ltd.
11fb Datel Inc
1414 Microsoft Corporation
0001 MN-120 (ADMtek Centaur-C based)
0002 MN-130 (ADMtek Centaur-P based)
+# Virtual Video Card Device for Windows Remote Desktop (RDP)
+ 008c Basic Render Driver
5353 Hyper-V virtual VGA
5801 XMA Decoder (Xenon)
5802 SATA Controller - CdRom (Xenon)
1028 2097 EMC PowerEdge Express Flash Ent NVMe AGN SED RI U.2 Gen4 1.92TB
1028 2098 EMC PowerEdge Express Flash Ent NVMe AGN SED RI U.2 Gen4 3.84TB
1028 2099 EMC PowerEdge Express Flash Ent NVMe AGN SED RI U.2 Gen4 7.68TB
+ 1028 2118 Ent NVMe v2 AGN FIPS MU U.2 1.6TB
+ 1028 2119 Ent NVMe v2 AGN MU U.2 1.6TB
+ 1028 2120 Ent NVMe v2 AGN FIPS MU U.2 3.2T
+ 1028 2121 Ent NVMe v2 AGN MU U.2 3.2TB
+ 1028 2122 Ent NVMe v2 AGN FIPS MU U.2 6.4TB
+ 1028 2123 Ent NVMe v2 AGN MU U.2 6.4TB
+ 1028 2124 Ent NVMe v2 AGN FIPS MU U.2 6.4TB
+ 1028 2125 Ent NVMe v2 AGN MU U.2 12.8TB
+ 1028 2126 Ent NVMe v2 AGN FIPS RI U.2 1.92TB
+ 1028 2127 Ent NVMe v2 AGN RI U.2 1.92TB
+ 1028 2128 Ent NVMe v2 AGN FIPS RI U.2 3.84TB
+ 1028 2129 Ent NVMe v2 AGN RI U.2 3.84TB
+ 1028 2130 Ent NVMe v2 AGN FIPS RI U.2 7.68TB
+ 1028 2131 Ent NVMe v2 AGN RI U.2 7.68TB
+ 1028 2132 Ent NVMe v2 AGN FIPS RI U.2 15.36TB
+ 1028 2133 Ent NVMe v2 AGN RI U.2 15.36TB
ecec Exynos 8895 PCIe Root Complex
144e OLITEC
144f Askey Computer Corp.
1456 Advanced Hardware Architectures
1457 Nuera Communications Inc
1458 Gigabyte Technology Co., Ltd
+ 3483 USB 3.0 Controller (VIA VL80x-based xHCI Controller)
1459 DOOIN Electronics
145a Escalate Networks Inc
145b PRAIM SRL
e836 M115S Hybrid Analog/DVB PAL/SECAM/NTSC Tuner
f436 AVerTV Hybrid+FM
1462 Micro-Star International Co., Ltd. [MSI]
+# VIA Driver-inf
+ 3483 MSI USB 3.0 (VIA VL80x-based xHCI USB Controller)
aaf0 Radeon RX 580 Gaming X 8G
1463 Fast Corporation
1464 Interactive Circuits & Systems Ltd
103c 0890 NC6000 laptop
103c 099c NX6110/NC6120
10cf 1279 LifeBook E8010D
- 165f NetXtreme BCM5720 2-port Gigabit Ethernet PCIe
+ 165f NetXtreme BCM5720 Gigabit Ethernet PCIe
1028 04f7 PowerEdge R320 server
1028 08fd PowerEdge R6515/R7515 LOM
1028 08ff PowerEdge Rx5xx LOM Board
16d4 BCM57402 NetXtreme-E Ethernet Partition
16d5 BCM57407 NetXtreme-E 10GBase-T Ethernet Controller
16d6 BCM57412 NetXtreme-E 10Gb RDMA Ethernet Controller
+ 14e4 1202 BCM957412M4122C OCP 1x25G Type1 wRoCE
14e4 4120 NetXtreme E-Series Advanced Dual-port 10Gb SFP+ Ethernet Network Daughter Card
14e4 4126 NetXtreme-E Dual-port 10G SFP+ Ethernet OCP 3.0 Adapter (BCM957412N4120C)
152d 8b20 BCM57412 NetXtreme-E 10Gb RDMA Ethernet Controller
152d 8b22 BCM57412 NetXtreme-E 25Gb RDMA Ethernet Controller
16d7 BCM57414 NetXtreme-E 10Gb/25Gb RDMA Ethernet Controller
- 14e4 1202 BCM957412M4122C OCP 1x25G Type1 wRoCE
14e4 1402 BCM957414A4142CC 10Gb/25Gb Ethernet PCIe
14e4 1404 BCM957414M4142C OCP 2x25G Type1 wRoCE
14e4 4140 NetXtreme E-Series Advanced Dual-port 25Gb SFP28 Network Daughter Card
1750 BCM57508 NetXtreme-E 10Gb/25Gb/40Gb/50Gb/100Gb/200Gb Ethernet
14e4 2100 NetXtreme-E Dual-port 100G QSFP56 Ethernet PCIe4.0 x16 Adapter (BCM957508-P2100G)
14e4 5208 NetXtreme-E Dual-port 100G QSFP56 Ethernet OCP 3.0 Adapter (BCM957508-N2100G)
+ 14e4 df24 BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz Ethernet
1751 BCM57504 NetXtreme-E 10Gb/25Gb/40Gb/50Gb/100Gb/200Gb Ethernet
1752 BCM57502 NetXtreme-E 10Gb/25Gb/40Gb/50Gb Ethernet
1800 BCM57502 NetXtreme-E Ethernet Partition
1801 BCM57504 NetXtreme-E Ethernet Partition
1802 BCM57508 NetXtreme-E Ethernet Partition
+ 14e4 df24 BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz Ethernet Partition
1803 BCM57502 NetXtreme-E RDMA Partition
1804 BCM57504 NetXtreme-E RDMA Partition
- 1805 BCM57508 NetXtreme-E RDMA Partition
+ 1805 BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz RDMA Partition
+ 14e4 df24 NetXtreme-E NGM2100D BCM57508 2x100G KR Mezz RDMA Partition
1806 BCM5750X NetXtreme-E Ethernet Virtual Function
+ 14e4 df24 BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz Ethernet Virtual Function
1807 BCM5750X NetXtreme-E RDMA Virtual Function
+ 14e4 df24 BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz RDMA Virtual Function
+ 1808 BCM5750X NetXtreme-E Ethernet Virtual Function
+ 14e4 df24 BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz Ethernet Virtual Function
+ 1809 BCM5750X NetXtreme-E RDMA Virtual Function
+ 14e4 df24 BCM57508 NetXtreme-E NGM2100D 2x100G KR Mezz RDMA Virtual Function
2711 BCM2711 PCIe Bridge
3352 BCM3352
3360 BCM3360
9260 RCIM-II Real-Time Clock & Interrupt Module
9271 RCIM-III Real-Time Clock & Interrupt Module (PCIe)
9272 Pulse Width Modulator Card
+ 9273 RCIM-IV Real-Time Clock & Interrupt Module (PCIe)
9277 5 Volt Delta Sigma Converter Card
9278 10 Volt Delta Sigma Converter Card
9287 Analog Output Card
15b3 0021 MCX4421A-ACQN ConnectX-4 Lx EN OCP,2x25G
15b3 0025 ConnectX-4 Lx 25 GbE Dual Port SFP28 rNDC
193d 100a 620F-B
+# NIC-ETH540F-LP-2P SFP+ Ethernet Card
+ 193d 1023 NIC-ETH540F-LP-2P
193d 1031 NIC-ETH640i-Mb-2x25G
+# NIC-ETH640F-3S-2P OCP3.0 Card
+ 193d 1083 NIC-ETH640F-3S-2P
+# NIC-ETH540F-3S-2P OCP3.0 2x10G Card
+ 193d 1084 NIC-ETH540F-3S-2P
1016 MT27710 Family [ConnectX-4 Lx Virtual Function]
1017 MT27800 Family [ConnectX-5]
15b3 0006 ConnectX®-5 EN network interface card, 100GbE single-port QSFP28, PCIe3.0 x16, tall bracket; MCX515A-CCAT
2086 CryptoServer Se-Series Hardware Security Module
c040 CryptoServer CSe-Series Hardware Security Module
c051 CryptoServer Se-Series Gen2 Hardware Security Module
+ c070 u.trust Anchor Hardware Security Module cs7.2 Series
+ c071 u.trust Anchor Hardware Security Module cs7.3 Series
+ c072 u.trust Anchor Hardware Security Module cs7.3 Series Virtual Function
# nee Atheros Communications, Inc.
168c Qualcomm Atheros
0007 AR5210 Wireless Network Adapter [AR5000 802.11a]
ab08 21x4x DEC-Tulip compatible 10/100 Ethernet
ab09 21x4x DEC-Tulip compatible 10/100 Ethernet
173b Altima (nee Broadcom)
+ 0001 AC1002 PCI Gigabit Ethernet controller
03e8 AC1000 Gigabit Ethernet
03e9 AC1001 Gigabit Ethernet
03ea AC9100 Gigabit Ethernet
9750 GL9750 SD Host Controller
e763 GL9763E eMMC Controller
17aa Lenovo
+ 3181 ThinkCentre M75n IoT
402b Intel 82599ES 10Gb 2-port Server Adapter X520-2
17ab Phillips Components
17af Hightech Information System Ltd.
1242 ASM1142 USB 3.1 Host Controller
1343 ASM1143 USB 3.1 Host Controller
2142 ASM2142 USB 3.1 Host Controller
+ 1462 7a72 H270 PC MATE
3242 ASM3242 USB 3.2 Host Controller
1b26 Netcope Technologies, a.s.
c132 COMBO-LXT155
0601 NumaChip N601
0602 NumaChip N602
1b4b Marvell Technology Group Ltd.
+# device 1b4b:0100 reports incorrect vendor id due to hw erratum (correct is 11ab)
+ 0100 88F3700 [Armada 3700 Family] ARM SoC
0640 88SE9128 SATA III 6Gb/s RAID Controller
2241 88NR2241 Non-Volatile memory controller
1028 2112 BOSS-N1 Monolithic
1002 PM1553-5 (PC/104+ MIL-STD-1553 Interface Card)
1004 AB3000 Series Rugged Computer
1005 PE1000 (Multi-Protocol PCIe/104 Interface Card)
+ 1006 webCS Wireless Aircraft Communications Server
+ 1007 AB3000 Series Rugged Computer (Series N)
+ 1008 ME1000 mPCIe Avionics Interface Card
+ 100a NG1 Series Avionics Converter
1101 OmniBus II PCIe Multi-Protocol Interface Card
1102 OmniBusBox II Multi-Protocol Interface Core
1103 OmniBus II cPCIe/PXIe Multi-Protocol Interface Card
+ 1200 NG3 Series Mil-Std-1553 Interface
+ 1201 NG3 Series ARINC 429 Interface
+ 1202 NG3 Series Avionics Discrete & Serial Interface
+ 1203 NG3 Series Avionics Discrete Interface
1bd4 Inspur Electronic Information Industry Co., Ltd.
0911 Arria10_PCIe_F10A1150
1bee IXXAT Automation GmbH
001b FD720
001c FD922
001d Vega
+ 001f FD940
1c28 Lite-On IT Corp. / Plextor
0122 M6e PCI Express SSD [Marvell 88SS9183]
# previously Fiberblaze
1284 PC300 NVMe Solid State Drive 512GB
1285 PC300 NVMe Solid State Drive 1TB
1327 BC501 NVMe Solid State Drive 512GB
+ 1339 BC511
1504 SC300 512GB M.2 2280 SATA Solid State Drive
1527 PC401 NVMe Solid State Drive 256GB
243b PE6110 NVMe Solid State Drive
0009 ExaNIC X25
000a ExaNIC X100
000b ExaNIC V9P
+ 000c ExaNIC V9P-3
0100 ExaDISK FX1
1cf0 Akitio
1cf7 Subspace Dynamics
0101 Codensity D400 SSD
0102 Codensity D408 PCIe Gen4 NVMe SSD
0202 Codensity T408 Video Encoding-Decoding Accelerator
-1d87 Fuzhou Rockchip Electronics Co., Ltd
+# nee Fuzhou Rockchip Electronics Co., Ltd
+1d87 Rockchip Electronics Co., Ltd
0100 RK3399 PCI Express Root Port
1808 RK1808 Neural Network Processor Card
+ 3566 RK3568 Remote Signal Processor
1d8f Enyx
1d93 YADRO
1d94 Chengdu Haiguang IC Design Co., Ltd.
0000 TSP100 Tensor Streaming Processor
1de1 Tekram Technology Co.,Ltd.
0391 TRM-S1040 [DC-315 / DC-395 series]
- 2020 DC-390
+ 2020 DC-390 Series SCSI Adapter [AMD Am53C974]
690c 690c
dc29 DC290
1de5 Eideticom, Inc
0206 ACE-NIC200 Programmable Network Accelerator
1df3 0000 Maintenance Mode
1df3 0001 ENA2200F
+ 0207 ACE-NIC50RN Programmable Network Accelerator
+ 0208 ACE-NIC100RN Programmable Network Accelerator
1df7 opencpi.org
0001 ml605
0002 alst4
1eae XFX Limited
1eb1 VeriSilicon Inc
1001 Video Accelerator
+1ed3 Yeston
1ed8 Digiteq Automotive
0101 FG4 PCIe Frame Grabber
1ed9 Myrtle.ai
2010 8142 100VG/AnyLAN
2646 Kingston Technology Company, Inc.
0010 HyperX Predator PCIe AHCI SSD
+ 2262 KC2000 NVMe SSD
2263 A2000 NVMe SSD
5008 U-SNS8154P3 NVMe SSD
500d OM3PDP3 NVMe SSD
7053 CH353 PCI Dual Serial and Parallel Ports Controller
7073 CH356 PCI Quad Serial and Parallel Ports Controller
7173 CH355 PCI Quad Serial Port Controller
-434e CAST Navigation LLC
+434e Cornelis Networks
+43bc Tiger Lake-H PCIe Root Port #5
4444 Internext Compression Inc
0016 iTVC16 (CX23416) Video Decoder
0070 0003 WinTV PVR 250
0406 Haswell Integrated Graphics Controller
040a Xeon E3-1200 v3 Processor Integrated Graphics Controller
0412 Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller
+ 1028 05d7 Alienware X51 R2
103c 1998 EliteDesk 800 G1
17aa 3098 ThinkCentre E73
17aa 309f ThinkCentre M83
06ab Comet Lake PCH Serial IO SPI Controller #1
06ac Comet Lake PCI Express Root Port #21
06b0 Comet Lake PCI Express Root Port #9
+ 06bd Comet Lake PCIe Port #6
06c0 Comet Lake PCI Express Root Port #17
06c8 Comet Lake PCH cAVS
+ 06d2 Comet Lake SATA AHCI Controller
06e0 Comet Lake HECI Controller
+ 06e3 Comet Lake Keyboard and Text (KT) Redirection
06e8 Comet Lake PCH Serial IO I2C Controller #0
06e9 Comet Lake PCH Serial IO I2C Controller #1
06ea Comet Lake PCH Serial IO I2C Controller #2
1028 2103 NVMe RI U.2 3.84TB (P5500)
1028 2104 NVMe RI U.2 7.68TB (P5500)
8086 8008 NVMe Datacenter SSD [3DNAND] SE 2.5" U.2 (P5510)
+ 8086 8d08 NVMe Datacenter SSD [3DNAND] VE 2.5" U.2 (P5316)
+ 8086 8d1d NVMe Datacenter SSD [3DNAND] VE E1.L 9.5/18mm (P5316)
0be0 Atom Processor D2xxx/N2xxx Integrated Graphics Controller
0be1 Atom Processor D2xxx/N2xxx Integrated Graphics Controller
105b 0d7c D270S/D250S Motherboard
0bf6 Atom Processor D2xxx/N2xxx DRAM Controller
0bf7 Atom Processor D2xxx/N2xxx DRAM Controller
0c00 4th Gen Core Processor DRAM Controller
+ 1028 05d7 Alienware X51 R2
103c 1998 EliteDesk 800 G1
17aa 3098 ThinkCentre E73
17aa 309f ThinkCentre M83
18d4 0c07 I350 1Gb 2-port RJ45 OCP Mezz Card MOP41-I-1GT2
193d 1005 360T-B
193d 1007 360T-L
+# NIC-ETH360T-3S-4P OCP3.0 4x1G Base-T Card
+ 193d 1080 NIC-ETH360T-3S-4P
1bd4 001d 1G base-T QP EP014Ti1 Adapter
1bd4 0035 1G base-T QP EP014Ti1 Adapter
8086 0001 Ethernet Server Adapter I350-T4
17aa 4002 ThinkServer X710-2 AnyFabric for 10GbE SFP+
193d 1020 NIC-ETH561F-sL-4x10G
193d 1021 NIC-ETH561F-sL-2x10G
+# NIC-ETH561F-3S-2P OCP3.0 2x10G SFP+ Card
+ 193d 1081 NIC-ETH561F-3S-2P
19e5 d11c Ethernet 2-port X710 10Gb SFP+ Adapter SP330
+ 1bd4 0042 10G SFP+ DP EP102Fi4 Adapter
1bd4 0056 Ethernet Network Adapter X710-BM2 for OCP NIC 3.0
8086 0000 Ethernet Converged Network Adapter X710
8086 0001 Ethernet Converged Network Adapter X710-4
8086 000b Ethernet 100G 2P E810-C Adapter
8086 000c Ethernet 100G 2P E810-C OCP
8086 000d Ethernet Network Adapter E810-L-Q2 for OCP 3.0
+ 8086 000e Ethernet Network Adapter E810-2C-Q2
1593 Ethernet Controller E810-C for SFP
1137 02c3 E810XXVDA4 4x25/10 GbE SFP28 PCIe NIC
8086 0002 Ethernet Network Adapter E810-L-2
15b6 DSL6540 USB 3.1 Controller [Alpine Ridge]
15b7 Ethernet Connection (2) I219-LM
15b8 Ethernet Connection (2) I219-V
+ 1462 7a72 H270 PC MATE
15b9 Ethernet Connection (3) I219-LM
15bb Ethernet Connection (7) I219-LM
15bc Ethernet Connection (7) I219-V
1137 02c2 X710T4LG 4x10 GbE RJ45 PCIe NIC
1137 02d9 Ethernet Network Adapter X710-T2L OCP 3.0
1137 02da Ethernet Network Adapter X710-T4L OCP 3.0
+# NIC-ETH565T-3S-2P OCP3.0 2x10G Base-T Card
+ 193d 1082 NIC-ETH565T-3S-2P
8086 0000 Ethernet Network Adapter X710-TL
8086 0001 Ethernet Network Adapter X710-T4L
8086 0002 Ethernet Network Adapter X710-T4L
103c 825b OMEN-17-w001nv
1911 Xeon E3-1200 v5/v6 / E3-1500 v5 / 6th/7th/8th Gen Core Processor Gaussian Mixture Model
1028 0869 Vostro 3470
+ 1462 7a72 H270 PC MATE
17aa 2247 ThinkPad T570
17aa 224f ThinkPad X1 Carbon 5th Gen
17aa 225d ThinkPad T480
1cb8 0002 Omni-Path HFI Adapter 100 Series, 1 Port, PCIe x16, TC6600 Fixed Port
1cb8 0003 Omni-Path HFI Adapter 100 Series, 2 Port, 2 PCIe x16, Earth Simulation QSFP28
1cb8 0004 Omni-Path HFI Adapter 100 Series, 1 Port, PCIe x16, TC4600E QSFP28
+ 434e 0001 Omni-Path HFI 100 Series, 1 Port, OCP 3.0 Adapter
8086 2628 Omni-Path HFI Adapter 100 Series, 1 Port, PCIe x16
8086 2629 Omni-Path HFI Adapter 100 Series, 1 Port, PCIe x8
8086 262a Omni-Path HFI Adapter 100 Series, 2 Ports, Split PCIe x16
277c 82975X Memory Controller Hub
1043 8178 P5WDG2 WS Professional motherboard
277d 82975X PCI Express Root Port
+ 2780 82915G/GV/GL/910GL [Grantsdale] Graphics Device
2782 82915G Integrated Graphics Controller
1043 2582 P5GD1-VW Mainboard
1734 105b Scenic W620
8086 1216 WiMAX/WiFi Link 5150 ABG
8086 1311 WiMAX/WiFi Link 5150 AGN
8086 1316 WiMAX/WiFi Link 5150 ABG
+ 438b Tiger Lake-H LPC/eSPI Controller
+ 43a3 Tiger Lake-H SMBus Controller
+ 43a4 Tiger Lake-H SPI Controller
+ 43b0 Tiger Lake-H PCI Express Root Port #9
+ 43bc Tiger Lake-H PCI Express Root Port #5
+ 43c8 Tiger Lake-H HD Audio Controller
+ 43e0 Tiger Lake-H Management Engine Interface
+ 43e8 Tiger Lake-H Serial IO I2C Controller #0
+ 43ed Tiger Lake-H USB 3.2 Gen 2x1 xHCI Host Controller
+ 43ef Tiger Lake-H Shared SRAM
+ 43f0 Wi-Fi 6 AX201
444e Turbo Memory Controller
467f Volume Management Device NVMe RAID Controller
4680 AlderLake-S GT1
8086 0001 EtherExpress PRO/100 Server Ethernet Adapter
530d 80310 (IOP) IO Processor
5502 Ethernet Controller (2) I225-LMvP
+ 5504 Ethernet Controller I226-K
5845 QEMU NVM Express Controller
1af4 1100 QEMU Virtual Machine
5900 Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
590c Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
590f Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
1462 7a68 B250 KRAIT GAMING (MS-7A68)
+ 1462 7a72 H270 PC MATE
5910 Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
5911 Xeon E3-1200 v6/7th Gen Core Processor Gaussian Mixture Model
5912 HD Graphics 630
+ 1462 7a72 H270 PC MATE
5914 Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
17aa 225d ThinkPad T480
5916 HD Graphics 620
8c00 8 Series/C220 Series Chipset Family 4-port SATA Controller 1 [IDE mode]
8c01 8 Series Chipset Family 4-port SATA Controller 1 [IDE mode] - Mobile
8c02 8 Series/C220 Series Chipset Family 6-port SATA Controller 1 [AHCI mode]
+ 1028 05d7 Alienware X51 R2
103c 1998 EliteDesk 800 G1
17aa 3098 ThinkCentre E73
17aa 309f ThinkCentre M83
8c1e 8 Series/C220 Series Chipset Family PCI Express Root Port #8
8c1f 8 Series/C220 Series Chipset Family PCI Express Root Port #8
8c20 8 Series/C220 Series Chipset High Definition Audio Controller
+ 1028 05d7 Alienware X51 R2
103c 1909 ZBook 15
103c 1998 EliteDesk 800 G1
17aa 220e ThinkPad T440p
17aa 309f ThinkCentre M83
8c21 8 Series/C220 Series Chipset High Definition Audio Controller
8c22 8 Series/C220 Series Chipset Family SMBus Controller
+ 1028 05d7 Alienware X51 R2
103c 1909 ZBook 15
103c 1998 EliteDesk 800 G1
17aa 220e ThinkPad T440p
8c23 8 Series Chipset Family CHAP Counters
8c24 8 Series Chipset Family Thermal Management Controller
8c26 8 Series/C220 Series Chipset Family USB EHCI #1
+ 1028 05d7 Alienware X51 R2
103c 1909 ZBook 15
103c 1998 EliteDesk 800 G1
17aa 220e ThinkPad T440p
17aa 309f ThinkCentre M83
2210 17aa ThinkPad T540p
8c2d 8 Series/C220 Series Chipset Family USB EHCI #2
+ 1028 05d7 Alienware X51 R2
103c 1909 ZBook 15
103c 1998 EliteDesk 800 G1
17aa 220e ThinkPad T440p
17aa 3098 ThinkCentre E73
17aa 309f ThinkCentre M83
8c31 8 Series/C220 Series Chipset Family USB xHCI
+ 1028 05d7 Alienware X51 R2
103c 1909 ZBook 15
103c 1998 EliteDesk 800 G1
17aa 220e ThinkPad T440p
8c33 8 Series/C220 Series Chipset Family LAN Controller
8c34 8 Series/C220 Series Chipset Family NAND Controller
8c3a 8 Series/C220 Series Chipset Family MEI Controller #1
+ 1028 05d7 Alienware X51 R2
103c 1909 ZBook 15
103c 1998 EliteDesk 800 G1
17aa 220e ThinkPad T440p
8c48 8 Series/C220 Series Chipset Family LPC Controller
8c49 HM86 Express LPC Controller
8c4a H87 Express LPC Controller
+ 1028 05d7 Alienware X51 R2
8c4b HM87 Express LPC Controller
8c4c Q85 Express LPC Controller
17aa 309f ThinkCentre M83
9622 Integrated RAID
9641 Integrated RAID
96a1 Integrated RAID
+ 9a01 11th Gen Core Processor PCIe Controller #1
9a03 TigerLake-LP Dynamic Tuning Processor Participant
9a09 11th Gen Core Processor PCIe Controller
9a0b Volume Management Device NVMe RAID Controller
9a0d Tiger Lake-LP Telemetry Aggregator
+ 9a0f 11th Gen Core Processor PCIe Controller #0
+ 9a11 GNA Scoring Accelerator module
9a13 Tiger Lake-LP Thunderbolt 4 USB Controller
9a14 11th Gen Core Processor Host Bridge/DRAM Registers
9a17 Tiger Lake-H Thunderbolt 4 USB Controller
9a21 Tiger Lake-H Thunderbolt 4 NHI #1
9a23 Tiger Lake-LP Thunderbolt 4 PCI Express Root Port #0
9a25 Tiger Lake-LP Thunderbolt 4 PCI Express Root Port #1
+ 9a26 11th Gen Core Processor Host Bridge/DRAM Registers
9a27 Tiger Lake-LP Thunderbolt 4 PCI Express Root Port #2
9a29 Tiger Lake-LP Thunderbolt 4 PCI Express Root Port #3
9a2b Tiger Lake-H Thunderbolt 4 PCI Express Root Port #0
9a2f Tiger Lake-H Thunderbolt 4 PCI Express Root Port #2
9a31 Tiger Lake-H Thunderbolt 4 PCI Express Root Port #3
9a33 Tiger Lake Trace Hub
+ 9a36 11th Gen Core Processor Host Bridge/DRAM Registers
9a49 TigerLake GT2 [Iris Xe Graphics]
+ 9a60 TigerLake GT2 [Iris Xe Graphics]
+ 9a68 Tiger Lake-H UHD Graphics
9b41 CometLake-U GT2 [UHD Graphics]
9b44 10th Gen Core Processor Host Bridge/DRAM Registers
9b53 Comet Lake-S 6c Host Bridge/DRAM Controller
a252 Lewisburg SSATA Controller [AHCI mode]
a256 Lewisburg SSATA Controller [RAID mode]
a282 200 Series PCH SATA controller [AHCI mode]
+ 1462 7a72 H270 PC MATE
a286 200 Series PCH SATA controller [RAID mode]
a290 200 Series PCH PCI Express Root Port #1
a291 200 Series PCH PCI Express Root Port #2
a292 200 Series PCH PCI Express Root Port #3
a293 200 Series PCH PCI Express Root Port #4
a294 200 Series PCH PCI Express Root Port #5
+ 1462 7a72 H270 PC MATE
a295 200 Series PCH PCI Express Root Port #6
a296 200 Series PCH PCI Express Root Port #7
+ 1462 7a72 H270 PC MATE
a297 200 Series PCH PCI Express Root Port #8
a298 200 Series PCH PCI Express Root Port #9
+ 1462 7a72 H270 PC MATE
a299 200 Series PCH PCI Express Root Port #10
a29a 200 Series PCH PCI Express Root Port #11
a29b 200 Series PCH PCI Express Root Port #12
a29f 200 Series PCH PCI Express Root Port #16
a2a0 200 Series/Z370 Chipset Family P2SB
a2a1 200 Series/Z370 Chipset Family Power Management Controller
+ 1462 7a72 H270 PC MATE
a2a3 200 Series/Z370 Chipset Family SMBus Controller
+ 1462 7a72 H270 PC MATE
a2a4 200 Series/Z370 Chipset Family SPI Controller
a2a5 200 Series/Z370 Chipset Family Gigabit Ethernet Controller
a2a6 200 Series/Z370 Chipset Family Trace Hub
a2a9 200 Series/Z370 Chipset Family Serial IO SPI Controller #0
a2aa 200 Series/Z370 Chipset Family Serial IO SPI Controller #1
a2af 200 Series/Z370 Chipset Family USB 3.0 xHCI Controller
+ 1462 7a72 H270 PC MATE
a2b1 200 Series PCH Thermal Subsystem
+ 1462 7a72 H270 PC MATE
a2ba 200 Series PCH CSME HECI #1
+ 1462 7a72 H270 PC MATE
a2bb 200 Series PCH CSME HECI #2
a2c4 200 Series PCH LPC Controller (H270)
+ 1462 7a72 H270 PC MATE
a2c5 200 Series PCH LPC Controller (Z270)
a2c6 200 Series PCH LPC Controller (Q270)
a2c7 200 Series PCH LPC Controller (Q250)
a2ed 200 Series PCH PCI Express Root Port #23
a2ee 200 Series PCH PCI Express Root Port #24
a2f0 200 Series PCH HD Audio
+ 1462 7a72 H270 PC MATE
+ 1462 fa72 H270 PC MATE
a304 H370 Chipset LPC/eSPI Controller
1028 0869 Vostro 3470
a305 Z390 Chipset LPC/eSPI Controller
a324 Cannon Lake PCH SPI Controller
1028 0869 Vostro 3470
a328 Cannon Lake PCH Serial IO UART Host Controller
+ a32b Cannon Lake PCH SPI Host Controller
a32c Cannon Lake PCH PCI Express Root Port #21
a32d Cannon Lake PCH PCI Express Root Port #22
a32e Cannon Lake PCH PCI Express Root Port #23
d157 Core Processor System Control and Status Registers
d158 Core Processor Miscellaneous Registers
f1a5 SSD 600P Series
+# M.2 22 x 80mm, NVMe
+ 8086 390a SSDPEKKW256G7 256GB
f1a6 SSD Pro 7600p/760p/E 6100p Series
8086 390b SSD Pro 7600p/760p/E 6100p Series [NVM Express]
f1a8 SSD 660P Series
0001 SG2010 PCI over Starfabric Bridge
0002 SG2010 PCI to Starfabric Gateway
0003 SG1010 Starfabric Switch and PCI Bridge
+9a11 Tiger Lake-H Gaussian & Neural Accelerator
9d32 Beijing Starblaze Technology Co. Ltd.
0000 STAR1000 PCIe NVMe SSD Controller
1001 STAR1000P PCIe NVMe SSD Controller
eb23 Kona 1
eb24 Kona HDMI
eb25 Corvid 44 12g
+ eb26 T-Tap Pro
efac Xena SD-MM/SD-22-MM
facd Xena HD-MM
f5f5 F5 Networks, Inc.
<tr class="even"><td>Alpha Telecom Inc</td><td>ATD</td><td>09/26/1997</td> </tr>
<tr class="odd"><td>Alpha-Top Corporation</td><td>ATP</td><td>12/04/1996</td> </tr>
<tr class="even"><td>AlphaView LCD</td><td>ALV</td><td>11/01/2008</td> </tr>
- <tr class="odd"><td>Alpine Electronics, Inc.</td><td>APE</td><td>01/22/2013</td> </tr>
- <tr class="even"><td>Alps Electric Company Ltd</td><td>ALP</td><td>11/29/1996</td> </tr>
- <tr class="odd"><td>Alps Electric Inc</td><td>AUI</td><td>11/29/1996</td> </tr>
+ <tr class="odd"><td>ALPS ALPINE CO., LTD.</td><td>APE</td><td>01/22/2013</td> </tr>
+ <tr class="even"><td>ALPS ALPINE CO., LTD.</td><td>ALP</td><td>11/29/1996</td> </tr>
+ <tr class="odd"><td>ALPS ALPINE CO., LTD.</td><td>AUI</td><td>11/29/1996</td> </tr>
<tr class="even"><td>Alta Research Corporation</td><td>ARC</td><td>11/29/1996</td> </tr>
<tr class="odd"><td>Altec Corporation</td><td>ALC</td><td>08/04/1998</td> </tr>
<tr class="even"><td>Altec Lansing</td><td>ALJ</td><td>01/13/2000</td> </tr>
<tr class="even"><td>NZXT (PNP same EDID)_</td><td>NXT</td><td>07/15/2020</td> </tr>
<tr class="odd"><td>Unicompute Technology Co., Ltd.</td><td>UTC</td><td>10/19/2020</td> </tr>
<tr class="even"><td>TECHNOGYM S.p.A.</td><td>TGW</td><td>01/08/2021</td> </tr>
+ <tr class="odd"><td>Clover Electronics</td><td>CLR</td><td>02/02/2021</td> </tr>
+ <tr class="even"><td>Kyokko Communication System Co., Ltd.</td><td>KTS</td><td>02/18/2021</td> </tr>
+ <tr class="odd"><td>Terumo Corporation</td><td>TMO</td><td>02/02/2021</td> </tr>
+ <tr class="even"><td>Micro-Star Int'l Co., Ltd.</td><td>CND</td><td>02/17/2021</td> </tr>
+ <tr class="odd"><td>Newline Interactive Inc.</td><td>NWL</td><td>12/03/2020</td> </tr>
+ <tr class="even"><td>CORSAIR MEMORY Inc.</td><td>CRM</td><td>02/05/2021</td> </tr>
</tbody>
</table>
</body>
# The latest version can be obtained from
# http://www.linux-usb.org/usb.ids
#
-# Version: 2021.01.29
-# Date: 2021-01-29 20:34:11
+# Version: 2021.02.19
+# Date: 2021-02-19 20:34:10
#
# Vendors, devices and interfaces. Please keep sorted.
ffff Mio DigiWalker Sync
3344 Leaguer Microelectronics (LME)
3744 OEM PC Remote
+3384 System76
+ 0000 Thelio Io (thelio-io)
+ 0001 Launch Configurable Keyboard (launch_1)
348f ISY
2322 Wireless Presenter
3504 Micro Star
<para><filename>/run/systemd/journald.conf.d/*.conf</filename></para>
<para><filename>/usr/lib/systemd/journald.conf.d/*.conf</filename></para>
<para><filename>/etc/systemd/journald@<replaceable>NAMESPACE</replaceable>.conf</filename></para>
+ <para><filename>/etc/systemd/journald@<replaceable>NAMESPACE</replaceable>.conf.d/*.conf</filename></para>
+ <para><filename>/run/systemd/journald@<replaceable>NAMESPACE</replaceable>.conf.d/*.conf</filename></para>
+ <para><filename>/usr/lib/systemd/journald@<replaceable>NAMESPACE</replaceable>.conf.d/*.conf</filename></para>
</refsynopsisdiv>
<refsect1>
<para>The <command>systemd-journald</command> instance managing the default namespace is configured by
<filename>/etc/systemd/journald.conf</filename> and associated drop-ins. Instances managing other
- namespaces read <filename>/etc/systemd/journald@<replaceable>NAMESPACE</replaceable>.conf</filename> with
- the namespace identifier filled in. This allows each namespace to carry a distinct configuration. See
+ namespaces read <filename>/etc/systemd/journald@<replaceable>NAMESPACE</replaceable>.conf</filename>
+ and associated drop-ins with the namespace identifier filled in. This allows each namespace to carry
+ a distinct configuration. See
<citerefentry><refentrytitle>systemd-journald.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
for details about journal namespaces.</para>
</refsect1>
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly s Type = '...';
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
+ readonly s ExitType = '...';
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly s Restart = '...';
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly s PIDFile = '...';
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly b PrivateMounts = ...;
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
+ readonly b PrivateIPC = ...;
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly s ProtectHome = '...';
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly s ProtectSystem = '...';
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly s NetworkNamespacePath = '...';
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
+ readonly s IPCNamespacePath = '...';
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly s KillMode = '...';
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly i KillSignal = ...;
<!--property Type is not documented!-->
+ <!--property ExitType is not documented!-->
+
<!--property Restart is not documented!-->
<!--property PIDFile is not documented!-->
<!--property PrivateMounts is not documented!-->
+ <!--property PrivateIPC is not documented!-->
+
<!--property ProtectHome is not documented!-->
<!--property ProtectSystem is not documented!-->
<!--property NetworkNamespacePath is not documented!-->
+ <!--property IPCNamespacePath is not documented!-->
+
<!--property KillMode is not documented!-->
<!--property KillSignal is not documented!-->
<variablelist class="dbus-property" generated="True" extra-ref="Type"/>
+ <variablelist class="dbus-property" generated="True" extra-ref="ExitType"/>
+
<variablelist class="dbus-property" generated="True" extra-ref="Restart"/>
<variablelist class="dbus-property" generated="True" extra-ref="PIDFile"/>
<variablelist class="dbus-property" generated="True" extra-ref="PrivateMounts"/>
+ <variablelist class="dbus-property" generated="True" extra-ref="PrivateIPC"/>
+
<variablelist class="dbus-property" generated="True" extra-ref="ProtectHome"/>
<variablelist class="dbus-property" generated="True" extra-ref="ProtectSystem"/>
<variablelist class="dbus-property" generated="True" extra-ref="NetworkNamespacePath"/>
+ <variablelist class="dbus-property" generated="True" extra-ref="IPCNamespacePath"/>
+
<variablelist class="dbus-property" generated="True" extra-ref="KillMode"/>
<variablelist class="dbus-property" generated="True" extra-ref="KillSignal"/>
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly b PrivateMounts = ...;
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
+ readonly b PrivateIPC = ...;
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly s ProtectHome = '...';
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly s ProtectSystem = '...';
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly s NetworkNamespacePath = '...';
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
+ readonly s IPCNamespacePath = '...';
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly s KillMode = '...';
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly i KillSignal = ...;
<!--property PrivateMounts is not documented!-->
+ <!--property PrivateIPC is not documented!-->
+
<!--property ProtectHome is not documented!-->
<!--property ProtectSystem is not documented!-->
<!--property NetworkNamespacePath is not documented!-->
+ <!--property IPCNamespacePath is not documented!-->
+
<!--property KillMode is not documented!-->
<!--property KillSignal is not documented!-->
<variablelist class="dbus-property" generated="True" extra-ref="PrivateMounts"/>
+ <variablelist class="dbus-property" generated="True" extra-ref="PrivateIPC"/>
+
<variablelist class="dbus-property" generated="True" extra-ref="ProtectHome"/>
<variablelist class="dbus-property" generated="True" extra-ref="ProtectSystem"/>
<variablelist class="dbus-property" generated="True" extra-ref="NetworkNamespacePath"/>
+ <variablelist class="dbus-property" generated="True" extra-ref="IPCNamespacePath"/>
+
<variablelist class="dbus-property" generated="True" extra-ref="KillMode"/>
<variablelist class="dbus-property" generated="True" extra-ref="KillSignal"/>
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly b PrivateMounts = ...;
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
+ readonly b PrivateIPC = ...;
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly s ProtectHome = '...';
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly s ProtectSystem = '...';
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly s NetworkNamespacePath = '...';
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
+ readonly s IPCNamespacePath = '...';
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly s KillMode = '...';
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly i KillSignal = ...;
<!--property PrivateMounts is not documented!-->
+ <!--property PrivateIPC is not documented!-->
+
<!--property ProtectHome is not documented!-->
<!--property ProtectSystem is not documented!-->
<!--property NetworkNamespacePath is not documented!-->
+ <!--property IPCNamespacePath is not documented!-->
+
<!--property KillMode is not documented!-->
<!--property KillSignal is not documented!-->
<variablelist class="dbus-property" generated="True" extra-ref="PrivateMounts"/>
+ <variablelist class="dbus-property" generated="True" extra-ref="PrivateIPC"/>
+
<variablelist class="dbus-property" generated="True" extra-ref="ProtectHome"/>
<variablelist class="dbus-property" generated="True" extra-ref="ProtectSystem"/>
<variablelist class="dbus-property" generated="True" extra-ref="NetworkNamespacePath"/>
+ <variablelist class="dbus-property" generated="True" extra-ref="IPCNamespacePath"/>
+
<variablelist class="dbus-property" generated="True" extra-ref="KillMode"/>
<variablelist class="dbus-property" generated="True" extra-ref="KillSignal"/>
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly b PrivateMounts = ...;
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
+ readonly b PrivateIPC = ...;
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly s ProtectHome = '...';
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly s ProtectSystem = '...';
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly s NetworkNamespacePath = '...';
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
+ readonly s IPCNamespacePath = '...';
+ @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly s KillMode = '...';
@org.freedesktop.DBus.Property.EmitsChangedSignal("const")
readonly i KillSignal = ...;
<!--property PrivateMounts is not documented!-->
+ <!--property PrivateIPC is not documented!-->
+
<!--property ProtectHome is not documented!-->
<!--property ProtectSystem is not documented!-->
<!--property NetworkNamespacePath is not documented!-->
+ <!--property IPCNamespacePath is not documented!-->
+
<!--property KillMode is not documented!-->
<!--property KillSignal is not documented!-->
<variablelist class="dbus-property" generated="True" extra-ref="PrivateMounts"/>
+ <variablelist class="dbus-property" generated="True" extra-ref="PrivateIPC"/>
+
<variablelist class="dbus-property" generated="True" extra-ref="ProtectHome"/>
<variablelist class="dbus-property" generated="True" extra-ref="ProtectSystem"/>
<variablelist class="dbus-property" generated="True" extra-ref="NetworkNamespacePath"/>
+ <variablelist class="dbus-property" generated="True" extra-ref="IPCNamespacePath"/>
+
<variablelist class="dbus-property" generated="True" extra-ref="KillMode"/>
<variablelist class="dbus-property" generated="True" extra-ref="KillSignal"/>
<listitem><para>Specifies the network interface to execute the query on. This may either be specified as numeric
interface index or as network interface string (e.g. <literal>en0</literal>). Note that this option has no
effect if system-wide DNS configuration (as configured in <filename>/etc/resolv.conf</filename> or
- <filename>/etc/systemd/resolve.conf</filename>) in place of per-link configuration is used.</para></listitem>
+ <filename>/etc/systemd/resolved.conf</filename>) in place of per-link configuration is used.</para></listitem>
</varlistentry>
<varlistentry>
'8',
['systemd-random-seed'],
'ENABLE_RANDOMSEED'],
- ['systemd-rc-local-generator', '8', [], 'HAVE_SYSV_COMPAT'],
+ ['systemd-rc-local-generator', '8', ['rc-local.service'], 'HAVE_SYSV_COMPAT'],
['systemd-remount-fs.service', '8', ['systemd-remount-fs'], ''],
['systemd-repart', '8', ['systemd-repart.service'], 'ENABLE_REPART'],
['systemd-resolved.service', '8', ['systemd-resolved'], 'ENABLE_RESOLVE'],
<citerefentry><refentrytitle>sd_bus_message_read_array</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
<citerefentry><refentrytitle>sd_bus_message_read_basic</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
<citerefentry><refentrytitle>sd_bus_message_read_strv</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-<citerefentry><refentrytitle>sd_bus_message_reply</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
<citerefentry><refentrytitle>sd_bus_message_rewind</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
<citerefentry><refentrytitle>sd_bus_message_seal</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+<citerefentry><refentrytitle>sd_bus_message_send</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
<citerefentry><refentrytitle>sd_bus_message_set_allow_interactive_authorization</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
<citerefentry><refentrytitle>sd_bus_message_set_destination</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
<citerefentry><refentrytitle>sd_bus_message_set_expect_reply</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
connection object <parameter>bus</parameter>. The syntax of the match rule expression passed in
<parameter>match</parameter> is described in the <ulink
url="https://dbus.freedesktop.org/doc/dbus-specification.html">D-Bus Specification</ulink>. The specified handler
- function <parameter>callback</parameter> is called for eaching incoming message matching the specified expression,
+ function <parameter>callback</parameter> is called for each incoming message matching the specified expression,
the <parameter>userdata</parameter> parameter is passed as-is to the callback function. The match is installed
synchronously when connected to a bus broker, i.e. the call sends a control message requested the match to be added
to the broker and waits until the broker confirms the match has been installed successfully.</para>
<para><function>sd_bus_add_match_async()</function> operates very similar to
- <function>sd_bus_match_signal()</function>, however it installs the match asynchronously, in a non-blocking
+ <function>sd_bus_add_match()</function>, however it installs the match asynchronously, in a non-blocking
fashion: a request is sent to the broker, but the call does not wait for a response. The
<parameter>install_callback</parameter> function is called when the response is later received, with the response
message from the broker as parameter. If this function is specified as <constant>NULL</constant> a default
returns zero, an error reply is sent back to the caller indicating no matching object for the
request was found.</para>
- <para>Note that you can return a positive integer from a callback without
+ <para>Note that you can return a positive integer from a <parameter>method</parameter> callback without
immediately sending a reply. This informs sd-bus this callback will take responsibility for
replying to the request without forcing the callback to produce a reply immediately. This allows
a callback to perform any number of asynchronous operations required to construct a reply.
- However, if producing a reply takes too long, the method call will time out at the caller.</para>
+ However, if producing a reply takes too long, the method call will time out at the caller. This is
+ only available to methods and not properties.</para>
<para>If a callback was invoked to handle a request that expects a reply and the callback
returns a negative value, the value is interpreted as a negative errno-style error code and sent
is sent to the bus broker, and the call waits until the broker responds.</para>
<para><function>sd_bus_request_name_async()</function> is an asynchronous version of
- <function>sd_bus_release_name()</function>. Instead of waiting for the request to complete, the request message is
+ <function>sd_bus_request_name()</function>. Instead of waiting for the request to complete, the request message is
enqueued. The specified <parameter>callback</parameter> will be called when the broker's response is received. If
the parameter is specified as <constant>NULL</constant> a default implementation is used instead which will
terminate the connection when the name cannot be acquired. The function returns a slot object in its
<varlistentry>
<term><option>--network-interface=</option></term>
- <listitem><para>Assign the specified network interface to the
- container. This will remove the specified interface from the
- calling namespace and place it in the container. When the
- container terminates, it is moved back to the host namespace.
- Note that <option>--network-interface=</option> implies
- <option>--private-network</option>. This option may be used
- more than once to add multiple network interfaces to the
- container.</para></listitem>
+ <listitem><para>Assign the specified network interface to the container. This will remove the
+ specified interface from the calling namespace and place it in the container. When the container
+ terminates, it is moved back to the calling namespace. Note that
+ <option>--network-interface=</option> implies <option>--private-network</option>. This option may be
+ used more than once to add multiple network interfaces to the container.</para>
+
+ <para>Note that any network interface specified this way must already exist at the time the container
+ is started. If the container shall be started automatically at boot via a
+ <filename>systemd-nspawn@.service</filename> unit file instance, it might hence make sense to add a
+ unit file drop-in to the service instance
+ (e.g. <filename>/etc/systemd/system/systemd-nspawn@foobar.service.d/50-network.conf</filename>) with
+ contents like the following:</para>
+
+ <programlisting>[Unit]
+Wants=sys-subsystem-net-devices-ens1.device
+After=sys-subsystem-net-devices-ens1.device</programlisting>
+
+ <para>This will make sure that activation of the container service will be delayed until the
+ <literal>ens1</literal> network interface has shown up. This is required since hardware probing is
+ fully asynchronous, and network interfaces might be discovered only later during the boot process,
+ after the container would normally be started without these explicit dependencies.</para>
+ </listitem>
</varlistentry>
<varlistentry>
<term><option>--network-macvlan=</option></term>
- <listitem><para>Create a <literal>macvlan</literal> interface
- of the specified Ethernet network interface and add it to the
- container. A <literal>macvlan</literal> interface is a virtual
- interface that adds a second MAC address to an existing
- physical Ethernet link. The interface in the container will be
- named after the interface on the host, prefixed with
- <literal>mv-</literal>. Note that
- <option>--network-macvlan=</option> implies
- <option>--private-network</option>. This option may be used
- more than once to add multiple network interfaces to the
- container.</para></listitem>
+ <listitem><para>Create a <literal>macvlan</literal> interface of the specified Ethernet network
+ interface and add it to the container. A <literal>macvlan</literal> interface is a virtual interface
+ that adds a second MAC address to an existing physical Ethernet link. The interface in the container
+ will be named after the interface on the host, prefixed with <literal>mv-</literal>. Note that
+ <option>--network-macvlan=</option> implies <option>--private-network</option>. This option may be
+ used more than once to add multiple network interfaces to the container.</para>
+
+ <para>As with <option>--network-interface=</option>, the underlying Ethernet network interface must
+ already exist at the time the container is started, and thus similar unit file drop-ins as described
+ above might be useful.</para></listitem>
</varlistentry>
<varlistentry>
<term><option>--network-ipvlan=</option></term>
- <listitem><para>Create an <literal>ipvlan</literal> interface
- of the specified Ethernet network interface and add it to the
- container. An <literal>ipvlan</literal> interface is a virtual
- interface, similar to a <literal>macvlan</literal> interface,
- which uses the same MAC address as the underlying interface.
- The interface in the container will be named after the
- interface on the host, prefixed with <literal>iv-</literal>.
- Note that <option>--network-ipvlan=</option> implies
- <option>--private-network</option>. This option may be used
- more than once to add multiple network interfaces to the
- container.</para></listitem>
+ <listitem><para>Create an <literal>ipvlan</literal> interface of the specified Ethernet network
+ interface and add it to the container. An <literal>ipvlan</literal> interface is a virtual interface,
+ similar to a <literal>macvlan</literal> interface, which uses the same MAC address as the underlying
+ interface. The interface in the container will be named after the interface on the host, prefixed
+ with <literal>iv-</literal>. Note that <option>--network-ipvlan=</option> implies
+ <option>--private-network</option>. This option may be used more than once to add multiple network
+ interfaces to the container.</para>
+
+ <para>As with <option>--network-interface=</option>, the underlying Ethernet network interface must
+ already exist at the time the container is started, and thus similar unit file drop-ins as described
+ above might be useful.</para></listitem>
</varlistentry>
<varlistentry>
this option is used, the host side of the Ethernet link will use the <literal>vb-</literal> prefix
instead of <literal>ve-</literal>. Regardless of the used naming prefix the same network interface
name length limits imposed by Linux apply, along with the complications this creates (for details see
- above).</para></listitem>
+ above).</para>
+
+ <para>As with <option>--network-interface=</option>, the underlying bridge network interface must
+ already exist at the time the container is started, and thus similar unit file drop-ins as described
+ above might be useful.</para></listitem>
</varlistentry>
<varlistentry>
<refnamediv>
<refname>systemd-rc-local-generator</refname>
- <refpurpose>Compatibility generator for starting <filename>&RC_LOCAL_PATH;</filename> during boot</refpurpose>
+ <refname>rc-local.service</refname>
+ <refpurpose>Compatibility generator and service to start <filename>&RC_LOCAL_PATH;</filename> during boot</refpurpose>
</refnamediv>
<refsynopsisdiv>
<para><filename>/usr/lib/systemd/system-generators/systemd-rc-local-generator</filename></para>
+ <para><filename>rc-local.service</filename></para>
</refsynopsisdiv>
<refsect1>
<title>Description</title>
- <para><filename>systemd-rc-local-generator</filename> is a generator that checks whether
- <filename>&RC_LOCAL_PATH;</filename> exists and is executable, and if it is pulls the
+ <para><command>systemd-rc-local-generator</command> is a generator that checks whether
+ <filename>&RC_LOCAL_PATH;</filename> exists and is executable, and if it is, pulls the
<filename>rc-local.service</filename> unit into the boot process. This unit is responsible for running
- this script during late boot. Note that the script will be run with slightly different semantics than the
- original System V version, which was run "last" in the boot process, which is a concept that does not
- translate to systemd. The script is run after <filename>network.target</filename>, but in parallel with
- most other regular system services.</para>
+ this script during late boot. The script is run after <filename>network.target</filename>, but in
+ parallel with most other regular system services.</para>
+
+ <para>Note that <filename>rc-local.service</filename> runs with slightly different semantics than the
+ original System V version, which was executed "last" in the boot process, which is a concept that does
+ not translate to systemd.</para>
+
+ <para>Also note that <filename>rc-local.service</filename> is ordered after
+ <filename>network.target</filename>, which does not mean that the network is functional, see
+ <citerefentry><refentrytitle>systemd.special</refentrytitle><manvolnum>7</manvolnum></citerefentry>.
+ If the script requires a configured network connection, it may be desirable to pull in and order it after
+ <filename>network-online.target</filename> with a drop-in:</para>
+
+ <programlisting># /etc/systemd/system/rc-local.service.d/network.conf
+[Unit]
+Wants=network-online.target
+After=network-online.target
+</programlisting>
<para>Support for <filename>&RC_LOCAL_PATH;</filename> is provided for compatibility with specific System
V systems only. However, it is strongly recommended to avoid making use of this script today, and instead
provide proper unit files with appropriate dependencies for any scripts to run during the boot process.
- Note that the path to the script is set a compile time and varies between distributions.</para>
+ Note that the path to the script is set at compile time and varies between distributions.</para>
<para><filename>systemd-rc-local-generator</filename> implements
<citerefentry><refentrytitle>systemd.generator</refentrytitle><manvolnum>7</manvolnum></citerefentry>.</para>
<refsect1>
<title>Description</title>
- <para>A unit configuration file whose name ends in
- <literal>.device</literal> encodes information about a device unit
- as exposed in the
- sysfs/<citerefentry><refentrytitle>udev</refentrytitle><manvolnum>7</manvolnum></citerefentry>
- device tree.</para>
+ <para>A unit configuration file whose name ends in <literal>.device</literal> encodes information about a
+ device unit as exposed in the
+ sysfs/<citerefentry><refentrytitle>udev</refentrytitle><manvolnum>7</manvolnum></citerefentry> device
+ tree. This may be used to define dependencies between devices and other units.</para>
<para>This unit type has no specific options. See
<citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>
sections. A separate [Device] section does not
exist, since no device-specific options may be configured.</para>
- <para>systemd will dynamically create device units for all kernel
- devices that are marked with the "systemd" udev tag (by default
- all block and network devices, and a few others). This may be used
- to define dependencies between devices and other units. To tag a
- udev device, use <literal>TAG+="systemd"</literal> in the udev
- rules file, see
- <citerefentry><refentrytitle>udev</refentrytitle><manvolnum>7</manvolnum></citerefentry>
- for details.</para>
+ <para>systemd will dynamically create device units for all kernel devices that are marked with the
+ <literal>systemd</literal> udev tag (by default all block and network devices, and a few others). Note
+ that <emphasis>if <filename>systemd-udev.service</filename> is not running, no device units will be
+ available (for example in a typical container)</emphasis>.</para>
<para>Device units are named after the <filename>/sys/</filename>
and <filename>/dev/</filename> paths they control. Example: the
name see
<citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>.</para>
+ <para>To tag a udev device, use <literal>TAG+="systemd"</literal> in the udev rules file, see
+ <citerefentry><refentrytitle>udev</refentrytitle><manvolnum>7</manvolnum></citerefentry> for details.
+ </para>
+
<para>Device units will be reloaded by systemd whenever the
corresponding device generates a <literal>changed</literal> event.
Other units can use <varname>ReloadPropagatedFrom=</varname> to react
<citerefentry project='man-pages'><refentrytitle>mount</refentrytitle><manvolnum>8</manvolnum></citerefentry>.
</para>
- <para>Valid partition names follow the <ulink url="https://systemd.io/DISCOVERABLE_PARTITIONS">Discoverable
- Partitions Specification</ulink>.</para>
-
- <table>
- <title>Accepted partition names</title>
-
- <tgroup cols='1'>
- <colspec colname='partition' />
- <thead>
- <row>
- <entry>Partition Name</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>root</entry>
- </row>
- <row>
- <entry>root-secondary</entry>
- </row>
- <row>
- <entry>home</entry>
- </row>
- <row>
- <entry>srv</entry>
- </row>
- <row>
- <entry>esp</entry>
- </row>
- <row>
- <entry>xbootldr</entry>
- </row>
- <row>
- <entry>tmp</entry>
- </row>
- <row>
- <entry>var</entry>
- </row>
- <row>
- <entry>usr</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
+ <para>Valid partition names follow the <ulink
+ url="https://systemd.io/DISCOVERABLE_PARTITIONS">Discoverable Partitions Specification</ulink>:
+ <constant>root</constant>, <constant>usr</constant>, <constant>home</constant>, <constant>srv</constant>,
+ <constant>esp</constant>, <constant>xbootldr</constant>, <constant>tmp</constant>,
+ <constant>var</constant>.</para>
<xi:include href="system-only.xml" xpointer="singular"/></listitem>
</varlistentry>
Filesystem</ulink>. It is generally recommended to run most system services with this option set to
<literal>invisible</literal>. This option is implemented via file system namespacing, and thus cannot
be used with services that shall be able to install mount points in the host file system
- hierarchy. It also cannot be used for services that need to access metainformation about other users'
- processes. This option implies <varname>MountAPIVFS=</varname>.</para>
+ hierarchy. Note that the root user is unaffected by this option, so to be effective it has to be used
+ together with <varname>User=</varname> or <varname>DynamicUser=yes</varname>, and also without the
+ <literal>CAP_SYS_PTRACE</literal> capability, which also allows a process to bypass this feature. It
+ cannot be used for services that need to access metainformation about other users' processes. This
+ option implies <varname>MountAPIVFS=</varname>.</para>
<para>If the kernel doesn't support per-mount point <option>hidepid=</option> mount options this
setting remains without effect, and the unit's processes will be able to access and see other process
setgid bits, or filesystem capabilities). This is the simplest and most effective way to ensure that
a process and its children can never elevate privileges again. Defaults to false, but certain
settings override this and ignore the value of this setting. This is the case when
- <varname>SystemCallFilter=</varname>, <varname>SystemCallArchitectures=</varname>,
- <varname>RestrictAddressFamilies=</varname>, <varname>RestrictNamespaces=</varname>,
- <varname>PrivateDevices=</varname>, <varname>ProtectKernelTunables=</varname>,
- <varname>ProtectKernelModules=</varname>, <varname>ProtectKernelLogs=</varname>,
- <varname>ProtectClock=</varname>, <varname>MemoryDenyWriteExecute=</varname>,
- <varname>RestrictRealtime=</varname>, <varname>RestrictSUIDSGID=</varname>, <varname>DynamicUser=</varname>
- or <varname>LockPersonality=</varname> are specified. Note that even if this setting is overridden by them,
- <command>systemctl show</command> shows the original value of this setting.
- Also see <ulink url="https://www.kernel.org/doc/html/latest/userspace-api/no_new_privs.html">No New Privileges
- Flag</ulink>.</para></listitem>
+ <varname>DynamicUser=</varname>,
+ <varname>LockPersonality=</varname>,
+ <varname>MemoryDenyWriteExecute=</varname>,
+ <varname>PrivateDevices=</varname>,
+ <varname>ProtectClock=</varname>,
+ <varname>ProtectHostname=</varname>,
+ <varname>ProtectKernelLogs=</varname>,
+ <varname>ProtectKernelModules=</varname>,
+ <varname>ProtectKernelTunables=</varname>,
+ <varname>RestrictAddressFamilies=</varname>,
+ <varname>RestrictNamespaces=</varname>,
+ <varname>RestrictRealtime=</varname>,
+ <varname>RestrictSUIDSGID=</varname>,
+ <varname>SystemCallArchitectures=</varname>,
+ <varname>SystemCallFilter=</varname>, or
+ <varname>SystemCallLog=</varname> are specified. Note that even if this setting is overridden
+ by them, <command>systemctl show</command> shows the original value of this setting. Also see
+ <ulink url="https://www.kernel.org/doc/html/latest/userspace-api/no_new_privs.html">No New
+ Privileges Flag</ulink>.</para></listitem>
</varlistentry>
<varlistentry>
unit (see above), and set <varname>DevicePolicy=closed</varname> (see
<citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>5</manvolnum></citerefentry>
for details). Note that using this setting will disconnect propagation of mounts from the service to the host
- (propagation in the opposite direction continues to work). This means that this setting may not be used for
+ (propagation in the opposite direction continues to work). This means that this setting may not be used for
services which shall be able to install mount points in the main mount namespace. The new
<filename>/dev/</filename> will be mounted read-only and 'noexec'. The latter may break old programs which try
to set up executable memory by using
<citerefentry><refentrytitle>mmap</refentrytitle><manvolnum>2</manvolnum></citerefentry> of
<filename>/dev/zero</filename> instead of using <constant>MAP_ANON</constant>. For this setting the same
restrictions regarding mount propagation and privileges apply as for <varname>ReadOnlyPaths=</varname> and
- related calls, see above. If turned on and if running in user mode, or in system mode, but without the
+ related calls, see above. If turned on and if running in user mode, or in system mode, but without the
<constant>CAP_SYS_ADMIN</constant> capability (e.g. setting <varname>User=</varname>),
<varname>NoNewPrivileges=yes</varname> is implied.</para>
<xi:include href="system-only.xml" xpointer="singular"/></listitem>
</varlistentry>
+ <varlistentry>
+ <term><varname>PrivateIPC=</varname></term>
+
+ <listitem><para>Takes a boolean argument. If true, sets up a new IPC namespace for the executed processes.
+ Each IPC namespace has its own set of System V IPC identifiers and its own POSIX message queue file system.
+ This is useful to avoid name clash of IPC identifiers. Defaults to false. It is possible to run two or
+ more units within the same private IPC namespace by using the <varname>JoinsNamespaceOf=</varname> directive,
+ see <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry> for
+ details.</para>
+
+ <para>Note that IPC namespacing does not have an effect on
+ <constant>AF_UNIX</constant> sockets, which are the most common
+ form of IPC used on Linux. Instead, <constant>AF_UNIX</constant>
+ sockets in the file system are subject to mount namespacing, and
+ those in the abstract namespace are subject to network namespacing.
+ IPC namespacing only has an effect on SysV IPC (which is mostly
+ legacy) as well as POSIX message queues (for which
+ <constant>AF_UNIX</constant>/<constant>SOCK_SEQPACKET</constant>
+ sockets are typically a better replacement). IPC namespacing also
+ has no effect on POSIX shared memory (which is subject to mount
+ namespacing) either. See
+ <citerefentry project='man-pages'><refentrytitle>ipc_namespaces</refentrytitle><manvolnum>7</manvolnum></citerefentry> for
+ the details.</para>
+
+ <para>Note that the implementation of this setting might be impossible (for example if IPC namespaces are
+ not available), and the unit should be written in a way that does not solely rely on this setting for
+ security.</para>
+
+ <xi:include href="system-only.xml" xpointer="singular"/></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>IPCNamespacePath=</varname></term>
+
+ <listitem><para>Takes an absolute file system path refererring to a Linux IPC namespace
+ pseudo-file (i.e. a file like <filename>/proc/$PID/ns/ipc</filename> or a bind mount or symlink to
+ one). When set the invoked processes are added to the network namespace referenced by that path. The
+ path has to point to a valid namespace file at the moment the processes are forked off. If this
+ option is used <varname>PrivateIPC=</varname> has no effect. If this option is used together with
+ <varname>JoinsNamespaceOf=</varname> then it only has an effect if this unit is started before any of
+ the listed units that have <varname>PrivateIPC=</varname> or
+ <varname>IPCNamespacePath=</varname> configured, as otherwise the network namespace of those
+ units is reused.</para>
+
+ <xi:include href="system-only.xml" xpointer="singular"/></listitem>
+ </varlistentry>
+
<varlistentry>
<term><varname>PrivateUsers=</varname></term>
the system into the service, it is hence not suitable for services that need to take notice of system
hostname changes dynamically.</para>
+ <para>If this setting is on, but the unit doesn't have the <constant>CAP_SYS_ADMIN</constant>
+ capability (e.g. services for which <varname>User=</varname> is set),
+ <varname>NoNewPrivileges=yes</varname> is implied.</para>
+
<xi:include href="system-only.xml" xpointer="singular"/></listitem>
</varlistentry>
clock, and <varname>DeviceAllow=char-rtc r</varname> is implied. This ensures <filename>/dev/rtc0</filename>,
<filename>/dev/rtc1</filename>, etc. are made read-only to the service. See
<citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>5</manvolnum></citerefentry>
- for the details about <varname>DeviceAllow=</varname>.</para>
+ for the details about <varname>DeviceAllow=</varname>. If this setting is on, but the unit
+ doesn't have the <constant>CAP_SYS_ADMIN</constant> capability (e.g. services for which
+ <varname>User=</varname> is set), <varname>NoNewPrivileges=yes</varname> is implied.</para>
<xi:include href="system-only.xml" xpointer="singular"/></listitem>
</varlistentry>
<citerefentry><refentrytitle>sysctl.d</refentrytitle><manvolnum>5</manvolnum></citerefentry> mechanism. Few
services need to write to these at runtime; it is hence recommended to turn this on for most services. For this
setting the same restrictions regarding mount propagation and privileges apply as for
- <varname>ReadOnlyPaths=</varname> and related calls, see above. Defaults to off. If turned on and if running
- in user mode, or in system mode, but without the <constant>CAP_SYS_ADMIN</constant> capability (e.g. services
- for which <varname>User=</varname> is set), <varname>NoNewPrivileges=yes</varname> is implied. Note that this
- option does not prevent indirect changes to kernel tunables effected by IPC calls to other processes. However,
- <varname>InaccessiblePaths=</varname> may be used to make relevant IPC file system objects inaccessible. If
- <varname>ProtectKernelTunables=</varname> is set, <varname>MountAPIVFS=yes</varname> is
- implied.</para>
+ <varname>ReadOnlyPaths=</varname> and related calls, see above. Defaults to off. If this
+ setting is on, but the unit doesn't have the <constant>CAP_SYS_ADMIN</constant> capability
+ (e.g. services for which <varname>User=</varname> is set),
+ <varname>NoNewPrivileges=yes</varname> is implied. Note that this option does not prevent
+ indirect changes to kernel tunables effected by IPC calls to other processes. However,
+ <varname>InaccessiblePaths=</varname> may be used to make relevant IPC file system objects
+ inaccessible. If <varname>ProtectKernelTunables=</varname> is set,
+ <varname>MountAPIVFS=yes</varname> is implied.</para>
<xi:include href="system-only.xml" xpointer="singular"/></listitem>
</varlistentry>
both privileged and unprivileged. To disable module auto-load feature please see
<citerefentry><refentrytitle>sysctl.d</refentrytitle><manvolnum>5</manvolnum></citerefentry>
<constant>kernel.modules_disabled</constant> mechanism and
- <filename>/proc/sys/kernel/modules_disabled</filename> documentation. If turned on and if running in user
- mode, or in system mode, but without the <constant>CAP_SYS_ADMIN</constant> capability (e.g. setting
- <varname>User=</varname>), <varname>NoNewPrivileges=yes</varname> is implied.</para>
+ <filename>/proc/sys/kernel/modules_disabled</filename> documentation. If this setting is on,
+ but the unit doesn't have the <constant>CAP_SYS_ADMIN</constant> capability (e.g. services for
+ which <varname>User=</varname> is set), <varname>NoNewPrivileges=yes</varname> is implied.</para>
<xi:include href="system-only.xml" xpointer="singular"/></listitem>
</varlistentry>
system call (not to be confused with the libc API
<citerefentry project='man-pages'><refentrytitle>syslog</refentrytitle><manvolnum>3</manvolnum></citerefentry>
for userspace logging). The kernel exposes its log buffer to userspace via <filename>/dev/kmsg</filename> and
- <filename>/proc/kmsg</filename>. If enabled, these are made inaccessible to all the processes in the unit.</para>
+ <filename>/proc/kmsg</filename>. If enabled, these are made inaccessible to all the processes in the unit.
+ If this setting is on, but the unit doesn't have the <constant>CAP_SYS_ADMIN</constant>
+ capability (e.g. services for which <varname>User=</varname> is set),
+ <varname>NoNewPrivileges=yes</varname> is implied.</para>
<xi:include href="system-only.xml" xpointer="singular"/></listitem>
</varlistentry>
restrictions of this option. Specifically, it is recommended to combine this option with
<varname>SystemCallArchitectures=native</varname> or similar. If running in user mode, or in system
mode, but without the <constant>CAP_SYS_ADMIN</constant> capability (e.g. setting
- <varname>User=nobody</varname>), <varname>NoNewPrivileges=yes</varname> is implied. By default, no
+ <varname>User=</varname>), <varname>NoNewPrivileges=yes</varname> is implied. By default, no
restrictions apply, all address families are accessible to processes. If assigned the empty string,
any previous address family restriction changes are undone. This setting does not affect commands
prefixed with <literal>+</literal>.</para>
explicitly specify killing. This value takes precedence over the one given in
<varname>SystemCallErrorNumber=</varname>, see below. If running in user mode, or in system mode,
but without the <constant>CAP_SYS_ADMIN</constant> capability (e.g. setting
- <varname>User=nobody</varname>), <varname>NoNewPrivileges=yes</varname> is implied. This feature
+ <varname>User=</varname>), <varname>NoNewPrivileges=yes</varname> is implied. This feature
makes use of the Secure Computing Mode 2 interfaces of the kernel ('seccomp filtering') and is useful
for enforcing a minimal sandboxing environment. Note that the <function>execve()</function>,
<function>exit()</function>, <function>exit_group()</function>, <function>getrlimit()</function>,
the special identifier <constant>native</constant>. The special identifier <constant>native</constant>
implicitly maps to the native architecture of the system (or more precisely: to the architecture the system
manager is compiled for). If running in user mode, or in system mode, but without the
- <constant>CAP_SYS_ADMIN</constant> capability (e.g. setting <varname>User=nobody</varname>),
+ <constant>CAP_SYS_ADMIN</constant> capability (e.g. setting <varname>User=</varname>),
<varname>NoNewPrivileges=yes</varname> is implied. By default, this option is set to the empty list, i.e. no
filtering is applied.</para>
system calls executed by the unit processes for the listed ones will be logged. If the first
character of the list is <literal>~</literal>, the effect is inverted: all system calls except the
listed system calls will be logged. If running in user mode, or in system mode, but without the
- <constant>CAP_SYS_ADMIN</constant> capability (e.g. setting <varname>User=nobody</varname>),
+ <constant>CAP_SYS_ADMIN</constant> capability (e.g. setting <varname>User=</varname>),
<varname>NoNewPrivileges=yes</varname> is implied. This feature makes use of the Secure Computing
Mode 2 interfaces of the kernel ('seccomp filtering') and is useful for auditing or setting up a
minimal sandboxing environment. This option may be specified more than once, in which case the filter
<row>
<entry>226</entry>
<entry><constant>EXIT_NAMESPACE</constant></entry>
- <entry>Failed to set up mount namespacing. See <varname>ReadOnlyPaths=</varname> and related settings above.</entry>
+ <entry>Failed to set up mount, UTS, or IPC namespacing. See <varname>ReadOnlyPaths=</varname>, <varname>ProtectHostname=</varname>, <varname>PrivateIPC=</varname>, and related settings above.</entry>
</row>
<row>
<entry>227</entry>
<citerefentry><refentrytitle>systemd.syntax</refentrytitle><manvolnum>7</manvolnum></citerefentry> for a
general description of the syntax.</para>
- <para>The link files are read from the files located in the system
- network directory <filename>/usr/lib/systemd/network</filename>,
- the volatile runtime network directory
- <filename>/run/systemd/network</filename>, and the local
- administration network directory
- <filename>/etc/systemd/network</filename>. Link files must have
- the extension <filename>.link</filename>; other extensions are
- ignored. All link files are collectively sorted and processed in
- lexical order, regardless of the directories in which they live.
- However, files with identical filenames replace each other. Files
- in <filename>/etc/</filename> have the highest priority, files in
- <filename>/run/</filename> take precedence over files with the same
- name in <filename>/usr/lib/</filename>. This can be used to
- override a system-supplied link file with a local file if needed.
- As a special case, an empty file (file size 0) or symlink with the
- same name pointing to <filename>/dev/null</filename> disables the
- configuration file entirely (it is "masked").</para>
+ <para>The link files are read from the files located in the system network directory
+ <filename>/usr/lib/systemd/network</filename>, the volatile runtime network directory
+ <filename>/run/systemd/network</filename>, and the local administration network directory
+ <filename>/etc/systemd/network</filename>. Link files must have the extension
+ <filename>.link</filename>; other extensions are ignored. All link files are collectively sorted
+ and processed in lexical order, regardless of the directories in which they live. However, files
+ with identical filenames replace each other. Files in <filename>/etc/</filename> have the highest
+ priority, files in <filename>/run/</filename> take precedence over files with the same name in
+ <filename>/usr/lib/</filename>. This can be used to override a system-supplied link file with a
+ local file if needed. As a special case, an empty file (file size 0) or symlink with the same name
+ pointing to <filename>/dev/null</filename> disables the configuration file entirely (it is
+ "masked").</para>
+
+ <para>Along with the link file <filename>foo.link</filename>, a "drop-in" directory
+ <filename>foo.link.d/</filename> may exist. All files with the suffix <literal>.conf</literal>
+ from this directory will be parsed after the file itself is parsed. This is useful to alter or add
+ configuration settings, without having to modify the main configuration file. Each drop-in file
+ must have appropriate section headers.</para>
+
+ <para>In addition to <filename>/etc/systemd/network</filename>, drop-in <literal>.d</literal>
+ directories can be placed in <filename>/usr/lib/systemd/network</filename> or
+ <filename>/run/systemd/network</filename> directories. Drop-in files in <filename>/etc/</filename>
+ take precedence over those in <filename>/run/</filename> which in turn take precedence over those
+ in <filename>/usr/lib/</filename>. Drop-in files under any of these directories take precedence
+ over the main link file wherever located.</para>
<para>The link file contains a [Match] section, which determines if a given link file may be applied to a
given device, as well as a [Link] section specifying how the device should be configured. The first (in
<term><varname>HopPenalty=</varname></term>
<listitem>
<para>The hop penalty setting allows to modify
- <citerefentry><refentrytitle>batctl</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+ <citerefentry project='mankier'><refentrytitle>batctl</refentrytitle><manvolnum>8</manvolnum></citerefentry>
preference for multihop routes vs. short routes. This integer value is applied to the
TQ (Transmit Quality) of each forwarded OGM (Originator Message), thereby propagating the
cost of an extra hop (the packet has to be received and retransmitted which costs airtime).
<varlistentry>
<term><varname>UseDNS=</varname></term>
<listitem>
- <para>When true (the default), the DNS servers received
- from the DHCP server will be used and take precedence over
- any statically configured ones.</para>
+ <para>When true (the default), the DNS servers received from the DHCP server will be used.</para>
<para>This corresponds to the <option>nameserver</option>
option in <citerefentry
<term><varname>UseNTP=</varname></term>
<listitem>
<para>When true (the default), the NTP servers received from the DHCP server will be used by
- <filename>systemd-timesyncd.service</filename> and take precedence over any statically configured
- ones.</para>
+ <filename>systemd-timesyncd.service</filename>.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><varname>UseGateway=</varname></term>
<listitem>
<para>When true, the gateway will be requested from the DHCP server and added to the routing table with a
- metric of 1024, and a scope of "link". When unset, the value specified with <option>UseRoutes=</option>
+ metric of 1024, and a scope of "link". When unset, the value specified with <option>UseRoutes=</option>
is used.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><varname>UseTimezone=</varname></term>
-
<listitem><para>When true, the timezone received from the
DHCP server will be set as timezone of the local
system. Defaults to <literal>no</literal>.</para></listitem>
<varlistentry>
<term><varname>UseDNS=</varname></term>
<listitem>
- <para>When true (the default), the DNS servers received in the Router Advertisement will be used and take
- precedence over any statically configured ones.</para>
+ <para>When true (the default), the DNS servers received in the Router Advertisement will be used.</para>
<para>This corresponds to the <option>nameserver</option> option in <citerefentry
project='man-pages'><refentrytitle>resolv.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>.</para>
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><varname>ExitType=</varname></term>
+
+ <listitem>
+ <para>Configures the process exit type for this service unit. One of <option>main</option> or
+ <option>cgroup</option>:</para>
+
+ <itemizedlist>
+ <listitem><para>If set to <option>main</option> (the default), the service manager
+ will consider the unit stopped when the main process, which is determined according to the `Type`, exits.
+ </para></listitem>
+
+ <listitem><para>The <option>cgroup</option> exit type is meant for applications whose forking model is not
+ known ahead of time and which might not have a specific main process. The service will stay running as long
+ as at least one process in the cgroup is running. The exit status of the service is that of the last
+ process in the cgroup to exit.</para></listitem>
+ </itemizedlist>
+
+ <para>It is generally recommended to use <varname>ExitType=</varname><option>main</option> when a service has
+ a known forking model and a main process can reliably be determined. <varname>ExitType=</varname>
+ <option>cgroup</option> is well suited for transient or automatically generated services, such as graphical
+ applications inside of a desktop environment.</para>
+ </listitem>
+ </varlistentry>
+
<varlistentry>
<term><varname>RemainAfterExit=</varname></term>
If set to <option>no</option> (the default), the service will
not be restarted. If set to <option>on-success</option>, it
will be restarted only when the service process exits cleanly.
- In this context, a clean exit means an exit code of 0, or one
- of the signals
- <constant>SIGHUP</constant>,
- <constant>SIGINT</constant>,
- <constant>SIGTERM</constant> or
- <constant>SIGPIPE</constant>, and
- additionally, exit statuses and signals specified in
- <varname>SuccessExitStatus=</varname>. If set to
+ In this context, a clean exit means any of the following:
+ <itemizedlist>
+ <listitem><simpara>exit code of 0;</simpara></listitem>
+ <listitem><simpara>for types other than
+ <varname>Type=oneshot</varname>, one of the signals
+ <constant>SIGHUP</constant>,
+ <constant>SIGINT</constant>,
+ <constant>SIGTERM</constant>, or
+ <constant>SIGPIPE</constant>;</simpara></listitem>
+ <listitem><simpara>exit statuses and signals specified in
+ <varname>SuccessExitStatus=</varname>.</simpara></listitem>
+ </itemizedlist>
+ If set to
<option>on-failure</option>, the service will be restarted
when the process exits with a non-zero exit code, is
terminated by a signal (including on core dump, but excluding
<listitem><para>Takes a list of exit status definitions that, when returned by the main service
process, will be considered successful termination, in addition to the normal successful exit status
- 0 and the signals <constant>SIGHUP</constant>, <constant>SIGINT</constant>,
+ 0 and, except for <varname>Type=oneshot</varname>, the signals <constant>SIGHUP</constant>, <constant>SIGINT</constant>,
<constant>SIGTERM</constant>, and <constant>SIGPIPE</constant>. Exit status definitions can be
numeric termination statuses, termination status names, or termination signal names, separated by
spaces. See the Process Exit Codes section in
<listitem><para>For units that start processes (such as service units), lists one or more other units
whose network and/or temporary file namespace to join. This only applies to unit types which support
- the <varname>PrivateNetwork=</varname>, <varname>NetworkNamespacePath=</varname> and
+ the <varname>PrivateNetwork=</varname>, <varname>NetworkNamespacePath=</varname>,
+ <varname>PrivateIPC=</varname>, <varname>IPCNamespacePath=</varname>, and
<varname>PrivateTmp=</varname> directives (see
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry> for
details). If a unit that has this setting set is started, its processes will see the same
- <filename>/tmp/</filename>, <filename>/var/tmp/</filename> and network namespace as one listed unit
- that is started. If multiple listed units are already started, it is not defined which namespace is
- joined. Note that this setting only has an effect if
- <varname>PrivateNetwork=</varname>/<varname>NetworkNamespacePath=</varname> and/or
+ <filename>/tmp/</filename>, <filename>/var/tmp/</filename>, IPC namespace and network namespace as
+ one listed unit that is started. If multiple listed units are already started, it is not defined
+ which namespace is joined. Note that this setting only has an effect if
+ <varname>PrivateNetwork=</varname>/<varname>NetworkNamespacePath=</varname>,
+ <varname>PrivateIPC=</varname>/<varname>IPCNamespacePath=</varname> and/or
<varname>PrivateTmp=</varname> is enabled for both the unit that joins the namespace and the unit
whose namespace is joined.</para></listitem>
</varlistentry>
<varname>Restart=</varname> logic.</para>
<para>Note that units which are configured for <varname>Restart=</varname>, and which reach the start
- limit are not attempted to be restarted anymore; however, they may still be restarted manually at a
- later point, after the <replaceable>interval</replaceable> has passed. From that point on, the
- restart logic is activated again. <command>systemctl reset-failed</command> will cause the restart
- rate counter for a service to be flushed, which is useful if the administrator wants to manually
- start a unit and the start limit interferes with that. Rate-limiting is enforced after any unit
- condition checks are executed, and hence unit activations with failing conditions do not count
- towards the rate limit.</para>
+ limit are not attempted to be restarted anymore; however, they may still be restarted manually or
+ from a timer or socket at a later point, after the <replaceable>interval</replaceable> has passed.
+ From that point on, the restart logic is activated again. <command>systemctl reset-failed</command>
+ will cause the restart rate counter for a service to be flushed, which is useful if the administrator
+ wants to manually start a unit and the start limit interferes with that. Rate-limiting is enforced
+ after any unit condition checks are executed, and hence unit activations with failing conditions do
+ not count towards the rate limit.</para>
<para>When a unit is unloaded due to the garbage collection logic (see above) its rate limit counters
are flushed out too. This means that configuring start rate limiting for a unit that is not
)
libsystemd_version = '0.31.0'
-libudev_version = '1.7.0'
+libudev_version = '1.7.1'
# We need the same data in two different formats, ugh!
# Also, for hysterical reasons, we use different variable
polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
-xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
+xinitrcdir = get_option('xinitrcdir') == '' ? join_paths(sysconfdir, 'X11/xinit/xinitrc.d') : get_option('xinitrcdir')
rpmmacrosdir = get_option('rpmmacrosdir')
if rpmmacrosdir != 'no'
rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
localegen_path = get_option('localegen-path')
have = false
+writable = ''
if localegen_path != ''
conf.set_quoted('LOCALEGEN_PATH', localegen_path)
have = true
+ writable = ' /usr/lib/locale'
endif
+substs.set('SERVICE_LOCALEGEN_WRITABLE', writable)
conf.set10('HAVE_LOCALEGEN', have)
conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
install_data('xorg/50-systemd-user.sh',
install_dir : xinitrcdir)
endif
-install_data('modprobe.d/systemd.conf',
+install_data('README',
+ 'modprobe.d/systemd.conf',
install_dir : modprobedir)
install_data('LICENSE.GPL2',
'LICENSE.LGPL2.1',
description : 'directory for arch-independent pkg-config files')
option('pkgconfiglibdir', type : 'string', value : '',
description : 'directory for standard pkg-config files')
+option('xinitrcdir', type : 'string', value : '',
+ description : 'directory for xinitrc files')
option('rpmmacrosdir', type : 'string', value : 'lib/rpm/macros.d',
description : 'directory for rpm macros ["no" disables]')
option('pamlibdir', type : 'string',
description : 'gnu-efi support for sd-boot')
option('efi-cc', type : 'array',
description : 'the compiler to use for EFI modules')
-option('efi-ld', type : 'string',
+option('efi-ld', type : 'string', value : 'ld',
description : 'the linker to use for EFI modules')
option('efi-libdir', type : 'string',
description : 'path to the EFI lib directory')
--- /dev/null
+Files in this directory contain configuration for modprobe, a program to load
+kernel modules.
+
+See man:modprobe.d(5) for explanation of the configuration file format, and
+man:modprobe(8) for a description of the program itself.
+
+Use 'systemd-analyze cat-config modprobe.d' to display the effective config.
# Korean translation for the systemd.
# Seong-ho Cho <shcho@gnome.org>, 2015.
# Dongsu Park <dongsu@endocode.com>, 2015.
-#
+# simmon <simmon@nplob.com>, 2021.
msgid ""
msgstr ""
"Project-Id-Version: systemd\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-08 17:48+0100\n"
-"PO-Revision-Date: 2015-11-03 13:19+0100\n"
-"Last-Translator: Dongsu Park <dongsu@endocode.com>\n"
-"Language-Team: GNOME Korea <gnome-kr@googlegroups.com>\n"
+"PO-Revision-Date: 2021-03-25 03:01+0000\n"
+"Last-Translator: simmon <simmon@nplob.com>\n"
+"Language-Team: Korean <https://translate.fedoraproject.org/projects/systemd/"
+"master/ko/>\n"
"Language: ko\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Gtranslator 2.91.7\n"
"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 4.5.1\n"
"X-Poedit-SourceCharset: UTF-8\n"
#: src/core/org.freedesktop.systemd1.policy.in:22
#: src/home/org.freedesktop.home1.policy:13
msgid "Create a home area"
-msgstr ""
+msgstr "홈 영역 생성"
#: src/home/org.freedesktop.home1.policy:14
-#, fuzzy
-#| msgid "Authentication is required to reload the systemd state."
msgid "Authentication is required to create a user's home area."
-msgstr "systemd 상태를 다시 불러오려면 인증이 필요합니다."
+msgstr "사용자 홈 영역을 생성하기 위해서는 인증이 필요합니다."
#: src/home/org.freedesktop.home1.policy:23
msgid "Remove a home area"
-msgstr ""
+msgstr "홈 영역 제거"
#: src/home/org.freedesktop.home1.policy:24
-#, fuzzy
-#| msgid "Authentication is required to reload the systemd state."
msgid "Authentication is required to remove a user's home area."
-msgstr "systemd 상태를 다시 불러오려면 인증이 필요합니다."
+msgstr "사용자 홈 영역을 제거하기 위해서는 인증이 필요합니다."
#: src/home/org.freedesktop.home1.policy:33
msgid "Check credentials of a home area"
-msgstr ""
+msgstr "홈영역 자격증명 확인"
#: src/home/org.freedesktop.home1.policy:34
-#, fuzzy
-#| msgid ""
-#| "Authentication is required to manage active sessions, users and seats."
msgid ""
"Authentication is required to check credentials against a user's home area."
-msgstr "활성 세션, 사용자 시트를 관리하려면 인증이 필요합니다."
+msgstr "사용자 홈 영역의 자격증명 확인하려면 인증이 필요합니다."
#: src/home/org.freedesktop.home1.policy:43
msgid "Update a home area"
-msgstr ""
+msgstr "홈 영역을 최신화"
#: src/home/org.freedesktop.home1.policy:44
-#, fuzzy
-#| msgid "Authentication is required to attach a device to a seat."
msgid "Authentication is required to update a user's home area."
-msgstr "ì\8b\9cí\8a¸ì\97\90 ì\9e¥ì¹\98 ë¶\80ì°©ì\9d\84 í\97\88ì\9a©하려면 인증이 필요합니다."
+msgstr "ì\82¬ì\9a©ì\9e\90 í\99\88 ì\98\81ì\97ì\9d\84 ìµ\9cì\8b í\99\94 하려면 인증이 필요합니다."
#: src/home/org.freedesktop.home1.policy:53
msgid "Resize a home area"
-msgstr ""
+msgstr "홈 영역을 조절"
#: src/home/org.freedesktop.home1.policy:54
-#, fuzzy
-#| msgid "Authentication is required to set a wall message"
msgid "Authentication is required to resize a user's home area."
-msgstr "wall 메시지를 설정하려면 인증이 필요합니다"
+msgstr "사용자 홈 영역의 크기를 조절하려면 인증이 필요합니다."
#: src/home/org.freedesktop.home1.policy:63
msgid "Change password of a home area"
-msgstr ""
+msgstr "홈 영역의 비밀번호를 변경"
#: src/home/org.freedesktop.home1.policy:64
-#, fuzzy
-#| msgid ""
-#| "Authentication is required to manage active sessions, users and seats."
msgid ""
"Authentication is required to change the password of a user's home area."
-msgstr "활성 세션, 사용자 시트를 관리하려면 인증이 필요합니다."
+msgstr "사용자 홈 영역의 비밀번호를 변경하려면 비밀번호가 필요합니다."
#: src/hostname/org.freedesktop.hostname1.policy:20
msgid "Set hostname"
msgid ""
"Authentication is required to set the statically configured local hostname, "
"as well as the pretty hostname."
-msgstr ""
-"로컬 호스트 이름을 모양새를 갖춘 호스트 이름 처럼 정적으로 설정하려면 인증"
-"이 필요합니다."
+msgstr "로컬호스트 이름을 모양새를 갖춘 호스트이름 처럼 정적으로 설정하려면 인증이 필요합니다."
#: src/hostname/org.freedesktop.hostname1.policy:41
msgid "Set machine information"
#: src/hostname/org.freedesktop.hostname1.policy:51
msgid "Get product UUID"
-msgstr ""
+msgstr "제품 UUID를 획득"
#: src/hostname/org.freedesktop.hostname1.policy:52
-#, fuzzy
-#| msgid "Authentication is required to reload '$(unit)'."
msgid "Authentication is required to get product UUID."
-msgstr "'$(unit)' 서비스 유닛을 다시 불러오려면 인증이 필요합니다."
+msgstr "제품 UUID를 얻기 위해서는 인증이 필요합니다."
#: src/import/org.freedesktop.import1.policy:22
msgid "Import a VM or container image"
#: src/import/org.freedesktop.import1.policy:42
msgid "Download a VM or container image"
-msgstr "ê°\80ì\83\81머ì\8b ë\98\90ë\8a\94 컨í\85\8cì\9d´ë\84\88 ì\9d´ë¯¸ì§\80 ë\8b¤ì\9a´ë¡\9cë\93\9c"
+msgstr "ê°\80ì\83\81머ì\8b ë\98\90ë\8a\94 컨í\85\8cì\9d´ë\84\88 ì\9d´ë¯¸ì§\80 ë\82´ë ¤ë°\9b기"
#: src/import/org.freedesktop.import1.policy:43
msgid "Authentication is required to download a VM or container image"
-msgstr "ê°\80ì\83\81머ì\8b ë\98\90ë\8a\94 컨í\85\8cì\9d´ë\84\88 ì\9d´ë¯¸ì§\80를 ë\8b¤ì\9a´ë¡\9cë\93\9c하려면 인증이 필요합니다"
+msgstr "ê°\80ì\83\81머ì\8b ë\98\90ë\8a\94 컨í\85\8cì\9d´ë\84\88 ì\9d´ë¯¸ì§\80를 ë\82´ë ¤ë°\9b기하려면 인증이 필요합니다"
#: src/locale/org.freedesktop.locale1.policy:22
msgid "Set system locale"
"니다."
#: src/login/org.freedesktop.login1.policy:117
-#, fuzzy
-#| msgid "Allow applications to inhibit system handling of the power key"
msgid "Allow applications to inhibit system handling of the reboot key"
-msgstr "프로그램의 시스템 전원 키 처리 방지 요청 허용"
+msgstr "응용프로그램이 리부트 키 처리하는 시스템 방지 허용"
#: src/login/org.freedesktop.login1.policy:118
-#, fuzzy
-#| msgid ""
-#| "Authentication is required for an application to inhibit system handling "
-#| "of the power key."
msgid ""
"Authentication is required for an application to inhibit system handling of "
"the reboot key."
-msgstr ""
-"프로그램의 시스템 전원 키 처리 방지 요청을 허용하려면 인증이 필요합니다."
+msgstr "응용프로그램이 시스템 리부트 키 처리 방지 요청을 허용하려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:128
-#, fuzzy
-#| msgid "Allow non-logged-in users to run programs"
msgid "Allow non-logged-in user to run programs"
msgstr "비 로그인 사용자 프로그램 실행 허용"
#: src/login/org.freedesktop.login1.policy:129
-#, fuzzy
-#| msgid "Authentication is required to run programs as a non-logged-in user."
msgid "Explicit request is required to run programs as a non-logged-in user."
-msgstr "비 로그인 사용자에게 프로그램 실행을 허용하려면 인증이 필요합니다."
+msgstr "비 로그인 사용자에게 프로그램 실행하려면 명시적 요청이 필요합니다."
#: src/login/org.freedesktop.login1.policy:138
msgid "Allow non-logged-in users to run programs"
"인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:235
-#, fuzzy
-#| msgid "Hibernate the system"
msgid "Halt the system"
-msgstr "ì\8b\9cì\8a¤í\85\9c ìµ\9cë\8c\80 ì \88ì \84 ì\83\81í\83\9c 진입"
+msgstr "ì\8b\9cì\8a¤í\85\9c ì \95ì§\80 진입"
#: src/login/org.freedesktop.login1.policy:236
-#, fuzzy
-#| msgid "Authentication is required to hibernate the system."
msgid "Authentication is required to halt the system."
-msgstr "ì\8b\9cì\8a¤í\85\9cì\9d\84 ìµ\9cë\8c\80 ì \88ì \84 상태로 놓으려면 인증이 필요합니다."
+msgstr "ì\8b\9cì\8a¤í\85\9cì\9d\84 ì \95ì§\80 상태로 놓으려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:246
-#, fuzzy
-#| msgid "Hibernate the system while other users are logged in"
msgid "Halt the system while other users are logged in"
-msgstr "다른 사용자가 로그인 했을 때 시스템 최대 절전 상태 진입"
+msgstr "다른 사용자가 로그인 했을 때 시스템이 정지 상태진입"
#: src/login/org.freedesktop.login1.policy:247
-#, fuzzy
-#| msgid ""
-#| "Authentication is required to hibernate the system while other users are "
-#| "logged in."
msgid ""
"Authentication is required to halt the system while other users are logged "
"in."
-msgstr ""
-"다른 사용자가 로그인 했을 때 시스템을 최대 절전 상태로 놓으려면 인증이 필요합"
-"니다."
+msgstr "다른 사용자가 로그인 했을 때 시스템을 정지 상태로 놓으려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:257
-#, fuzzy
-#| msgid "Hibernate the system while an application is inhibiting this"
msgid "Halt the system while an application is inhibiting this"
-msgstr ""
-"프로그램이 최대 절전 상태 진입을 못하게 요청할 때 시스템 최대 절전 상태 진입"
+msgstr "응용프로그램이 이와 같이 금지 상태일 때에 시스템 정지 상태 진입"
#: src/login/org.freedesktop.login1.policy:258
-#, fuzzy
-#| msgid ""
-#| "Authentication is required to hibernate the system while an application "
-#| "is inhibiting this."
msgid ""
"Authentication is required to halt the system while an application is "
"inhibiting this."
-msgstr ""
-"프로그램이 최대 절전 상태 진입을 못하게 요청할 때 시스템을 최대 절전 상태로 "
-"놓으려면 인증이 필요합니다."
+msgstr "응용프로그램이 이와 같이 금지 할 때에는 시스템을 정지 할 때에는인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:268
msgid "Suspend the system"
#: src/login/org.freedesktop.login1.policy:352
msgid "Set the reboot \"reason\" in the kernel"
-msgstr ""
+msgstr "커널이 재시작 \"원인\"을 설정합니다"
#: src/login/org.freedesktop.login1.policy:353
-#, fuzzy
-#| msgid "Authentication is required to set the system timezone."
msgid "Authentication is required to set the reboot \"reason\" in the kernel."
-msgstr "ì\8b\9cì\8a¤í\85\9c ì\8b\9cê°\84ë\8c\80를 설정하려면 인증이 필요합니다."
+msgstr "커ë\84\90ì\97\90ì\84\9c \"reason\"ì\9c¼ë¡\9c ì\9e¬ë\8f\99ì\9e\91 설정하려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:363
-#, fuzzy
-#| msgid "Allow indication to the firmware to boot to setup interface"
msgid "Indicate to the firmware to boot to setup interface"
-msgstr "설정 화면으로 부팅하도록 펌웨어에게 지시 허용"
+msgstr "설정 화면으로 부팅하도록 펌웨어에게 지시"
#: src/login/org.freedesktop.login1.policy:364
msgid ""
#: src/login/org.freedesktop.login1.policy:374
msgid "Indicate to the boot loader to boot to the boot loader menu"
-msgstr ""
+msgstr "부트로더 메뉴에 부팅하기 위해 부트로더에 표시하기"
#: src/login/org.freedesktop.login1.policy:375
-#, fuzzy
-#| msgid ""
-#| "Authentication is required to indicate to the firmware to boot to setup "
-#| "interface."
msgid ""
"Authentication is required to indicate to the boot loader to boot to the "
"boot loader menu."
-msgstr "설정 화면으로 부팅하도록 펌웨어에게 지시하려면 인증이 필요합니다."
+msgstr "부트로더에 부팅하려면 부트로더 메뉴에 표시하려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:385
msgid "Indicate to the boot loader to boot a specific entry"
-msgstr ""
+msgstr "특정 항목으로 재시작 하기 위해 부트로더 표시"
#: src/login/org.freedesktop.login1.policy:386
-#, fuzzy
-#| msgid ""
-#| "Authentication is required to indicate to the firmware to boot to setup "
-#| "interface."
msgid ""
"Authentication is required to indicate to the boot loader to boot into a "
"specific boot loader entry."
-msgstr "설정 화면으로 부팅하도록 펌웨어에게 지시하려면 인증이 필요합니다."
+msgstr "부트로더에 지정한 부트로더 에서 부트하거나 지정한 부트로더 진입을 표시하려면 인증이 필요합니다."
#: src/login/org.freedesktop.login1.policy:396
msgid "Set a wall message"
#: src/login/org.freedesktop.login1.policy:406
msgid "Change Session"
-msgstr ""
+msgstr "세션 변경"
#: src/login/org.freedesktop.login1.policy:407
-#, fuzzy
-#| msgid "Authentication is required to set the local hostname."
msgid "Authentication is required to change the virtual terminal."
-msgstr "로컬 호스트 이름을 설정하려면 인증이 필요합니다."
+msgstr "가상 터미널을 변경하려면 인증이 필요합니다."
#: src/machine/org.freedesktop.machine1.policy:22
msgid "Log into a local container"
#: src/network/org.freedesktop.network1.policy:22
msgid "Set NTP servers"
-msgstr ""
+msgstr "NTP 서버 설정"
#: src/network/org.freedesktop.network1.policy:23
-#, fuzzy
-#| msgid "Authentication is required to set the system time."
msgid "Authentication is required to set NTP servers."
-msgstr "시스템 시간을 설정하려면 인증이 필요합니다."
+msgstr "NTP 서버 설정에 인증이 필요합니다."
#: src/network/org.freedesktop.network1.policy:33
#: src/resolve/org.freedesktop.resolve1.policy:44
msgid "Set DNS servers"
-msgstr ""
+msgstr "DNS 서버 설정"
#: src/network/org.freedesktop.network1.policy:34
#: src/resolve/org.freedesktop.resolve1.policy:45
-#, fuzzy
-#| msgid "Authentication is required to set the system time."
msgid "Authentication is required to set DNS servers."
-msgstr "시스템 시간을 설정하려면 인증이 필요합니다."
+msgstr "DNS 서버를 설정하려면 인증이 필요합니다."
#: src/network/org.freedesktop.network1.policy:44
#: src/resolve/org.freedesktop.resolve1.policy:55
msgid "Set domains"
-msgstr ""
+msgstr "도메인 설정"
#: src/network/org.freedesktop.network1.policy:45
#: src/resolve/org.freedesktop.resolve1.policy:56
-#, fuzzy
-#| msgid "Authentication is required to stop '$(unit)'."
msgid "Authentication is required to set domains."
-msgstr "'$(unit)' 서비스 유닛을 멈추려면 인증이 필요합니다."
+msgstr "도메인을 설정하려면 인증이 필요합니다."
#: src/network/org.freedesktop.network1.policy:55
#: src/resolve/org.freedesktop.resolve1.policy:66
msgid "Set default route"
-msgstr ""
+msgstr "기본 라우트 설정"
#: src/network/org.freedesktop.network1.policy:56
#: src/resolve/org.freedesktop.resolve1.policy:67
-#, fuzzy
-#| msgid "Authentication is required to set the local hostname."
msgid "Authentication is required to set default route."
-msgstr "로컬 호스트 이름을 설정하려면 인증이 필요합니다."
+msgstr "기본 라우트 설정하려면 인증이 필요합니다."
#: src/network/org.freedesktop.network1.policy:66
#: src/resolve/org.freedesktop.resolve1.policy:77
msgid "Enable/disable LLMNR"
-msgstr ""
+msgstr "LLMNR 활성화/비활성화"
#: src/network/org.freedesktop.network1.policy:67
#: src/resolve/org.freedesktop.resolve1.policy:78
-#, fuzzy
-#| msgid "Authentication is required to hibernate the system."
msgid "Authentication is required to enable or disable LLMNR."
-msgstr "시스템을 최대 절전 상태로 놓으려면 인증이 필요합니다."
+msgstr "LLMNR을 활성화 또는 비활성화 하려면 인증이 필요합니다."
#: src/network/org.freedesktop.network1.policy:77
#: src/resolve/org.freedesktop.resolve1.policy:88
msgid "Enable/disable multicast DNS"
-msgstr ""
+msgstr "멀티캐스트 DNS 활성화/비활성화"
#: src/network/org.freedesktop.network1.policy:78
#: src/resolve/org.freedesktop.resolve1.policy:89
-#, fuzzy
-#| msgid "Authentication is required to log into the local host."
msgid "Authentication is required to enable or disable multicast DNS."
-msgstr "ë¡\9c컬 í\98¸ì\8a¤í\8a¸ë¡\9c ë¡\9cê·¸ì\9d¸하려면 인증이 필요합니다."
+msgstr "ë©\80í\8b°ìº\90ì\8a¤í\8a¸ DNS í\99\9cì\84±í\99\94 ë\98\90ë\8a\94 ë¹\84í\99\9cì\84±í\99\94하려면 인증이 필요합니다."
#: src/network/org.freedesktop.network1.policy:88
#: src/resolve/org.freedesktop.resolve1.policy:99
msgid "Enable/disable DNS over TLS"
-msgstr ""
+msgstr "TLS를 통한 DNS 활성화/비활성화"
#: src/network/org.freedesktop.network1.policy:89
#: src/resolve/org.freedesktop.resolve1.policy:100
-#, fuzzy
-#| msgid "Authentication is required to set the local hostname."
msgid "Authentication is required to enable or disable DNS over TLS."
-msgstr "로컬 호스트 이름을 설정하려면 인증이 필요합니다."
+msgstr "TLS를 통 DNS를 활성화 또는 비활성화하려면 인증이 필요합니다."
#: src/network/org.freedesktop.network1.policy:99
#: src/resolve/org.freedesktop.resolve1.policy:110
msgid "Enable/disable DNSSEC"
-msgstr ""
+msgstr "DNSSEC 활성화/비활성화"
#: src/network/org.freedesktop.network1.policy:100
#: src/resolve/org.freedesktop.resolve1.policy:111
-#, fuzzy
-#| msgid "Authentication is required to hibernate the system."
msgid "Authentication is required to enable or disable DNSSEC."
-msgstr "시스템을 최대 절전 상태로 놓으려면 인증이 필요합니다."
+msgstr "DNSSEC를 활성화 또는 비활성화 하려면 인증이 필요합니다."
#: src/network/org.freedesktop.network1.policy:110
#: src/resolve/org.freedesktop.resolve1.policy:121
msgid "Set DNSSEC Negative Trust Anchors"
-msgstr ""
+msgstr "DNSSEC 부정적인 신뢰 고정 설정"
#: src/network/org.freedesktop.network1.policy:111
#: src/resolve/org.freedesktop.resolve1.policy:122
-#, fuzzy
-#| msgid "Authentication is required to set the system locale."
msgid "Authentication is required to set DNSSEC Negative Trust Anchors."
-msgstr "시스템 로캘을 설정하려면 인증이 필요합니다."
+msgstr "DNSSEC 부정적인 신뢰 고정을 설정하려면 인증이 필요합니다."
#: src/network/org.freedesktop.network1.policy:121
msgid "Revert NTP settings"
-msgstr ""
+msgstr "NTP 설정 되돌리기"
#: src/network/org.freedesktop.network1.policy:122
-#, fuzzy
-#| msgid "Authentication is required to set the system time."
msgid "Authentication is required to reset NTP settings."
-msgstr "시스템 시간을 설정하려면 인증이 필요합니다."
+msgstr "NTP 설정을 재시작하려면 인증이 필요합니다."
#: src/network/org.freedesktop.network1.policy:132
msgid "Revert DNS settings"
-msgstr ""
+msgstr "DNS 설정 되돌리기"
#: src/network/org.freedesktop.network1.policy:133
-#, fuzzy
-#| msgid "Authentication is required to set the system time."
msgid "Authentication is required to reset DNS settings."
-msgstr "시스템 시간을 설정하려면 인증이 필요합니다."
+msgstr "DNS 설정을 재시작하려면 인증이 필요합니다."
#: src/network/org.freedesktop.network1.policy:143
msgid "DHCP server sends force renew message"
-msgstr ""
+msgstr "DHCP 서버는 새로운 메시지를 강제로 보냅니다"
#: src/network/org.freedesktop.network1.policy:144
-#, fuzzy
-#| msgid "Authentication is required to set a wall message"
msgid "Authentication is required to send force renew message."
-msgstr "wall 메시지를 설정하려면 인증이 필요합니다"
+msgstr "새로운 메시지를 보내려면 인증이 필요합니다."
#: src/network/org.freedesktop.network1.policy:154
msgid "Renew dynamic addresses"
-msgstr ""
+msgstr "동적 주소 갱신"
#: src/network/org.freedesktop.network1.policy:155
-#, fuzzy
-#| msgid "Authentication is required to set a wall message"
msgid "Authentication is required to renew dynamic addresses."
-msgstr "wall 메시지를 설정하려면 인증이 필요합니다"
+msgstr "동적주소를 새로 변경하려면 인증이 필요합니다."
#: src/network/org.freedesktop.network1.policy:165
msgid "Reload network settings"
-msgstr ""
+msgstr "네트웍설정 다시 적재함"
#: src/network/org.freedesktop.network1.policy:166
-#, fuzzy
-#| msgid "Authentication is required to reload the systemd state."
msgid "Authentication is required to reload network settings."
-msgstr "systemd 상태를 다시 불러오려면 인증이 필요합니다."
+msgstr "네트웍 설정을 재적재하려면 인증이 필요합니다."
#: src/network/org.freedesktop.network1.policy:176
msgid "Reconfigure network interface"
-msgstr ""
+msgstr "네트워크 인터페이스 재설정"
#: src/network/org.freedesktop.network1.policy:177
-#, fuzzy
-#| msgid "Authentication is required to reboot the system."
msgid "Authentication is required to reconfigure network interface."
-msgstr "시스템을 다시 시작하려면 인증이 필요합니다."
+msgstr "네트웍 연결장치를 재설정하려면 인증이 필요합니다."
#: src/portable/org.freedesktop.portable1.policy:13
msgid "Inspect a portable service image"
-msgstr ""
+msgstr "이동 서비스 이미지 검사"
#: src/portable/org.freedesktop.portable1.policy:14
-#, fuzzy
-#| msgid "Authentication is required to import a VM or container image"
msgid "Authentication is required to inspect a portable service image."
-msgstr "VM 또는 컨테이너의 이미지를 가져오려면 인증이 필요합니다"
+msgstr "이동형 서비스 이미지를 검사하려면 인증이 필요합니다."
#: src/portable/org.freedesktop.portable1.policy:23
msgid "Attach or detach a portable service image"
-msgstr ""
+msgstr "이동 서비스 첨부 또는 분리"
#: src/portable/org.freedesktop.portable1.policy:24
-#, fuzzy
-#| msgid "Authentication is required to attach a device to a seat."
msgid ""
"Authentication is required to attach or detach a portable service image."
-msgstr "ì\8b\9cí\8a¸ì\97\90 ì\9e¥ì¹\98 ë¶\80ì°©ì\9d\84 í\97\88ì\9a©í\95\98ë ¤ë©´ 인증이 필요합니다."
+msgstr "ì\9d´ë\8f\99 ì\84\9cë¹\84ì\8a¤ ì\9e¥ì°© ë\98\90ë\8a\94 ë¶\84리ì\97\90ë\8a\94 인증이 필요합니다."
#: src/portable/org.freedesktop.portable1.policy:34
msgid "Delete or modify portable service image"
-msgstr ""
+msgstr "이동 서비스 이미지 삭제 또는 변경"
#: src/portable/org.freedesktop.portable1.policy:35
-#, fuzzy
-#| msgid "Authentication is required to download a VM or container image"
msgid ""
"Authentication is required to delete or modify a portable service image."
-msgstr "가상머신 또는 컨테이너 이미지를 다운로드하려면 인증이 필요합니다"
+msgstr "이동형 서비스 이미지를 지우거나 변경하려면 인증이 필요합니다."
#: src/resolve/org.freedesktop.resolve1.policy:22
msgid "Register a DNS-SD service"
-msgstr ""
+msgstr "DNS-SD 서비스 등록"
#: src/resolve/org.freedesktop.resolve1.policy:23
-#, fuzzy
-#| msgid "Authentication is required to set a wall message"
msgid "Authentication is required to register a DNS-SD service"
-msgstr "wall 메시지를 설정하려면 인증이 필요합니다"
+msgstr "DNS-SD 서비스 등록에는 인증이 필요합니다"
#: src/resolve/org.freedesktop.resolve1.policy:33
msgid "Unregister a DNS-SD service"
-msgstr ""
+msgstr "DNS-SD 서비스 해제"
#: src/resolve/org.freedesktop.resolve1.policy:34
-#, fuzzy
-#| msgid "Authentication is required to set a wall message"
msgid "Authentication is required to unregister a DNS-SD service"
-msgstr "wall 메시지를 설정하려면 인증이 필요합니다"
+msgstr "DNS-SD 서비스 등록해제에는 인증이 필요합니다"
#: src/resolve/org.freedesktop.resolve1.policy:132
msgid "Revert name resolution settings"
-msgstr ""
+msgstr "이름 확인 설정 되돌리기"
#: src/resolve/org.freedesktop.resolve1.policy:133
-#, fuzzy
-#| msgid "Authentication is required to set the system keyboard settings."
msgid "Authentication is required to reset name resolution settings."
-msgstr "ì\8b\9cì\8a¤í\85\9c í\82¤ë³´ë\93\9c를 ì\84¤ì \95하려면 인증이 필요합니다."
+msgstr "ì\9d´ë¦\84 í\95´ê²° ì\84¤ì \95ì\9d\84 ì\9e¬ì\8b\9cì\9e\91하려면 인증이 필요합니다."
#: src/timedate/org.freedesktop.timedate1.policy:22
msgid "Set system time"
msgstr "'$(unit)' 서비스 유닛을 다시 시작하려면 인증이 필요합니다."
#: src/core/dbus-unit.c:535
-#, fuzzy
-#| msgid "Authentication is required to set properties on '$(unit)'."
msgid ""
"Authentication is required to send a UNIX signal to the processes of "
"'$(unit)'."
-msgstr "'$(unit)' 서비스 유닛 속성을 설정하려면 인증이 필요합니다."
+msgstr "'$(unit)'의 처리에 유닉스 신호를 전송하려면 인증이 필요합니다."
#: src/core/dbus-unit.c:566
msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
msgstr "'$(unit)' 서비스 유닛 속성을 설정하려면 인증이 필요합니다."
#: src/core/dbus-unit.c:708
-#, fuzzy
-#| msgid ""
-#| "Authentication is required to reset the \"failed\" state of '$(unit)'."
msgid ""
"Authentication is required to delete files and directories associated with "
"'$(unit)'."
-msgstr "'$(unit)' 서비스 유닛의 \"실패\" 상태를 되돌리려면 인증이 필요합니다."
+msgstr "'$(unit)' 과 함께 지정된 파일 또는 디렉토리 삭제에는 인증이 필요합니다."
#: src/core/dbus-unit.c:757
-#, fuzzy
-#| msgid ""
-#| "Authentication is required to reset the \"failed\" state of '$(unit)'."
msgid ""
"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
-msgstr "'$(unit)' 서비스 유닛의 \"실패\" 상태를 되돌리려면 인증이 필요합니다."
+msgstr "'$(unit)'단위의 처리를 동결 또는 해제하기 위해서는 인증이 필요합니다."
#~ msgid "Authentication is required to kill '$(unit)'."
#~ msgstr "'$(unit)' 서비스 유닛을 강제로 끝내려면 인증이 필요합니다."
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the systemd package.
+# Pjotr Vertaalt <pjotrvertaalt@gmail.com>, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: systemd\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-01-08 17:48+0100\n"
+"PO-Revision-Date: 2021-03-24 09:16+0000\n"
+"Last-Translator: Pjotr Vertaalt <pjotrvertaalt@gmail.com>\n"
+"Language-Team: Dutch <https://translate.fedoraproject.org/projects/systemd/"
+"master/nl/>\n"
+"Language: nl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.5.1\n"
+
+#: src/core/org.freedesktop.systemd1.policy.in:22
+msgid "Send passphrase back to system"
+msgstr "Stuur wachtwoordzin terug naar systeem"
+
+#: src/core/org.freedesktop.systemd1.policy.in:23
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
+msgstr ""
+"Authenticatie is vereist voor het terugsturen van de ingevulde wachtwoordzin "
+"naar het systeem."
+
+#: src/core/org.freedesktop.systemd1.policy.in:33
+msgid "Manage system services or other units"
+msgstr "Beheer systeemdiensten of andere eenheden"
+
+#: src/core/org.freedesktop.systemd1.policy.in:34
+msgid "Authentication is required to manage system services or other units."
+msgstr ""
+"Authenticatie is vereist voor het beheren van systeemdiensten of andere "
+"eenheden."
+
+#: src/core/org.freedesktop.systemd1.policy.in:43
+msgid "Manage system service or unit files"
+msgstr "Beheer systeemdienst of eenheidbestanden"
+
+#: src/core/org.freedesktop.systemd1.policy.in:44
+msgid "Authentication is required to manage system service or unit files."
+msgstr ""
+"Authenticatie is vereist voor het beheren van systeemdienst of "
+"eenheidbestanden."
+
+#: src/core/org.freedesktop.systemd1.policy.in:54
+msgid "Set or unset system and service manager environment variables"
+msgstr "Stel omgevingsvariabelen in voor systeem en dienstenbeheerder"
+
+#: src/core/org.freedesktop.systemd1.policy.in:55
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+"Authenticatie is vereist voor het instellen van omgevingsvariabelen voor "
+"systeem en dienstenbeheerder."
+
+#: src/core/org.freedesktop.systemd1.policy.in:64
+msgid "Reload the systemd state"
+msgstr "Herlaad de status van systemd"
+
+#: src/core/org.freedesktop.systemd1.policy.in:65
+msgid "Authentication is required to reload the systemd state."
+msgstr "Authenticatie is vereist voor het herladen van de status van systemd."
+
+#: src/home/org.freedesktop.home1.policy:13
+msgid "Create a home area"
+msgstr "Maak een persoonlijke gebruikersmap"
+
+#: src/home/org.freedesktop.home1.policy:14
+msgid "Authentication is required to create a user's home area."
+msgstr ""
+"Authenticatie is vereist voor het maken van een persoonlijke gebruikersmap."
+
+#: src/home/org.freedesktop.home1.policy:23
+msgid "Remove a home area"
+msgstr "Verwijder een persoonlijke gebruikersmap"
+
+#: src/home/org.freedesktop.home1.policy:24
+msgid "Authentication is required to remove a user's home area."
+msgstr ""
+"Authenticatie is vereist voor het verwijderen van een persoonlijke "
+"gebruikersmap."
+
+#: src/home/org.freedesktop.home1.policy:33
+msgid "Check credentials of a home area"
+msgstr "Controleer de verificatiegegevens van een persoonlijke gebruikersmap"
+
+#: src/home/org.freedesktop.home1.policy:34
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+"Authenticatie is vereist voor het controleren van verificatiegegevens voor "
+"een persoonlijke gebruikersmap."
+
+#: src/home/org.freedesktop.home1.policy:43
+msgid "Update a home area"
+msgstr "Werk een persoonlijke gebruikersmap bij"
+
+#: src/home/org.freedesktop.home1.policy:44
+msgid "Authentication is required to update a user's home area."
+msgstr ""
+"Authenticatie is vereist voor het bijwerken van een persoonlijke "
+"gebruikersmap."
+
+#: src/home/org.freedesktop.home1.policy:53
+msgid "Resize a home area"
+msgstr "Verander de grootte van een persoonlijke gebruikersmap"
+
+#: src/home/org.freedesktop.home1.policy:54
+msgid "Authentication is required to resize a user's home area."
+msgstr ""
+"Authenticatie is vereist voor het veranderen van de grootte van een "
+"persoonlijke gebruikersmap."
+
+#: src/home/org.freedesktop.home1.policy:63
+msgid "Change password of a home area"
+msgstr "Verander het wachtwoord van een persoonlijke gebruikersmap"
+
+#: src/home/org.freedesktop.home1.policy:64
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+"Authenticatie is vereist voor het wijzigen van het wachtwoord van een "
+"persoonlijke gebruikersmap."
+
+#: src/hostname/org.freedesktop.hostname1.policy:20
+msgid "Set hostname"
+msgstr "Stel computernaam in"
+
+#: src/hostname/org.freedesktop.hostname1.policy:21
+msgid "Authentication is required to set the local hostname."
+msgstr ""
+"Authenticatie is vereist voor het instellen van de plaatselijke computernaam."
+
+#: src/hostname/org.freedesktop.hostname1.policy:30
+msgid "Set static hostname"
+msgstr "Stel statische computernaam in"
+
+#: src/hostname/org.freedesktop.hostname1.policy:31
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+"Authenticatie is vereist voor het instellen van de statische plaatselijke "
+"computernaam en voor de 'mooie' computernaam."
+
+#: src/hostname/org.freedesktop.hostname1.policy:41
+msgid "Set machine information"
+msgstr "Stel machine-informatie in"
+
+#: src/hostname/org.freedesktop.hostname1.policy:42
+msgid "Authentication is required to set local machine information."
+msgstr ""
+"Authenticatie is vereist voor het instellen van de plaatselijke machine-"
+"informatie."
+
+#: src/hostname/org.freedesktop.hostname1.policy:51
+msgid "Get product UUID"
+msgstr "Verkrijg de UUID van het product"
+
+#: src/hostname/org.freedesktop.hostname1.policy:52
+msgid "Authentication is required to get product UUID."
+msgstr ""
+"Authenticatie is vereist voor het verkrijgen van de UUID van het product."
+
+#: src/import/org.freedesktop.import1.policy:22
+msgid "Import a VM or container image"
+msgstr "Importeer een VM of een container-schijfkopie"
+
+#: src/import/org.freedesktop.import1.policy:23
+msgid "Authentication is required to import a VM or container image"
+msgstr ""
+"Authenticatie is vereist voor het importeren van een VM of een container-"
+"schijfkopie"
+
+#: src/import/org.freedesktop.import1.policy:32
+msgid "Export a VM or container image"
+msgstr "Exporteer een VM of een container-schijfkopie"
+
+#: src/import/org.freedesktop.import1.policy:33
+msgid "Authentication is required to export a VM or container image"
+msgstr ""
+"Authenticatie is vereist voor het exporteren van een VM of container-"
+"schijfkopie"
+
+#: src/import/org.freedesktop.import1.policy:42
+msgid "Download a VM or container image"
+msgstr "Haal een VM of container-schijfkopie binnen"
+
+#: src/import/org.freedesktop.import1.policy:43
+msgid "Authentication is required to download a VM or container image"
+msgstr ""
+"Authenticatie is vereist voor het binnenhalen van een VM of container-"
+"schijfkopie"
+
+#: src/locale/org.freedesktop.locale1.policy:22
+msgid "Set system locale"
+msgstr "Stel de systeemtaal in"
+
+#: src/locale/org.freedesktop.locale1.policy:23
+msgid "Authentication is required to set the system locale."
+msgstr "Authenticatie is vereist voor het instellen van de systeemtaal."
+
+#: src/locale/org.freedesktop.locale1.policy:33
+msgid "Set system keyboard settings"
+msgstr "Stel de instellingen in van het systeemtoetsenbord"
+
+#: src/locale/org.freedesktop.locale1.policy:34
+msgid "Authentication is required to set the system keyboard settings."
+msgstr ""
+"Authenticatie is vereist voor het instellen van de configuratie van het "
+"systeemtoetsenbord."
+
+#: src/login/org.freedesktop.login1.policy:22
+msgid "Allow applications to inhibit system shutdown"
+msgstr "Sta toepassingen toe om afsluiten van het systeem te verhinderen"
+
+#: src/login/org.freedesktop.login1.policy:23
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassing afsluiten van het systeem "
+"kan verhinderen."
+
+#: src/login/org.freedesktop.login1.policy:33
+msgid "Allow applications to delay system shutdown"
+msgstr "Sta toepassingen toe om afsluiten van het systeem uit te stellen"
+
+#: src/login/org.freedesktop.login1.policy:34
+msgid "Authentication is required for an application to delay system shutdown."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassing het afsluiten van het "
+"systeem kan uitstellen."
+
+#: src/login/org.freedesktop.login1.policy:44
+msgid "Allow applications to inhibit system sleep"
+msgstr "Sta toepassingen toe om slaapstand van het systeem te verhinderen"
+
+#: src/login/org.freedesktop.login1.policy:45
+msgid "Authentication is required for an application to inhibit system sleep."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassing slaapstand van het systeem "
+"kan verhinderen."
+
+#: src/login/org.freedesktop.login1.policy:55
+msgid "Allow applications to delay system sleep"
+msgstr "Sta toepassingen toe om slaapstand van het systeem uit te stellen"
+
+#: src/login/org.freedesktop.login1.policy:56
+msgid "Authentication is required for an application to delay system sleep."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassing slaapstand van het systeem "
+"kan uitstellen."
+
+#: src/login/org.freedesktop.login1.policy:65
+msgid "Allow applications to inhibit automatic system suspend"
+msgstr ""
+"Sta toepassingen toe om automatische pauzestand van het systeem te "
+"verhinderen"
+
+#: src/login/org.freedesktop.login1.policy:66
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassing automatische pauzestand van "
+"het systeem kan verhinderen."
+
+#: src/login/org.freedesktop.login1.policy:75
+msgid "Allow applications to inhibit system handling of the power key"
+msgstr ""
+"Sta toepassingen toe om het bedienen van de aan/uit-toets door het systeem "
+"te verhinderen"
+
+#: src/login/org.freedesktop.login1.policy:76
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassing het bedienen van de aan/uit-"
+"toets door het systeem kan verhinderen."
+
+#: src/login/org.freedesktop.login1.policy:86
+msgid "Allow applications to inhibit system handling of the suspend key"
+msgstr ""
+"Sta toepassingen toe om bediening door het systeem van de pauzestandtoets te "
+"verhinderen"
+
+#: src/login/org.freedesktop.login1.policy:87
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassing de bediening door het "
+"systeem van de pauzestandtoets kan verhinderen."
+
+#: src/login/org.freedesktop.login1.policy:97
+msgid "Allow applications to inhibit system handling of the hibernate key"
+msgstr ""
+"Sta toepassingen toe om behandeling door het systeem van de slaapstandtoets "
+"te verhinderen"
+
+#: src/login/org.freedesktop.login1.policy:98
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassing de behandeling door het "
+"systeem van de slaapstandtoets kan verhinderen."
+
+#: src/login/org.freedesktop.login1.policy:107
+msgid "Allow applications to inhibit system handling of the lid switch"
+msgstr ""
+"Sta toepassingen toe om de behandeling door het systeem van de "
+"klepschakelaar te verhinderen"
+
+#: src/login/org.freedesktop.login1.policy:108
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassing de behandeling door het "
+"systeem van de klepschakelaar kan verhinderen."
+
+#: src/login/org.freedesktop.login1.policy:117
+msgid "Allow applications to inhibit system handling of the reboot key"
+msgstr ""
+"Sta toepassingen toe om de behandeling door het systeem van de herstarttoets "
+"te verhinderen"
+
+#: src/login/org.freedesktop.login1.policy:118
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+"Authenticatie is vereist alvorens een toepassing de behandeling door het "
+"systeem van de herstarttoets kan verhinderen."
+
+#: src/login/org.freedesktop.login1.policy:128
+msgid "Allow non-logged-in user to run programs"
+msgstr "Sta niet-aangemelde gebruiker toe om programma's te draaien"
+
+#: src/login/org.freedesktop.login1.policy:129
+msgid "Explicit request is required to run programs as a non-logged-in user."
+msgstr ""
+"Expliciet verzoek is vereist om programma's te draaien als een niet-"
+"aangemelde gebruiker."
+
+#: src/login/org.freedesktop.login1.policy:138
+msgid "Allow non-logged-in users to run programs"
+msgstr "Sta niet-aangemelde gebruikers toe om programma's te draaien"
+
+#: src/login/org.freedesktop.login1.policy:139
+msgid "Authentication is required to run programs as a non-logged-in user."
+msgstr ""
+"Authenticatie is vereist alvorens een niet-aangemelde gebruiker programma's "
+"kan draaien."
+
+#: src/login/org.freedesktop.login1.policy:148
+msgid "Allow attaching devices to seats"
+msgstr "Sta het verbinden van apparaten aan zittingen toe"
+
+#: src/login/org.freedesktop.login1.policy:149
+msgid "Authentication is required to attach a device to a seat."
+msgstr ""
+"Authenticatie is vereist voor het verbinden van een apparaat aan een zitting."
+
+#: src/login/org.freedesktop.login1.policy:159
+msgid "Flush device to seat attachments"
+msgstr "Verwijder alle apparaat-zitting-koppelingen"
+
+#: src/login/org.freedesktop.login1.policy:160
+msgid "Authentication is required to reset how devices are attached to seats."
+msgstr ""
+"Authenticatie is vereist voor het terugzetten van de wijze waarop apparaten "
+"zijn verbonden aan zittingen."
+
+#: src/login/org.freedesktop.login1.policy:169
+msgid "Power off the system"
+msgstr "Sluit het systeem af"
+
+#: src/login/org.freedesktop.login1.policy:170
+msgid "Authentication is required to power off the system."
+msgstr "Authenticatie is vereist voor het afsluiten van het systeem."
+
+#: src/login/org.freedesktop.login1.policy:180
+msgid "Power off the system while other users are logged in"
+msgstr "Sluit het systeem af terwijl er nog andere gebruikers zijn aangemeld"
+
+#: src/login/org.freedesktop.login1.policy:181
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+"Authenticatie is vereist voor het afsluiten van het systeem terwijl er nog "
+"andere gebruikers zijn aangemeld."
+
+#: src/login/org.freedesktop.login1.policy:191
+msgid "Power off the system while an application is inhibiting this"
+msgstr "Sluit het systeem af terwijl er een toepassing is die dit verhindert"
+
+#: src/login/org.freedesktop.login1.policy:192
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+"Authenticatie is vereist voor het afsluiten van het systeem terwijl er een "
+"toepassing is die dit verhindert."
+
+#: src/login/org.freedesktop.login1.policy:202
+msgid "Reboot the system"
+msgstr "Herstart het systeem"
+
+#: src/login/org.freedesktop.login1.policy:203
+msgid "Authentication is required to reboot the system."
+msgstr "Authenticatie is vereist voor het herstarten van het systeem."
+
+#: src/login/org.freedesktop.login1.policy:213
+msgid "Reboot the system while other users are logged in"
+msgstr "Herstart het systeem terwijl er nog andere gebruikers zijn aangemeld"
+
+#: src/login/org.freedesktop.login1.policy:214
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+"Authenticatie is vereist voor het herstarten van het systeem terwijl er nog "
+"andere gebruikers zijn aangemeld."
+
+#: src/login/org.freedesktop.login1.policy:224
+msgid "Reboot the system while an application is inhibiting this"
+msgstr "Herstart het systeem terwijl er een toepassing is die dit verhindert"
+
+#: src/login/org.freedesktop.login1.policy:225
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+"Authenticatie is vereist voor het herstarten van het systeem terwijl er een "
+"toepassing is die dit verhindert."
+
+#: src/login/org.freedesktop.login1.policy:235
+msgid "Halt the system"
+msgstr "Zet het systeem stil"
+
+#: src/login/org.freedesktop.login1.policy:236
+msgid "Authentication is required to halt the system."
+msgstr "Authenticatie is vereist voor het stilzetten van het systeem."
+
+#: src/login/org.freedesktop.login1.policy:246
+msgid "Halt the system while other users are logged in"
+msgstr "Zet het systeem stil terwijl er nog andere gebruikers zijn aangemeld"
+
+#: src/login/org.freedesktop.login1.policy:247
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+"Authenticatie is vereist voor het stilzetten van het systeem terwijl er nog "
+"andere gebruikers zijn aangemeld."
+
+#: src/login/org.freedesktop.login1.policy:257
+msgid "Halt the system while an application is inhibiting this"
+msgstr "Zet het systeem stil terwijl er een toepassing is die dit verhindert"
+
+#: src/login/org.freedesktop.login1.policy:258
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+"Authenticatie is vereist voor het stilzetten van het systeem terwijl er een "
+"toepassing is die dit verhindert."
+
+#: src/login/org.freedesktop.login1.policy:268
+msgid "Suspend the system"
+msgstr "Breng het systeem in pauzestand"
+
+#: src/login/org.freedesktop.login1.policy:269
+msgid "Authentication is required to suspend the system."
+msgstr ""
+"Authenticatie is vereist voor het in pauzestand brengen van het systeem."
+
+#: src/login/org.freedesktop.login1.policy:278
+msgid "Suspend the system while other users are logged in"
+msgstr ""
+"Breng het systeem in pauzestand terwijl er nog andere gebruikers zijn "
+"aangemeld"
+
+#: src/login/org.freedesktop.login1.policy:279
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+"Authenticatie is vereist voor het in pauzestand brengen van het systeem "
+"terwijl er nog andere gebruikers zijn aangemeld."
+
+#: src/login/org.freedesktop.login1.policy:289
+msgid "Suspend the system while an application is inhibiting this"
+msgstr ""
+"Breng het systeem in pauzestand terwijl er een toepassing is die dit "
+"verhindert"
+
+#: src/login/org.freedesktop.login1.policy:290
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+"Authenticatie is vereist voor het in pauzestand brengen van het systeem "
+"terwijl er een toepassing is die dit verhindert."
+
+#: src/login/org.freedesktop.login1.policy:300
+msgid "Hibernate the system"
+msgstr "Breng het systeem in slaapstand"
+
+#: src/login/org.freedesktop.login1.policy:301
+msgid "Authentication is required to hibernate the system."
+msgstr ""
+"Authenticatie is vereist voor het in slaapstand brengen van het systeem."
+
+#: src/login/org.freedesktop.login1.policy:310
+msgid "Hibernate the system while other users are logged in"
+msgstr ""
+"Breng het systeem in slaapstand terwijl er nog andere gebruikers zijn "
+"aangemeld"
+
+#: src/login/org.freedesktop.login1.policy:311
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+"Authenticatie is vereist voor het in slaapstand brengen van het systeem "
+"terwijl er nog andere gebruikers zijn aangemeld."
+
+#: src/login/org.freedesktop.login1.policy:321
+msgid "Hibernate the system while an application is inhibiting this"
+msgstr ""
+"Breng het systeem in slaapstand terwijl er een toepassing is die dit "
+"verhindert"
+
+#: src/login/org.freedesktop.login1.policy:322
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+"Authenticatie is vereist voor het in slaapstand brengen van het systeem "
+"terwijl er een toepassing is die dit verhindert."
+
+#: src/login/org.freedesktop.login1.policy:332
+msgid "Manage active sessions, users and seats"
+msgstr "Beheer actieve sessies, gebruikers en zittingen"
+
+#: src/login/org.freedesktop.login1.policy:333
+msgid "Authentication is required to manage active sessions, users and seats."
+msgstr ""
+"Authenticatie is vereist voor het beheren van actieve sessies, gebruikers en "
+"zittingen."
+
+#: src/login/org.freedesktop.login1.policy:342
+msgid "Lock or unlock active sessions"
+msgstr "Vergrendel of ontgrendel actieve sessies"
+
+#: src/login/org.freedesktop.login1.policy:343
+msgid "Authentication is required to lock or unlock active sessions."
+msgstr ""
+"Authenticatie is vereist voor het vergrendelen of ontgrendelen van actieve "
+"sessies."
+
+#: src/login/org.freedesktop.login1.policy:352
+msgid "Set the reboot \"reason\" in the kernel"
+msgstr "Stel de herstart-'reden' in de systeemkern in"
+
+#: src/login/org.freedesktop.login1.policy:353
+msgid "Authentication is required to set the reboot \"reason\" in the kernel."
+msgstr ""
+"Authenticatie is vereist voor het instellen van de herstart-'reden' in de "
+"systeemkern."
+
+#: src/login/org.freedesktop.login1.policy:363
+msgid "Indicate to the firmware to boot to setup interface"
+msgstr ""
+"Geef aan de firmware aan om op te starten ten einde een apparaat in te "
+"stellen"
+
+#: src/login/org.freedesktop.login1.policy:364
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+"Authenticatie is vereist voor het aangeven aan de firmware dat die moet "
+"opstarten om een apparaat in te stellen."
+
+#: src/login/org.freedesktop.login1.policy:374
+msgid "Indicate to the boot loader to boot to the boot loader menu"
+msgstr ""
+"Geef aan de opstartlader aan dat die moet opstarten naar het opstartmenu"
+
+#: src/login/org.freedesktop.login1.policy:375
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+"Authenticatie is vereist voor het aangeven aan de opstartlader dat die moet "
+"opstarten naar het opstartmenu."
+
+#: src/login/org.freedesktop.login1.policy:385
+msgid "Indicate to the boot loader to boot a specific entry"
+msgstr ""
+"Geef aan de opstartlader aan dat die een bepaalde vermelding moet opstarten"
+
+#: src/login/org.freedesktop.login1.policy:386
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+"Authenticatie is vereist voor het aangeven aan de opstartlader dat die een "
+"bepaalde opstartvermelding moet opstarten."
+
+#: src/login/org.freedesktop.login1.policy:396
+msgid "Set a wall message"
+msgstr "Stel een gebruikersmuurboodschap in"
+
+#: src/login/org.freedesktop.login1.policy:397
+msgid "Authentication is required to set a wall message"
+msgstr ""
+"Authenticatie is vereist voor het instellen van een gebruikersmuurboodschap"
+
+#: src/login/org.freedesktop.login1.policy:406
+msgid "Change Session"
+msgstr "Verander van sessie"
+
+#: src/login/org.freedesktop.login1.policy:407
+msgid "Authentication is required to change the virtual terminal."
+msgstr "Authenticatie is vereist voor het wijzigen van de virtuele terminal."
+
+#: src/machine/org.freedesktop.machine1.policy:22
+msgid "Log into a local container"
+msgstr "Meld aan bij een plaatselijke container"
+
+#: src/machine/org.freedesktop.machine1.policy:23
+msgid "Authentication is required to log into a local container."
+msgstr ""
+"Authenticatie is vereist voor het aanmelden bij een plaatselijke container."
+
+#: src/machine/org.freedesktop.machine1.policy:32
+msgid "Log into the local host"
+msgstr "Meld aan bij de plaatselijke computer"
+
+#: src/machine/org.freedesktop.machine1.policy:33
+msgid "Authentication is required to log into the local host."
+msgstr ""
+"Authenticatie is vereist voor het aanmelden bij de plaatselijke computer."
+
+#: src/machine/org.freedesktop.machine1.policy:42
+msgid "Acquire a shell in a local container"
+msgstr "Verkrijg een bedieningsvenster in een plaatselijke container"
+
+#: src/machine/org.freedesktop.machine1.policy:43
+msgid "Authentication is required to acquire a shell in a local container."
+msgstr ""
+"Authenticatie is vereist voor het verkrijgen van een bedieningsvenster in "
+"een plaatselijke container."
+
+#: src/machine/org.freedesktop.machine1.policy:53
+msgid "Acquire a shell on the local host"
+msgstr "Verkrijg een bedieningsvenster op de plaatselijke computer"
+
+#: src/machine/org.freedesktop.machine1.policy:54
+msgid "Authentication is required to acquire a shell on the local host."
+msgstr ""
+"Authenticatie is vereist voor het verkrijgen van een bedieningsvenster op de "
+"plaatselijke computer."
+
+#: src/machine/org.freedesktop.machine1.policy:64
+msgid "Acquire a pseudo TTY in a local container"
+msgstr "Verkrijg een pseudo-TTY in een plaatselijke container"
+
+#: src/machine/org.freedesktop.machine1.policy:65
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+"Authenticatie is vereist voor het verkrijgen van een pseudo-TTY in een "
+"plaatselijke container."
+
+#: src/machine/org.freedesktop.machine1.policy:74
+msgid "Acquire a pseudo TTY on the local host"
+msgstr "Verkrijg een pseudo-TTY op de plaatselijke computer"
+
+#: src/machine/org.freedesktop.machine1.policy:75
+msgid "Authentication is required to acquire a pseudo TTY on the local host."
+msgstr ""
+"Authenticatie is vereist voor het verkrijgen van een pseudo-TTY op de "
+"plaatselijke computer."
+
+#: src/machine/org.freedesktop.machine1.policy:84
+msgid "Manage local virtual machines and containers"
+msgstr "Beheer lokale virtuele machines en containers"
+
+#: src/machine/org.freedesktop.machine1.policy:85
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+"Authenticatie is vereist voor het beheren van lokale virtuele machines en "
+"containers."
+
+#: src/machine/org.freedesktop.machine1.policy:95
+msgid "Manage local virtual machine and container images"
+msgstr "Beheer plaatselijke virtuele machine en container-schijfkopieën"
+
+#: src/machine/org.freedesktop.machine1.policy:96
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+"Authenticatie is vereist voor het beheren van plaatselijke virtuele machine "
+"en container-schijfkopieën."
+
+#: src/network/org.freedesktop.network1.policy:22
+msgid "Set NTP servers"
+msgstr "Stel NTP-servers in"
+
+#: src/network/org.freedesktop.network1.policy:23
+msgid "Authentication is required to set NTP servers."
+msgstr "Authenticatie is vereist voor het instellen van NTP-servers."
+
+#: src/network/org.freedesktop.network1.policy:33
+#: src/resolve/org.freedesktop.resolve1.policy:44
+msgid "Set DNS servers"
+msgstr "Stel DNS-servers in"
+
+#: src/network/org.freedesktop.network1.policy:34
+#: src/resolve/org.freedesktop.resolve1.policy:45
+msgid "Authentication is required to set DNS servers."
+msgstr "Authenticatie is vereist voor het instellen van DNS-servers."
+
+#: src/network/org.freedesktop.network1.policy:44
+#: src/resolve/org.freedesktop.resolve1.policy:55
+msgid "Set domains"
+msgstr "Stel domeinen in"
+
+#: src/network/org.freedesktop.network1.policy:45
+#: src/resolve/org.freedesktop.resolve1.policy:56
+msgid "Authentication is required to set domains."
+msgstr "Authenticatie is vereist voor het instellen van domeinen."
+
+#: src/network/org.freedesktop.network1.policy:55
+#: src/resolve/org.freedesktop.resolve1.policy:66
+msgid "Set default route"
+msgstr "Stel standaardroute in"
+
+#: src/network/org.freedesktop.network1.policy:56
+#: src/resolve/org.freedesktop.resolve1.policy:67
+msgid "Authentication is required to set default route."
+msgstr "Authenticatie is vereist voor het instellen van een standaardroute."
+
+#: src/network/org.freedesktop.network1.policy:66
+#: src/resolve/org.freedesktop.resolve1.policy:77
+msgid "Enable/disable LLMNR"
+msgstr "Schakel LLMNR in of uit"
+
+#: src/network/org.freedesktop.network1.policy:67
+#: src/resolve/org.freedesktop.resolve1.policy:78
+msgid "Authentication is required to enable or disable LLMNR."
+msgstr "Authenticatie is vereist voor het in- of uitschakelen van LLMNR."
+
+#: src/network/org.freedesktop.network1.policy:77
+#: src/resolve/org.freedesktop.resolve1.policy:88
+msgid "Enable/disable multicast DNS"
+msgstr "Schakel multicast-DNS in of uit"
+
+#: src/network/org.freedesktop.network1.policy:78
+#: src/resolve/org.freedesktop.resolve1.policy:89
+msgid "Authentication is required to enable or disable multicast DNS."
+msgstr ""
+"Authenticatie is vereist voor het in- of uitschakelen van multicast-DNS."
+
+#: src/network/org.freedesktop.network1.policy:88
+#: src/resolve/org.freedesktop.resolve1.policy:99
+msgid "Enable/disable DNS over TLS"
+msgstr "Schakel DNS over TLS in of uit"
+
+#: src/network/org.freedesktop.network1.policy:89
+#: src/resolve/org.freedesktop.resolve1.policy:100
+msgid "Authentication is required to enable or disable DNS over TLS."
+msgstr ""
+"Authenticatie is vereist voor het inschakelen of uitschakelen van DNS over "
+"TLS."
+
+#: src/network/org.freedesktop.network1.policy:99
+#: src/resolve/org.freedesktop.resolve1.policy:110
+msgid "Enable/disable DNSSEC"
+msgstr "Schakel DNSSEC in of uit"
+
+#: src/network/org.freedesktop.network1.policy:100
+#: src/resolve/org.freedesktop.resolve1.policy:111
+msgid "Authentication is required to enable or disable DNSSEC."
+msgstr "Authenticatie is vereist voor het in- of uitschakelen van DNSSEC."
+
+#: src/network/org.freedesktop.network1.policy:110
+#: src/resolve/org.freedesktop.resolve1.policy:121
+msgid "Set DNSSEC Negative Trust Anchors"
+msgstr "Stel DNSSEC Negative Trust Anchors in"
+
+#: src/network/org.freedesktop.network1.policy:111
+#: src/resolve/org.freedesktop.resolve1.policy:122
+msgid "Authentication is required to set DNSSEC Negative Trust Anchors."
+msgstr ""
+"Authenticatie is vereist voor het instellen van DNSSEC Negative Trust "
+"Anchors."
+
+#: src/network/org.freedesktop.network1.policy:121
+msgid "Revert NTP settings"
+msgstr "Draai NTP-instellingen terug"
+
+#: src/network/org.freedesktop.network1.policy:122
+msgid "Authentication is required to reset NTP settings."
+msgstr "Authenticatie is vereist voor het terugzetten van NTP-instellingen."
+
+#: src/network/org.freedesktop.network1.policy:132
+msgid "Revert DNS settings"
+msgstr "Draai DNS-instellingen terug"
+
+#: src/network/org.freedesktop.network1.policy:133
+msgid "Authentication is required to reset DNS settings."
+msgstr "Authenticatie is vereist voor het terugzetten van DNS-instellingen."
+
+#: src/network/org.freedesktop.network1.policy:143
+msgid "DHCP server sends force renew message"
+msgstr "DHCP-server verstuurt 'gedwongen hernieuwing'-boodschap"
+
+#: src/network/org.freedesktop.network1.policy:144
+msgid "Authentication is required to send force renew message."
+msgstr ""
+"Authenticatie is vereist voor het verzenden van een 'gedwongen "
+"hernieuwing'-boodschap."
+
+#: src/network/org.freedesktop.network1.policy:154
+msgid "Renew dynamic addresses"
+msgstr "Hernieuw dynamische adressen"
+
+#: src/network/org.freedesktop.network1.policy:155
+msgid "Authentication is required to renew dynamic addresses."
+msgstr "Authenticatie is vereist voor het hernieuwen van dynamische adressen."
+
+#: src/network/org.freedesktop.network1.policy:165
+msgid "Reload network settings"
+msgstr "Herlaad netwerkinstellingen"
+
+#: src/network/org.freedesktop.network1.policy:166
+msgid "Authentication is required to reload network settings."
+msgstr "Authenticatie is vereist voor het herladen van netwerkinstellingen."
+
+#: src/network/org.freedesktop.network1.policy:176
+msgid "Reconfigure network interface"
+msgstr "Stel netwerkkaart opnieuw in"
+
+#: src/network/org.freedesktop.network1.policy:177
+msgid "Authentication is required to reconfigure network interface."
+msgstr ""
+"Authenticatie is vereist voor het opnieuw instellen van de netwerkkaart."
+
+#: src/portable/org.freedesktop.portable1.policy:13
+msgid "Inspect a portable service image"
+msgstr "Inspecteer een portable service schijfkopie"
+
+#: src/portable/org.freedesktop.portable1.policy:14
+msgid "Authentication is required to inspect a portable service image."
+msgstr ""
+"Authenticatie is vereist voor het inspecteren van een portable service "
+"schijfkopie."
+
+#: src/portable/org.freedesktop.portable1.policy:23
+msgid "Attach or detach a portable service image"
+msgstr "Koppel een portable service schijfkopie aan of af"
+
+#: src/portable/org.freedesktop.portable1.policy:24
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+"Authenticatie is vereist voor het aan- of afkoppelen van een portable "
+"service schijfkopie."
+
+#: src/portable/org.freedesktop.portable1.policy:34
+msgid "Delete or modify portable service image"
+msgstr "Verwijder of wijzig een portable service schijfkopie"
+
+#: src/portable/org.freedesktop.portable1.policy:35
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+"Authenticatie is vereist voor het verwijderen of aanpassen van een portable "
+"service schijfkopie."
+
+#: src/resolve/org.freedesktop.resolve1.policy:22
+msgid "Register a DNS-SD service"
+msgstr "Registreer een DNS-SD-dienst"
+
+#: src/resolve/org.freedesktop.resolve1.policy:23
+msgid "Authentication is required to register a DNS-SD service"
+msgstr "Authenticatie is vereist voor het registreren van een DNS-SD-dienst"
+
+#: src/resolve/org.freedesktop.resolve1.policy:33
+msgid "Unregister a DNS-SD service"
+msgstr "Ontregistreer een DNS-SD-dienst"
+
+#: src/resolve/org.freedesktop.resolve1.policy:34
+msgid "Authentication is required to unregister a DNS-SD service"
+msgstr "Authenticatie is vereist voor het ontregistreren van een DNS-SD-dienst"
+
+#: src/resolve/org.freedesktop.resolve1.policy:132
+msgid "Revert name resolution settings"
+msgstr "Draai instellingen voor naamoplossing terug"
+
+#: src/resolve/org.freedesktop.resolve1.policy:133
+msgid "Authentication is required to reset name resolution settings."
+msgstr ""
+"Authenticatie is vereist voor het terugzetten van de instellingen voor "
+"naamoplossing."
+
+#: src/timedate/org.freedesktop.timedate1.policy:22
+msgid "Set system time"
+msgstr "Stel systeemtijd in"
+
+#: src/timedate/org.freedesktop.timedate1.policy:23
+msgid "Authentication is required to set the system time."
+msgstr "Authenticatie is vereist voor het instellen van de systeemtijd."
+
+#: src/timedate/org.freedesktop.timedate1.policy:33
+msgid "Set system timezone"
+msgstr "Stel de tijdzone van het systeem in"
+
+#: src/timedate/org.freedesktop.timedate1.policy:34
+msgid "Authentication is required to set the system timezone."
+msgstr ""
+"Authenticatie is vereist voor het instellen van de tijdzone van het systeem."
+
+#: src/timedate/org.freedesktop.timedate1.policy:43
+msgid "Set RTC to local timezone or UTC"
+msgstr "Stel RTC in op plaatselijke tijdzone of UTC"
+
+#: src/timedate/org.freedesktop.timedate1.policy:44
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+"Authenticatie is vereist voor het bepalen of RTC de plaatselijke tijd of de "
+"UTC-tijd opslaat."
+
+#: src/timedate/org.freedesktop.timedate1.policy:53
+msgid "Turn network time synchronization on or off"
+msgstr "Schakel netwerktijdsynchronisatie in of uit"
+
+#: src/timedate/org.freedesktop.timedate1.policy:54
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+"Authenticatie is vereist voor het bepalen of netwerktijdsynchronisatie "
+"ingeschakeld zal zijn."
+
+#: src/core/dbus-unit.c:359
+msgid "Authentication is required to start '$(unit)'."
+msgstr "Authenticatie is vereist voor het starten van '$(unit)'."
+
+#: src/core/dbus-unit.c:360
+msgid "Authentication is required to stop '$(unit)'."
+msgstr "Authenticatie is vereist voor het stilzetten van '$(unit)'."
+
+#: src/core/dbus-unit.c:361
+msgid "Authentication is required to reload '$(unit)'."
+msgstr "Authenticatie is vereist voor het herladen van '$(unit)'."
+
+#: src/core/dbus-unit.c:362 src/core/dbus-unit.c:363
+msgid "Authentication is required to restart '$(unit)'."
+msgstr "Authenticatie is vereist voor het herstarten van '$(unit)'."
+
+#: src/core/dbus-unit.c:535
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+"Authenticatie is vereist voor het zenden van een UNIX-signaal naar de "
+"processen van '$(unit)'."
+
+#: src/core/dbus-unit.c:566
+msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
+msgstr ""
+"Authenticatie is vereist voor het terugzetten van de 'mislukt'-status van "
+"'$(unit)'."
+
+#: src/core/dbus-unit.c:599
+msgid "Authentication is required to set properties on '$(unit)'."
+msgstr ""
+"Authenticatie is vereist voor het instellen van eigenschappen op '$(unit)'."
+
+#: src/core/dbus-unit.c:708
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+"Authenticatie is vereist voor het verwijderen van bestanden en mappen die "
+"verbonden zijn aan '$(unit)'."
+
+#: src/core/dbus-unit.c:757
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
+"Authenticatie is vereist voor het bevriezen of ontdooien van de processen "
+"van '$(unit)' unit."
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the systemd package.
+# Hela Basa <r45xveza@pm.me>, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: systemd\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-01-08 17:48+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: si\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/core/org.freedesktop.systemd1.policy.in:22
+msgid "Send passphrase back to system"
+msgstr ""
+
+#: src/core/org.freedesktop.systemd1.policy.in:23
+msgid ""
+"Authentication is required to send the entered passphrase back to the system."
+msgstr ""
+
+#: src/core/org.freedesktop.systemd1.policy.in:33
+msgid "Manage system services or other units"
+msgstr ""
+
+#: src/core/org.freedesktop.systemd1.policy.in:34
+msgid "Authentication is required to manage system services or other units."
+msgstr ""
+
+#: src/core/org.freedesktop.systemd1.policy.in:43
+msgid "Manage system service or unit files"
+msgstr ""
+
+#: src/core/org.freedesktop.systemd1.policy.in:44
+msgid "Authentication is required to manage system service or unit files."
+msgstr ""
+
+#: src/core/org.freedesktop.systemd1.policy.in:54
+msgid "Set or unset system and service manager environment variables"
+msgstr ""
+
+#: src/core/org.freedesktop.systemd1.policy.in:55
+msgid ""
+"Authentication is required to set or unset system and service manager "
+"environment variables."
+msgstr ""
+
+#: src/core/org.freedesktop.systemd1.policy.in:64
+msgid "Reload the systemd state"
+msgstr ""
+
+#: src/core/org.freedesktop.systemd1.policy.in:65
+msgid "Authentication is required to reload the systemd state."
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:13
+msgid "Create a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:14
+msgid "Authentication is required to create a user's home area."
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:23
+msgid "Remove a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:24
+msgid "Authentication is required to remove a user's home area."
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:33
+msgid "Check credentials of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:34
+msgid ""
+"Authentication is required to check credentials against a user's home area."
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:43
+msgid "Update a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:44
+msgid "Authentication is required to update a user's home area."
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:53
+msgid "Resize a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:54
+msgid "Authentication is required to resize a user's home area."
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:63
+msgid "Change password of a home area"
+msgstr ""
+
+#: src/home/org.freedesktop.home1.policy:64
+msgid ""
+"Authentication is required to change the password of a user's home area."
+msgstr ""
+
+#: src/hostname/org.freedesktop.hostname1.policy:20
+msgid "Set hostname"
+msgstr ""
+
+#: src/hostname/org.freedesktop.hostname1.policy:21
+msgid "Authentication is required to set the local hostname."
+msgstr ""
+
+#: src/hostname/org.freedesktop.hostname1.policy:30
+msgid "Set static hostname"
+msgstr ""
+
+#: src/hostname/org.freedesktop.hostname1.policy:31
+msgid ""
+"Authentication is required to set the statically configured local hostname, "
+"as well as the pretty hostname."
+msgstr ""
+
+#: src/hostname/org.freedesktop.hostname1.policy:41
+msgid "Set machine information"
+msgstr ""
+
+#: src/hostname/org.freedesktop.hostname1.policy:42
+msgid "Authentication is required to set local machine information."
+msgstr ""
+
+#: src/hostname/org.freedesktop.hostname1.policy:51
+msgid "Get product UUID"
+msgstr ""
+
+#: src/hostname/org.freedesktop.hostname1.policy:52
+msgid "Authentication is required to get product UUID."
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:22
+msgid "Import a VM or container image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:23
+msgid "Authentication is required to import a VM or container image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:32
+msgid "Export a VM or container image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:33
+msgid "Authentication is required to export a VM or container image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:42
+msgid "Download a VM or container image"
+msgstr ""
+
+#: src/import/org.freedesktop.import1.policy:43
+msgid "Authentication is required to download a VM or container image"
+msgstr ""
+
+#: src/locale/org.freedesktop.locale1.policy:22
+msgid "Set system locale"
+msgstr ""
+
+#: src/locale/org.freedesktop.locale1.policy:23
+msgid "Authentication is required to set the system locale."
+msgstr ""
+
+#: src/locale/org.freedesktop.locale1.policy:33
+msgid "Set system keyboard settings"
+msgstr ""
+
+#: src/locale/org.freedesktop.locale1.policy:34
+msgid "Authentication is required to set the system keyboard settings."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:22
+msgid "Allow applications to inhibit system shutdown"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:23
+msgid ""
+"Authentication is required for an application to inhibit system shutdown."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:33
+msgid "Allow applications to delay system shutdown"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:34
+msgid "Authentication is required for an application to delay system shutdown."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:44
+msgid "Allow applications to inhibit system sleep"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:45
+msgid "Authentication is required for an application to inhibit system sleep."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:55
+msgid "Allow applications to delay system sleep"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:56
+msgid "Authentication is required for an application to delay system sleep."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:65
+msgid "Allow applications to inhibit automatic system suspend"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:66
+msgid ""
+"Authentication is required for an application to inhibit automatic system "
+"suspend."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:75
+msgid "Allow applications to inhibit system handling of the power key"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:76
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the power key."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:86
+msgid "Allow applications to inhibit system handling of the suspend key"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:87
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the suspend key."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:97
+msgid "Allow applications to inhibit system handling of the hibernate key"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:98
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the hibernate key."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:107
+msgid "Allow applications to inhibit system handling of the lid switch"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:108
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the lid switch."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:117
+msgid "Allow applications to inhibit system handling of the reboot key"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:118
+msgid ""
+"Authentication is required for an application to inhibit system handling of "
+"the reboot key."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:128
+msgid "Allow non-logged-in user to run programs"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:129
+msgid "Explicit request is required to run programs as a non-logged-in user."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:138
+msgid "Allow non-logged-in users to run programs"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:139
+msgid "Authentication is required to run programs as a non-logged-in user."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:148
+msgid "Allow attaching devices to seats"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:149
+msgid "Authentication is required to attach a device to a seat."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:159
+msgid "Flush device to seat attachments"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:160
+msgid "Authentication is required to reset how devices are attached to seats."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:169
+msgid "Power off the system"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:170
+msgid "Authentication is required to power off the system."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:180
+msgid "Power off the system while other users are logged in"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:181
+msgid ""
+"Authentication is required to power off the system while other users are "
+"logged in."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:191
+msgid "Power off the system while an application is inhibiting this"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:192
+msgid ""
+"Authentication is required to power off the system while an application is "
+"inhibiting this."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:202
+msgid "Reboot the system"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:203
+msgid "Authentication is required to reboot the system."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:213
+msgid "Reboot the system while other users are logged in"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:214
+msgid ""
+"Authentication is required to reboot the system while other users are logged "
+"in."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:224
+msgid "Reboot the system while an application is inhibiting this"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:225
+msgid ""
+"Authentication is required to reboot the system while an application is "
+"inhibiting this."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:235
+msgid "Halt the system"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:236
+msgid "Authentication is required to halt the system."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:246
+msgid "Halt the system while other users are logged in"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:247
+msgid ""
+"Authentication is required to halt the system while other users are logged "
+"in."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:257
+msgid "Halt the system while an application is inhibiting this"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:258
+msgid ""
+"Authentication is required to halt the system while an application is "
+"inhibiting this."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:268
+msgid "Suspend the system"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:269
+msgid "Authentication is required to suspend the system."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:278
+msgid "Suspend the system while other users are logged in"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:279
+msgid ""
+"Authentication is required to suspend the system while other users are "
+"logged in."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:289
+msgid "Suspend the system while an application is inhibiting this"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:290
+msgid ""
+"Authentication is required to suspend the system while an application is "
+"inhibiting this."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:300
+msgid "Hibernate the system"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:301
+msgid "Authentication is required to hibernate the system."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:310
+msgid "Hibernate the system while other users are logged in"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:311
+msgid ""
+"Authentication is required to hibernate the system while other users are "
+"logged in."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:321
+msgid "Hibernate the system while an application is inhibiting this"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:322
+msgid ""
+"Authentication is required to hibernate the system while an application is "
+"inhibiting this."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:332
+msgid "Manage active sessions, users and seats"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:333
+msgid "Authentication is required to manage active sessions, users and seats."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:342
+msgid "Lock or unlock active sessions"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:343
+msgid "Authentication is required to lock or unlock active sessions."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:352
+msgid "Set the reboot \"reason\" in the kernel"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:353
+msgid "Authentication is required to set the reboot \"reason\" in the kernel."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:363
+msgid "Indicate to the firmware to boot to setup interface"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:364
+msgid ""
+"Authentication is required to indicate to the firmware to boot to setup "
+"interface."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:374
+msgid "Indicate to the boot loader to boot to the boot loader menu"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:375
+msgid ""
+"Authentication is required to indicate to the boot loader to boot to the "
+"boot loader menu."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:385
+msgid "Indicate to the boot loader to boot a specific entry"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:386
+msgid ""
+"Authentication is required to indicate to the boot loader to boot into a "
+"specific boot loader entry."
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:396
+msgid "Set a wall message"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:397
+msgid "Authentication is required to set a wall message"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:406
+msgid "Change Session"
+msgstr ""
+
+#: src/login/org.freedesktop.login1.policy:407
+msgid "Authentication is required to change the virtual terminal."
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:22
+msgid "Log into a local container"
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:23
+msgid "Authentication is required to log into a local container."
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:32
+msgid "Log into the local host"
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:33
+msgid "Authentication is required to log into the local host."
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:42
+msgid "Acquire a shell in a local container"
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:43
+msgid "Authentication is required to acquire a shell in a local container."
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:53
+msgid "Acquire a shell on the local host"
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:54
+msgid "Authentication is required to acquire a shell on the local host."
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:64
+msgid "Acquire a pseudo TTY in a local container"
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:65
+msgid ""
+"Authentication is required to acquire a pseudo TTY in a local container."
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:74
+msgid "Acquire a pseudo TTY on the local host"
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:75
+msgid "Authentication is required to acquire a pseudo TTY on the local host."
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:84
+msgid "Manage local virtual machines and containers"
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:85
+msgid ""
+"Authentication is required to manage local virtual machines and containers."
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:95
+msgid "Manage local virtual machine and container images"
+msgstr ""
+
+#: src/machine/org.freedesktop.machine1.policy:96
+msgid ""
+"Authentication is required to manage local virtual machine and container "
+"images."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:22
+msgid "Set NTP servers"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:23
+msgid "Authentication is required to set NTP servers."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:33
+#: src/resolve/org.freedesktop.resolve1.policy:44
+msgid "Set DNS servers"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:34
+#: src/resolve/org.freedesktop.resolve1.policy:45
+msgid "Authentication is required to set DNS servers."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:44
+#: src/resolve/org.freedesktop.resolve1.policy:55
+msgid "Set domains"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:45
+#: src/resolve/org.freedesktop.resolve1.policy:56
+msgid "Authentication is required to set domains."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:55
+#: src/resolve/org.freedesktop.resolve1.policy:66
+msgid "Set default route"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:56
+#: src/resolve/org.freedesktop.resolve1.policy:67
+msgid "Authentication is required to set default route."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:66
+#: src/resolve/org.freedesktop.resolve1.policy:77
+msgid "Enable/disable LLMNR"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:67
+#: src/resolve/org.freedesktop.resolve1.policy:78
+msgid "Authentication is required to enable or disable LLMNR."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:77
+#: src/resolve/org.freedesktop.resolve1.policy:88
+msgid "Enable/disable multicast DNS"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:78
+#: src/resolve/org.freedesktop.resolve1.policy:89
+msgid "Authentication is required to enable or disable multicast DNS."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:88
+#: src/resolve/org.freedesktop.resolve1.policy:99
+msgid "Enable/disable DNS over TLS"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:89
+#: src/resolve/org.freedesktop.resolve1.policy:100
+msgid "Authentication is required to enable or disable DNS over TLS."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:99
+#: src/resolve/org.freedesktop.resolve1.policy:110
+msgid "Enable/disable DNSSEC"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:100
+#: src/resolve/org.freedesktop.resolve1.policy:111
+msgid "Authentication is required to enable or disable DNSSEC."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:110
+#: src/resolve/org.freedesktop.resolve1.policy:121
+msgid "Set DNSSEC Negative Trust Anchors"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:111
+#: src/resolve/org.freedesktop.resolve1.policy:122
+msgid "Authentication is required to set DNSSEC Negative Trust Anchors."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:121
+msgid "Revert NTP settings"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:122
+msgid "Authentication is required to reset NTP settings."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:132
+msgid "Revert DNS settings"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:133
+msgid "Authentication is required to reset DNS settings."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:143
+msgid "DHCP server sends force renew message"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:144
+msgid "Authentication is required to send force renew message."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:154
+msgid "Renew dynamic addresses"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:155
+msgid "Authentication is required to renew dynamic addresses."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:165
+msgid "Reload network settings"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:166
+msgid "Authentication is required to reload network settings."
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:176
+msgid "Reconfigure network interface"
+msgstr ""
+
+#: src/network/org.freedesktop.network1.policy:177
+msgid "Authentication is required to reconfigure network interface."
+msgstr ""
+
+#: src/portable/org.freedesktop.portable1.policy:13
+msgid "Inspect a portable service image"
+msgstr ""
+
+#: src/portable/org.freedesktop.portable1.policy:14
+msgid "Authentication is required to inspect a portable service image."
+msgstr ""
+
+#: src/portable/org.freedesktop.portable1.policy:23
+msgid "Attach or detach a portable service image"
+msgstr ""
+
+#: src/portable/org.freedesktop.portable1.policy:24
+msgid ""
+"Authentication is required to attach or detach a portable service image."
+msgstr ""
+
+#: src/portable/org.freedesktop.portable1.policy:34
+msgid "Delete or modify portable service image"
+msgstr ""
+
+#: src/portable/org.freedesktop.portable1.policy:35
+msgid ""
+"Authentication is required to delete or modify a portable service image."
+msgstr ""
+
+#: src/resolve/org.freedesktop.resolve1.policy:22
+msgid "Register a DNS-SD service"
+msgstr ""
+
+#: src/resolve/org.freedesktop.resolve1.policy:23
+msgid "Authentication is required to register a DNS-SD service"
+msgstr ""
+
+#: src/resolve/org.freedesktop.resolve1.policy:33
+msgid "Unregister a DNS-SD service"
+msgstr ""
+
+#: src/resolve/org.freedesktop.resolve1.policy:34
+msgid "Authentication is required to unregister a DNS-SD service"
+msgstr ""
+
+#: src/resolve/org.freedesktop.resolve1.policy:132
+msgid "Revert name resolution settings"
+msgstr ""
+
+#: src/resolve/org.freedesktop.resolve1.policy:133
+msgid "Authentication is required to reset name resolution settings."
+msgstr ""
+
+#: src/timedate/org.freedesktop.timedate1.policy:22
+msgid "Set system time"
+msgstr ""
+
+#: src/timedate/org.freedesktop.timedate1.policy:23
+msgid "Authentication is required to set the system time."
+msgstr ""
+
+#: src/timedate/org.freedesktop.timedate1.policy:33
+msgid "Set system timezone"
+msgstr ""
+
+#: src/timedate/org.freedesktop.timedate1.policy:34
+msgid "Authentication is required to set the system timezone."
+msgstr ""
+
+#: src/timedate/org.freedesktop.timedate1.policy:43
+msgid "Set RTC to local timezone or UTC"
+msgstr ""
+
+#: src/timedate/org.freedesktop.timedate1.policy:44
+msgid ""
+"Authentication is required to control whether the RTC stores the local or "
+"UTC time."
+msgstr ""
+
+#: src/timedate/org.freedesktop.timedate1.policy:53
+msgid "Turn network time synchronization on or off"
+msgstr ""
+
+#: src/timedate/org.freedesktop.timedate1.policy:54
+msgid ""
+"Authentication is required to control whether network time synchronization "
+"shall be enabled."
+msgstr ""
+
+#: src/core/dbus-unit.c:359
+msgid "Authentication is required to start '$(unit)'."
+msgstr ""
+
+#: src/core/dbus-unit.c:360
+msgid "Authentication is required to stop '$(unit)'."
+msgstr ""
+
+#: src/core/dbus-unit.c:361
+msgid "Authentication is required to reload '$(unit)'."
+msgstr ""
+
+#: src/core/dbus-unit.c:362 src/core/dbus-unit.c:363
+msgid "Authentication is required to restart '$(unit)'."
+msgstr ""
+
+#: src/core/dbus-unit.c:535
+msgid ""
+"Authentication is required to send a UNIX signal to the processes of "
+"'$(unit)'."
+msgstr ""
+
+#: src/core/dbus-unit.c:566
+msgid "Authentication is required to reset the \"failed\" state of '$(unit)'."
+msgstr ""
+
+#: src/core/dbus-unit.c:599
+msgid "Authentication is required to set properties on '$(unit)'."
+msgstr ""
+
+#: src/core/dbus-unit.c:708
+msgid ""
+"Authentication is required to delete files and directories associated with "
+"'$(unit)'."
+msgstr ""
+
+#: src/core/dbus-unit.c:757
+msgid ""
+"Authentication is required to freeze or thaw the processes of '$(unit)' unit."
+msgstr ""
SUBSYSTEM=="rtc", ATTR{hctosys}=="1", SYMLINK+="rtc"
SUBSYSTEM=="rtc", KERNEL=="rtc0", SYMLINK+="rtc", OPTIONS+="link_priority=-100"
-SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", IMPORT{builtin}="usb_id", IMPORT{builtin}="hwdb --subsystem=usb", GOTO="default_hwdb_imported"
+SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", IMPORT{builtin}="usb_id", IMPORT{builtin}="hwdb --subsystem=usb"
ENV{MODALIAS}!="", IMPORT{builtin}="hwdb --subsystem=$env{SUBSYSTEM}"
-LABEL="default_hwdb_imported"
ACTION!="add", GOTO="default_end"
SUBSYSTEM=="drm", KERNEL=="renderD*", GROUP="render", MODE="@GROUP_RENDER_MODE@"
SUBSYSTEM=="kfd", GROUP="render", MODE="@GROUP_RENDER_MODE@"
+SUBSYSTEM=="misc", KERNEL=="sgx_enclave", GROUP="sgx", MODE="0660"
+
# When using static_node= with non-default permissions, also update
# tmpfiles.d/static-nodes-permissions.conf.in to keep permissions synchronized.
SUBSYSTEM!="tty", GOTO="serial_end"
SUBSYSTEMS=="pci", ENV{ID_BUS}="pci", ENV{ID_VENDOR_ID}="$attr{vendor}", ENV{ID_MODEL_ID}="$attr{device}"
-# We already ran the hwdb builtin for devices with MODALIAS in 50-default.rules.
-# Let's cover the remaining case here, where we walk up the tree to find a node with $MODALIAS.
-ENV{MODALIAS}=="", SUBSYSTEMS=="pci", IMPORT{builtin}="hwdb --subsystem=pci"
+SUBSYSTEMS=="pci", IMPORT{builtin}="hwdb --subsystem=pci"
+SUBSYSTEMS=="usb", IMPORT{builtin}="usb_id", IMPORT{builtin}="hwdb --subsystem=usb"
# /dev/serial/by-path/, /dev/serial/by-id/ for USB devices
KERNEL!="ttyUSB[0-9]*|ttyACM[0-9]*", GOTO="serial_end"
--- /dev/null
+Files in this directory contain configuration for systemd-udev.service, a
+daemon that manages symlinks to device nodes, permissions of devices nodes,
+emits device events for userspace, and renames network interfaces.
+
+See man:udev(7) for an overview of the configuration file format, and
+man:systemd-udevd.service(8) for a description of service itself.
+
+Use 'systemd-analyze cat-config udev/rules.d' to display the effective config.
# SPDX-License-Identifier: LGPL-2.1-or-later
+install_data(
+ 'README',
+ install_dir : udevrulesdir)
+
rules = files('''
60-autosuspend.rules
60-block.rules
_systemd_run() {
local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
- local OPTS='-h --help --version --user --system --scope --unit --description --slice
- -r --remain-after-exit --send-sighup -H --host -M --machine --service-type
- --on-active --on-boot --on-startup --on-unit-active --on-unit-inactive
- --on-calendar --timer-property --path-property --socket-property -t --pty
- -q --quiet --no-block --uid --gid --nice -E --setenv -p --property
- --no-ask-password --wait -P --pipe -G --collect --working-directory
- -d --same-dir -S --shell'
+ local OPTS='--no-ask-password --scope -u --unit -p --property --description --slice --slice-inherit
+ -r --remain-after-exit --send-sighup --service-type --uid --gid --nice
+ --working-directory -d --same-dir -E --setenv -t --pty -P --pipe -S --shell -q --quiet
+ --on-active --on-boot --on-startup --on-unit-active --on-unit-inactive --on-calendar
+ --on-clock-change --on-timezone-change --path-property --socket-property
+ --timer-property --no-block --wait -G --collect --user --system -H --host -M --machine
+ -h --help --version'
local mode=--system
local i
local opts_with_values=(
- --unit --description --slice --service-type -H --host -M --machine -p --property --on-active
- --on-boot --on-startup --on-unit-active --on-unit-inactive --on-calendar --timer-property
- --path-property --socket-property --uid --gid --nice -E --setenv --working-directory
+ --unit -p --property --slice --description --service-type --uid --gid --nice --working-directory
+ -E --setenv --on-active --on-boot --on-startup --on-unit-active --on-unit-inactive --on-calendar
+ --path-property --socket-property --timer-property -H --host -M --machine
)
for (( i=1; i <= COMP_CWORD; i++ )); do
if [[ ${COMP_WORDS[i]} != -* ]]; then
-p|--property)
local comps='CPUAccounting= MemoryAccounting= BlockIOAccounting= SendSIGHUP=
SendSIGKILL= MemoryLimit= CPUShares= BlockIOWeight= User= Group=
- DevicePolicy= KillMode= DeviceAllow= BlockIOReadBandwidth=
+ DevicePolicy= KillMode= ExitType= DeviceAllow= BlockIOReadBandwidth=
BlockIOWriteBandwidth= BlockIODeviceWeight= Nice= Environment=
KillSignal= RestartKillSignal= FinalKillSignal= LimitCPU= LimitFSIZE= LimitDATA=
LimitSTACK= LimitCORE= LimitRSS= LimitNOFILE= LimitAS= LimitNPROC=
}
_arguments \
+ {-G,--collect}'[Unload the transient unit after it completed]' \
+ '--description=[Description for unit]:description' \
+ '--gid=[Run as system group]:group:_groups' \
{-h,--help}'[Show help message]' \
- '--version[Show package version]' \
- '--user[Run as user unit]' \
{-H+,--host=}'[Operate on remote host]:[user@]host:_sd_hosts_or_user_at_host' \
{-M+,--machine=}'[Operate on local container]:machines:_sd_machines' \
- '--scope[Run this as scope rather than service]' \
- '--unit=[Run under the specified unit name]:unit name' \
+ '--nice=[Nice level]:nice level' \
+ '--no-ask-password[Do not query the user for authentication]' \
+ '--no-block[Do not synchronously wait for the unit start operation to finish]' \
+ '--on-active=[Run after SEC seconds]:SEC' \
+ '--on-boot=[Run SEC seconds after machine was booted up]:SEC' \
+ '--on-calendar=[Realtime timer]:SPEC' \
+ '--on-clock-change[Defines a trigger based on system clock jumps]' \
+ '--on-startup=[Run SEC seconds after systemd was first started]:SEC' \
+ '--on-timezone-change[Defines a trigger based on system timezone changes]' \
+ '--on-unit-active=[Run SEC seconds after the last activation]:SEC' \
+ '--on-unit-inactive=[Run SEC seconds after the last deactivation]:SEC' \
+ '--path-property=[Set path unit property]:NAME=VALUE' \
+ {-P,--pipe}'[Inherit standard input, output, and error]' \
{-p+,--property=}'[Set unit property]:NAME=VALUE:(( \
CPUAccounting= MemoryAccounting= BlockIOAccounting= SendSIGHUP= \
SendSIGKILL= MemoryLimit= CPUShares= BlockIOWeight= User= Group= \
- DevicePolicy= KillMode= DeviceAllow= BlockIOReadBandwidth= \
+ DevicePolicy= KillMode= ExitType= DeviceAllow= BlockIOReadBandwidth= \
BlockIOWriteBandwidth= BlockIODeviceWeight= Nice= Environment= \
KillSignal= RestartKillSignal= FinalKillSignal= LimitCPU= LimitFSIZE= LimitDATA= \
LimitSTACK= LimitCORE= LimitRSS= LimitNOFILE= LimitAS= LimitNPROC= \
ReadOnlyPaths= InaccessiblePaths= EnvironmentFile= \
ProtectSystem= ProtectHome= RuntimeDirectory= PassEnvironment= \
))' \
- '--description=[Description for unit]:description' \
- '--slice=[Run in the specified slice]:slices:__systemd-run_slices' \
+ {-t,--pty}'[The service connects to the terminal]' \
+ {-q,--quiet}'[Suppresses additional informational output]' \
{-r,--remain-after-exit}'[Leave service around until explicitly stopped]' \
+ {-d,--same-dir}'[Run on the current working directory]' \
+ '--scope[Run this as scope rather than service]' \
'--send-sighup[Send SIGHUP when terminating]' \
'--service-type=[Service type]:type:(simple forking oneshot dbus notify idle)' \
- '--uid=[Run as system user]:user:_users' \
- '--gid=[Run as system group]:group:_groups' \
- '--nice=[Nice level]:nice level' \
- '--setenv=[Set environment]:NAME=VALUE' \
- '--on-active=[Run after SEC seconds]:SEC' \
- '--on-boot=[Run SEC seconds after machine was booted up]:SEC' \
- '--on-startup=[Run SEC seconds after systemd was first started]:SEC' \
- '--on-unit-active=[Run SEC seconds after the last activation]:SEC' \
- '--on-unit-inactive=[Run SEC seconds after the last deactivation]:SEC' \
- '--on-calendar=[Realtime timer]:SPEC' \
+ {-E+,--setenv=}'[Set environment]:NAME=VALUE' \
+ {-S,--shell}'[requests an interactive shell in the current working directory]' \
+ '--slice=[Run in the specified slice]:slices:__systemd-run_slices' \
+ '--slice-inherit[Run in the inherited slice]' \
+ '--socket-property=[Set socket unit property]:NAME=VALUE' \
+ '--system[Run as system unit]' \
'--timer-property=[Set timer unit property]:NAME=VALUE' \
+ '--uid=[Run as system user]:user:_users' \
+ {-u+,--unit=}'[Run under the specified unit name]:unit name' \
+ '--user[Run as user unit]' \
+ '--version[Show package version]' \
'--wait=[Wait until service stopped again]' \
+ '--working-directory=[Run with the specified working directory]' \
'*::command:_command'
if (!details_table)
return log_oom();
- (void) table_set_sort(details_table, (size_t) 3, (size_t) 1, (size_t) -1);
+ (void) table_set_sort(details_table, (size_t) 3, (size_t) 1);
(void) table_set_reverse(details_table, 3, true);
if (getenv_bool("SYSTEMD_ANALYZE_DEBUG") <= 0)
- (void) table_set_display(details_table, (size_t) 0, (size_t) 1, (size_t) 2, (size_t) 6, (size_t) -1);
+ (void) table_set_display(details_table, (size_t) 0, (size_t) 1, (size_t) 2, (size_t) 6);
}
for (i = 0; i < ELEMENTSOF(security_assessor_table); i++) {
if (r < 0)
return r;
- r = table_set_sort(table, (size_t) 0, (size_t) SIZE_MAX);
+ r = table_set_sort(table, (size_t) 0);
if (r < 0)
return r;
return bus_log_parse_error(r);
fflush(stdout);
- return copy_bytes(fd, STDOUT_FILENO, (uint64_t) -1, 0);
+ return copy_bytes(fd, STDOUT_FILENO, UINT64_MAX, 0);
}
static int cat_config(int argc, char *argv[], void *userdata) {
return table_log_add_error(r);
}
- (void) table_set_sort(table, (size_t) 1, (size_t) -1);
+ (void) table_set_sort(table, (size_t) 1);
}
(void) pager_open(arg_pager_flags);
return r;
if (arg_timeout > 0)
- timeout = now(CLOCK_MONOTONIC) + arg_timeout;
+ timeout = usec_add(now(CLOCK_MONOTONIC), arg_timeout);
else
timeout = 0;
#include <stdint.h>
#include <sys/types.h>
-#define AUDIT_SESSION_INVALID ((uint32_t) -1)
+#define AUDIT_SESSION_INVALID UINT32_MAX
int audit_session_from_pid(pid_t pid, uint32_t *id);
int audit_loginuid_from_pid(pid_t pid, uid_t *uid);
/* Gets the block device directly backing a file system. If the block device is encrypted, returns
* the device mapper block device. */
- fd = open(path, O_NOFOLLOW|O_CLOEXEC);
+ fd = open(path, O_RDONLY|O_NOFOLLOW|O_CLOEXEC);
if (fd < 0)
return -errno;
_cleanup_closedir_ DIR *d = NULL;
_cleanup_free_ char *t = NULL;
char p[SYS_BLOCK_PATH_MAX("/slaves")];
- struct dirent *de, *found = NULL;
+ _cleanup_free_ char *first_found = NULL;
+ struct dirent *de;
const char *q;
dev_t devt;
int r;
if (!IN_SET(de->d_type, DT_LNK, DT_UNKNOWN))
continue;
- if (found) {
+ if (first_found) {
_cleanup_free_ char *u = NULL, *v = NULL, *a = NULL, *b = NULL;
- /* We found a device backed by multiple other devices. We don't really support automatic
- * discovery on such setups, with the exception of dm-verity partitions. In this case there are
- * two backing devices: the data partition and the hash partition. We are fine with such
- * setups, however, only if both partitions are on the same physical device. Hence, let's
- * verify this. */
+ /* We found a device backed by multiple other devices. We don't really support
+ * automatic discovery on such setups, with the exception of dm-verity partitions. In
+ * this case there are two backing devices: the data partition and the hash
+ * partition. We are fine with such setups, however, only if both partitions are on
+ * the same physical device. Hence, let's verify this by iterating over every node
+ * in the 'slaves/' directory and comparing them with the first that gets returned by
+ * readdir(), to ensure they all point to the same device. */
u = path_join(p, de->d_name, "../dev");
if (!u)
return -ENOMEM;
- v = path_join(p, found->d_name, "../dev");
+ v = path_join(p, first_found, "../dev");
if (!v)
return -ENOMEM;
* different physical devices, and we don't support that. */
if (!streq(a, b))
return -ENOTUNIQ;
+ } else {
+ first_found = strdup(de->d_name);
+ if (!first_found)
+ return -ENOMEM;
}
-
- found = de;
}
- if (!found)
+ if (!first_found)
return -ENOENT;
- q = strjoina(p, "/", found->d_name, "/dev");
+ q = strjoina(p, "/", first_found, "/dev");
r = read_one_line_file(q, &t);
if (r < 0)
* comparing. This call increases the counter by one, dealing
* with the overflow between the overflows */
- if (args->key.min_offset < (uint64_t) -1) {
+ if (args->key.min_offset < UINT64_MAX) {
args->key.min_offset++;
return true;
}
- if (args->key.min_type < (uint8_t) -1) {
+ if (args->key.min_type < UINT8_MAX) {
args->key.min_type++;
args->key.min_offset = 0;
return true;
}
- if (args->key.min_objectid < (uint64_t) -1) {
+ if (args->key.min_objectid < UINT64_MAX) {
args->key.min_objectid++;
args->key.min_offset = 0;
args->key.min_type = 0;
.key.max_type = BTRFS_ROOT_ITEM_KEY,
.key.min_offset = 0,
- .key.max_offset = (uint64_t) -1,
+ .key.max_offset = UINT64_MAX,
/* No restrictions on the other components */
.key.min_transid = 0,
- .key.max_transid = (uint64_t) -1,
+ .key.max_transid = UINT64_MAX,
};
bool found = false;
/* No restrictions on the other components */
.key.min_transid = 0,
- .key.max_transid = (uint64_t) -1,
+ .key.max_transid = UINT64_MAX,
};
bool found_info = false, found_limit = false;
if (le64toh(qli->flags) & BTRFS_QGROUP_LIMIT_MAX_RFER)
ret->referenced_max = le64toh(qli->max_rfer);
else
- ret->referenced_max = (uint64_t) -1;
+ ret->referenced_max = UINT64_MAX;
if (le64toh(qli->flags) & BTRFS_QGROUP_LIMIT_MAX_EXCL)
ret->exclusive_max = le64toh(qli->max_excl);
else
- ret->exclusive_max = (uint64_t) -1;
+ ret->exclusive_max = UINT64_MAX;
found_limit = true;
}
return -ENODATA;
if (!found_info) {
- ret->referenced = (uint64_t) -1;
- ret->exclusive = (uint64_t) -1;
+ ret->referenced = UINT64_MAX;
+ ret->exclusive = UINT64_MAX;
}
if (!found_limit) {
- ret->referenced_max = (uint64_t) -1;
- ret->exclusive_max = (uint64_t) -1;
+ ret->referenced_max = UINT64_MAX;
+ ret->exclusive_max = UINT64_MAX;
}
return 0;
}
int btrfs_subvol_find_subtree_qgroup(int fd, uint64_t subvol_id, uint64_t *ret) {
- uint64_t level, lowest = (uint64_t) -1, lowest_qgroupid = 0;
+ uint64_t level, lowest = UINT64_MAX, lowest_qgroupid = 0;
_cleanup_free_ uint64_t *qgroups = NULL;
int r, n;
if (id != subvol_id)
continue;
- if (lowest == (uint64_t) -1 || level < lowest) {
+ if (lowest == UINT64_MAX || level < lowest) {
lowest_qgroupid = qgroups[i];
lowest = level;
}
}
- if (lowest == (uint64_t) -1) {
+ if (lowest == UINT64_MAX) {
/* No suitable higher-level qgroup found, let's return
* the leaf qgroup instead, and indicate that with the
* return value. */
.key.max_type = BTRFS_ROOT_BACKREF_KEY,
.key.min_transid = 0,
- .key.max_transid = (uint64_t) -1,
+ .key.max_transid = UINT64_MAX,
};
struct btrfs_ioctl_vol_args vol_args = {};
/* No restrictions on the other components */
.key.min_transid = 0,
- .key.max_transid = (uint64_t) -1,
+ .key.max_transid = UINT64_MAX,
};
int r;
.key.max_type = BTRFS_ROOT_BACKREF_KEY,
.key.min_transid = 0,
- .key.max_transid = (uint64_t) -1,
+ .key.max_transid = UINT64_MAX,
};
struct btrfs_ioctl_vol_args_v2 vol_args = {
/* No restrictions on the other components */
.key.min_offset = 0,
- .key.max_offset = (uint64_t) -1,
+ .key.max_offset = UINT64_MAX,
.key.min_transid = 0,
- .key.max_transid = (uint64_t) -1,
+ .key.max_transid = UINT64_MAX,
};
_cleanup_free_ uint64_t *items = NULL;
/* No restrictions on the other components */
.key.min_offset = 0,
- .key.max_offset = (uint64_t) -1,
+ .key.max_offset = UINT64_MAX,
.key.min_transid = 0,
- .key.max_transid = (uint64_t) -1,
+ .key.max_transid = UINT64_MAX,
};
int r;
combined = q->effective | q->bounding | q->inheritable | q->permitted;
- ambient_supported = q->ambient != (uint64_t) -1;
+ ambient_supported = q->ambient != UINT64_MAX;
if (ambient_supported)
combined |= q->ambient;
_cleanup_cap_free_ cap_t c = NULL, modified = NULL;
int r;
- if (q->ambient != (uint64_t) -1) {
+ if (q->ambient != UINT64_MAX) {
bool changed = false;
c = cap_get_proc();
return r;
}
- if (q->inheritable != (uint64_t) -1 || q->permitted != (uint64_t) -1 || q->effective != (uint64_t) -1) {
+ if (q->inheritable != UINT64_MAX || q->permitted != UINT64_MAX || q->effective != UINT64_MAX) {
bool changed = false;
if (!c) {
uint64_t m = UINT64_C(1) << i;
cap_value_t cv = (cap_value_t) i;
- if (q->inheritable != (uint64_t) -1) {
+ if (q->inheritable != UINT64_MAX) {
cap_flag_value_t old_value, new_value;
if (cap_get_flag(c, cv, CAP_INHERITABLE, &old_value) < 0) {
}
}
- if (q->permitted != (uint64_t) -1) {
+ if (q->permitted != UINT64_MAX) {
cap_flag_value_t old_value, new_value;
if (cap_get_flag(c, cv, CAP_PERMITTED, &old_value) < 0) {
}
}
- if (q->effective != (uint64_t) -1) {
+ if (q->effective != UINT64_MAX) {
cap_flag_value_t old_value, new_value;
if (cap_get_flag(c, cv, CAP_EFFECTIVE, &old_value) < 0) {
if (changed) {
/* In order to change the bounding caps, we need to keep CAP_SETPCAP for a bit
* longer. Let's add it to our list hence for now. */
- if (q->bounding != (uint64_t) -1) {
+ if (q->bounding != UINT64_MAX) {
cap_value_t cv = CAP_SETPCAP;
modified = cap_dup(c);
}
}
- if (q->bounding != (uint64_t) -1) {
+ if (q->bounding != UINT64_MAX) {
r = capability_bounding_set_drop(q->bounding, false);
if (r < 0)
return r;
#include "missing_capability.h"
#include "util.h"
-#define CAP_ALL (uint64_t) -1
+#define CAP_ALL UINT64_MAX
unsigned cap_last_cap(void);
int have_effective_cap(int value);
#define CAP_TO_MASK_CORRECTED(x) (1U << ((x) & 31U))
typedef struct CapabilityQuintet {
- /* Stores all five types of capabilities in one go. Note that we use (uint64_t) -1 for unset here. This hence
+ /* Stores all five types of capabilities in one go. Note that we use UINT64_MAX for unset here. This hence
* needs to be updated as soon as Linux learns more than 63 caps. */
uint64_t effective;
uint64_t bounding;
assert_cc(CAP_LAST_CAP < 64);
-#define CAPABILITY_QUINTET_NULL { (uint64_t) -1, (uint64_t) -1, (uint64_t) -1, (uint64_t) -1, (uint64_t) -1 }
+#define CAPABILITY_QUINTET_NULL { UINT64_MAX, UINT64_MAX, UINT64_MAX, UINT64_MAX, UINT64_MAX }
static inline bool capability_quintet_is_set(const CapabilityQuintet *q) {
- return q->effective != (uint64_t) -1 ||
- q->bounding != (uint64_t) -1 ||
- q->inheritable != (uint64_t) -1 ||
- q->permitted != (uint64_t) -1 ||
- q->ambient != (uint64_t) -1;
+ return q->effective != UINT64_MAX ||
+ q->bounding != UINT64_MAX ||
+ q->inheritable != UINT64_MAX ||
+ q->permitted != UINT64_MAX ||
+ q->ambient != UINT64_MAX;
}
/* Mangles the specified caps quintet taking the current bounding set into account:
if (r < 0)
return r;
- r = read_full_file(events, &content, NULL);
+ r = read_full_virtual_file(events, &content, NULL);
if (r < 0)
return r;
return 0;
}
-static int controller_is_accessible(const char *controller) {
- int r;
+static int controller_is_v1_accessible(const char *root, const char *controller) {
+ const char *cpath, *dn;
assert(controller);
- /* Checks whether a specific controller is accessible,
- * i.e. its hierarchy mounted. In the unified hierarchy all
- * controllers are considered accessible, except for the named
- * hierarchies */
-
- if (!cg_controller_is_valid(controller))
- return -EINVAL;
-
- r = cg_all_unified();
- if (r < 0)
- return r;
- if (r > 0) {
- /* We don't support named hierarchies if we are using
- * the unified hierarchy. */
-
- if (streq(controller, SYSTEMD_CGROUP_CONTROLLER))
- return 0;
-
- if (startswith(controller, "name="))
- return -EOPNOTSUPP;
-
- } else {
- const char *cc, *dn;
+ dn = controller_to_dirname(controller);
- dn = controller_to_dirname(controller);
- cc = strjoina("/sys/fs/cgroup/", dn);
+ /* If root if specified, we check that:
+ * - possible subcgroup is created at root,
+ * - we can modify the hierarchy. */
- if (laccess(cc, F_OK) < 0)
- return -errno;
- }
+ cpath = strjoina("/sys/fs/cgroup/", dn, root, root ? "/cgroup.procs" : NULL);
+ if (laccess(cpath, root ? W_OK : F_OK) < 0)
+ return -errno;
return 0;
}
assert(controller);
assert(fs);
- /* Check if the specified controller is actually accessible */
- r = controller_is_accessible(controller);
+ if (!cg_controller_is_valid(controller))
+ return -EINVAL;
+
+ r = cg_all_unified();
if (r < 0)
return r;
+ if (r > 0) {
+ /* In the unified hierarchy all controllers are considered accessible,
+ * except for the named hierarchies */
+ if (startswith(controller, "name="))
+ return -EOPNOTSUPP;
+ } else {
+ /* Check if the specified controller is actually accessible */
+ r = controller_is_v1_accessible(NULL, controller);
+ if (r < 0)
+ return r;
+ }
return cg_get_path(controller, path, suffix, fs);
}
if (!strchr(CONTROLLER_VALID, *t))
return false;
- if (t - p > FILENAME_MAX)
+ if (t - p > NAME_MAX)
return false;
return true;
return 0;
}
-int cg_mask_supported(CGroupMask *ret) {
+int cg_mask_supported_subtree(const char *root, CGroupMask *ret) {
CGroupMask mask;
int r;
if (r < 0)
return r;
if (r > 0) {
- _cleanup_free_ char *root = NULL, *controllers = NULL, *path = NULL;
+ _cleanup_free_ char *controllers = NULL, *path = NULL;
/* In the unified hierarchy we can read the supported and accessible controllers from
* the top-level cgroup attribute */
- r = cg_get_root_path(&root);
- if (r < 0)
- return r;
-
r = cg_get_path(SYSTEMD_CGROUP_CONTROLLER, root, "cgroup.controllers", &path);
if (r < 0)
return r;
} else {
CGroupController c;
- /* In the legacy hierarchy, we check which hierarchies are mounted. */
+ /* In the legacy hierarchy, we check which hierarchies are accessible. */
mask = 0;
for (c = 0; c < _CGROUP_CONTROLLER_MAX; c++) {
continue;
n = cgroup_controller_to_string(c);
- if (controller_is_accessible(n) >= 0)
+ if (controller_is_v1_accessible(root, n) >= 0)
mask |= bit;
}
}
return 0;
}
+int cg_mask_supported(CGroupMask *ret) {
+ _cleanup_free_ char *root = NULL;
+ int r;
+
+ r = cg_get_root_path(&root);
+ if (r < 0)
+ return r;
+
+ return cg_mask_supported_subtree(root, ret);
+}
+
int cg_kernel_controllers(Set **ret) {
_cleanup_set_free_free_ Set *controllers = NULL;
_cleanup_fclose_ FILE *f = NULL;
return r;
/* Ignore the header line */
- (void) read_line(f, (size_t) -1, NULL);
+ (void) read_line(f, SIZE_MAX, NULL);
for (;;) {
char *controller;
unified_cache = CGROUP_UNIFIED_SYSTEMD;
unified_systemd_v232 = false;
} else {
- if (statfs("/sys/fs/cgroup/systemd/", &fs) < 0)
+ if (statfs("/sys/fs/cgroup/systemd/", &fs) < 0) {
+ if (errno == ENOENT) {
+ /* Some other software may have set up /sys/fs/cgroup in a configuration we do not recognize. */
+ log_debug_errno(errno, "Unsupported cgroupsv1 setup detected: name=systemd hierarchy not found.");
+ return -ENOMEDIUM;
+ }
return log_debug_errno(errno, "statfs(\"/sys/fs/cgroup/systemd\" failed: %m");
+ }
if (F_TYPE_EQUAL(fs.f_type, CGROUP2_SUPER_MAGIC)) {
log_debug("Found cgroup2 on /sys/fs/cgroup/systemd, unified hierarchy for systemd controller (v232 variant)");
bool cpu_accounting_is_cheap(void);
/* Special values for all weight knobs on unified hierarchy */
-#define CGROUP_WEIGHT_INVALID ((uint64_t) -1)
+#define CGROUP_WEIGHT_INVALID UINT64_MAX
#define CGROUP_WEIGHT_MIN UINT64_C(1)
#define CGROUP_WEIGHT_MAX UINT64_C(10000)
#define CGROUP_WEIGHT_DEFAULT UINT64_C(100)
#define CGROUP_LIMIT_MIN UINT64_C(0)
-#define CGROUP_LIMIT_MAX ((uint64_t) -1)
+#define CGROUP_LIMIT_MAX UINT64_MAX
static inline bool CGROUP_WEIGHT_IS_OK(uint64_t x) {
return
CGroupIOLimitType cgroup_io_limit_type_from_string(const char *s) _pure_;
/* Special values for the cpu.shares attribute */
-#define CGROUP_CPU_SHARES_INVALID ((uint64_t) -1)
+#define CGROUP_CPU_SHARES_INVALID UINT64_MAX
#define CGROUP_CPU_SHARES_MIN UINT64_C(2)
#define CGROUP_CPU_SHARES_MAX UINT64_C(262144)
#define CGROUP_CPU_SHARES_DEFAULT UINT64_C(1024)
}
/* Special values for the blkio.weight attribute */
-#define CGROUP_BLKIO_WEIGHT_INVALID ((uint64_t) -1)
+#define CGROUP_BLKIO_WEIGHT_INVALID UINT64_MAX
#define CGROUP_BLKIO_WEIGHT_MIN UINT64_C(10)
#define CGROUP_BLKIO_WEIGHT_MAX UINT64_C(1000)
#define CGROUP_BLKIO_WEIGHT_DEFAULT UINT64_C(500)
typedef const char* (*cg_migrate_callback_t)(CGroupMask mask, void *userdata);
int cg_mask_supported(CGroupMask *ret);
+int cg_mask_supported_subtree(const char *root, CGroupMask *ret);
int cg_mask_from_string(const char *s, CGroupMask *ret);
int cg_mask_to_string(CGroupMask mask, char **ret);
return r;
}
- if (max_bytes != (uint64_t) -1) {
+ if (max_bytes != UINT64_MAX) {
assert(max_bytes >= (uint64_t) n);
max_bytes -= n;
}
if (fdt < 0)
return -errno;
- r = copy_bytes_full(fdf, fdt, (uint64_t) -1, copy_flags, NULL, NULL, progress, userdata);
+ r = copy_bytes_full(fdf, fdt, UINT64_MAX, copy_flags, NULL, NULL, progress, userdata);
if (r < 0) {
(void) unlinkat(dt, to, 0);
return r;
if (fdf < 0)
return -errno;
- r = copy_bytes_full(fdf, fdt, (uint64_t) -1, copy_flags, NULL, NULL, progress_bytes, userdata);
+ r = copy_bytes_full(fdf, fdt, UINT64_MAX, copy_flags, NULL, NULL, progress_bytes, userdata);
(void) copy_times(fdf, fdt, copy_flags);
(void) copy_xattr(fdf, fdt);
if (fdf < 0)
return -errno;
- if (mode == (mode_t) -1)
+ if (mode == MODE_INVALID)
if (fstat(fdf, &st) < 0)
return -errno;
return r;
}
fdt = open(to, flags|O_WRONLY|O_CREAT|O_CLOEXEC|O_NOCTTY,
- mode != (mode_t) -1 ? mode : st.st_mode);
+ mode != MODE_INVALID ? mode : st.st_mode);
if (copy_flags & COPY_MAC_CREATE)
mac_selinux_create_file_clear();
if (fdt < 0)
if (chattr_mask != 0)
(void) chattr_fd(fdt, chattr_flags, chattr_mask & CHATTR_EARLY_FL, NULL);
- r = copy_bytes_full(fdf, fdt, (uint64_t) -1, copy_flags, NULL, NULL, progress_bytes, userdata);
+ r = copy_bytes_full(fdf, fdt, UINT64_MAX, copy_flags, NULL, NULL, progress_bytes, userdata);
if (r < 0) {
close(fdt);
(void) unlink(to);
* writing it. */
if (copy_flags & COPY_REPLACE) {
- r = tempfn_random(to, NULL, &t);
+ _cleanup_free_ char *f = NULL;
+
+ r = tempfn_random(to, NULL, &f);
if (r < 0)
return r;
if (copy_flags & COPY_MAC_CREATE) {
r = mac_selinux_create_file_prepare(to, S_IFREG);
- if (r < 0) {
- t = mfree(t);
+ if (r < 0)
return r;
- }
}
- fdt = open(t, O_CREAT|O_EXCL|O_NOFOLLOW|O_NOCTTY|O_WRONLY|O_CLOEXEC, 0600);
+ fdt = open(f, O_CREAT|O_EXCL|O_NOFOLLOW|O_NOCTTY|O_WRONLY|O_CLOEXEC, 0600);
if (copy_flags & COPY_MAC_CREATE)
mac_selinux_create_file_clear();
- if (fdt < 0) {
- t = mfree(t);
+ if (fdt < 0)
return -errno;
- }
+
+ t = TAKE_PTR(f);
} else {
if (copy_flags & COPY_MAC_CREATE) {
r = mac_selinux_create_file_prepare(to, S_IFREG);
assert(fdf >= 0);
assert(fdt >= 0);
+ /* Copies just the access mode (and not the ownership) from fdf to fdt */
+
if (fstat(fdf, &st) < 0)
return -errno;
return 0;
}
+int copy_rights(int fdf, int fdt) {
+ struct stat st;
+
+ assert(fdf >= 0);
+ assert(fdt >= 0);
+
+ /* Copies both access mode and ownership from fdf to fdt */
+
+ if (fstat(fdf, &st) < 0)
+ return -errno;
+
+ return fchmod_and_chown(fdt, st.st_mode & 07777, st.st_uid, st.st_gid);
+}
+
int copy_xattr(int fdf, int fdt) {
_cleanup_free_ char *names = NULL;
int ret = 0, r;
int copy_times(int fdf, int fdt, CopyFlags flags);
int copy_access(int fdf, int fdt);
+int copy_rights(int fdf, int fdt);
int copy_xattr(int fdf, int fdt);
for (i = 0, j = 0; str[i] != '\0'; i++) {
int seqlen;
- seqlen = utf8_encoded_valid_unichar(str + i, (size_t) -1);
+ seqlen = utf8_encoded_valid_unichar(str + i, SIZE_MAX);
if (seqlen > 1) {
if (len-j < (size_t)seqlen)
void *userdata,
int *n_pushed) {
- size_t key_alloc = 0, n_key = 0, value_alloc = 0, n_value = 0, last_value_whitespace = (size_t) -1, last_key_whitespace = (size_t) -1;
+ size_t key_alloc = 0, n_key = 0, value_alloc = 0, n_value = 0, last_value_whitespace = SIZE_MAX, last_key_whitespace = SIZE_MAX;
_cleanup_free_ char *contents = NULL, *key = NULL, *value = NULL;
unsigned line = 1;
char *p;
state = COMMENT;
else if (!strchr(WHITESPACE, c)) {
state = KEY;
- last_key_whitespace = (size_t) -1;
+ last_key_whitespace = SIZE_MAX;
if (!GREEDY_REALLOC(key, key_alloc, n_key+2))
return -ENOMEM;
n_key = 0;
} else if (c == '=') {
state = PRE_VALUE;
- last_value_whitespace = (size_t) -1;
+ last_value_whitespace = SIZE_MAX;
} else {
if (!strchr(WHITESPACE, c))
- last_key_whitespace = (size_t) -1;
- else if (last_key_whitespace == (size_t) -1)
+ last_key_whitespace = SIZE_MAX;
+ else if (last_key_whitespace == SIZE_MAX)
last_key_whitespace = n_key;
if (!GREEDY_REALLOC(key, key_alloc, n_key+2))
value[n_value] = 0;
/* strip trailing whitespace from key */
- if (last_key_whitespace != (size_t) -1)
+ if (last_key_whitespace != SIZE_MAX)
key[last_key_whitespace] = 0;
r = push(fname, line, key, value, userdata, n_pushed);
value[n_value] = 0;
/* Chomp off trailing whitespace from value */
- if (last_value_whitespace != (size_t) -1)
+ if (last_value_whitespace != SIZE_MAX)
value[last_value_whitespace] = 0;
/* strip trailing whitespace from key */
- if (last_key_whitespace != (size_t) -1)
+ if (last_key_whitespace != SIZE_MAX)
key[last_key_whitespace] = 0;
r = push(fname, line, key, value, userdata, n_pushed);
} else if (c == '\\') {
state = VALUE_ESCAPE;
- last_value_whitespace = (size_t) -1;
+ last_value_whitespace = SIZE_MAX;
} else {
if (!strchr(WHITESPACE, c))
- last_value_whitespace = (size_t) -1;
- else if (last_value_whitespace == (size_t) -1)
+ last_value_whitespace = SIZE_MAX;
+ else if (last_value_whitespace == SIZE_MAX)
last_value_whitespace = n_value;
if (!GREEDY_REALLOC(value, value_alloc, n_value+2))
value[n_value] = 0;
if (state == VALUE)
- if (last_value_whitespace != (size_t) -1)
+ if (last_value_whitespace != SIZE_MAX)
value[last_value_whitespace] = 0;
/* strip trailing whitespace from key */
- if (last_key_whitespace != (size_t) -1)
+ if (last_key_whitespace != SIZE_MAX)
key[last_key_whitespace] = 0;
r = push(fname, line, key, value, userdata, n_pushed);
* instead be copied directly.
*/
- if (length != (size_t) -1 && length < 1)
+ if (length != SIZE_MAX && length < 1)
return -EINVAL;
switch (p[0]) {
/* hexadecimal encoding */
int a, b;
- if (length != (size_t) -1 && length < 3)
+ if (length != SIZE_MAX && length < 3)
return -EINVAL;
a = unhexchar(p[1]);
size_t i;
uint32_t c;
- if (length != (size_t) -1 && length < 5)
+ if (length != SIZE_MAX && length < 5)
return -EINVAL;
for (i = 0; i < 4; i++) {
size_t i;
char32_t c;
- if (length != (size_t) -1 && length < 9)
+ if (length != SIZE_MAX && length < 9)
return -EINVAL;
for (i = 0; i < 8; i++) {
int a, b, c;
char32_t m;
- if (length != (size_t) -1 && length < 3)
+ if (length != SIZE_MAX && length < 3)
return -EINVAL;
a = unoctchar(p[0]);
return -ENOMEM;
if (c == 0) {
- if ((flags & EXTRACT_CUNESCAPE_RELAX) &&
+ if ((flags & EXTRACT_UNESCAPE_RELAX) &&
(quote == 0 || flags & EXTRACT_RELAX)) {
/* If we find an unquoted trailing backslash and we're in
- * EXTRACT_CUNESCAPE_RELAX mode, keep it verbatim in the
+ * EXTRACT_UNESCAPE_RELAX mode, keep it verbatim in the
* output.
*
* Unbalanced quotes will only be allowed in EXTRACT_RELAX
- * mode, EXTRACT_CUNESCAPE_RELAX mode does not allow them.
+ * mode, EXTRACT_UNESCAPE_RELAX mode does not allow them.
*/
s[sz++] = '\\';
goto finish_force_terminate;
char32_t u;
if ((flags & EXTRACT_CUNESCAPE) &&
- (r = cunescape_one(*p, (size_t) -1, &u, &eight_bit, false)) >= 0) {
+ (r = cunescape_one(*p, SIZE_MAX, &u, &eight_bit, false)) >= 0) {
/* A valid escaped sequence */
assert(r >= 1);
else
sz += utf8_encode_unichar(s + sz, u);
} else if ((flags & EXTRACT_UNESCAPE_SEPARATORS) &&
- strchr(separators, **p))
- /* An escaped separator char */
+ (strchr(separators, **p) || **p == '\\'))
+ /* An escaped separator char or the escape char itself */
s[sz++] = c;
- else if (flags & EXTRACT_CUNESCAPE_RELAX) {
+ else if (flags & EXTRACT_UNESCAPE_RELAX) {
s[sz++] = '\\';
s[sz++] = c;
} else
const char *rvalue) {
/* Try to unquote it, if it fails, warn about it and try again
- * but this time using EXTRACT_CUNESCAPE_RELAX to keep the
+ * but this time using EXTRACT_UNESCAPE_RELAX to keep the
* backslashes verbatim in invalid escape sequences. */
const char *save;
if (r >= 0)
return r;
- if (r == -EINVAL && !(flags & EXTRACT_CUNESCAPE_RELAX)) {
+ if (r == -EINVAL && !(flags & EXTRACT_UNESCAPE_RELAX)) {
- /* Retry it with EXTRACT_CUNESCAPE_RELAX. */
+ /* Retry it with EXTRACT_UNESCAPE_RELAX. */
*p = save;
- r = extract_first_word(p, ret, separators, flags|EXTRACT_CUNESCAPE_RELAX);
+ r = extract_first_word(p, ret, separators, flags|EXTRACT_UNESCAPE_RELAX);
if (r >= 0) {
/* It worked this time, hence it must have been an invalid escape sequence. */
log_syntax(unit, LOG_WARNING, filename, line, EINVAL, "Ignoring unknown escape sequences: \"%s\"", *ret);
#include "macro.h"
typedef enum ExtractFlags {
- EXTRACT_RELAX = 1 << 0,
- EXTRACT_CUNESCAPE = 1 << 1,
- EXTRACT_CUNESCAPE_RELAX = 1 << 2,
- EXTRACT_UNESCAPE_SEPARATORS = 1 << 3,
- EXTRACT_UNQUOTE = 1 << 4,
- EXTRACT_DONT_COALESCE_SEPARATORS = 1 << 5,
- EXTRACT_RETAIN_ESCAPE = 1 << 6,
+ EXTRACT_RELAX = 1 << 0, /* Allow unbalanced quote and eat up trailing backslash. */
+ EXTRACT_CUNESCAPE = 1 << 1, /* Unescape known escape sequences. */
+ EXTRACT_UNESCAPE_RELAX = 1 << 2, /* Allow and keep unknown escape sequences, allow and keep trailing backslash. */
+ EXTRACT_UNESCAPE_SEPARATORS = 1 << 3, /* Unescape separators (those specified, or whitespace by default). */
+ EXTRACT_UNQUOTE = 1 << 4, /* Remove quoting with "" and ''. */
+ EXTRACT_DONT_COALESCE_SEPARATORS = 1 << 5, /* Don't treat multiple adjacent separators as one */
+ EXTRACT_RETAIN_ESCAPE = 1 << 6, /* Treat escape character '\' as any other character without special meaning */
+
+ /* Note that if no flags are specified, escaped escape characters will be silently stripped. */
} ExtractFlags;
int extract_first_word(const char **p, char **ret, const char *separators, ExtractFlags flags);
#include "string-util.h"
#include "tmpfile-util.h"
-#define READ_FULL_BYTES_MAX (4U*1024U*1024U)
+/* The maximum size of the file we'll read in one go. */
+#define READ_FULL_BYTES_MAX (4U*1024U*1024U - 1)
int fopen_unlocked(const char *path, const char *options, FILE **ret) {
assert(ret);
struct stat st;
size_t n, size;
int n_retries;
- char *p;
assert(ret_contents);
if (fd < 0)
return -errno;
- /* Start size for files in /proc/ which usually report a file size of 0. (Files in /sys/ report a
- * file size of 4K, which is probably OK for sizing our initial buffer, and sysfs attributes can't be
- * larger anyway.) */
- size = LINE_MAX / 2;
-
/* Limit the number of attempts to read the number of bytes returned by fstat(). */
n_retries = 3;
for (;;) {
- if (n_retries <= 0)
- return -EIO;
-
if (fstat(fd, &st) < 0)
return -errno;
return -EBADF;
/* Be prepared for files from /proc which generally report a file size of 0. */
+ assert_cc(READ_FULL_BYTES_MAX < SSIZE_MAX);
if (st.st_size > 0) {
+ if (st.st_size > READ_FULL_BYTES_MAX)
+ return -EFBIG;
+
size = st.st_size;
n_retries--;
- } else
- size = size * 2;
-
- if (size > READ_FULL_BYTES_MAX)
- return -E2BIG;
+ } else {
+ size = READ_FULL_BYTES_MAX;
+ n_retries = 0;
+ }
- p = realloc(buf, size + 1);
- if (!p)
+ buf = malloc(size + 1);
+ if (!buf)
return -ENOMEM;
- buf = TAKE_PTR(p);
+ /* Use a bigger allocation if we got it anyway, but not more than the limit. */
+ size = MIN(malloc_usable_size(buf) - 1, READ_FULL_BYTES_MAX);
for (;;) {
ssize_t k;
* processing, let's try again either with a bigger guessed size or the new
* file size. */
+ if (n_retries <= 0)
+ return st.st_size > 0 ? -EIO : -EFBIG;
+
if (lseek(fd, 0, SEEK_SET) < 0)
return -errno;
+
+ buf = mfree(buf);
}
if (n < size) {
+ char *p;
+
+ /* Return rest of the buffer to libc */
p = realloc(buf, n + 1);
if (!p)
return -ENOMEM;
- buf = TAKE_PTR(p);
+ buf = p;
}
- if (!ret_size) {
- /* Safety check: if the caller doesn't want to know the size of what we
- * just read it will rely on the trailing NUL byte. But if there's an
- * embedded NUL byte, then we should refuse operation as otherwise
- * there'd be ambiguity about what we just read. */
-
- if (memchr(buf, 0, n))
- return -EBADMSG;
- } else
+ if (ret_size)
*ret_size = n;
+ else if (memchr(buf, 0, n))
+ /* Safety check: if the caller doesn't want to know the size of what we just read it will
+ * rely on the trailing NUL byte. But if there's an embedded NUL byte, then we should refuse
+ * operation as otherwise there'd be ambiguity about what we just read. */
+ return -EBADMSG;
buf[n] = 0;
*ret_contents = TAKE_PTR(buf);
}
buf = t;
- n = n_next;
+ /* Unless a size has been explicitly specified, try to read as much as fits into the memory
+ * we allocated (minus 1, to leave one byte for the safety NUL byte) */
+ n = size == SIZE_MAX ? malloc_usable_size(buf) - 1 : n_next;
errno = 0;
k = fread(buf + l, 1, n - l, f);
return 0;
}
-int sync_rights(int from, int to) {
- struct stat st;
-
- if (fstat(from, &st) < 0)
- return -errno;
-
- return fchmod_and_chown(to, st.st_mode & 07777, st.st_uid, st.st_gid);
-}
-
int rename_and_apply_smack_floor_label(const char *from, const char *to) {
int r = 0;
if (rename(from, to) < 0)
int warn_file_is_world_accessible(const char *filename, struct stat *st, const char *unit, unsigned line);
-int sync_rights(int from, int to);
-
int rename_and_apply_smack_floor_label(const char *temp_path, const char *dest_path);
assert_cc(ELEMENTSOF(table_iec) == ELEMENTSOF(table_si));
- if (t == (uint64_t) -1)
+ if (t == UINT64_MAX)
return NULL;
table = flag & FORMAT_BYTES_USE_IEC ? table_iec : table_si;
}
int readlinkat_malloc(int fd, const char *p, char **ret) {
- size_t l = FILENAME_MAX+1;
- int r;
+ size_t l = PATH_MAX;
assert(p);
assert(ret);
for (;;) {
- char *c;
+ _cleanup_free_ char *c = NULL;
ssize_t n;
- c = new(char, l);
+ c = new(char, l+1);
if (!c)
return -ENOMEM;
- n = readlinkat(fd, p, c, l-1);
- if (n < 0) {
- r = -errno;
- free(c);
- return r;
- }
+ n = readlinkat(fd, p, c, l);
+ if (n < 0)
+ return -errno;
- if ((size_t) n < l-1) {
+ if ((size_t) n < l) {
c[n] = 0;
- *ret = c;
+ *ret = TAKE_PTR(c);
return 0;
}
- free(c);
+ if (l > (SSIZE_MAX-1)/2) /* readlinkat() returns an ssize_t, and we want an extra byte for a
+ * trailing NUL, hence do an overflow check relative to SSIZE_MAX-1
+ * here */
+ return -EFBIG;
+
l *= 2;
}
}
if (make_relative) {
_cleanup_free_ char *parent = NULL;
- parent = dirname_malloc(to);
- if (!parent)
- return -ENOMEM;
+ r = path_extract_directory(to, &parent);
+ if (r < 0)
+ return r;
r = path_make_relative(parent, from, &relpath);
if (r < 0)
int fsync_directory_of_file(int fd) {
_cleanup_free_ char *path = NULL;
_cleanup_close_ int dfd = -1;
+ struct stat st;
int r;
- r = fd_verify_regular(fd);
- if (r < 0)
- return r;
+ assert(fd >= 0);
- r = fd_get_path(fd, &path);
- if (r < 0) {
- log_debug_errno(r, "Failed to query /proc/self/fd/%d%s: %m",
- fd,
- r == -ENOSYS ? ", ignoring" : "");
+ /* We only reasonably can do this for regular files and directories, hence check for that */
+ if (fstat(fd, &st) < 0)
+ return -errno;
- if (r == -ENOSYS)
- /* If /proc is not available, we're most likely running in some
- * chroot environment, and syncing the directory is not very
- * important in that case. Let's just silently do nothing. */
- return 0;
+ if (S_ISREG(st.st_mode)) {
- return r;
- }
+ r = fd_get_path(fd, &path);
+ if (r < 0) {
+ log_debug_errno(r, "Failed to query /proc/self/fd/%d%s: %m",
+ fd,
+ r == -ENOSYS ? ", ignoring" : "");
- if (!path_is_absolute(path))
- return -EINVAL;
+ if (r == -ENOSYS)
+ /* If /proc is not available, we're most likely running in some
+ * chroot environment, and syncing the directory is not very
+ * important in that case. Let's just silently do nothing. */
+ return 0;
- dfd = open_parent(path, O_CLOEXEC, 0);
- if (dfd < 0)
- return dfd;
+ return r;
+ }
+
+ if (!path_is_absolute(path))
+ return -EINVAL;
+
+ dfd = open_parent(path, O_CLOEXEC|O_NOFOLLOW, 0);
+ if (dfd < 0)
+ return dfd;
+
+ } else if (S_ISDIR(st.st_mode)) {
+ dfd = openat(fd, "..", O_RDONLY|O_DIRECTORY|O_CLOEXEC, 0);
+ if (dfd < 0)
+ return -errno;
+ } else
+ return -ENOTTY;
if (fsync(dfd) < 0)
return -errno;
/* Sync both the file and the directory */
r = fsync(fd) < 0 ? -errno : 0;
- q = fsync_directory_of_file(fd);
- return r < 0 ? r : q;
+ q = fsync_directory_of_file(fd);
+ if (r < 0) /* Return earlier error */
+ return r;
+ if (q == -ENOTTY) /* Ignore if the 'fd' refers to a block device or so which doesn't really have a
+ * parent dir */
+ return 0;
+ return q;
}
int fsync_path_at(int at_fd, const char *path) {
} else
fd = at_fd;
} else {
-
- opened_fd = openat(at_fd, path, O_RDONLY|O_CLOEXEC);
+ opened_fd = openat(at_fd, path, O_RDONLY|O_CLOEXEC|O_NONBLOCK);
if (opened_fd < 0)
return -errno;
int open_parent(const char *path, int flags, mode_t mode) {
_cleanup_free_ char *parent = NULL;
- int fd;
+ int fd, r;
- if (isempty(path))
- return -EINVAL;
- if (path_equal(path, "/")) /* requesting the parent of the root dir is fishy, let's prohibit that */
- return -EINVAL;
-
- parent = dirname_malloc(path);
- if (!parent)
- return -ENOMEM;
+ r = path_extract_directory(path, &parent);
+ if (r < 0)
+ return r;
/* Let's insist on O_DIRECTORY since the parent of a file or directory is a directory. Except if we open an
* O_TMPFILE file, because in that case we are actually create a regular file below the parent directory. */
#include <sys/types.h>
#include <unistd.h>
+#include "alloc-util.h"
#include "errno-util.h"
#include "time-util.h"
return NULL;
(void) rmdir(p);
- free(p);
- return NULL;
+ return mfree(p);
}
DEFINE_TRIVIAL_CLEANUP_FUNC(char*, rmdir_and_free);
return NULL;
(void) unlink_noerrno(p);
- free(p);
- return NULL;
+ return mfree(p);
}
DEFINE_TRIVIAL_CLEANUP_FUNC(char*, unlink_and_free);
assert(ret_len);
assert(p || l == 0);
- if (l == (size_t) -1)
+ if (l == SIZE_MAX)
l = strlen(p);
/* Note that the calculation of memory size is an upper boundary, as we ignore whitespace while decoding */
assert(mem);
assert(_len);
- if (l == (size_t) -1)
+ if (l == SIZE_MAX)
l = strlen(p);
/* padding ensures any base32hex input has input divisible by 8 */
assert(ret);
assert(ret_size);
- if (l == (size_t) -1)
+ if (l == SIZE_MAX)
l = strlen(p);
/* A group of four input bytes needs three output bytes, in case of padding we need to add two or three extra
#include <errno.h>
#include <limits.h>
-#include <poll.h>
#include <stdio.h>
#include <unistd.h>
return !!(r & POLLHUP);
}
-int fd_wait_for_event(int fd, int event, usec_t t) {
-
- struct pollfd pollfd = {
- .fd = fd,
- .events = event,
- };
-
+int ppoll_usec(struct pollfd *fds, size_t nfds, usec_t timeout) {
struct timespec ts;
int r;
- r = ppoll(&pollfd, 1, t == USEC_INFINITY ? NULL : timespec_store(&ts, t), NULL);
+ assert(fds || nfds == 0);
+
+ if (nfds == 0)
+ return 0;
+
+ r = ppoll(fds, nfds, timeout == USEC_INFINITY ? NULL : timespec_store(&ts, timeout), NULL);
if (r < 0)
return -errno;
if (r == 0)
return 0;
- if (pollfd.revents & POLLNVAL)
- return -EBADF;
+ for (size_t i = 0, n = r; i < nfds && n > 0; i++) {
+ if (fds[i].revents == 0)
+ continue;
+ if (fds[i].revents & POLLNVAL)
+ return -EBADF;
+ n--;
+ }
+
+ return r;
+}
+
+int fd_wait_for_event(int fd, int event, usec_t timeout) {
+ struct pollfd pollfd = {
+ .fd = fd,
+ .events = event,
+ };
+ int r;
+
+ r = ppoll_usec(&pollfd, 1, timeout);
+ if (r <= 0)
+ return r;
return pollfd.revents;
}
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#pragma once
+#include <poll.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
int pipe_eof(int fd);
+int ppoll_usec(struct pollfd *fds, size_t nfds, usec_t timeout);
int fd_wait_for_event(int fd, int event, usec_t timeout);
ssize_t sparse_write(int fd, const void *p, size_t sz, size_t run_length);
/* Same as above, but allows one extra value: -1 as indication for infinity. */
- if (l == (uint64_t) -1)
+ if (l == UINT64_MAX)
return true;
return FILE_SIZE_VALID(l);
+++ /dev/null
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-
-#include <ftw.h>
-
-#include "kbd-util.h"
-#include "log.h"
-#include "nulstr-util.h"
-#include "path-util.h"
-#include "set.h"
-#include "string-util.h"
-#include "strv.h"
-#include "utf8.h"
-
-static thread_local Set *keymaps = NULL;
-
-static int nftw_cb(
- const char *fpath,
- const struct stat *sb,
- int tflag,
- struct FTW *ftwbuf) {
-
- _cleanup_free_ char *p = NULL;
- char *e;
- int r;
-
- if (tflag != FTW_F)
- return 0;
-
- if (!endswith(fpath, ".map") &&
- !endswith(fpath, ".map.gz"))
- return 0;
-
- p = strdup(basename(fpath));
- if (!p)
- return FTW_STOP;
-
- e = endswith(p, ".map");
- if (e)
- *e = 0;
-
- e = endswith(p, ".map.gz");
- if (e)
- *e = 0;
-
- if (!keymap_is_valid(p))
- return 0;
-
- r = set_consume(keymaps, TAKE_PTR(p));
- if (r < 0 && r != -EEXIST)
- return r;
-
- return 0;
-}
-
-int get_keymaps(char ***ret) {
- _cleanup_strv_free_ char **l = NULL;
- const char *dir;
- int r;
-
- keymaps = set_new(&string_hash_ops);
- if (!keymaps)
- return -ENOMEM;
-
- NULSTR_FOREACH(dir, KBD_KEYMAP_DIRS) {
- r = nftw(dir, nftw_cb, 20, FTW_PHYS|FTW_ACTIONRETVAL);
-
- if (r == FTW_STOP)
- log_debug("Directory not found %s", dir);
- else if (r < 0)
- log_debug_errno(r, "Can't add keymap: %m");
- }
-
- l = set_get_strv(keymaps);
- if (!l) {
- set_free_free(keymaps);
- return -ENOMEM;
- }
-
- set_free(keymaps);
-
- if (strv_isempty(l))
- return -ENOENT;
-
- strv_sort(l);
-
- *ret = TAKE_PTR(l);
-
- return 0;
-}
-
-bool keymap_is_valid(const char *name) {
-
- if (isempty(name))
- return false;
-
- if (strlen(name) >= 128)
- return false;
-
- if (!utf8_is_valid(name))
- return false;
-
- if (!filename_is_valid(name))
- return false;
-
- if (!string_is_safe(name))
- return false;
-
- return true;
-}
/* Do not call from library code. */
- /* If we don't use the console we close it here, to not get
- * killed by SAK. If we don't use syslog we close it here so
- * that we are not confused by somebody deleting the socket in
- * the fs, and to make sure we don't use it if prohibit_ipc is
- * set. If we don't use /dev/kmsg we still keep it open,
+ /* This function is often called in preparation for logging. Let's make sure we don't clobber errno,
+ * so that a call to a logging function immediately following a log_open() call can still easily
+ * reference an error that happened immediately before the log_open() call. */
+ PROTECT_ERRNO;
+
+ /* If we don't use the console, we close it here to not get killed by SAK. If we don't use syslog, we
+ * close it here too, so that we are not confused by somebody deleting the socket in the fs, and to
+ * make sure we don't use it if prohibit_ipc is set. If we don't use /dev/kmsg we still keep it open,
* because there is no reason to close it. */
if (log_target == LOG_TARGET_NULL) {
#define log_error_errno(error, ...) log_full_errno(LOG_ERR, error, __VA_ARGS__)
#define log_emergency_errno(error, ...) log_full_errno(log_emergency_level(), error, __VA_ARGS__)
-#ifdef LOG_TRACE
+#if LOG_TRACE
# define log_trace(...) log_debug(__VA_ARGS__)
#else
# define log_trace(...) do {} while (0)
io-util.c
io-util.h
ioprio.h
- kbd-util.c
- kbd-util.h
khash.c
khash.h
label.c
strv.h
strxcpyx.c
strxcpyx.h
+ sysctl-util.c
+ sysctl-util.h
syslog-util.c
syslog-util.h
terminal-util.c
return {filename.split('-')[-1][:-4]: parse_syscall_table(filename)
for filename in filenames}
-DEF_TEMPLATE = '''\
+DEF_TEMPLATE = '''
#ifndef __IGNORE_{syscall}
# if defined(__aarch64__)
# define systemd_NR_{syscall} {nr_arm64}
mappings = {f'nr_{arch}':t.get(syscall, -1)
for arch, t in tables.items()}
print(DEF_TEMPLATE.format(syscall=syscall, **mappings),
- file=out)
+ file=out, end='')
def print_syscall_defs(syscalls, tables, out):
print('''\
/* SPDX-License-Identifier: LGPL-2.1-or-later
* This file is generated. Do not edit! */
-''' , file=out)
+''' , file=out, end='')
for syscall in syscalls:
print_syscall_def(syscall, tables, out)
xsprintf(path, "/proc/self/fdinfo/%i", subfd);
}
- r = read_full_file(path, &fdinfo, NULL);
+ r = read_full_virtual_file(path, &fdinfo, NULL);
if (r == -ENOENT) /* The fdinfo directory is a relatively new addition */
return -EOPNOTSUPP;
if (r < 0)
if (!slash)
return filename_is_valid(s);
- if (slash - s > FILENAME_MAX) /* We want to allocate on the stack below, hence do a size check first */
+ if (slash - s > PATH_MAX) /* We want to allocate on the stack below, hence do a size check first */
return false;
if (slash[strspn(slash, "/")] != 0) /* Check that the suffix consist only of one or more slashes */
#include "namespace-util.h"
#include "process-util.h"
#include "stat-util.h"
+#include "stdio-util.h"
#include "user-util.h"
int namespace_open(pid_t pid, int *pidns_fd, int *mntns_fd, int *netns_fd, int *userns_fd, int *root_fd) {
}
int namespace_enter(int pidns_fd, int mntns_fd, int netns_fd, int userns_fd, int root_fd) {
+ int r;
+
if (userns_fd >= 0) {
- /* Can't setns to your own userns, since then you could
- * escalate from non-root to root in your own namespace, so
- * check if namespaces equal before attempting to enter. */
- _cleanup_free_ char *userns_fd_path = NULL;
- int r;
- if (asprintf(&userns_fd_path, "/proc/self/fd/%d", userns_fd) < 0)
- return -ENOMEM;
+ /* Can't setns to your own userns, since then you could escalate from non-root to root in
+ * your own namespace, so check if namespaces are equal before attempting to enter. */
+ char userns_fd_path[STRLEN("/proc/self/fd/") + DECIMAL_STR_MAX(int)];
+ xsprintf(userns_fd_path, "/proc/self/fd/%d", userns_fd);
r = files_same(userns_fd_path, "/proc/self/ns/user", 0);
if (r < 0)
return r;
return reset_uid_gid();
}
-int fd_is_network_ns(int fd) {
+int fd_is_ns(int fd, unsigned long nsflag) {
struct statfs s;
int r;
- /* Checks whether the specified file descriptor refers to a network namespace. On old kernels there's no nice
- * way to detect that, hence on those we'll return a recognizable error (EUCLEAN), so that callers can handle
- * this somewhat nicely.
+ /* Checks whether the specified file descriptor refers to a namespace created by specifying nsflag in clone().
+ * On old kernels there's no nice way to detect that, hence on those we'll return a recognizable error (EUCLEAN),
+ * so that callers can handle this somewhat nicely.
*
* This function returns > 0 if the fd definitely refers to a network namespace, 0 if it definitely does not
* refer to a network namespace, -EUCLEAN if we can't determine, and other negative error codes on error. */
return -errno;
}
- return r == CLONE_NEWNET;
+ return (unsigned long) r == nsflag;
}
int detach_mount_namespace(void) {
int namespace_open(pid_t pid, int *pidns_fd, int *mntns_fd, int *netns_fd, int *userns_fd, int *root_fd);
int namespace_enter(int pidns_fd, int mntns_fd, int netns_fd, int userns_fd, int root_fd);
-int fd_is_network_ns(int fd);
+int fd_is_ns(int fd, unsigned long nsflag);
int detach_mount_namespace(void);
extension_full_path = strjoina("/usr/lib/extension-release.d/extension-release.", extension);
r = chase_symlinks(extension_full_path, root, CHASE_PREFIX_ROOT,
- ret_path ? &q : NULL,
- ret_fd ? &fd : NULL);
+ ret_path ? &q : NULL,
+ ret_fd ? &fd : NULL);
} else {
const char *p;
FOREACH_STRING(p, "/etc/os-release", "/usr/lib/os-release") {
r = chase_symlinks(p, root, CHASE_PREFIX_ROOT,
- ret_path ? &q : NULL,
- ret_fd ? &fd : NULL);
+ ret_path ? &q : NULL,
+ ret_fd ? &fd : NULL);
if (r != -ENOENT)
break;
}
if (!f)
return -errno;
- *ret_file = f;
-
if (ret_path)
*ret_path = TAKE_PTR(p);
+ *ret_file = f;
return 0;
}
typedef struct Prioq Prioq;
-#define PRIOQ_IDX_NULL ((unsigned) -1)
+#define PRIOQ_IDX_NULL (UINT_MAX)
Prioq *prioq_new(compare_func_t compare);
Prioq *prioq_free(Prioq *q);
}
int get_process_cmdline(pid_t pid, size_t max_columns, ProcessCmdlineFlags flags, char **line) {
- _cleanup_fclose_ FILE *f = NULL;
_cleanup_free_ char *t = NULL, *ans = NULL;
const char *p;
- int r;
size_t k;
-
- /* This is supposed to be a safety guard against runaway command lines. */
- size_t max_length = sc_arg_max();
+ int r;
assert(line);
assert(pid >= 0);
* comm_fallback is false). Returns 0 and sets *line otherwise. */
p = procfs_file_alloca(pid, "cmdline");
- r = fopen_unlocked(p, "re", &f);
+ r = read_full_virtual_file(p, &t, &k);
if (r == -ENOENT)
return -ESRCH;
if (r < 0)
return r;
- /* We assume that each four-byte character uses one or two columns. If we ever check for combining
- * characters, this assumption will need to be adjusted. */
- if ((size_t) 4 * max_columns + 1 < max_columns)
- max_length = MIN(max_length, (size_t) 4 * max_columns + 1);
-
- t = new(char, max_length);
- if (!t)
- return -ENOMEM;
-
- k = fread(t, 1, max_length, f);
if (k > 0) {
/* Arguments are separated by NULs. Let's replace those with spaces. */
for (size_t i = 0; i < k - 1; i++)
if (t[i] == '\0')
t[i] = ' ';
-
- t[k] = '\0'; /* Normally, t[k] is already NUL, so this is just a guard in case of short read */
} else {
- /* We only treat getting nothing as an error. We *could* also get an error after reading some
- * data, but we ignore that case, as such an error is rather unlikely and we prefer to get
- * some data rather than none. */
- if (ferror(f))
- return -errno;
-
if (!(flags & PROCESS_CMDLINE_COMM_FALLBACK))
return -ENOENT;
if (r < 0)
return r;
- mfree(t);
+ free(t);
t = strjoin("[", t2, "]");
if (!t)
return -ENOMEM;
/* Drop into a sigtimewait-based timeout. Waiting for the
* pid to exit. */
- until = now(CLOCK_MONOTONIC) + timeout;
+ until = usec_add(now(CLOCK_MONOTONIC), timeout);
for (;;) {
usec_t n;
siginfo_t status = {};
original_pid = getpid_cached();
+ if (flags & FORK_FLUSH_STDIO) {
+ fflush(stdout);
+ fflush(stderr); /* This one shouldn't be necessary, stderr should be unbuffered anyway, but let's better be safe than sorry */
+ }
+
if (flags & (FORK_RESET_SIGNALS|FORK_DEATHSIG)) {
/* We temporarily block all signals, so that the new child has them blocked initially. This way, we can
* be sure that SIGTERMs are not lost we might send to the child. */
/* Spawns a temporary TTY agent, making sure it goes away when we go away */
- r = safe_fork_full(name, except, n_except, FORK_RESET_SIGNALS|FORK_DEATHSIG|FORK_CLOSE_ALL_FDS, ret_pid);
+ r = safe_fork_full(name,
+ except,
+ n_except,
+ FORK_RESET_SIGNALS|FORK_DEATHSIG|FORK_CLOSE_ALL_FDS|FORK_REOPEN_LOG,
+ ret_pid);
if (r < 0)
return r;
if (r > 0)
xsprintf(path, "/proc/self/fdinfo/%i", fd);
- r = read_full_file(path, &fdinfo, NULL);
+ r = read_full_virtual_file(path, &fdinfo, NULL);
if (r == -ENOENT) /* if fdinfo doesn't exist we assume the process does not exist */
return -ESRCH;
if (r < 0)
FORK_MOUNTNS_SLAVE = 1 << 9, /* Make child's mount namespace MS_SLAVE */
FORK_RLIMIT_NOFILE_SAFE = 1 << 10, /* Set RLIMIT_NOFILE soft limit to 1K for select() compat */
FORK_STDOUT_TO_STDERR = 1 << 11, /* Make stdout a copy of stderr */
+ FORK_FLUSH_STDIO = 1 << 12, /* fflush() stdout (and stderr) before forking */
} ForkFlags;
int safe_fork_full(const char *name, const int except_fds[], size_t n_except_fds, ForkFlags flags, pid_t *ret_pid);
ts = now(CLOCK_MONOTONIC);
if (r->begin <= 0 ||
- ts - r->begin > r->interval) {
+ usec_sub_unsigned(ts, r->begin) > r->interval) {
r->begin = ts;
/* Reset counter */
return !is_temporary_fs(sfs) && !is_cgroup_fs(sfs);
}
+static int patch_dirfd_mode(
+ int dfd,
+ mode_t *ret_old_mode) {
+
+ struct stat st;
+
+ assert(dfd >= 0);
+ assert(ret_old_mode);
+
+ if (fstat(dfd, &st) < 0)
+ return -errno;
+ if (!S_ISDIR(st.st_mode))
+ return -ENOTDIR;
+ if (FLAGS_SET(st.st_mode, 0700)) /* Already set? */
+ return -EACCES; /* original error */
+ if (st.st_uid != geteuid()) /* this only works if the UID matches ours */
+ return -EACCES;
+
+ if (fchmod(dfd, (st.st_mode | 0700) & 07777) < 0)
+ return -errno;
+
+ *ret_old_mode = st.st_mode;
+ return 0;
+}
+
static int unlinkat_harder(
int dfd,
const char *filename,
int unlink_flags,
RemoveFlags remove_flags) {
- struct stat st;
+ mode_t old_mode;
int r;
/* Like unlinkat(), but tries harder: if we get EACCESS we'll try to set the r/w/x bits on the
if (errno != EACCES || !FLAGS_SET(remove_flags, REMOVE_CHMOD))
return -errno;
- if (fstat(dfd, &st) < 0)
- return -errno;
- if (!S_ISDIR(st.st_mode))
- return -ENOTDIR;
- if (FLAGS_SET(st.st_mode, 0700)) /* Already set? */
- return -EACCES; /* original error */
- if (st.st_uid != geteuid()) /* this only works if the UID matches ours */
- return -EACCES;
-
- if (fchmod(dfd, (st.st_mode | 0700) & 07777) < 0)
- return -errno;
+ r = patch_dirfd_mode(dfd, &old_mode);
+ if (r < 0)
+ return r;
if (unlinkat(dfd, filename, unlink_flags) < 0) {
r = -errno;
/* Try to restore the original access mode if this didn't work */
- (void) fchmod(dfd, st.st_mode & 07777);
+ (void) fchmod(dfd, old_mode);
+ return r;
+ }
+
+ /* If this worked, we won't reset the old mode, since we'll need it for other entries too, and we
+ * should destroy the whole thing */
+ return 0;
+}
+
+static int fstatat_harder(
+ int dfd,
+ const char *filename,
+ struct stat *ret,
+ int fstatat_flags,
+ RemoveFlags remove_flags) {
+
+ mode_t old_mode;
+ int r;
+
+ /* Like unlink_harder() but does the same for fstatat() */
+
+ if (fstatat(dfd, filename, ret, fstatat_flags) >= 0)
+ return 0;
+ if (errno != EACCES || !FLAGS_SET(remove_flags, REMOVE_CHMOD))
+ return -errno;
+
+ r = patch_dirfd_mode(dfd, &old_mode);
+ if (r < 0)
+ return r;
+
+ if (fstatat(dfd, filename, ret, fstatat_flags) < 0) {
+ r = -errno;
+ (void) fchmod(dfd, old_mode);
return r;
}
if (de->d_type == DT_UNKNOWN ||
(de->d_type == DT_DIR && (root_dev || (flags & REMOVE_SUBVOLUME)))) {
- if (fstatat(fd, de->d_name, &st, AT_SYMLINK_NOFOLLOW) < 0) {
- if (ret == 0 && errno != ENOENT)
- ret = -errno;
+ r = fstatat_harder(fd, de->d_name, &st, AT_SYMLINK_NOFOLLOW, flags);
+ if (r < 0) {
+ if (ret == 0 && r != -ENOENT)
+ ret = r;
continue;
}
#include <sys/stat.h>
+#include "alloc-util.h"
#include "errno-util.h"
typedef enum RemoveFlags {
if (!p)
return NULL;
- (void) rm_rf(p, REMOVE_ROOT|REMOVE_PHYSICAL);
- free(p);
- return NULL;
+ (void) rm_rf(p, REMOVE_ROOT|REMOVE_PHYSICAL|REMOVE_MISSING_OK|REMOVE_CHMOD);
+ return mfree(p);
}
DEFINE_TRIVIAL_CLEANUP_FUNC(char*, rm_rf_physical_and_free);
if (!p)
return NULL;
- (void) rm_rf(p, REMOVE_ROOT|REMOVE_PHYSICAL|REMOVE_SUBVOLUME);
- free(p);
- return NULL;
+ (void) rm_rf(p, REMOVE_ROOT|REMOVE_PHYSICAL|REMOVE_SUBVOLUME|REMOVE_MISSING_OK|REMOVE_CHMOD);
+ return mfree(p);
}
DEFINE_TRIVIAL_CLEANUP_FUNC(char*, rm_rf_subvolume_and_free);
/* Check for policy reload so 'label_hnd' is kept up-to-date by callbacks */
mac_selinux_maybe_reload();
+ if (!label_hnd)
+ return 0;
if (selabel_lookup_raw(label_hnd, &fcon, inside_path, st.st_mode) < 0) {
/* If there's no label to set, then exit without warning */
/* Check for policy reload so 'label_hnd' is kept up-to-date by callbacks */
mac_selinux_maybe_reload();
+ if (!label_hnd)
+ return 0;
r = selabel_lookup_raw(label_hnd, &filecon, abspath, mode);
if (r < 0) {
_cleanup_free_ char *abspath = NULL;
int r;
-
assert(path);
if (!label_hnd)
/* Check for policy reload so 'label_hnd' is kept up-to-date by callbacks */
mac_selinux_maybe_reload();
+ if (!label_hnd)
+ goto skipped;
if (path_is_absolute(path))
r = selabel_lookup_raw(label_hnd, &fcon, path, S_IFSOCK);
#include "string-table.h"
#include "string-util.h"
#include "strv.h"
+#include "sysctl-util.h"
#include "user-util.h"
#include "utf8.h"
}
bool socket_ipv6_is_supported(void) {
- if (access("/proc/net/if_inet6", F_OK) != 0)
+ static int cached = -1;
+
+ if (cached < 0) {
+
+ if (access("/proc/net/if_inet6", F_OK) < 0) {
+
+ if (errno != ENOENT) {
+ log_debug_errno(errno, "Unexpected error when checking whether /proc/net/if_inet6 exists: %m");
+ return false;
+ }
+
+ cached = false;
+ } else
+ cached = true;
+ }
+
+ return cached;
+}
+
+bool socket_ipv6_is_enabled(void) {
+ _cleanup_free_ char *v = NULL;
+ int r;
+
+ /* Much like socket_ipv6_is_supported(), but also checks that the sysctl that disables IPv6 on all
+ * interfaces isn't turned on */
+
+ if (!socket_ipv6_is_supported())
return false;
- return true;
+ r = sysctl_read_ip_property(AF_INET6, "all", "disable_ipv6", &v);
+ if (r < 0) {
+ log_debug_errno(r, "Unexpected error reading 'net.ipv6.conf.all.disable_ipv6' sysctl: %m");
+ return true;
+ }
+
+ r = parse_boolean(v);
+ if (r < 0) {
+ log_debug_errno(r, "Failed to pare 'net.ipv6.conf.all.disable_ipv6' sysctl: %m");
+ return true;
+ }
+
+ return !r;
}
bool socket_address_matches_fd(const SocketAddress *a, int fd) {
if (dot_or_dot_dot(p))
return false;
+ /* Let's refuse "all" and "default" as interface name, to avoid collisions with the special sysctl
+ * directories /proc/sys/net/{ipv4,ipv6}/conf/{all,default} */
+ if (STR_IN_SET(p, "all", "default"))
+ return false;
+
for (const char *t = p; *t; t++) {
if ((unsigned char) *t >= 127U)
return false;
if ((unsigned char) *t <= 32U)
return false;
- if (IN_SET(*t, ':', '/'))
+ if (IN_SET(*t,
+ ':', /* colons are used by the legacy "alias" interface logic */
+ '/', /* slashes cannot work, since we need to use network interfaces in sysfs paths, and in paths slashes are separators */
+ '%')) /* %d is used in the kernel's weird foo%d format string naming feature which we really really don't want to ever run into by accident */
return false;
numeric = numeric && (*t >= '0' && *t <= '9');
const char* socket_address_get_path(const SocketAddress *a);
bool socket_ipv6_is_supported(void);
+bool socket_ipv6_is_enabled(void);
int sockaddr_port(const struct sockaddr *_sa, unsigned *port);
const union in_addr_union *sockaddr_in_addr(const struct sockaddr *sa);
assert(suffix);
a = strlen(s);
- if (b > ((size_t) -1) - a)
+ if (b > SIZE_MAX - a)
return NULL;
r = new(char, a+b+1);
assert(s);
assert(percent <= 100);
- assert(new_length != (size_t) -1);
+ assert(new_length != SIZE_MAX);
if (old_length <= new_length)
return strndup(s, old_length);
assert(s);
assert(percent <= 100);
- if (new_length == (size_t) -1)
+ if (new_length == SIZE_MAX)
return strndup(s, old_length);
if (new_length == 0)
return 0;
}
-char **strv_split_newlines(const char *s) {
- char **l;
+int strv_split_newlines_full(char ***ret, const char *s, ExtractFlags flags) {
+ _cleanup_strv_free_ char **l = NULL;
size_t n;
+ int r;
assert(s);
- /* Special version of strv_split() that splits on newlines and
- * suppresses an empty string at the end */
+ /* Special version of strv_split_full() that splits on newlines and
+ * suppresses an empty string at the end. */
- l = strv_split(s, NEWLINE);
- if (!l)
- return NULL;
+ r = strv_split_full(&l, s, NEWLINE, flags);
+ if (r < 0)
+ return r;
n = strv_length(l);
- if (n <= 0)
- return l;
-
- if (isempty(l[n - 1]))
+ if (n > 0 && isempty(l[n - 1])) {
l[n - 1] = mfree(l[n - 1]);
+ n--;
+ }
- return l;
+ *ret = TAKE_PTR(l);
+ return n;
}
int strv_split_full(char ***t, const char *s, const char *separators, ExtractFlags flags) {
return !l || !*l;
}
-char **strv_split_newlines(const char *s);
-
int strv_split_full(char ***t, const char *s, const char *separators, ExtractFlags flags);
static inline char **strv_split(const char *s, const char *separators) {
char **ret;
- int r;
- r = strv_split_full(&ret, s, separators, 0);
- if (r < 0)
+ if (strv_split_full(&ret, s, separators, 0) < 0)
+ return NULL;
+
+ return ret;
+}
+
+int strv_split_newlines_full(char ***ret, const char *s, ExtractFlags flags);
+static inline char **strv_split_newlines(const char *s) {
+ char **ret;
+
+ if (strv_split_newlines_full(&ret, s, 0) < 0)
return NULL;
return ret;
atomic_barrier
atomic_cmpxchg_32
bdflush
-bfin_spinlock
bind
bpf
brk
-cache_sync
cachectl
cacheflush
capget
mmap2
modify_ldt
mount
+mount_setattr
move_mount
move_pages
mprotect
atomic_barrier
atomic_cmpxchg_32
bdflush 300
-bfin_spinlock
bind 104
bpf 515
brk 17
-cache_sync
cachectl
cacheflush
capget 368
mmap2
modify_ldt
mount 302
+mount_setattr 552
move_mount 539
move_pages 472
mprotect 74
atomic_barrier
atomic_cmpxchg_32
bdflush
-bfin_spinlock
bind 200
bpf 280
brk 214
-cache_sync
cachectl
cacheflush 244
capget 90
mmap2 222
modify_ldt
mount 40
+mount_setattr 442
move_mount 429
move_pages 239
mprotect 226
atomic_barrier
atomic_cmpxchg_32
bdflush 134
-bfin_spinlock
bind 282
bpf 386
brk 45
-cache_sync
cachectl
cacheflush
capget 184
mmap2 192
modify_ldt
mount 21
+mount_setattr 442
move_mount 429
move_pages 344
mprotect 125
atomic_barrier
atomic_cmpxchg_32
bdflush
-bfin_spinlock
bind 200
bpf 280
brk 214
-cache_sync
cachectl
cacheflush
capget 90
mmap2
modify_ldt
mount 40
+mount_setattr 442
move_mount 429
move_pages 239
mprotect 226
atomic_barrier
atomic_cmpxchg_32
bdflush 134
-bfin_spinlock
bind 361
bpf 357
brk 45
-cache_sync
cachectl
cacheflush
capget 184
mmap2 192
modify_ldt 123
mount 21
+mount_setattr 442
move_mount 429
move_pages 317
mprotect 125
atomic_barrier
atomic_cmpxchg_32
bdflush 1138
-bfin_spinlock
bind 1191
bpf 1341
brk 1060
-cache_sync
cachectl
cacheflush
capget 1185
mmap2 1172
modify_ldt
mount 1043
+mount_setattr 1466
move_mount 1453
move_pages 1276
mprotect 1155
atomic_barrier 336
atomic_cmpxchg_32 335
bdflush 134
-bfin_spinlock
bind 358
bpf 354
brk 45
-cache_sync
cachectl
cacheflush 123
capget 184
mmap2 192
modify_ldt
mount 21
+mount_setattr 442
move_mount 429
move_pages 310
mprotect 125
atomic_barrier
atomic_cmpxchg_32
bdflush
-bfin_spinlock
bind 5048
bpf 5315
brk 5012
-cache_sync
cachectl 5198
cacheflush 5197
capget 5123
mmap2
modify_ldt
mount 5160
+mount_setattr 5442
move_mount 5429
move_pages 5267
mprotect 5010
atomic_barrier
atomic_cmpxchg_32
bdflush
-bfin_spinlock
bind 6048
bpf 6319
brk 6012
-cache_sync
cachectl 6198
cacheflush 6197
capget 6123
mmap2
modify_ldt
mount 6160
+mount_setattr 6442
move_mount 6429
move_pages 6271
mprotect 6010
atomic_barrier
atomic_cmpxchg_32
bdflush 4134
-bfin_spinlock
bind 4169
bpf 4355
brk 4045
-cache_sync
cachectl 4148
cacheflush 4147
capget 4204
mmap2 4210
modify_ldt 4123
mount 4021
+mount_setattr 4442
move_mount 4429
move_pages 4308
mprotect 4125
atomic_barrier
atomic_cmpxchg_32
bdflush 134
-bfin_spinlock
bind 327
bpf 361
brk 45
-cache_sync
cachectl
cacheflush
capget 183
mmap2 192
modify_ldt 123
mount 21
+mount_setattr 442
move_mount 429
move_pages 301
mprotect 125
atomic_barrier
atomic_cmpxchg_32
bdflush 134
-bfin_spinlock
bind 327
bpf 361
brk 45
-cache_sync
cachectl
cacheflush
capget 183
mmap2
modify_ldt 123
mount 21
+mount_setattr 442
move_mount 429
move_pages 301
mprotect 125
atomic_barrier
atomic_cmpxchg_32
bdflush 134
-bfin_spinlock
bind 361
bpf 351
brk 45
-cache_sync
cachectl
cacheflush
capget 184
mmap2 192
modify_ldt
mount 21
+mount_setattr 442
move_mount 429
move_pages 310
mprotect 125
atomic_barrier
atomic_cmpxchg_32
bdflush 134
-bfin_spinlock
bind 361
bpf 351
brk 45
-cache_sync
cachectl
cacheflush
capget 184
mmap2
modify_ldt
mount 21
+mount_setattr 442
move_mount 429
move_pages 310
mprotect 125
atomic_barrier
atomic_cmpxchg_32
bdflush 225
-bfin_spinlock
bind 353
bpf 349
brk 17
-cache_sync
cachectl
cacheflush
capget 21
mmap2 56
modify_ldt
mount 167
+mount_setattr 442
move_mount 429
move_pages 307
mprotect 74
atomic_barrier
atomic_cmpxchg_32
bdflush
-bfin_spinlock
bind 49
bpf 321
brk 12
-cache_sync
cachectl
cacheflush
capget 125
mmap2
modify_ldt 154
mount 165
+mount_setattr 442
move_mount 429
move_pages 279
mprotect 10
return write_string_file(p, value, WRITE_STRING_FILE_VERIFY_ON_FAILURE | WRITE_STRING_FILE_DISABLE_BUFFER);
}
-int sysctl_read(const char *property, char **content) {
+int sysctl_read(const char *property, char **ret) {
char *p;
assert(property);
- assert(content);
+ assert(ret);
p = strjoina("/proc/sys/", property);
- return read_full_file(p, content, NULL);
+ return read_full_virtual_file(p, ret, NULL);
}
int sysctl_read_ip_property(int af, const char *ifname, const char *property, char **ret) {
ifname ? "/conf/" : "", strempty(ifname),
property[0] == '/' ? "" : "/", property);
- r = read_one_line_file(p, &value);
+ r = read_full_virtual_file(p, &value, NULL);
if (r < 0)
return r;
#include "strv.h"
#include "terminal-util.h"
#include "time-util.h"
+#include "user-util.h"
#include "util.h"
static volatile unsigned cached_columns = 0;
assert(ts != USEC_INFINITY);
- n = now(CLOCK_MONOTONIC);
- if (ts + timeout < n)
+ n = usec_sub_unsigned(now(CLOCK_MONOTONIC), ts);
+ if (n >= timeout)
return -ETIMEDOUT;
- r = fd_wait_for_event(notify, POLLIN, ts + timeout - n);
+ r = fd_wait_for_event(notify, POLLIN, usec_sub_unsigned(timeout, n));
if (r < 0)
return r;
if (r == 0)
q = -errno;
}
- r = fchmod_and_chown(fd, TTY_MODE, 0, (gid_t) -1);
+ r = fchmod_and_chown(fd, TTY_MODE, 0, GID_INVALID);
if (r < 0) {
log_debug_errno(r, "Failed to chmod()/chown() VT, ignoring: %m");
if (q >= 0)
if (l > (size_t) sz)
return false;
- if (l > FILENAME_MAX)
+ if (l > NAME_MAX) /* must fit in a filename */
return false;
if (l > UT_NAMESIZE - 1)
return false;
continue;
}
- len = utf8_encoded_valid_unichar(i, (size_t) -1);
+ len = utf8_encoded_valid_unichar(i, SIZE_MAX);
if (len < 0) {
*i = ' ';
continue;
assert(str);
- for (const char *p = str; len_bytes != (size_t) -1 ? (size_t) (p - str) < len_bytes : *p != '\0'; ) {
+ for (const char *p = str; len_bytes != SIZE_MAX ? (size_t) (p - str) < len_bytes : *p != '\0'; ) {
int len;
- if (_unlikely_(*p == '\0') && len_bytes != (size_t) -1)
+ if (_unlikely_(*p == '\0') && len_bytes != SIZE_MAX)
return NULL; /* embedded NUL */
len = utf8_encoded_valid_unichar(p,
- len_bytes != (size_t) -1 ? len_bytes - (p - str) : (size_t) -1);
+ len_bytes != SIZE_MAX ? len_bytes - (p - str) : SIZE_MAX);
if (_unlikely_(len < 0))
return NULL; /* invalid character */
while (*str) {
int len;
- len = utf8_encoded_valid_unichar(str, (size_t) -1);
+ len = utf8_encoded_valid_unichar(str, SIZE_MAX);
if (len > 0) {
s = mempcpy(s, str, len);
str += len;
if (!*str) /* done! */
goto finish;
- len = utf8_encoded_valid_unichar(str, (size_t) -1);
+ len = utf8_encoded_valid_unichar(str, SIZE_MAX);
if (len > 0) {
if (utf8_is_printable(str, len)) {
int w;
assert(str);
assert(length > 0);
- /* We read until NUL, at most length bytes. (size_t) -1 may be used to disable the length check. */
+ /* We read until NUL, at most length bytes. SIZE_MAX may be used to disable the length check. */
len = utf8_encoded_expected_len(str[0]);
if (len == 0)
size_t utf8_n_codepoints(const char *str) {
size_t n = 0;
- /* Returns the number of UTF-8 codepoints in this string, or (size_t) -1 if the string is not valid UTF-8. */
+ /* Returns the number of UTF-8 codepoints in this string, or SIZE_MAX if the string is not valid UTF-8. */
while (*str != 0) {
int k;
- k = utf8_encoded_valid_unichar(str, (size_t) -1);
+ k = utf8_encoded_valid_unichar(str, SIZE_MAX);
if (k < 0)
- return (size_t) -1;
+ return SIZE_MAX;
str += k;
n++;
w = utf8_char_console_width(str);
if (w < 0)
- return (size_t) -1;
+ return SIZE_MAX;
n += w;
str = utf8_next_char(str);
char *utf8_is_valid_n(const char *str, size_t len_bytes) _pure_;
static inline char *utf8_is_valid(const char *s) {
- return utf8_is_valid_n(s, (size_t) -1);
+ return utf8_is_valid_n(s, SIZE_MAX);
}
char *ascii_is_valid(const char *s) _pure_;
char *ascii_is_valid_n(const char *str, size_t len);
char *utf8_escape_invalid(const char *s);
char *utf8_escape_non_printable_full(const char *str, size_t console_width);
static inline char *utf8_escape_non_printable(const char *str) {
- return utf8_escape_non_printable_full(str, (size_t) -1);
+ return utf8_escape_non_printable_full(str, SIZE_MAX);
}
size_t utf8_encode_unichar(char *out_utf8, char32_t g);
assert(usec);
u = le64toh(le);
- if (IN_SET(u, 0, (uint64_t) -1))
+ if (IN_SET(u, 0, UINT64_MAX))
return -EIO;
*usec = (usec_t) u;
return log_error_errno(errno, "Failed to open \"%s\" for writing: %m", t);
}
- r = copy_bytes(fd_from, fd_to, (uint64_t) -1, COPY_REFLINK);
+ r = copy_bytes(fd_from, fd_to, UINT64_MAX, COPY_REFLINK);
if (r < 0) {
(void) unlink(t);
return log_error_errno(r, "Failed to copy data from \"%s\" to \"%s\": %m", from, t);
if (entry->call)
Print(L"internal call yes\n");
- if (entry->tries_left != (UINTN) -1)
+ if (entry->tries_left != UINTN_MAX)
Print(L"counting boots yes\n"
"tries done %u\n"
"tries left %u\n"
CHAR16 *file,
CHAR16 *suffix) {
- UINTN left = (UINTN) -1, done = (UINTN) -1, factor = 1, i, next_left, next_done;
+ UINTN left = UINTN_MAX, done = UINTN_MAX, factor = 1, i, next_left, next_done;
_cleanup_freepool_ CHAR16 *prefix = NULL;
/*
switch (file[i]) {
case '+':
- if (left == (UINTN) -1) /* didn't read at least one digit for 'left'? */
+ if (left == UINTN_MAX) /* didn't read at least one digit for 'left'? */
return;
- if (done == (UINTN) -1) /* no 'done' counter? If so, it's equivalent to 0 */
+ if (done == UINTN_MAX) /* no 'done' counter? If so, it's equivalent to 0 */
done = 0;
goto good;
case '-':
- if (left == (UINTN) -1) /* didn't parse any digit yet? */
+ if (left == UINTN_MAX) /* didn't parse any digit yet? */
return;
- if (done != (UINTN) -1) /* already encountered a dash earlier? */
+ if (done != UINTN_MAX) /* already encountered a dash earlier? */
return;
/* So we encountered a dash. This means this counter is of the form +LEFT-DONE. Let's assign
* what we already parsed to 'done', and start fresh for the 'left' part. */
done = left;
- left = (UINTN) -1;
+ left = UINTN_MAX;
factor = 1;
break;
case '0'...'9': {
UINTN new_factor;
- if (left == (UINTN) -1)
+ if (left == UINTN_MAX)
left = file[i] - '0';
else {
UINTN new_left, digit;
digit = file[i] - '0';
- if (digit > (UINTN) -1 / factor) /* overflow check */
+ if (digit > UINTN_MAX / factor) /* overflow check */
return;
new_left = left + digit * factor;
if (new_left < left) /* overflow check */
return;
- if (new_left == (UINTN) -1) /* don't allow us to be confused */
+ if (new_left == UINTN_MAX) /* don't allow us to be confused */
return;
}
UINTN file_info_size, a, b;
EFI_STATUS r;
- if (entry->tries_left == (UINTN) -1)
+ if (entry->tries_left == UINTN_MAX)
return;
if (!entry->path || !entry->current_name || !entry->next_name)
entry = AllocatePool(sizeof(ConfigEntry));
*entry = (ConfigEntry) {
- .tries_done = (UINTN) -1,
- .tries_left = (UINTN) -1,
+ .tries_done = UINTN_MAX,
+ .tries_left = UINTN_MAX,
};
while ((line = line_get_key_value(content, (CHAR8 *)" \t", &pos, &key, &value))) {
if (r != 0)
return r;
- if (a->tries_left == (UINTN) -1 ||
- b->tries_left == (UINTN) -1)
+ if (a->tries_left == UINTN_MAX ||
+ b->tries_left == UINTN_MAX)
return 0;
/* If both items have boot counting, and otherwise are identical, put the entry with more tries left last */
.title = StrDuplicate(title),
.call = call,
.no_autoselect = TRUE,
- .tries_done = (UINTN) -1,
- .tries_left = (UINTN) -1,
+ .tries_done = UINTN_MAX,
+ .tries_left = UINTN_MAX,
};
config_add_entry(config, entry);
.loader = StrDuplicate(loader),
.id = StrDuplicate(id),
.key = key,
- .tries_done = (UINTN) -1,
- .tries_left = (UINTN) -1,
+ .tries_done = UINTN_MAX,
+ .tries_left = UINTN_MAX,
};
StrLwr(entry->id);
EFI_HANDLE *device) {
EFI_DEVICE_PATH *partition_path, *disk_path, *copy;
- UINT32 found_partition_number = (UINT32) -1;
- UINT64 found_partition_start = (UINT64) -1;
- UINT64 found_partition_size = (UINT64) -1;
+ UINT32 found_partition_number = UINT32_MAX;
+ UINT64 found_partition_start = UINT64_MAX;
+ UINT64 found_partition_size = UINT64_MAX;
UINT8 found_partition_signature[16] = {};
EFI_HANDLE new_device;
EFI_FILE *root_dir;
continue;
/* Calculate CRC check */
- c = ~crc32_exclude_offset((UINT32) -1,
+ c = ~crc32_exclude_offset(UINT32_MAX,
(const UINT8*) &gpt_header_buffer,
h->Header.HeaderSize,
OFFSETOF(EFI_PARTITION_TABLE_HEADER, Header.CRC32),
continue;
/* Calculate CRC of entries array, too */
- c = ~crc32((UINT32) -1, entries, sz);
+ c = ~crc32(UINT32_MAX, entries, sz);
if (c != h->PartitionEntryArrayCRC32)
continue;
#define SYSTEM_FONT_WIDTH 8
#define SYSTEM_FONT_HEIGHT 19
-#define EFI_SIMPLE_TEXT_INPUT_EX_GUID \
- &(EFI_GUID) { 0xdd9e7534, 0x7762, 0x4698, { 0x8c, 0x14, 0xf5, 0x85, 0x17, 0xa6, 0x25, 0xaa } }
-
-struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL;
-
-typedef EFI_STATUS (EFIAPI *EFI_INPUT_RESET_EX)(
- struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
- BOOLEAN ExtendedVerification
-);
-
-typedef UINT8 EFI_KEY_TOGGLE_STATE;
-
-typedef struct {
- UINT32 KeyShiftState;
- EFI_KEY_TOGGLE_STATE KeyToggleState;
-} EFI_KEY_STATE;
-
-typedef struct {
- EFI_INPUT_KEY Key;
- EFI_KEY_STATE KeyState;
-} EFI_KEY_DATA;
-
-typedef EFI_STATUS (EFIAPI *EFI_INPUT_READ_KEY_EX)(
- struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
- EFI_KEY_DATA *KeyData
-);
-
-typedef EFI_STATUS (EFIAPI *EFI_SET_STATE)(
- struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
- EFI_KEY_TOGGLE_STATE *KeyToggleState
-);
-
-typedef EFI_STATUS (EFIAPI *EFI_KEY_NOTIFY_FUNCTION)(
- EFI_KEY_DATA *KeyData
-);
-
-typedef EFI_STATUS (EFIAPI *EFI_REGISTER_KEYSTROKE_NOTIFY)(
- struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
- EFI_KEY_DATA KeyData,
- EFI_KEY_NOTIFY_FUNCTION KeyNotificationFunction,
- VOID **NotifyHandle
-);
-
-typedef EFI_STATUS (EFIAPI *EFI_UNREGISTER_KEYSTROKE_NOTIFY)(
- struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
- VOID *NotificationHandle
-);
-
-typedef struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL {
- EFI_INPUT_RESET_EX Reset;
- EFI_INPUT_READ_KEY_EX ReadKeyStrokeEx;
- EFI_EVENT WaitForKeyEx;
- EFI_SET_STATE SetState;
- EFI_REGISTER_KEYSTROKE_NOTIFY RegisterKeyNotify;
- EFI_UNREGISTER_KEYSTROKE_NOTIFY UnregisterKeyNotify;
-} EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL;
+#define EFI_SIMPLE_TEXT_INPUT_EX_GUID &(EFI_GUID) EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL_GUID
EFI_STATUS console_key_read(UINT64 *key, BOOLEAN wait) {
static EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *TextInputEx;
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#pragma once
-#define EFI_SHIFT_STATE_VALID 0x80000000
-#define EFI_RIGHT_CONTROL_PRESSED 0x00000004
-#define EFI_LEFT_CONTROL_PRESSED 0x00000008
-#define EFI_RIGHT_ALT_PRESSED 0x00000010
-#define EFI_LEFT_ALT_PRESSED 0x00000020
+#include "missing_efi.h"
#define EFI_CONTROL_PRESSED (EFI_RIGHT_CONTROL_PRESSED|EFI_LEFT_CONTROL_PRESSED)
#define EFI_ALT_PRESSED (EFI_RIGHT_ALT_PRESSED|EFI_LEFT_ALT_PRESSED)
if efi_cc.length() == 0
efi_cc = cc.cmd_array()
endif
- efi_ld = get_option('efi-ld')
- if efi_ld == ''
- efi_ld = find_program('ld', required: true)
+
+ efi_ld = find_program(get_option('efi-ld'), required: true)
+ efi_ld_name = efi_ld.path().split('/')[-1]
+ if efi_ld_name == 'lld' or efi_ld_name == 'ld.lld'
+ # LLVM/LLD does not support PE/COFF relocations
+ # https://lists.llvm.org/pipermail/llvm-dev/2021-March/149234.html
+ error('LLVM/lld does not support PE/COFF relocations. Use different linker for EFI image.')
endif
+
efi_incdir = get_option('efi-includedir')
gnu_efi_path_arch = ''
} EFI_RNG_PROTOCOL;
#endif
+
+#ifndef EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL_GUID
+
+#define EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL_GUID \
+ { 0xdd9e7534, 0x7762, 0x4698, {0x8c, 0x14, 0xf5, 0x85, 0x17, 0xa6, 0x25, 0xaa} }
+
+#define EFI_SHIFT_STATE_VALID 0x80000000
+#define EFI_RIGHT_CONTROL_PRESSED 0x00000004
+#define EFI_LEFT_CONTROL_PRESSED 0x00000008
+#define EFI_RIGHT_ALT_PRESSED 0x00000010
+#define EFI_LEFT_ALT_PRESSED 0x00000020
+
+struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL;
+
+typedef EFI_STATUS (EFIAPI *EFI_INPUT_RESET_EX)(
+ struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
+ BOOLEAN ExtendedVerification
+);
+
+typedef UINT8 EFI_KEY_TOGGLE_STATE;
+
+typedef struct {
+ UINT32 KeyShiftState;
+ EFI_KEY_TOGGLE_STATE KeyToggleState;
+} EFI_KEY_STATE;
+
+typedef struct {
+ EFI_INPUT_KEY Key;
+ EFI_KEY_STATE KeyState;
+} EFI_KEY_DATA;
+
+typedef EFI_STATUS (EFIAPI *EFI_INPUT_READ_KEY_EX)(
+ struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
+ EFI_KEY_DATA *KeyData
+);
+
+typedef EFI_STATUS (EFIAPI *EFI_SET_STATE)(
+ struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
+ EFI_KEY_TOGGLE_STATE *KeyToggleState
+);
+
+typedef EFI_STATUS (EFIAPI *EFI_KEY_NOTIFY_FUNCTION)(
+ EFI_KEY_DATA *KeyData
+);
+
+typedef EFI_STATUS (EFIAPI *EFI_REGISTER_KEYSTROKE_NOTIFY)(
+ struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
+ EFI_KEY_DATA KeyData,
+ EFI_KEY_NOTIFY_FUNCTION KeyNotificationFunction,
+ VOID **NotifyHandle
+);
+
+typedef EFI_STATUS (EFIAPI *EFI_UNREGISTER_KEYSTROKE_NOTIFY)(
+ struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
+ VOID *NotificationHandle
+);
+
+typedef struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL {
+ EFI_INPUT_RESET_EX Reset;
+ EFI_INPUT_READ_KEY_EX ReadKeyStrokeEx;
+ EFI_EVENT WaitForKeyEx;
+ EFI_SET_STATE SetState;
+ EFI_REGISTER_KEYSTROKE_NOTIFY RegisterKeyNotify;
+ EFI_UNREGISTER_KEYSTROKE_NOTIFY UnregisterKeyNotify;
+} EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL;
+
+#endif
#define UINTN_MAX (~(UINTN)0)
#define INTN_MAX ((INTN)(UINTN_MAX>>1))
+#ifndef UINT32_MAX
+#define UINT32_MAX ((UINT32) -1)
+#endif
+#ifndef UINT64_MAX
+#define UINT64_MAX ((UINT64) -1)
+#endif
EFI_STATUS log_oom(void);
if (r < 0)
return log_error_errno(r, "Failed to set empty string: %m");
- r = table_set_sort(table, (size_t) COLUMN_NAME, (size_t) -1);
+ r = table_set_sort(table, (size_t) COLUMN_NAME);
if (r < 0)
return log_error_errno(r, "Failed to set sort column: %m");
(size_t) COLUMN_UNIT,
(size_t) COLUMN_SESSION,
(size_t) COLUMN_DESCRIPTION,
- (size_t) COLUMN_MACHINE,
- (size_t) -1);
+ (size_t) COLUMN_MACHINE);
else
r = table_set_display(table, (size_t) COLUMN_NAME,
(size_t) COLUMN_PID,
(size_t) COLUMN_CONNECTION,
(size_t) COLUMN_UNIT,
(size_t) COLUMN_SESSION,
- (size_t) COLUMN_DESCRIPTION,
- (size_t) -1);
+ (size_t) COLUMN_DESCRIPTION);
if (r < 0)
return log_error_errno(r, "Failed to set columns to display: %m");
if (r > 0)
continue;
- r = sd_bus_wait(bus, (uint64_t) -1);
+ r = sd_bus_wait(bus, UINT64_MAX);
if (r < 0)
return log_error_errno(r, "Failed to wait for bus: %m");
}
} Group;
static unsigned arg_depth = 3;
-static unsigned arg_iterations = (unsigned) -1;
+static unsigned arg_iterations = UINT_MAX;
static bool arg_batch = false;
static bool arg_raw = false;
static usec_t arg_delay = 1*USEC_PER_SEC;
signal(SIGWINCH, columns_lines_cache_reset);
- if (arg_iterations == (unsigned) -1)
+ if (arg_iterations == UINT_MAX)
arg_iterations = on_tty() ? 0 : 1;
while (!quit) {
t = now(CLOCK_MONOTONIC);
- if (t >= last_refresh + arg_delay || immediate_refresh) {
+ if (t >= usec_add(last_refresh, arg_delay) || immediate_refresh) {
r = refresh(root, a, b, iteration++);
if (r < 0)
fflush(stdout);
if (arg_batch)
- (void) usleep(last_refresh + arg_delay - t);
+ (void) usleep(usec_add(usec_sub_unsigned(last_refresh, t), arg_delay));
else {
- r = read_one_char(stdin, &key, last_refresh + arg_delay - t, NULL);
+ r = read_one_char(stdin, &key, usec_add(usec_sub_unsigned(last_refresh, t), arg_delay), NULL);
if (r == -ETIMEDOUT)
continue;
if (r < 0)
break;
case '+':
- if (arg_delay < USEC_PER_SEC)
- arg_delay += USEC_PER_MSEC*250;
- else
- arg_delay += USEC_PER_SEC;
+ arg_delay = usec_add(arg_delay, arg_delay < USEC_PER_SEC ? USEC_PER_MSEC * 250 : USEC_PER_SEC);
fprintf(stdout, "\nIncreased delay to %s.", format_timespan(h, sizeof(h), arg_delay, 0));
fflush(stdout);
case '-':
if (arg_delay <= USEC_PER_MSEC*500)
arg_delay = USEC_PER_MSEC*250;
- else if (arg_delay < USEC_PER_MSEC*1250)
- arg_delay -= USEC_PER_MSEC*250;
else
- arg_delay -= USEC_PER_SEC;
+ arg_delay = usec_sub_unsigned(arg_delay, arg_delay < USEC_PER_MSEC * 1250 ? USEC_PER_MSEC * 250 : USEC_PER_SEC);
fprintf(stdout, "\nDecreased delay to %s.", format_timespan(h, sizeof(h), arg_delay, 0));
fflush(stdout);
return 0;
}
-static int cg_v1_errno_to_log_level(int r) {
- return r == -EROFS ? LOG_DEBUG : LOG_WARNING;
-}
-
static int unit_update_cgroup(
Unit *u,
CGroupMask target_mask,
* We perform migration also with whole slices for cases when users don't care about leave
* granularity. Since delegated_mask is subset of target mask, we won't trim slice subtree containing
* delegated units.
- *
- * If we're in an nspawn container and using legacy cgroups, the controller hierarchies are mounted
- * read-only into the container. We skip migration/trim in this scenario since it would fail
- * regardless with noisy "Read-only filesystem" warnings.
*/
if (cg_all_unified() == 0) {
r = cg_migrate_v1_controllers(u->manager->cgroup_supported, migrate_mask, u->cgroup_path, migrate_callback, u);
if (r < 0)
- log_unit_full_errno(
- u,
- cg_v1_errno_to_log_level(r),
- r,
- "Failed to migrate controller cgroups from %s, ignoring: %m",
- u->cgroup_path);
+ log_unit_warning_errno(u, r, "Failed to migrate controller cgroups from %s, ignoring: %m", u->cgroup_path);
is_root_slice = unit_has_name(u, SPECIAL_ROOT_SLICE);
r = cg_trim_v1_controllers(u->manager->cgroup_supported, ~target_mask, u->cgroup_path, !is_root_slice);
if (r < 0)
- log_unit_full_errno(
- u,
- cg_v1_errno_to_log_level(r),
- r,
- "Failed to delete controller cgroups %s, ignoring: %m",
- u->cgroup_path);
+ log_unit_warning_errno(u, r, "Failed to delete controller cgroups %s, ignoring: %m", u->cgroup_path);
}
/* Set attributes */
(void) cg_set_attribute("memory", "/", "memory.use_hierarchy", "1");
/* 8. Figure out which controllers are supported */
- r = cg_mask_supported(&m->cgroup_supported);
+ r = cg_mask_supported_subtree(m->cgroup_root, &m->cgroup_supported);
if (r < 0)
return log_error_errno(r, "Failed to determine supported controllers: %m");
/* We only take one subscriber for this method so return an error if there's already an existing one.
* This shouldn't happen since systemd-oomd is the only client of this method. */
if (FLAGS_SET(flags, VARLINK_METHOD_MORE) && m->managed_oom_varlink_request)
- return varlink_error(m->managed_oom_varlink_request, VARLINK_ERROR_SUBSCRIPTION_TAKEN, NULL);
+ return varlink_error(link, VARLINK_ERROR_SUBSCRIPTION_TAKEN, NULL);
r = json_build(&arr, JSON_BUILD_EMPTY_ARRAY);
if (r < 0)
if (!FLAGS_SET(flags, VARLINK_METHOD_MORE))
return varlink_reply(link, v);
+ assert(!m->managed_oom_varlink_request);
m->managed_oom_varlink_request = varlink_ref(link);
return varlink_notify(m->managed_oom_varlink_request, v);
}
assert(m);
/* Send the final message if we still have a subscribe request open. */
- if (m->managed_oom_varlink_request)
- m->managed_oom_varlink_request = varlink_close_unref(m->managed_oom_varlink_request);
+ m->managed_oom_varlink_request = varlink_close_unref(m->managed_oom_varlink_request);
m->varlink_server = varlink_server_unref(m->varlink_server);
}
SD_BUS_PROPERTY("PrivateNetwork", "b", bus_property_get_bool, offsetof(ExecContext, private_network), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("PrivateUsers", "b", bus_property_get_bool, offsetof(ExecContext, private_users), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("PrivateMounts", "b", bus_property_get_bool, offsetof(ExecContext, private_mounts), SD_BUS_VTABLE_PROPERTY_CONST),
+ SD_BUS_PROPERTY("PrivateIPC", "b", bus_property_get_bool, offsetof(ExecContext, private_ipc), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("ProtectHome", "s", property_get_protect_home, offsetof(ExecContext, protect_home), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("ProtectSystem", "s", property_get_protect_system, offsetof(ExecContext, protect_system), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("SameProcessGroup", "b", bus_property_get_bool, offsetof(ExecContext, same_pgrp), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("ProcSubset", "s", property_get_proc_subset, offsetof(ExecContext, proc_subset), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("ProtectHostname", "b", bus_property_get_bool, offsetof(ExecContext, protect_hostname), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("NetworkNamespacePath", "s", NULL, offsetof(ExecContext, network_namespace_path), SD_BUS_VTABLE_PROPERTY_CONST),
+ SD_BUS_PROPERTY("IPCNamespacePath", "s", NULL, offsetof(ExecContext, ipc_namespace_path), SD_BUS_VTABLE_PROPERTY_CONST),
/* Obsolete/redundant properties: */
SD_BUS_PROPERTY("Capabilities", "s", property_get_empty_string, 0, SD_BUS_VTABLE_PROPERTY_CONST|SD_BUS_VTABLE_HIDDEN),
if (streq(name, "PrivateNetwork"))
return bus_set_transient_bool(u, name, &c->private_network, message, flags, error);
+ if (streq(name, "PrivateIPC"))
+ return bus_set_transient_bool(u, name, &c->private_ipc, message, flags, error);
+
if (streq(name, "PrivateUsers"))
return bus_set_transient_bool(u, name, &c->private_users, message, flags, error);
if (streq(name, "NetworkNamespacePath"))
return bus_set_transient_path(u, name, &c->network_namespace_path, message, flags, error);
+ if (streq(name, "IPCNamespacePath"))
+ return bus_set_transient_path(u, name, &c->ipc_namespace_path, message, flags, error);
+
if (streq(name, "SupplementaryGroups")) {
_cleanup_strv_free_ char **l = NULL;
char **p;
if (r < 0)
return r;
+ if (allow_list && e >= 0)
+ return -EINVAL;
+
r = seccomp_parse_syscall_filter(n,
e,
c->syscall_filter,
}
STRV_FOREACH(s, l) {
- _cleanup_free_ char *n = NULL;
- int e;
-
- r = parse_syscall_and_errno(*s, &n, &e);
- if (r < 0)
- return r;
-
- r = seccomp_parse_syscall_filter(n,
- 0, /* errno not used */
+ r = seccomp_parse_syscall_filter(*s,
+ -1, /* errno not used */
c->syscall_log,
SECCOMP_PARSE_LOG | SECCOMP_PARSE_PERMISSIVE |
invert_flag |
if (r < 0)
return r;
- if (rl == (uint64_t) -1)
+ if (rl == UINT64_MAX)
x = RLIM_INFINITY;
else {
x = (rlim_t) rl;
SD_BUS_PROPERTY("ShowStatus", "b", property_get_show_status, 0, 0),
SD_BUS_PROPERTY("UnitPath", "as", NULL, offsetof(Manager, lookup_paths.search_path), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("DefaultStandardOutput", "s", bus_property_get_exec_output, offsetof(Manager, default_std_output), SD_BUS_VTABLE_PROPERTY_CONST),
- SD_BUS_PROPERTY("DefaultStandardError", "s", bus_property_get_exec_output, offsetof(Manager, default_std_output), SD_BUS_VTABLE_PROPERTY_CONST),
+ SD_BUS_PROPERTY("DefaultStandardError", "s", bus_property_get_exec_output, offsetof(Manager, default_std_error), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_WRITABLE_PROPERTY("RuntimeWatchdogUSec", "t", property_get_runtime_watchdog, property_set_runtime_watchdog, 0, 0),
SD_BUS_WRITABLE_PROPERTY("RebootWatchdogUSec", "t", property_get_reboot_watchdog, property_set_reboot_watchdog, 0, 0),
/* The following item is an obsolete alias */
#include "unit.h"
static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_type, service_type, ServiceType);
+static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_exit_type, service_exit_type, ServiceExitType);
static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_result, service_result, ServiceResult);
static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_restart, service_restart, ServiceRestart);
static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_notify_access, notify_access, NotifyAccess);
const sd_bus_vtable bus_service_vtable[] = {
SD_BUS_VTABLE_START(0),
SD_BUS_PROPERTY("Type", "s", property_get_type, offsetof(Service, type), SD_BUS_VTABLE_PROPERTY_CONST),
+ SD_BUS_PROPERTY("ExitType", "s", property_get_exit_type, offsetof(Service, exit_type), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("Restart", "s", property_get_restart, offsetof(Service, restart), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("PIDFile", "s", NULL, offsetof(Service, pid_file), SD_BUS_VTABLE_PROPERTY_CONST),
SD_BUS_PROPERTY("NotifyAccess", "s", property_get_notify_access, offsetof(Service, notify_access), SD_BUS_VTABLE_PROPERTY_CONST),
}
static BUS_DEFINE_SET_TRANSIENT_PARSE(notify_access, NotifyAccess, notify_access_from_string);
static BUS_DEFINE_SET_TRANSIENT_PARSE(service_type, ServiceType, service_type_from_string);
+static BUS_DEFINE_SET_TRANSIENT_PARSE(service_exit_type, ServiceExitType, service_exit_type_from_string);
static BUS_DEFINE_SET_TRANSIENT_PARSE(service_restart, ServiceRestart, service_restart_from_string);
static BUS_DEFINE_SET_TRANSIENT_PARSE(oom_policy, OOMPolicy, oom_policy_from_string);
static BUS_DEFINE_SET_TRANSIENT_STRING_WITH_CHECK(bus_name, sd_bus_service_name_is_valid);
if (streq(name, "Type"))
return bus_set_transient_service_type(u, name, &s->type, message, flags, error);
+ if (streq(name, "ExitType"))
+ return bus_set_transient_service_exit_type(u, name, &s->exit_type, message, flags, error);
+
if (streq(name, "OOMPolicy"))
return bus_set_transient_oom_policy(u, name, &s->oom_policy, message, flags, error);
void *userdata,
sd_bus_error *error) {
- uint64_t sz = (uint64_t) -1;
+ uint64_t sz = UINT64_MAX;
Unit *u = userdata;
int r;
void *userdata,
sd_bus_error *error) {
- uint64_t cn = (uint64_t) -1;
+ uint64_t cn = UINT64_MAX;
Unit *u = userdata;
int r;
void *userdata,
sd_bus_error *error) {
- nsec_t ns = (nsec_t) -1;
+ nsec_t ns = NSEC_INFINITY;
Unit *u = userdata;
int r;
return false;
/* We need NNP if we have any form of seccomp and are unprivileged */
- return context_has_address_families(c) ||
+ return c->lock_personality ||
c->memory_deny_write_execute ||
- c->restrict_realtime ||
- c->restrict_suid_sgid ||
- exec_context_restrict_namespaces_set(c) ||
+ c->private_devices ||
c->protect_clock ||
+ c->protect_hostname ||
c->protect_kernel_tunables ||
c->protect_kernel_modules ||
c->protect_kernel_logs ||
- c->private_devices ||
- context_has_syscall_filters(c) ||
- context_has_syscall_logs(c) ||
+ context_has_address_families(c) ||
+ exec_context_restrict_namespaces_set(c) ||
+ c->restrict_realtime ||
+ c->restrict_suid_sgid ||
!set_isempty(c->syscall_archs) ||
- c->lock_personality ||
- c->protect_hostname;
+ context_has_syscall_filters(c) ||
+ context_has_syscall_logs(c);
}
static bool exec_context_has_credentials(const ExecContext *context) {
context->protect_kernel_logs ||
context->protect_control_groups ||
context->protect_proc != PROTECT_PROC_DEFAULT ||
- context->proc_subset != PROC_SUBSET_ALL)
+ context->proc_subset != PROC_SUBSET_ALL ||
+ context->private_ipc ||
+ context->ipc_namespace_path)
return true;
if (context->root_directory) {
* user can no longer chmod() the file to gain write access. */
return r;
- if (fchown(fd, uid, (gid_t) -1) < 0)
+ if (fchown(fd, uid, GID_INVALID) < 0)
return -errno;
}
}
if (!ownership_ok)
return r;
- if (fchown(dfd, uid, (gid_t) -1) < 0)
+ if (fchown(dfd, uid, GID_INVALID) < 0)
return -errno;
}
}
.protect_system = context->protect_system,
.protect_proc = context->protect_proc,
.proc_subset = context->proc_subset,
+ .private_ipc = context->private_ipc || context->ipc_namespace_path,
};
} else if (!context->dynamic_user && root_dir)
/*
n_dont_close += n_fds;
}
- if (runtime)
+ if (runtime) {
append_socket_pair(dont_close, &n_dont_close, runtime->netns_storage_socket);
+ append_socket_pair(dont_close, &n_dont_close, runtime->ipcns_storage_socket);
+ }
if (dcreds) {
if (dcreds->user)
}
if (context->network_namespace_path && runtime && runtime->netns_storage_socket[0] >= 0) {
- r = open_netns_path(runtime->netns_storage_socket, context->network_namespace_path);
+ r = open_shareable_ns_path(runtime->netns_storage_socket, context->network_namespace_path, CLONE_NEWNET);
if (r < 0) {
*exit_status = EXIT_NETWORK;
return log_unit_error_errno(unit, r, "Failed to open network namespace path %s: %m", context->network_namespace_path);
}
}
+ if (context->ipc_namespace_path && runtime && runtime->ipcns_storage_socket[0] >= 0) {
+ r = open_shareable_ns_path(runtime->ipcns_storage_socket, context->ipc_namespace_path, CLONE_NEWIPC);
+ if (r < 0) {
+ *exit_status = EXIT_NAMESPACE;
+ return log_unit_error_errno(unit, r, "Failed to open IPC namespace path %s: %m", context->ipc_namespace_path);
+ }
+ }
+
r = setup_input(context, params, socket_fd, named_iofds);
if (r < 0) {
*exit_status = EXIT_STDIN;
if ((context->private_network || context->network_namespace_path) && runtime && runtime->netns_storage_socket[0] >= 0) {
if (ns_type_supported(NAMESPACE_NET)) {
- r = setup_netns(runtime->netns_storage_socket);
+ r = setup_shareable_ns(runtime->netns_storage_socket, CLONE_NEWNET);
if (r == -EPERM)
log_unit_warning_errno(unit, r,
"PrivateNetwork=yes is configured, but network namespace setup failed, ignoring: %m");
log_unit_warning(unit, "PrivateNetwork=yes is configured, but the kernel does not support network namespaces, ignoring.");
}
+ if ((context->private_ipc || context->ipc_namespace_path) && runtime && runtime->ipcns_storage_socket[0] >= 0) {
+
+ if (ns_type_supported(NAMESPACE_IPC)) {
+ r = setup_shareable_ns(runtime->ipcns_storage_socket, CLONE_NEWIPC);
+ if (r == -EPERM)
+ log_unit_warning_errno(unit, r,
+ "PrivateIPC=yes is configured, but IPC namespace setup failed, ignoring: %m");
+ else if (r < 0) {
+ *exit_status = EXIT_NAMESPACE;
+ return log_unit_error_errno(unit, r, "Failed to set up IPC namespacing: %m");
+ }
+ } else if (context->ipc_namespace_path) {
+ *exit_status = EXIT_NAMESPACE;
+ return log_unit_error_errno(unit, SYNTHETIC_ERRNO(EOPNOTSUPP),
+ "IPCNamespacePath= is not supported, refusing.");
+ } else
+ log_unit_warning(unit, "PrivateIPC=yes is configured, but the kernel does not support IPC namespaces, ignoring.");
+ }
+
needs_mount_namespace = exec_needs_mount_namespace(context, params, runtime);
if (needs_mount_namespace) {
_cleanup_free_ char *error_path = NULL;
#endif
/* We repeat the fd closing here, to make sure that nothing is leaked from the PAM modules. Note that we are
- * more aggressive this time since socket_fd and the netns fds we don't need anymore. We do keep the exec_fd
+ * more aggressive this time since socket_fd and the netns and ipcns fds we don't need anymore. We do keep the exec_fd
* however if we have it as we want to keep it open until the final execve(). */
r = close_all_fds(keep_fds, n_keep_fds);
rt->tmp_dir = mfree(rt->tmp_dir);
rt->var_tmp_dir = mfree(rt->var_tmp_dir);
safe_close_pair(rt->netns_storage_socket);
+ safe_close_pair(rt->ipcns_storage_socket);
return mfree(rt);
}
*n = (ExecRuntime) {
.id = TAKE_PTR(id_copy),
.netns_storage_socket = { -1, -1 },
+ .ipcns_storage_socket = { -1, -1 },
};
*ret = n;
char **tmp_dir,
char **var_tmp_dir,
int netns_storage_socket[2],
+ int ipcns_storage_socket[2],
ExecRuntime **ret) {
_cleanup_(exec_runtime_freep) ExecRuntime *rt = NULL;
assert(m);
assert(id);
- /* tmp_dir, var_tmp_dir, netns_storage_socket fds are donated on success */
+ /* tmp_dir, var_tmp_dir, {net,ipc}ns_storage_socket fds are donated on success */
r = exec_runtime_allocate(&rt, id);
if (r < 0)
rt->netns_storage_socket[1] = TAKE_FD(netns_storage_socket[1]);
}
+ if (ipcns_storage_socket) {
+ rt->ipcns_storage_socket[0] = TAKE_FD(ipcns_storage_socket[0]);
+ rt->ipcns_storage_socket[1] = TAKE_FD(ipcns_storage_socket[1]);
+ }
+
rt->manager = m;
if (ret)
ExecRuntime **ret) {
_cleanup_(namespace_cleanup_tmpdirp) char *tmp_dir = NULL, *var_tmp_dir = NULL;
- _cleanup_close_pair_ int netns_storage_socket[2] = { -1, -1 };
+ _cleanup_close_pair_ int netns_storage_socket[2] = { -1, -1 }, ipcns_storage_socket[2] = { -1, -1 };
int r;
assert(m);
assert(id);
/* It is not necessary to create ExecRuntime object. */
- if (!c->private_network && !c->private_tmp && !c->network_namespace_path) {
+ if (!c->private_network && !c->private_ipc && !c->private_tmp && !c->network_namespace_path) {
*ret = NULL;
return 0;
}
return -errno;
}
- r = exec_runtime_add(m, id, &tmp_dir, &var_tmp_dir, netns_storage_socket, ret);
+ if (c->private_ipc || c->ipc_namespace_path) {
+ if (socketpair(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0, ipcns_storage_socket) < 0)
+ return -errno;
+ }
+
+ r = exec_runtime_add(m, id, &tmp_dir, &var_tmp_dir, netns_storage_socket, ipcns_storage_socket, ret);
if (r < 0)
return r;
fprintf(f, " netns-socket-1=%i", copy);
}
+ if (rt->ipcns_storage_socket[0] >= 0) {
+ int copy;
+
+ copy = fdset_put_dup(fds, rt->ipcns_storage_socket[0]);
+ if (copy < 0)
+ return copy;
+
+ fprintf(f, " ipcns-socket-0=%i", copy);
+ }
+
+ if (rt->ipcns_storage_socket[1] >= 0) {
+ int copy;
+
+ copy = fdset_put_dup(fds, rt->ipcns_storage_socket[1]);
+ if (copy < 0)
+ return copy;
+
+ fprintf(f, " ipcns-socket-1=%i", copy);
+ }
+
fputc('\n', f);
}
safe_close(rt->netns_storage_socket[1]);
rt->netns_storage_socket[1] = fdset_remove(fds, fd);
+
+ } else if (streq(key, "ipcns-socket-0")) {
+ int fd;
+
+ if (safe_atoi(value, &fd) < 0 || !fdset_contains(fds, fd)) {
+ log_unit_debug(u, "Failed to parse ipcns socket value: %s", value);
+ return 0;
+ }
+
+ safe_close(rt->ipcns_storage_socket[0]);
+ rt->ipcns_storage_socket[0] = fdset_remove(fds, fd);
+
+ } else if (streq(key, "ipcns-socket-1")) {
+ int fd;
+
+ if (safe_atoi(value, &fd) < 0 || !fdset_contains(fds, fd)) {
+ log_unit_debug(u, "Failed to parse ipcns socket value: %s", value);
+ return 0;
+ }
+
+ safe_close(rt->ipcns_storage_socket[1]);
+ rt->ipcns_storage_socket[1] = fdset_remove(fds, fd);
} else
return 0;
int exec_runtime_deserialize_one(Manager *m, const char *value, FDSet *fds) {
_cleanup_free_ char *tmp_dir = NULL, *var_tmp_dir = NULL;
char *id = NULL;
- int r, fdpair[] = {-1, -1};
+ int r, netns_fdpair[] = {-1, -1}, ipcns_fdpair[] = {-1, -1};
const char *p, *v = value;
size_t n;
n = strcspn(v, " ");
buf = strndupa(v, n);
- r = safe_atoi(buf, &fdpair[0]);
+ r = safe_atoi(buf, &netns_fdpair[0]);
if (r < 0)
return log_debug_errno(r, "Unable to parse exec-runtime specification netns-socket-0=%s: %m", buf);
- if (!fdset_contains(fds, fdpair[0]))
+ if (!fdset_contains(fds, netns_fdpair[0]))
return log_debug_errno(SYNTHETIC_ERRNO(EBADF),
- "exec-runtime specification netns-socket-0= refers to unknown fd %d: %m", fdpair[0]);
- fdpair[0] = fdset_remove(fds, fdpair[0]);
+ "exec-runtime specification netns-socket-0= refers to unknown fd %d: %m", netns_fdpair[0]);
+ netns_fdpair[0] = fdset_remove(fds, netns_fdpair[0]);
if (v[n] != ' ')
goto finalize;
p = v + n + 1;
n = strcspn(v, " ");
buf = strndupa(v, n);
- r = safe_atoi(buf, &fdpair[1]);
+
+ r = safe_atoi(buf, &netns_fdpair[1]);
if (r < 0)
return log_debug_errno(r, "Unable to parse exec-runtime specification netns-socket-1=%s: %m", buf);
- if (!fdset_contains(fds, fdpair[1]))
+ if (!fdset_contains(fds, netns_fdpair[1]))
+ return log_debug_errno(SYNTHETIC_ERRNO(EBADF),
+ "exec-runtime specification netns-socket-1= refers to unknown fd %d: %m", netns_fdpair[1]);
+ netns_fdpair[1] = fdset_remove(fds, netns_fdpair[1]);
+ if (v[n] != ' ')
+ goto finalize;
+ p = v + n + 1;
+ }
+
+ v = startswith(p, "ipcns-socket-0=");
+ if (v) {
+ char *buf;
+
+ n = strcspn(v, " ");
+ buf = strndupa(v, n);
+
+ r = safe_atoi(buf, &ipcns_fdpair[0]);
+ if (r < 0)
+ return log_debug_errno(r, "Unable to parse exec-runtime specification ipcns-socket-0=%s: %m", buf);
+ if (!fdset_contains(fds, ipcns_fdpair[0]))
+ return log_debug_errno(SYNTHETIC_ERRNO(EBADF),
+ "exec-runtime specification ipcns-socket-0= refers to unknown fd %d: %m", ipcns_fdpair[0]);
+ ipcns_fdpair[0] = fdset_remove(fds, ipcns_fdpair[0]);
+ if (v[n] != ' ')
+ goto finalize;
+ p = v + n + 1;
+ }
+
+ v = startswith(p, "ipcns-socket-1=");
+ if (v) {
+ char *buf;
+
+ n = strcspn(v, " ");
+ buf = strndupa(v, n);
+
+ r = safe_atoi(buf, &ipcns_fdpair[1]);
+ if (r < 0)
+ return log_debug_errno(r, "Unable to parse exec-runtime specification ipcns-socket-1=%s: %m", buf);
+ if (!fdset_contains(fds, ipcns_fdpair[1]))
return log_debug_errno(SYNTHETIC_ERRNO(EBADF),
- "exec-runtime specification netns-socket-1= refers to unknown fd %d: %m", fdpair[1]);
- fdpair[1] = fdset_remove(fds, fdpair[1]);
+ "exec-runtime specification ipcns-socket-1= refers to unknown fd %d: %m", ipcns_fdpair[1]);
+ ipcns_fdpair[1] = fdset_remove(fds, ipcns_fdpair[1]);
}
finalize:
- r = exec_runtime_add(m, id, &tmp_dir, &var_tmp_dir, fdpair, NULL);
+ r = exec_runtime_add(m, id, &tmp_dir, &var_tmp_dir, netns_fdpair, ipcns_fdpair, NULL);
if (r < 0)
return log_debug_errno(r, "Failed to add exec-runtime: %m");
return 0;
/* An AF_UNIX socket pair, that contains a datagram containing a file descriptor referring to the network
* namespace. */
int netns_storage_socket[2];
+
+ /* Like netns_storage_socket, but the file descriptor is referring to the IPC namespace. */
+ int ipcns_storage_socket[2];
};
typedef enum ExecDirectoryType {
bool private_devices;
bool private_users;
bool private_mounts;
+ bool private_ipc;
bool protect_kernel_tunables;
bool protect_kernel_modules;
bool protect_kernel_logs;
Set *address_families;
char *network_namespace_path;
+ char *ipc_namespace_path;
ExecDirectory directories[_EXEC_DIRECTORY_TYPE_MAX];
ExecPreserveMode runtime_directory_preserve_mode;
return log_oom();
}
+ u->dropin_mtime = 0;
STRV_FOREACH(f, u->dropin_paths)
(void) config_parse(
u->id, *f, NULL,
$1.ProtectClock, config_parse_bool, 0, offsetof($1, exec_context.protect_clock)
$1.ProtectControlGroups, config_parse_bool, 0, offsetof($1, exec_context.protect_control_groups)
$1.NetworkNamespacePath, config_parse_unit_path_printf, 0, offsetof($1, exec_context.network_namespace_path)
+$1.IPCNamespacePath, config_parse_unit_path_printf, 0, offsetof($1, exec_context.ipc_namespace_path)
$1.LogNamespace, config_parse_log_namespace, 0, offsetof($1, exec_context)
$1.PrivateNetwork, config_parse_bool, 0, offsetof($1, exec_context.private_network)
$1.PrivateUsers, config_parse_bool, 0, offsetof($1, exec_context.private_users)
$1.PrivateMounts, config_parse_bool, 0, offsetof($1, exec_context.private_mounts)
+$1.PrivateIPC, config_parse_bool, 0, offsetof($1, exec_context.private_ipc)
$1.ProtectSystem, config_parse_protect_system, 0, offsetof($1, exec_context.protect_system)
$1.ProtectHome, config_parse_protect_home, 0, offsetof($1, exec_context.protect_home)
$1.MountFlags, config_parse_exec_mount_flags, 0, offsetof($1, exec_context.mount_flags)
Service.FailureAction, config_parse_emergency_action, 0, offsetof(Unit, failure_action)
Service.RebootArgument, config_parse_unit_string_printf, 0, offsetof(Unit, reboot_arg)
Service.Type, config_parse_service_type, 0, offsetof(Service, type)
+Service.ExitType, config_parse_service_exit_type, 0, offsetof(Service, exit_type)
Service.Restart, config_parse_service_restart, 0, offsetof(Service, restart)
Service.PermissionsStartOnly, config_parse_bool, 0, offsetof(Service, permissions_start_only)
Service.RootDirectoryStartOnly, config_parse_bool, 0, offsetof(Service, root_directory_start_only)
DEFINE_CONFIG_PARSE_ENUM(config_parse_protect_system, protect_system, ProtectSystem, "Failed to parse protect system value");
DEFINE_CONFIG_PARSE_ENUM(config_parse_runtime_preserve_mode, exec_preserve_mode, ExecPreserveMode, "Failed to parse runtime directory preserve mode");
DEFINE_CONFIG_PARSE_ENUM(config_parse_service_type, service_type, ServiceType, "Failed to parse service type");
+DEFINE_CONFIG_PARSE_ENUM(config_parse_service_exit_type, service_exit_type, ServiceExitType, "Failed to parse service exit type");
DEFINE_CONFIG_PARSE_ENUM(config_parse_service_restart, service_restart, ServiceRestart, "Failed to parse service restart specifier");
DEFINE_CONFIG_PARSE_ENUM(config_parse_service_timeout_failure_mode, service_timeout_failure_mode, ServiceTimeoutFailureMode, "Failed to parse timeout failure mode");
DEFINE_CONFIG_PARSE_ENUM(config_parse_socket_bind, socket_address_bind_ipv6_only_or_bool, SocketAddressBindIPv6Only, "Failed to parse bind IPv6 only value");
return 0;
}
- r = unbase64mem(rvalue, (size_t) -1, &p, &sz);
+ r = unbase64mem(rvalue, SIZE_MAX, &p, &sz);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Failed to decode base64 data, ignoring: %s", rvalue);
if (r == -ENOMEM)
return log_oom();
if (r < 0) {
- log_syntax(unit, LOG_WARNING, filename, line, r, "Invalid syntax, ignoring: %s", rvalue);
+ log_syntax(unit, LOG_WARNING, filename, line, r,
+ "Invalid syntax, ignoring: %s", rvalue);
return 0;
}
r = parse_syscall_and_errno(word, &name, &num);
if (r < 0) {
- log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to parse syscall:errno, ignoring: %s", word);
+ log_syntax(unit, LOG_WARNING, filename, line, r,
+ "Failed to parse syscall:errno, ignoring: %s", word);
+ continue;
+ }
+ if (!invert && num >= 0) {
+ log_syntax(unit, LOG_WARNING, filename, line, 0,
+ "Allow-listed system calls cannot take error number, ignoring: %s", word);
continue;
}
p = rvalue;
for (;;) {
- _cleanup_free_ char *word = NULL, *name = NULL;
- int num;
+ _cleanup_free_ char *word = NULL;
r = extract_first_word(&p, &word, NULL, 0);
if (r == 0)
return 0;
}
- r = parse_syscall_and_errno(word, &name, &num);
- if (r < 0 || num >= 0) { /* errno code not allowed */
- log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to parse syscall, ignoring: %s", word);
- continue;
- }
-
r = seccomp_parse_syscall_filter(
- name, 0, c->syscall_log,
+ word, -1, c->syscall_log,
SECCOMP_PARSE_LOG|SECCOMP_PARSE_PERMISSIVE|
(invert ? SECCOMP_PARSE_INVERT : 0)|
(c->syscall_log_allow_list ? SECCOMP_PARSE_ALLOW_LIST : 0),
{ config_parse_unit_deps, "UNIT [...]" },
{ config_parse_exec, "PATH [ARGUMENT [...]]" },
{ config_parse_service_type, "SERVICETYPE" },
+ { config_parse_service_exit_type, "SERVICEEXITTYPE" },
{ config_parse_service_restart, "SERVICERESTART" },
{ config_parse_service_timeout_failure_mode, "TIMEOUTMODE" },
{ config_parse_kill_mode, "KILLMODE" },
CONFIG_PARSER_PROTOTYPE(config_parse_service_timeout_abort);
CONFIG_PARSER_PROTOTYPE(config_parse_service_timeout_failure_mode);
CONFIG_PARSER_PROTOTYPE(config_parse_service_type);
+CONFIG_PARSER_PROTOTYPE(config_parse_service_exit_type);
CONFIG_PARSER_PROTOTYPE(config_parse_service_restart);
CONFIG_PARSER_PROTOTYPE(config_parse_socket_bindtodevice);
CONFIG_PARSER_PROTOTYPE(config_parse_exec_output);
if (proc_cmdline_value_missing(key, value))
return 0;
- r = unbase64mem(value, (size_t) -1, &p, &sz);
+ r = unbase64mem(value, SIZE_MAX, &p, &sz);
if (r < 0)
log_warning_errno(r, "Failed to parse systemd.random_seed= argument, ignoring: %s", value);
/* When we are reloading, let's not wait with generating signals, since we need to exit the manager as quickly
* as we can. There's no point in throttling generation of signals in that case. */
if (MANAGER_IS_RELOADING(m) || m->send_reloading_done || m->pending_reload_message)
- budget = (unsigned) -1; /* infinite budget in this case */
+ budget = UINT_MAX; /* infinite budget in this case */
else {
/* Anything to do at all? */
if (!m->dbus_unit_queue && !m->dbus_job_queue)
bus_unit_send_change_signal(u);
n++;
- if (budget != (unsigned) -1)
+ if (budget != UINT_MAX)
budget--;
}
bus_job_send_change_signal(j);
n++;
- if (budget != (unsigned) -1)
+ if (budget != UINT_MAX)
budget--;
}
if (p) {
_cleanup_free_ char *opts = NULL;
- r = fstab_filter_options(p->options, "nofail\0" "noauto\0" "auto\0", NULL, NULL, &opts);
+ r = fstab_filter_options(p->options, "nofail\0" "noauto\0" "auto\0", NULL, NULL, NULL, &opts);
if (r < 0)
goto fail;
#include "mountpoint-util.h"
#include "namespace-util.h"
#include "namespace.h"
+#include "nsflags.h"
#include "nulstr-util.h"
#include "os-util.h"
#include "path-util.h"
EXEC,
TMPFS,
EXTENSION_IMAGES, /* Mounted outside the root directory, and used by subsequent mounts */
+ MQUEUEFS,
READWRITE_IMPLICIT, /* Should have the lowest priority. */
_MOUNT_MODE_MAX,
} MountMode;
[READWRITE_IMPLICIT] = "rw-implicit",
[EXEC] = "exec",
[NOEXEC] = "noexec",
+ [MQUEUEFS] = "mqueuefs",
};
DEFINE_PRIVATE_STRING_TABLE_LOOKUP_TO_STRING(mount_mode, MountMode);
return mount_tmpfs(m);
}
+static int mount_mqueuefs(const MountEntry *m) {
+ int r;
+ const char *entry_path;
+
+ assert(m);
+
+ entry_path = mount_entry_path(m);
+
+ (void) mkdir_p_label(entry_path, 0755);
+ (void) umount_recursive(entry_path, 0);
+
+ r = mount_nofollow_verbose(LOG_DEBUG, "mqueue", entry_path, "mqueue", m->flags, mount_entry_options(m));
+ if (r < 0)
+ return r;
+
+ return 0;
+}
+
static int mount_image(const MountEntry *m, const char *root_directory) {
_cleanup_free_ char *host_os_release_id = NULL, *host_os_release_version_id = NULL,
case RUN:
return mount_run(m);
+ case MQUEUEFS:
+ return mount_mqueuefs(m);
+
case MOUNT_IMAGES:
return mount_image(m, NULL);
(creds_path ? 2 : 1) +
!!log_namespace +
setup_propagate + /* /run/systemd/incoming */
- !!notify_socket;
+ !!notify_socket +
+ ns_info->private_ipc; /* /dev/mqueue */
}
static void normalize_mounts(const char *root_directory, MountEntry *mounts, size_t *n_mounts) {
};
}
+ if (ns_info->private_ipc)
+ *(m++) = (MountEntry) {
+ .path_const = "/dev/mqueue",
+ .mode = MQUEUEFS,
+ .flags = MS_NOSUID | MS_NODEV | MS_NOEXEC | MS_RELATIME,
+ };
+
if (creds_path) {
/* If our service has a credentials store configured, then bind that one in, but hide
* everything else. */
if (setup_propagate)
(void) mkdir_p(propagate_dir, 0600);
- if (n_extension_images > 0) {
+ if (n_extension_images > 0)
/* ExtensionImages mountpoint directories will be created
* while parsing the mounts to create, so have the parent ready */
(void) mkdir_p(extension_dir, 0600);
- }
/* Remount / as SLAVE so that nothing now mounted in the namespace
* shows up in the parent */
return 0;
}
-int setup_netns(const int netns_storage_socket[static 2]) {
- _cleanup_close_ int netns = -1;
+int setup_shareable_ns(const int ns_storage_socket[static 2], unsigned long nsflag) {
+ _cleanup_close_ int ns = -1;
int r, q;
+ const char *ns_name, *ns_path;
+
+ assert(ns_storage_socket);
+ assert(ns_storage_socket[0] >= 0);
+ assert(ns_storage_socket[1] >= 0);
- assert(netns_storage_socket);
- assert(netns_storage_socket[0] >= 0);
- assert(netns_storage_socket[1] >= 0);
+ ns_name = namespace_single_flag_to_string(nsflag);
+ assert(ns_name);
/* We use the passed socketpair as a storage buffer for our
* namespace reference fd. Whatever process runs this first
*
* It's a bit crazy, but hey, works great! */
- if (lockf(netns_storage_socket[0], F_LOCK, 0) < 0)
+ if (lockf(ns_storage_socket[0], F_LOCK, 0) < 0)
return -errno;
- netns = receive_one_fd(netns_storage_socket[0], MSG_DONTWAIT);
- if (netns == -EAGAIN) {
+ ns = receive_one_fd(ns_storage_socket[0], MSG_DONTWAIT);
+ if (ns == -EAGAIN) {
/* Nothing stored yet, so let's create a new namespace. */
- if (unshare(CLONE_NEWNET) < 0) {
+ if (unshare(nsflag) < 0) {
r = -errno;
goto fail;
}
(void) loopback_setup();
- netns = open("/proc/self/ns/net", O_RDONLY|O_CLOEXEC|O_NOCTTY);
- if (netns < 0) {
+ ns_path = strjoina("/proc/self/ns/", ns_name);
+ ns = open(ns_path, O_RDONLY|O_CLOEXEC|O_NOCTTY);
+ if (ns < 0) {
r = -errno;
goto fail;
}
r = 1;
- } else if (netns < 0) {
- r = netns;
+ } else if (ns < 0) {
+ r = ns;
goto fail;
} else {
/* Yay, found something, so let's join the namespace */
- if (setns(netns, CLONE_NEWNET) < 0) {
+ if (setns(ns, nsflag) < 0) {
r = -errno;
goto fail;
}
r = 0;
}
- q = send_one_fd(netns_storage_socket[1], netns, MSG_DONTWAIT);
+ q = send_one_fd(ns_storage_socket[1], ns, MSG_DONTWAIT);
if (q < 0) {
r = q;
goto fail;
}
fail:
- (void) lockf(netns_storage_socket[0], F_ULOCK, 0);
+ (void) lockf(ns_storage_socket[0], F_ULOCK, 0);
return r;
}
-int open_netns_path(const int netns_storage_socket[static 2], const char *path) {
- _cleanup_close_ int netns = -1;
+int open_shareable_ns_path(const int ns_storage_socket[static 2], const char *path, unsigned long nsflag) {
+ _cleanup_close_ int ns = -1;
int q, r;
- assert(netns_storage_socket);
- assert(netns_storage_socket[0] >= 0);
- assert(netns_storage_socket[1] >= 0);
+ assert(ns_storage_socket);
+ assert(ns_storage_socket[0] >= 0);
+ assert(ns_storage_socket[1] >= 0);
assert(path);
- /* If the storage socket doesn't contain a netns fd yet, open one via the file system and store it in
- * it. This is supposed to be called ahead of time, i.e. before setup_netns() which will allocate a
- * new anonymous netns if needed. */
+ /* If the storage socket doesn't contain a ns fd yet, open one via the file system and store it in
+ * it. This is supposed to be called ahead of time, i.e. before setup_shareable_ns() which will
+ * allocate a new anonymous ns if needed. */
- if (lockf(netns_storage_socket[0], F_LOCK, 0) < 0)
+ if (lockf(ns_storage_socket[0], F_LOCK, 0) < 0)
return -errno;
- netns = receive_one_fd(netns_storage_socket[0], MSG_DONTWAIT);
- if (netns == -EAGAIN) {
+ ns = receive_one_fd(ns_storage_socket[0], MSG_DONTWAIT);
+ if (ns == -EAGAIN) {
/* Nothing stored yet. Open the file from the file system. */
- netns = open(path, O_RDONLY|O_NOCTTY|O_CLOEXEC);
- if (netns < 0) {
+ ns = open(path, O_RDONLY|O_NOCTTY|O_CLOEXEC);
+ if (ns < 0) {
r = -errno;
goto fail;
}
- r = fd_is_network_ns(netns);
- if (r == 0) { /* Not a netns? Refuse early. */
+ r = fd_is_ns(ns, nsflag);
+ if (r == 0) { /* Not a ns of our type? Refuse early. */
r = -EINVAL;
goto fail;
}
r = 1;
- } else if (netns < 0) {
- r = netns;
+ } else if (ns < 0) {
+ r = ns;
goto fail;
} else
r = 0; /* Already allocated */
- q = send_one_fd(netns_storage_socket[1], netns, MSG_DONTWAIT);
+ q = send_one_fd(ns_storage_socket[1], ns, MSG_DONTWAIT);
if (q < 0) {
r = q;
goto fail;
}
fail:
- (void) lockf(netns_storage_socket[0], F_ULOCK, 0);
+ (void) lockf(ns_storage_socket[0], F_ULOCK, 0);
return r;
}
bool protect_kernel_logs;
bool mount_apivfs;
bool protect_hostname;
+ bool private_ipc;
ProtectHome protect_home;
ProtectSystem protect_system;
ProtectProc protect_proc;
char **tmp_dir,
char **var_tmp_dir);
-int setup_netns(const int netns_storage_socket[static 2]);
-int open_netns_path(const int netns_storage_socket[static 2], const char *path);
+int setup_shareable_ns(const int ns_storage_socket[static 2], unsigned long nsflag);
+int open_shareable_ns_path(const int netns_storage_socket[static 2], const char *path, unsigned long nsflag);
const char* protect_home_to_string(ProtectHome p) _const_;
ProtectHome protect_home_from_string(const char *s) _pure_;
return s->control_pid > 0;
}
-static int cgroup_good(Service *s) {
- int r;
-
+static int cgroup_empty(Service *s) {
assert(s);
- /* Returns 0 if the cgroup is empty or doesn't exist, > 0 if it is exists and is populated, < 0 if we can't
- * figure it out */
+ /* Returns 0 if there is no cgroup, > 0 if is empty or doesn't exist, < 0 if we can't figure it out */
if (!UNIT(s)->cgroup_path)
return 0;
- r = cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, UNIT(s)->cgroup_path);
+ return cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, UNIT(s)->cgroup_path);
+}
+
+
+static int cgroup_good(Service *s) {
+ int r;
+
+ /* Returns 0 if the cgroup is empty or doesn't exist, > 0 if it is exists and is populated, < 0 if we can't
+ * figure it out */
+
+ r = cgroup_empty(s);
if (r < 0)
return r;
else
assert_not_reached("Unknown code");
- if (s->main_pid == pid) {
+ /* Services with ExitType=cgroup ignore the main PID for purposes of exit status */
+ if (s->exit_type == SERVICE_EXIT_CGROUP && s->main_pid == pid) {
+ service_unwatch_main_pid(s);
+ s->main_pid_known = false;
+ }
+
+ if ((s->exit_type == SERVICE_EXIT_MAIN && s->main_pid == pid) ||
+ (s->exit_type == SERVICE_EXIT_CGROUP && cgroup_empty(s) && !control_pid_good(s))) {
/* Forking services may occasionally move to a new PID.
* As long as they update the PID file before exiting the old
* PID, they're fine. */
unit_log_process_exit(
u,
- "Main process",
+ s->exit_type == SERVICE_EXIT_CGROUP ? "Last process" : "Main process",
service_exec_command_to_string(SERVICE_EXEC_START),
f == SERVICE_SUCCESS,
code, status);
DEFINE_STRING_TABLE_LOOKUP(service_type, ServiceType);
+static const char* const service_exit_type_table[_SERVICE_EXIT_TYPE_MAX] = {
+ [SERVICE_EXIT_MAIN] = "main",
+ [SERVICE_EXIT_CGROUP] = "cgroup",
+};
+
+DEFINE_STRING_TABLE_LOOKUP(service_exit_type, ServiceExitType);
+
static const char* const service_exec_command_table[_SERVICE_EXEC_COMMAND_MAX] = {
[SERVICE_EXEC_CONDITION] = "ExecCondition",
[SERVICE_EXEC_START_PRE] = "ExecStartPre",
_SERVICE_TYPE_INVALID = -EINVAL,
} ServiceType;
+typedef enum ServiceExitType {
+ SERVICE_EXIT_MAIN, /* we consider the main PID when deciding if the service exited */
+ SERVICE_EXIT_CGROUP, /* we wait for the last process in the cgroup to exit */
+ _SERVICE_EXIT_TYPE_MAX,
+ _SERVICE_EXIT_TYPE_INVALID = -EINVAL,
+} ServiceExitType;
+
typedef enum ServiceExecCommand {
SERVICE_EXEC_CONDITION,
SERVICE_EXEC_START_PRE,
Unit meta;
ServiceType type;
+ ServiceExitType exit_type;
ServiceRestart restart;
ExitStatusSet restart_prevent_status;
ExitStatusSet restart_force_status;
const char* service_type_to_string(ServiceType i) _const_;
ServiceType service_type_from_string(const char *s) _pure_;
+const char* service_exit_type_to_string(ServiceExitType i) _const_;
+ServiceExitType service_exit_type_from_string(const char *s) _pure_;
+
const char* service_exec_command_to_string(ServiceExecCommand i) _const_;
ServiceExecCommand service_exec_command_from_string(const char *s) _pure_;
s->control_command_id = _SOCKET_EXEC_COMMAND_INVALID;
s->trigger_limit.interval = USEC_INFINITY;
- s->trigger_limit.burst = (unsigned) -1;
+ s->trigger_limit.burst = UINT_MAX;
}
static void socket_unwatch_control_pid(Socket *s) {
if (s->trigger_limit.interval == USEC_INFINITY)
s->trigger_limit.interval = 2 * USEC_PER_SEC;
- if (s->trigger_limit.burst == (unsigned) -1) {
+ if (s->trigger_limit.burst == UINT_MAX) {
if (s->accept)
s->trigger_limit.burst = 200;
else
if (s->exec_context.network_namespace_path &&
s->exec_runtime &&
s->exec_runtime->netns_storage_socket[0] >= 0) {
- r = open_netns_path(s->exec_runtime->netns_storage_socket, s->exec_context.network_namespace_path);
+ r = open_shareable_ns_path(s->exec_runtime->netns_storage_socket, s->exec_context.network_namespace_path, CLONE_NEWNET);
if (r < 0)
return log_unit_error_errno(UNIT(s), r, "Failed to open network namespace path %s: %m", s->exec_context.network_namespace_path);
}
+ if (s->exec_context.ipc_namespace_path &&
+ s->exec_runtime &&
+ s->exec_runtime->ipcns_storage_socket[0] >= 0) {
+ r = open_shareable_ns_path(s->exec_runtime->ipcns_storage_socket, s->exec_context.ipc_namespace_path, CLONE_NEWIPC);
+ if (r < 0)
+ return log_unit_error_errno(UNIT(s), r, "Failed to open IPC namespace path %s: %m", s->exec_context.ipc_namespace_path);
+ }
+
if (socketpair(AF_UNIX, SOCK_SEQPACKET|SOCK_CLOEXEC, 0, pair) < 0)
return log_unit_error_errno(UNIT(s), errno, "Failed to create communication channel: %m");
s->exec_runtime->netns_storage_socket[0] >= 0) {
if (ns_type_supported(NAMESPACE_NET)) {
- r = setup_netns(s->exec_runtime->netns_storage_socket);
+ r = setup_shareable_ns(s->exec_runtime->netns_storage_socket, CLONE_NEWNET);
if (r < 0) {
log_unit_error_errno(UNIT(s), r, "Failed to join network namespace: %m");
_exit(EXIT_NETWORK);
# the system.conf.d/ subdirectory. The latter is generally recommended.
# Defaults can be restored by simply deleting this file and all drop-ins.
#
+# Use 'systemd-analyze cat-config systemd/system.conf' to display the full config.
+#
# See systemd-system.conf(5) for details.
[Manager]
j->unit->id,
unit_id == array ? "ordering cycle" : "dependency",
*unit_id, *job_type,
- unit_ids);
+ "%s", unit_ids);
if (delete) {
const char *status;
"MESSAGE=%s: Job %s/%s deleted to break ordering cycle starting with %s/%s",
j->unit->id, delete->unit->id, job_type_to_string(delete->type),
j->unit->id, job_type_to_string(j->type),
- unit_ids);
+ "%s", unit_ids);
if (log_get_show_color())
status = ANSI_HIGHLIGHT_RED " SKIP " ANSI_NORMAL;
log_struct(LOG_ERR,
"MESSAGE=%s: Unable to break cycle starting with %s/%s",
j->unit->id, j->unit->id, job_type_to_string(j->type),
- unit_ids);
+ "%s", unit_ids);
return sd_bus_error_setf(e, BUS_ERROR_TRANSACTION_ORDER_IS_CYCLIC,
"Transaction order is cyclic. See system logs for details.");
}
static bool vacuum_necessary(int fd, uint64_t sum, uint64_t keep_free, uint64_t max_use) {
- uint64_t fs_size = 0, fs_free = (uint64_t) -1;
+ uint64_t fs_size = 0, fs_free = UINT64_MAX;
struct statvfs sv;
assert(fd >= 0);
fs_free = sv.f_frsize * sv.f_bfree;
}
- if (max_use == (uint64_t) -1) {
+ if (max_use == UINT64_MAX) {
if (fs_size > 0) {
max_use = PAGE_ALIGN(fs_size / 10); /* 10% */
if (max_use > 0 && sum > max_use)
return true;
- if (keep_free == (uint64_t) -1) {
+ if (keep_free == UINT64_MAX) {
if (fs_size > 0) {
keep_free = PAGE_ALIGN((fs_size * 3) / 20); /* 15% */
static uint64_t arg_process_size_max = PROCESS_SIZE_MAX;
static uint64_t arg_external_size_max = EXTERNAL_SIZE_MAX;
static uint64_t arg_journal_size_max = JOURNAL_SIZE_MAX;
-static uint64_t arg_keep_free = (uint64_t) -1;
-static uint64_t arg_max_use = (uint64_t) -1;
+static uint64_t arg_keep_free = UINT64_MAX;
+static uint64_t arg_max_use = UINT64_MAX;
static int parse_config(void) {
static const ConfigTableItem items[] = {
(void) iovw_put_string_field_free(iovw, "COREDUMP_OPEN_FDS=", t);
p = procfs_file_alloca(pid, "status");
- if (read_full_file(p, &t, NULL) >= 0)
+ if (read_full_virtual_file(p, &t, NULL) >= 0)
(void) iovw_put_string_field_free(iovw, "COREDUMP_PROC_STATUS=", t);
p = procfs_file_alloca(pid, "maps");
- if (read_full_file(p, &t, NULL) >= 0)
+ if (read_full_virtual_file(p, &t, NULL) >= 0)
(void) iovw_put_string_field_free(iovw, "COREDUMP_PROC_MAPS=", t);
p = procfs_file_alloca(pid, "limits");
- if (read_full_file(p, &t, NULL) >= 0)
+ if (read_full_virtual_file(p, &t, NULL) >= 0)
(void) iovw_put_string_field_free(iovw, "COREDUMP_PROC_LIMITS=", t);
p = procfs_file_alloca(pid, "cgroup");
- if (read_full_file(p, &t, NULL) >=0)
+ if (read_full_virtual_file(p, &t, NULL) >=0)
(void) iovw_put_string_field_free(iovw, "COREDUMP_PROC_CGROUP=", t);
p = procfs_file_alloca(pid, "mountinfo");
- if (read_full_file(p, &t, NULL) >=0)
+ if (read_full_virtual_file(p, &t, NULL) >=0)
(void) iovw_put_string_field_free(iovw, "COREDUMP_PROC_MOUNTINFO=", t);
if (get_process_cwd(pid, &t) >= 0)
# the system.conf.d/ subdirectory. The latter is generally recommended.
# Defaults can be restored by simply deleting this file and all drop-ins.
#
+# Use 'systemd-analyze cat-config systemd/coredump.conf' to display the full config.
+#
# See coredump.conf(5) for details.
[Coredump]
RETRIEVE(d, l, "COREDUMP_EXE", exe);
RETRIEVE(d, l, "COREDUMP_COMM", comm);
RETRIEVE(d, l, "COREDUMP_CMDLINE", cmdline);
+ RETRIEVE(d, l, "COREDUMP_HOSTNAME", hostname);
RETRIEVE(d, l, "COREDUMP_UNIT", unit);
RETRIEVE(d, l, "COREDUMP_USER_UNIT", user_unit);
RETRIEVE(d, l, "COREDUMP_SESSION", session);
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 (r < 0)
return r;
- print_info(stdout, j, false);
- fputs("\n", stdout);
+ if (!arg_quiet) {
+ print_info(stdout, j, false);
+ fputs("\n", stdout);
+ }
r = sd_journal_get_data(j, "COREDUMP_EXE", (const void**) &data, &len);
if (r < 0)
fork_name = strjoina("(", debugger_call[0], ")");
- r = safe_fork(fork_name, FORK_RESET_SIGNALS|FORK_DEATHSIG|FORK_CLOSE_ALL_FDS|FORK_RLIMIT_NOFILE_SAFE|FORK_LOG, &pid);
+ r = safe_fork(fork_name, FORK_RESET_SIGNALS|FORK_DEATHSIG|FORK_CLOSE_ALL_FDS|FORK_RLIMIT_NOFILE_SAFE|FORK_LOG|FORK_FLUSH_STDIO, &pid);
if (r < 0)
goto finish;
if (r == 0) {
int main(int argc, char *argv[]) {
- if (coredump_vacuum(-1, (uint64_t) -1, 70 * 1024) < 0)
+ if (coredump_vacuum(-1, UINT64_MAX, 70 * 1024) < 0)
return EXIT_FAILURE;
return EXIT_SUCCESS;
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"TPM2 token data lacks 'tpm2-policy-hash' field.");
- r = unhexmem(json_variant_string(w), (size_t) -1, &thash, &thash_size);
+ r = unhexmem(json_variant_string(w), SIZE_MAX, &thash, &thash_size);
if (r < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Invalid base64 data in 'tpm2-policy-hash' field.");
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"FIDO2 token data lacks 'fido2-credential' field.");
- r = unbase64mem(json_variant_string(w), (size_t) -1, &cid, &cid_size);
+ r = unbase64mem(json_variant_string(w), SIZE_MAX, &cid, &cid_size);
if (r < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Invalid base64 data in 'fido2-credential' field.");
assert(!salt);
assert(salt_size == 0);
- r = unbase64mem(json_variant_string(w), (size_t) -1, &salt, &salt_size);
+ r = unbase64mem(json_variant_string(w), SIZE_MAX, &salt, &salt_size);
if (r < 0)
return log_error_errno(r, "Failed to decode base64 encoded salt.");
netdev = fstab_test_option(options, "_netdev\0");
attach_in_initrd = fstab_test_option(options, "x-initrd.attach\0");
- keyfile_can_timeout = fstab_filter_options(options, "keyfile-timeout\0", NULL, &keyfile_timeout_value, NULL);
+ keyfile_can_timeout = fstab_filter_options(options,
+ "keyfile-timeout\0",
+ NULL, &keyfile_timeout_value, NULL, NULL);
if (keyfile_can_timeout < 0)
return log_error_errno(keyfile_can_timeout, "Failed to parse keyfile-timeout= option value: %m");
"header\0",
NULL,
&header_path,
+ NULL,
headerdev ? &filtered_header : NULL);
if (detached_header < 0)
return log_error_errno(detached_header, "Failed to parse header= option value: %m");
- tmp = fstab_filter_options(options, "tmp\0", NULL, &tmp_fstype, NULL);
+ tmp = fstab_filter_options(options, "tmp\0", NULL, &tmp_fstype, NULL, NULL);
if (tmp < 0)
return log_error_errno(tmp, "Failed to parse tmp= option value: %m");
assert(ret_headerdev);
assert(ret_filtered_headerdev_options);
- r = fstab_filter_options(options, "header\0", NULL, &headerspec, &filtered_headerspec);
+ r = fstab_filter_options(options, "header\0", NULL, &headerspec, NULL, &filtered_headerspec);
if (r < 0)
return log_error_errno(r, "Failed to parse header= option value: %m");
assert(!key);
assert(key_size == 0);
- r = unbase64mem(json_variant_string(w), (size_t) -1, &key, &key_size);
+ r = unbase64mem(json_variant_string(w), SIZE_MAX, &key, &key_size);
if (r < 0)
return log_error_errno(r, "Failed to decode base64 encoded key.");
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"TPM2 token data lacks 'tpm2-blob' field.");
- r = unbase64mem(json_variant_string(w), (size_t) -1, &blob, &blob_size);
+ r = unbase64mem(json_variant_string(w), SIZE_MAX, &blob, &blob_size);
if (r < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Invalid base64 data in 'tpm2-blob' field.");
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"TPM2 token data lacks 'tpm2-policy-hash' field.");
- r = unhexmem(json_variant_string(w), (size_t) -1, &policy_hash, &policy_hash_size);
+ r = unhexmem(json_variant_string(w), SIZE_MAX, &policy_hash, &policy_hash_size);
if (r < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Invalid base64 data in 'tpm2-policy-hash' field.");
_cleanup_free_ void *cid = NULL;
size_t cid_size;
- r = unbase64mem(val, (size_t) -1, &cid, &cid_size);
+ r = unbase64mem(val, SIZE_MAX, &cid, &cid_size);
if (r < 0)
return log_error_errno(r, "Failed to decode FIDO2 CID data: %m");
flags = determine_flags();
- if (arg_timeout == USEC_INFINITY)
+ until = usec_add(now(CLOCK_MONOTONIC), arg_timeout);
+ if (until == USEC_INFINITY)
until = 0;
- else
- until = now(CLOCK_MONOTONIC) + arg_timeout;
arg_key_size = (arg_key_size > 0 ? arg_key_size : (256 / 8));
/* Copying to stdout? */
if (streq(arg_target, "-")) {
- r = copy_bytes(source_fd, STDOUT_FILENO, (uint64_t) -1, COPY_REFLINK);
+ r = copy_bytes(source_fd, STDOUT_FILENO, UINT64_MAX, COPY_REFLINK);
if (r < 0)
return log_error_errno(r, "Failed to copy bytes from %s in mage '%s' to stdout: %m", arg_source, arg_image);
- /* When we copy to stdou we don't copy any attributes (i.e. no access mode, no ownership, no xattr, no times) */
+ /* When we copy to stdout we don't copy any attributes (i.e. no access mode, no ownership, no xattr, no times) */
return 0;
}
if (target_fd < 0)
return log_error_errno(errno, "Failed to create regular file at target path '%s': %m", arg_target);
- r = copy_bytes(source_fd, target_fd, (uint64_t) -1, COPY_REFLINK);
+ r = copy_bytes(source_fd, target_fd, UINT64_MAX, COPY_REFLINK);
if (r < 0)
return log_error_errno(r, "Failed to copy bytes from %s in mage '%s' to '%s': %m", arg_source, arg_image, arg_target);
if (target_fd < 0)
return log_error_errno(errno, "Failed to open target file '%s': %m", arg_target);
- r = copy_bytes(STDIN_FILENO, target_fd, (uint64_t) -1, COPY_REFLINK);
+ r = copy_bytes(STDIN_FILENO, target_fd, UINT64_MAX, COPY_REFLINK);
if (r < 0)
return log_error_errno(r, "Failed to copy bytes from stdin to '%s' in image '%s': %m", arg_target, arg_image);
if (target_fd < 0)
return log_error_errno(errno, "Failed to open target file '%s': %m", arg_target);
- r = copy_bytes(source_fd, target_fd, (uint64_t) -1, COPY_REFLINK);
+ r = copy_bytes(source_fd, target_fd, UINT64_MAX, COPY_REFLINK);
if (r < 0)
return log_error_errno(r, "Failed to copy bytes from '%s' to '%s' in image '%s': %m", arg_source, arg_target, arg_image);
if (original) {
struct passwd *i;
- r = sync_rights(fileno(original), fileno(passwd));
+ r = copy_rights(fileno(original), fileno(passwd));
if (r < 0)
return r;
if (original) {
struct spwd *i;
- r = sync_rights(fileno(original), fileno(shadow));
+ r = copy_rights(fileno(original), fileno(shadow));
if (r < 0)
return r;
.sp_warn = -1,
.sp_inact = -1,
.sp_expire = -1,
- .sp_flag = (unsigned long) -1, /* this appears to be what everybody does ... */
+ .sp_flag = ULONG_MAX, /* this appears to be what everybody does ... */
};
if (errno != ENOENT)
usec_t u;
int r;
- r = fstab_filter_options(opts, filter, NULL, &timeout, NULL);
+ r = fstab_filter_options(opts, filter, NULL, &timeout, NULL, NULL);
if (r < 0)
return log_warning_errno(r, "Failed to parse options: %m");
if (r == 0)
assert(f);
assert(opts);
- r = fstab_extract_values(opts, filter, &names);
+ r = fstab_filter_options(opts, filter, NULL, NULL, &names, NULL);
if (r < 0)
return log_warning_errno(r, "Failed to parse options: %m");
if (r == 0)
static int write_after(FILE *f, const char *opts) {
return write_dependency(f, opts,
- "x-systemd.after", "After=%1$s\n");
+ "x-systemd.after\0", "After=%1$s\n");
}
static int write_requires_after(FILE *f, const char *opts) {
return write_dependency(f, opts,
- "x-systemd.requires", "After=%1$s\nRequires=%1$s\n");
+ "x-systemd.requires\0", "After=%1$s\nRequires=%1$s\n");
}
static int write_before(FILE *f, const char *opts) {
return write_dependency(f, opts,
- "x-systemd.before", "Before=%1$s\n");
+ "x-systemd.before\0", "Before=%1$s\n");
}
static int write_requires_mounts_for(FILE *f, const char *opts) {
assert(f);
assert(opts);
- r = fstab_extract_values(opts, "x-systemd.requires-mounts-for", &paths);
+ r = fstab_filter_options(opts, "x-systemd.requires-mounts-for\0", NULL, NULL, &paths, NULL);
if (r < 0)
return log_warning_errno(r, "Failed to parse options: %m");
if (r == 0)
mount_point_ignore(where))
return 0;
- r = fstab_extract_values(opts, "x-systemd.wanted-by", &wanted_by);
+ r = fstab_filter_options(opts, "x-systemd.wanted-by\0", NULL, NULL, &wanted_by, NULL);
if (r < 0)
return r;
- r = fstab_extract_values(opts, "x-systemd.required-by", &required_by);
+ r = fstab_filter_options(opts, "x-systemd.required-by\0", NULL, NULL, &required_by, NULL);
if (r < 0)
return r;
* mount.nfs (so systemd can manage the job-control aspects of 'bg'),
* we need to explicitly preserve that default, and also ensure
* the systemd mount-timeout doesn't interfere.
- * By placing these options first, they can be over-ridden by
+ * By placing these options first, they can be overridden by
* settings in /etc/fstab. */
opts = strjoina("x-systemd.mount-timeout=infinity,retry=10000,nofail,", opts, ",fg");
SET_FLAG(flags, NOFAIL, true);
* /etc/fstab. So we canonicalize here. Note that we use CHASE_NONEXISTENT to handle the case
* where a symlink refers to another mount target; this works assuming the sub-mountpoint
* target is the final directory. */
- r = chase_symlinks(where, initrd ? "/sysroot" : NULL,
+ k = chase_symlinks(where, initrd ? "/sysroot" : NULL,
CHASE_PREFIX_ROOT | CHASE_NONEXISTENT,
&canonical_where, NULL);
- if (r < 0) /* If we can't canonicalize we continue on as if it wasn't a symlink */
- log_debug_errno(r, "Failed to read symlink target for %s, ignoring: %m", where);
+ if (k < 0) /* If we can't canonicalize we continue on as if it wasn't a symlink */
+ log_debug_errno(k, "Failed to read symlink target for %s, ignoring: %m", where);
else if (streq(canonical_where, where)) /* If it was fully canonicalized, suppress the change */
canonical_where = mfree(canonical_where);
else
if (!what)
return log_oom();
- fstype = arg_root_fstype ?: "tmpfs"; /* tmpfs, unless overriden */
+ fstype = arg_root_fstype ?: "tmpfs"; /* tmpfs, unless overridden */
- default_rw = true; /* writable, unless overriden */;
+ default_rw = true; /* writable, unless overridden */;
} else {
what = fstab_node_to_udev_node(arg_root_what);
fstype = arg_root_fstype; /* if not specified explicitly, don't default to anything here */
- default_rw = false; /* read-only, unless overriden */
+ default_rw = false; /* read-only, unless overridden */
}
if (!arg_root_options)
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#include "alloc-util.h"
-#include "log.h"
#include "fileio.h"
#include "fuzz.h"
+#include "log.h"
+#include "parse-util.h"
+#include "string-util.h"
#include "tests.h"
/* This is a test driver for the systemd fuzzers that provides main function
/* This one was borrowed from
* https://github.com/google/oss-fuzz/blob/646fca1b506b056db3a60d32c4a1a7398f171c94/infra/base-images/base-runner/bad_build_check#L19
*/
-#define MIN_NUMBER_OF_RUNS 4
+#define NUMBER_OF_RUNS 4
int main(int argc, char **argv) {
int r;
test_setup_logging(LOG_DEBUG);
+ unsigned number_of_runs = NUMBER_OF_RUNS;
+
+ const char *v = getenv("SYSTEMD_FUZZ_RUNS");
+ if (!isempty(v)) {
+ r = safe_atou(v, &number_of_runs);
+ if (r < 0)
+ return log_error_errno(r, "Failed to parse SYSTEMD_FUZZ_RUNS=%s: %m", v);
+ }
+
for (int i = 1; i < argc; i++) {
_cleanup_free_ char *buf = NULL;
size_t size;
}
printf("%s... ", name);
fflush(stdout);
- for (int j = 0; j < MIN_NUMBER_OF_RUNS; j++)
+ for (unsigned j = 0; j < number_of_runs; j++)
if (LLVMFuzzerTestOneInput((uint8_t*)buf, size) == EXIT_TEST_SKIP)
return EXIT_TEST_SKIP;
printf("ok\n");
# SPDX-License-Identifier: LGPL-2.1-or-later
fuzzers += [
- [['src/fuzz/fuzz-bus-message.c']],
-
[['src/fuzz/fuzz-catalog.c']],
[['src/fuzz/fuzz-json.c']],
return bus_log_parse_error(r);
if (table_get_rows(table) > 1 || !FLAGS_SET(arg_json_format_flags, JSON_FORMAT_OFF)) {
- r = table_set_sort(table, (size_t) 0, (size_t) -1);
+ r = table_set_sort(table, (size_t) 0);
if (r < 0)
return table_log_sort_error(r);
assert(h);
- h->deferred_change_event_source = sd_event_source_unref(h->deferred_change_event_source);
+ h->deferred_change_event_source = sd_event_source_disable_unref(h->deferred_change_event_source);
r = bus_home_path(h, &path);
if (r < 0) {
user_record_unref(h->record);
user_record_unref(h->secret);
- h->worker_event_source = sd_event_source_unref(h->worker_event_source);
+ h->worker_event_source = sd_event_source_disable_unref(h->worker_event_source);
safe_close(h->worker_stdout_fd);
free(h->user_name);
free(h->sysfs);
- h->ref_event_source_please_suspend = sd_event_source_unref(h->ref_event_source_please_suspend);
- h->ref_event_source_dont_suspend = sd_event_source_unref(h->ref_event_source_dont_suspend);
+ h->ref_event_source_please_suspend = sd_event_source_disable_unref(h->ref_event_source_please_suspend);
+ h->ref_event_source_dont_suspend = sd_event_source_disable_unref(h->ref_event_source_dont_suspend);
h->pending_operations = ordered_set_free(h->pending_operations);
- h->pending_event_source = sd_event_source_unref(h->pending_event_source);
- h->deferred_change_event_source = sd_event_source_unref(h->deferred_change_event_source);
+ h->pending_event_source = sd_event_source_disable_unref(h->pending_event_source);
+ h->deferred_change_event_source = sd_event_source_disable_unref(h->deferred_change_event_source);
h->current_operation = operation_unref(h->current_operation);
(void) hashmap_remove_value(h->manager->homes_by_worker_pid, PID_TO_PTR(h->worker_pid), h);
h->worker_pid = 0;
- h->worker_event_source = sd_event_source_unref(h->worker_event_source);
+ h->worker_event_source = sd_event_source_disable_unref(h->worker_event_source);
if (si->si_code != CLD_EXITED) {
assert(IN_SET(si->si_code, CLD_KILLED, CLD_DUMPED));
r = safe_fork_full("(sd-homework)",
(int[]) { stdin_fd, stdout_fd }, 2,
- FORK_RESET_SIGNALS|FORK_CLOSE_ALL_FDS|FORK_DEATHSIG|FORK_LOG, &pid);
+ FORK_RESET_SIGNALS|FORK_CLOSE_ALL_FDS|FORK_DEATHSIG|FORK_LOG|FORK_REOPEN_LOG, &pid);
if (r < 0)
return r;
if (r == 0) {
r = hashmap_put(h->manager->homes_by_worker_pid, PID_TO_PTR(pid), h);
if (r < 0) {
- h->worker_event_source = sd_event_source_unref(h->worker_event_source);
+ h->worker_event_source = sd_event_source_disable_unref(h->worker_event_source);
return r;
}
assert(h->uid > 0); /* We never should be UID 0 */
/* Let's kill everything matching the specified UID */
- r = safe_fork("(sd-killer)", FORK_RESET_SIGNALS|FORK_CLOSE_ALL_FDS|FORK_DEATHSIG|FORK_WAIT|FORK_LOG, NULL);
+ r = safe_fork("(sd-killer)",
+ FORK_RESET_SIGNALS|FORK_CLOSE_ALL_FDS|FORK_DEATHSIG|FORK_WAIT|FORK_LOG|FORK_REOPEN_LOG,
+ NULL);
if (r < 0)
return r;
if (r == 0) {
assert(m);
- m->deferred_auto_login_event_source = sd_event_source_unref(m->deferred_auto_login_event_source);
+ m->deferred_auto_login_event_source = sd_event_source_disable_unref(m->deferred_auto_login_event_source);
r = sd_bus_emit_properties_changed(
m->bus,
assert(m);
- m->inotify_event_source = sd_event_source_unref(m->inotify_event_source);
+ m->inotify_event_source = sd_event_source_disable_unref(m->inotify_event_source);
m->scan_slash_home = false;
if (statfs("/home/", &sfs) < 0) {
m->scan_slash_home = true;
- r = sd_event_add_inotify(m->event, &m->inotify_event_source, "/home/", IN_CREATE|IN_CLOSE_WRITE|IN_DELETE_SELF|IN_MOVE_SELF|IN_ONLYDIR|IN_MOVED_TO|IN_MOVED_FROM|IN_DELETE, on_home_inotify, m);
+ r = sd_event_add_inotify(m->event, &m->inotify_event_source, "/home/",
+ IN_CREATE|IN_CLOSE_WRITE|IN_DELETE_SELF|IN_MOVE_SELF|IN_ONLYDIR|IN_MOVED_TO|IN_MOVED_FROM|IN_DELETE,
+ on_home_inotify, m);
if (r < 0)
log_full_errno(r == -ENOENT ? LOG_DEBUG : LOG_WARNING, r,
"Failed to create inotify watch on /home/, ignoring.");
HASHMAP_FOREACH(h, m->homes_by_worker_pid)
(void) home_wait_for_worker(h);
- hashmap_free(m->homes_by_uid);
- hashmap_free(m->homes_by_name);
- hashmap_free(m->homes_by_worker_pid);
- hashmap_free(m->homes_by_sysfs);
-
- m->inotify_event_source = sd_event_source_unref(m->inotify_event_source);
-
- bus_verify_polkit_async_registry_free(m->polkit_registry);
-
sd_bus_flush_close_unref(m->bus);
- sd_event_unref(m->event);
+ bus_verify_polkit_async_registry_free(m->polkit_registry);
- m->notify_socket_event_source = sd_event_source_unref(m->notify_socket_event_source);
m->device_monitor = sd_device_monitor_unref(m->device_monitor);
+ m->inotify_event_source = sd_event_source_unref(m->inotify_event_source);
+ m->notify_socket_event_source = sd_event_source_unref(m->notify_socket_event_source);
m->deferred_rescan_event_source = sd_event_source_unref(m->deferred_rescan_event_source);
m->deferred_gc_event_source = sd_event_source_unref(m->deferred_gc_event_source);
m->deferred_auto_login_event_source = sd_event_source_unref(m->deferred_auto_login_event_source);
+ sd_event_unref(m->event);
+
+ hashmap_free(m->homes_by_uid);
+ hashmap_free(m->homes_by_name);
+ hashmap_free(m->homes_by_worker_pid);
+ hashmap_free(m->homes_by_sysfs);
+
if (m->private_key)
EVP_PKEY_free(m->private_key);
return r;
if (!streq_ptr(hr->user_name, name))
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Identity's user name %s does not match file name %s, refusing.", hr->user_name, name);
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+ "Identity's user name %s does not match file name %s, refusing.",
+ hr->user_name, name);
is_signed = manager_verify_user_record(m, hr);
switch (is_signed) {
other = hashmap_get(m->homes_by_uid, UID_TO_PTR(candidate));
if (other) {
- log_debug("Candidate UID " UID_FMT " already used by another home directory (%s), let's try another.", candidate, other->user_name);
+ log_debug("Candidate UID " UID_FMT " already used by another home directory (%s), let's try another.",
+ candidate, other->user_name);
continue;
}
pw = getpwuid(candidate);
if (pw) {
- log_debug("Candidate UID " UID_FMT " already registered by another user in NSS (%s), let's try another.", candidate, pw->pw_name);
+ log_debug("Candidate UID " UID_FMT " already registered by another user in NSS (%s), let's try another.",
+ candidate, pw->pw_name);
continue;
}
gr = getgrgid((gid_t) candidate);
if (gr) {
- log_debug("Candidate UID " UID_FMT " already registered by another group in NSS (%s), let's try another.", candidate, gr->gr_name);
+ log_debug("Candidate UID " UID_FMT " already registered by another group in NSS (%s), let's try another.",
+ candidate, gr->gr_name);
continue;
}
if (r < 0)
continue;
if (r > 0) {
- log_debug_errno(r, "Candidate UID " UID_FMT " already owns IPC objects, let's try another: %m", candidate);
+ log_debug_errno(r, "Candidate UID " UID_FMT " already owns IPC objects, let's try another: %m",
+ candidate);
continue;
}
if (h && uid_is_valid(h->uid))
uid = h->uid;
else {
- r = manager_acquire_uid(m, start_uid, user_name, IN_SET(storage, USER_SUBVOLUME, USER_DIRECTORY, USER_FSCRYPT) ? image_path : NULL, &uid);
+ r = manager_acquire_uid(m, start_uid, user_name,
+ IN_SET(storage, USER_SUBVOLUME, USER_DIRECTORY, USER_FSCRYPT) ? image_path : NULL,
+ &uid);
if (r < 0)
return log_warning_errno(r, "Failed to acquire unused UID for %s: %m", user_name);
}
assert(m);
- m->deferred_rescan_event_source = sd_event_source_unref(m->deferred_rescan_event_source);
+ m->deferred_rescan_event_source = sd_event_source_disable_unref(m->deferred_rescan_event_source);
manager_enumerate_devices(m);
manager_enumerate_images(m);
assert(m);
- m->deferred_gc_event_source = sd_event_source_unref(m->deferred_gc_event_source);
+ m->deferred_gc_event_source = sd_event_source_disable_unref(m->deferred_gc_event_source);
manager_gc_images(m);
return 0;
# the system.conf.d/ subdirectory. The latter is generally recommended.
# Defaults can be restored by simply deleting this file and all drop-ins.
#
+# Use 'systemd-analyze cat-config systemd/homed.conf' to display the full config.
+#
# See homed.conf(5) for details.
[Home]
/* Also install the access key in the user's own keyring */
if (uid_is_valid(h->uid)) {
- r = safe_fork("(sd-addkey)", FORK_RESET_SIGNALS|FORK_CLOSE_ALL_FDS|FORK_DEATHSIG|FORK_LOG|FORK_WAIT, NULL);
+ r = safe_fork("(sd-addkey)",
+ FORK_RESET_SIGNALS|FORK_CLOSE_ALL_FDS|FORK_DEATHSIG|FORK_LOG|FORK_WAIT|FORK_REOPEN_LOG,
+ NULL);
if (r < 0)
return log_error_errno(r, "Failed install encryption key in user's keyring: %m");
if (r == 0) {
return 0;
}
- r = safe_fork("(fsck)", FORK_RESET_SIGNALS|FORK_RLIMIT_NOFILE_SAFE|FORK_DEATHSIG|FORK_LOG|FORK_STDOUT_TO_STDERR, &fsck_pid);
+ r = safe_fork("(fsck)",
+ FORK_RESET_SIGNALS|FORK_RLIMIT_NOFILE_SAFE|FORK_DEATHSIG|FORK_LOG|FORK_STDOUT_TO_STDERR|FORK_CLOSE_ALL_FDS,
+ &fsck_pid);
if (r < 0)
return r;
if (r == 0) {
/* Child */
execl("/sbin/fsck", "/sbin/fsck", "-aTl", node, NULL);
+ log_open();
log_error_errno(errno, "Failed to execute fsck: %m");
_exit(FSCK_OPERATIONAL_ERROR);
}
log_info("Temporary unmounting of file system completed.");
/* resize2fs requires that the file system is force checked first, do so. */
- r = safe_fork("(e2fsck)", FORK_RESET_SIGNALS|FORK_RLIMIT_NOFILE_SAFE|FORK_DEATHSIG|FORK_LOG|FORK_STDOUT_TO_STDERR, &fsck_pid);
+ r = safe_fork("(e2fsck)",
+ FORK_RESET_SIGNALS|FORK_RLIMIT_NOFILE_SAFE|FORK_DEATHSIG|FORK_LOG|FORK_STDOUT_TO_STDERR|FORK_CLOSE_ALL_FDS,
+ &fsck_pid);
if (r < 0)
return r;
if (r == 0) {
/* Child */
execlp("e2fsck" ,"e2fsck", "-fp", setup->dm_node, NULL);
+ log_open();
log_error_errno(errno, "Failed to execute e2fsck: %m");
_exit(EXIT_FAILURE);
}
return log_oom();
/* Resize the thing */
- r = safe_fork("(e2resize)", FORK_RESET_SIGNALS|FORK_RLIMIT_NOFILE_SAFE|FORK_DEATHSIG|FORK_LOG|FORK_WAIT|FORK_STDOUT_TO_STDERR, &resize_pid);
+ r = safe_fork("(e2resize)",
+ FORK_RESET_SIGNALS|FORK_RLIMIT_NOFILE_SAFE|FORK_DEATHSIG|FORK_LOG|FORK_WAIT|FORK_STDOUT_TO_STDERR|FORK_CLOSE_ALL_FDS,
+ &resize_pid);
if (r < 0)
return r;
if (r == 0) {
/* Child */
execlp("resize2fs" ,"resize2fs", setup->dm_node, size_str, NULL);
+ log_open();
log_error_errno(errno, "Failed to execute resize2fs: %m");
_exit(EXIT_FAILURE);
}
.input_fd = -1,
.on_finished = on_finished,
.userdata = userdata,
- .last_percent = (unsigned) -1,
+ .last_percent = UINT_MAX,
.progress_ratelimit = { 100 * USEC_PER_MSEC, 1 },
};
.tar_fd = -1,
.on_finished = on_finished,
.userdata = userdata,
- .quota_referenced = (uint64_t) -1,
- .last_percent = (unsigned) -1,
+ .quota_referenced = UINT64_MAX,
+ .last_percent = UINT_MAX,
.progress_ratelimit = { 100 * USEC_PER_MSEC, 1 },
};
assert(e);
/* Do we have any quota info? If not, we don't know anything about the progress */
- if (e->quota_referenced == (uint64_t) -1)
+ if (e->quota_referenced == UINT64_MAX)
return;
if (e->written_uncompressed >= e->quota_referenced)
if (r < 0)
return r;
- e->quota_referenced = (uint64_t) -1;
+ e->quota_referenced = UINT64_MAX;
if (btrfs_might_be_subvol(&e->st)) {
BtrfsQuotaInfo q;
.output_fd = -1,
.on_finished = on_finished,
.userdata = userdata,
- .last_percent = (unsigned) -1,
+ .last_percent = UINT_MAX,
.image_root = TAKE_PTR(root),
.progress_ratelimit = { 100 * USEC_PER_MSEC, 1 },
};
.tar_fd = -1,
.on_finished = on_finished,
.userdata = userdata,
- .last_percent = (unsigned) -1,
+ .last_percent = UINT_MAX,
.image_root = TAKE_PTR(root),
.progress_ratelimit = { 100 * USEC_PER_MSEC, 1 },
};
.stdin_fd = -1,
.stdout_fd = -1,
.verify = _IMPORT_VERIFY_INVALID,
- .progress_percent= (unsigned) -1,
+ .progress_percent= UINT_MAX,
};
id = m->current_transfer_id + 1;
static double transfer_percent_as_double(Transfer *t) {
assert(t);
- if (t->progress_percent == (unsigned) -1)
+ if (t->progress_percent == UINT_MAX)
return -DBL_MAX;
return (double) t->progress_percent / 100.0;
goto finish;
}
- if (j->content_length != (uint64_t) -1 &&
+ if (j->content_length != UINT64_MAX &&
j->content_length != j->written_compressed) {
log_error("Download truncated.");
r = -EIO;
if (j->written_compressed + sz > j->compressed_max)
return log_error_errno(SYNTHETIC_ERRNO(EFBIG), "File overly large, refusing.");
- if (j->content_length != (uint64_t) -1 &&
+ if (j->content_length != UINT64_MAX &&
j->written_compressed + sz > j->content_length)
return log_error_errno(SYNTHETIC_ERRNO(EFBIG),
"Content length incorrect.");
if (r > 0) {
(void) safe_atou64(length, &j->content_length);
- if (j->content_length != (uint64_t) -1) {
+ if (j->content_length != UINT64_MAX) {
char bytes[FORMAT_BYTES_MAX];
if (j->content_length > j->compressed_max) {
.disk_fd = -1,
.userdata = userdata,
.glue = glue,
- .content_length = (uint64_t) -1,
+ .content_length = UINT64_MAX,
.start_usec = now(CLOCK_MONOTONIC),
.compressed_max = 64LLU * 1024LLU * 1024LLU * 1024LLU, /* 64GB safety limit */
.uncompressed_max = 64LLU * 1024LLU * 1024LLU * 1024LLU, /* 64GB safety limit */
* since it reduces fragmentation caused by not allowing in-place writes. */
(void) import_set_nocow_and_log(dfd, tp);
- r = copy_bytes(i->raw_job->disk_fd, dfd, (uint64_t) -1, COPY_REFLINK);
+ r = copy_bytes(i->raw_job->disk_fd, dfd, UINT64_MAX, COPY_REFLINK);
if (r < 0) {
(void) unlink(tp);
return log_error_errno(r, "Failed to make writable copy of image: %m");
if (!response)
return respond_oom(connection);
- MHD_add_response_header(response, "Content-Type", mime_types[m->mode]);
+ if (MHD_add_response_header(response, "Content-Type", mime_types[m->mode]) == MHD_NO)
+ return respond_oom(connection);
+
return MHD_queue_response(connection, MHD_HTTP_OK, response);
}
if (!response)
return respond_oom(connection);
- MHD_add_response_header(response, "Content-Type", mime_types[m->mode == OUTPUT_JSON ? OUTPUT_JSON : OUTPUT_SHORT]);
+ if (MHD_add_response_header(response, "Content-Type", mime_types[m->mode == OUTPUT_JSON ? OUTPUT_JSON : OUTPUT_SHORT]) == MHD_NO)
+ return respond_oom(connection);
+
return MHD_queue_response(connection, MHD_HTTP_OK, response);
}
struct MHD_Connection *connection,
const char *target) {
- char *page;
+ _cleanup_free_ char *page = NULL;
_cleanup_(MHD_destroy_responsep) struct MHD_Response *response = NULL;
assert(connection);
return respond_oom(connection);
response = MHD_create_response_from_buffer(strlen(page), page, MHD_RESPMEM_MUST_FREE);
- if (!response) {
- free(page);
+ if (!response)
+ return respond_oom(connection);
+ TAKE_PTR(page);
+
+ if (MHD_add_response_header(response, "Content-Type", "text/html") == MHD_NO ||
+ MHD_add_response_header(response, "Location", target) == MHD_NO)
return respond_oom(connection);
- }
- MHD_add_response_header(response, "Content-Type", "text/html");
- MHD_add_response_header(response, "Location", target);
return MHD_queue_response(connection, MHD_HTTP_MOVED_PERMANENTLY, response);
}
return respond_oom(connection);
TAKE_FD(fd);
- MHD_add_response_header(response, "Content-Type", mime_type);
+ if (MHD_add_response_header(response, "Content-Type", mime_type) == MHD_NO)
+ return respond_oom(connection);
+
return MHD_queue_response(connection, MHD_HTTP_OK, response);
}
return respond_oom(connection);
TAKE_PTR(json);
- MHD_add_response_header(response, "Content-Type", "application/json");
+ if (MHD_add_response_header(response, "Content-Type", "application/json") == MHD_NO)
+ return respond_oom(connection);
+
return MHD_queue_response(connection, MHD_HTTP_OK, response);
}
}
r = sd_event_add_time(s->events, &d->timer_event,
- CLOCK_MONOTONIC, (uint64_t) -1, 0,
+ CLOCK_MONOTONIC, UINT64_MAX, 0,
null_timer_event_handler, d);
if (r < 0) {
log_error_errno(r, "Failed to add timer_event: %m");
#include "journal-remote.h"
static int do_rotate(JournalFile **f, bool compress, bool seal) {
- int r = journal_file_rotate(f, compress, (uint64_t) -1, seal, NULL);
+ int r = journal_file_rotate(f, compress, UINT64_MAX, seal, NULL);
if (r < 0) {
if (*f)
log_error_errno(r, "Failed to rotate %s: %m", (*f)->path);
r = journal_file_open_reliably(filename,
O_RDWR|O_CREAT, 0640,
- s->compress, (uint64_t) -1, s->seal,
+ s->compress, UINT64_MAX, s->seal,
&w->metrics,
w->mmap, NULL,
NULL, &w->journal);
return log_error_errno(r, "Failed to register input event: %m");
log_debug("Listening for journal events on fd:%d, timeout %d",
- fd, u->timeout == (uint64_t) -1 ? -1 : (int) u->timeout);
+ fd, u->timeout == UINT64_MAX ? -1 : (int) u->timeout);
} else
log_debug("Not listening for journal events.");
} \
} while (0)
+DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(CURL*, curl_easy_cleanup, NULL);
+DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(struct curl_slist*, curl_slist_free_all, NULL);
+
static size_t output_callback(char *buf,
size_t size,
size_t nmemb,
assert(input_callback);
if (!u->header) {
- struct curl_slist *h;
+ _cleanup_(curl_slist_free_allp) struct curl_slist *h = NULL;
+ struct curl_slist *l;
h = curl_slist_append(NULL, "Content-Type: application/vnd.fdo.journal");
if (!h)
return log_oom();
- h = curl_slist_append(h, "Transfer-Encoding: chunked");
- if (!h) {
- curl_slist_free_all(h);
+ l = curl_slist_append(h, "Transfer-Encoding: chunked");
+ if (!l)
return log_oom();
- }
+ h = l;
- h = curl_slist_append(h, "Accept: text/plain");
- if (!h) {
- curl_slist_free_all(h);
+ l = curl_slist_append(h, "Accept: text/plain");
+ if (!l)
return log_oom();
- }
+ h = l;
- u->header = h;
+ u->header = TAKE_PTR(h);
}
if (!u->easy) {
- CURL *curl;
+ _cleanup_(curl_easy_cleanupp) CURL *curl = NULL;
curl = curl_easy_init();
if (!curl)
easy_setopt(curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1,
LOG_WARNING, );
- u->easy = curl;
+ u->easy = TAKE_PTR(curl);
} else {
/* truncate the potential old error message */
u->error[0] = '\0';
return MHD_NO;
log_debug("Queueing response %u: %s", code, buffer);
- MHD_add_response_header(response, "Content-Type", "text/plain");
+ if (MHD_add_response_header(response, "Content-Type", "text/plain") == MHD_NO)
+ return MHD_NO;
return MHD_queue_response(connection, code, response);
}
assert_se(stdout_stream_install(&s, stream_fds[0], &stream) >= 0);
assert_se(write(stream_fds[1], data, size) == (ssize_t) size);
while (ioctl(stream_fds[0], SIOCINQ, &v) == 0 && v)
- sd_event_run(s.event, (uint64_t) -1);
+ sd_event_run(s.event, UINT64_MAX);
if (s.n_stdout_streams)
stdout_stream_destroy(stream);
server_done(&s);
#include <fnmatch.h>
#include <getopt.h>
#include <linux/fs.h>
-#include <poll.h>
#include <signal.h>
#include <stddef.h>
#include <stdio.h>
{ .fd = poll_fd, .events = POLLIN },
{ .fd = STDOUT_FILENO },
};
-
- struct timespec ts;
usec_t timeout;
int r;
if (r < 0)
return log_error_errno(r, "Failed to determine journal waiting time: %m");
- if (ppoll(pollfds, ELEMENTSOF(pollfds),
- timeout == USEC_INFINITY ? NULL : timespec_store(&ts, timeout), NULL) < 0) {
- if (errno == EINTR)
- return 0;
-
- return log_error_errno(errno, "Couldn't wait for journal event: %m");
- }
+ r = ppoll_usec(pollfds, ELEMENTSOF(pollfds), timeout);
+ if (r == -EINTR)
+ return 0;
+ if (r < 0)
+ return log_error_errno(r, "Couldn't wait for journal event: %m");
- if (pollfds[1].revents & (POLLHUP|POLLERR|POLLNVAL)) /* STDOUT has been closed? */
+ if (pollfds[1].revents & (POLLHUP|POLLERR)) /* STDOUT has been closed? */
return log_debug_errno(SYNTHETIC_ERRNO(ECANCELED),
"Standard output has been closed.");
- if (pollfds[0].revents & POLLNVAL)
- return log_debug_errno(SYNTHETIC_ERRNO(EBADF), "Change fd closed?");
-
r = sd_journal_process(j);
if (r < 0)
return log_error_errno(r, "Failed to process journal events: %m");
static size_t cache_max(void) {
static size_t cached = -1;
- if (cached == (size_t) -1) {
+ if (cached == SIZE_MAX) {
uint64_t mem_total;
int r;
*
* Note that *remaining is altered on both success and failure. */
- size_t n = 0, j, tn = (size_t) -1, m = 0, entry_size = 0;
+ size_t n = 0, j, tn = SIZE_MAX, m = 0, entry_size = 0;
char *identifier = NULL, *message = NULL;
struct iovec *iovec = NULL;
int priority = LOG_INFO;
ts = now(CLOCK_MONOTONIC);
- if (space->timestamp != 0 && space->timestamp + RECHECK_SPACE_USEC > ts)
+ if (space->timestamp != 0 && usec_add(space->timestamp, RECHECK_SPACE_USEC) > ts)
return 0;
r = determine_path_usage(s, storage->path, &vfs_used, &vfs_avail);
server_driver_message(s, 0, NULL,
LOG_MESSAGE("Time spent on flushing to %s is %s for %u entries.",
s->system_storage.path,
- format_timespan(ts, sizeof(ts), now(CLOCK_MONOTONIC) - start, 0),
+ format_timespan(ts, sizeof(ts), usec_sub_unsigned(now(CLOCK_MONOTONIC), start), 0),
n),
NULL);
assert(s);
if (s->namespace) {
- const char *namespaced;
+ const char *namespaced, *dropin_dirname;
/* If we are running in namespace mode, load the namespace specific configuration file, and nothing else */
namespaced = strjoina(PKGSYSCONFDIR "/journald@", s->namespace, ".conf");
-
- r = config_parse(NULL,
- namespaced, NULL,
- "Journal\0",
- config_item_perf_lookup, journald_gperf_lookup,
- CONFIG_PARSE_WARN, s,
- NULL);
+ dropin_dirname = strjoina("journald@", s->namespace, ".conf.d");
+
+ r = config_parse_many(
+ STRV_MAKE_CONST(namespaced),
+ (const char* const*) CONF_PATHS_STRV("systemd"),
+ dropin_dirname,
+ "Journal\0",
+ config_item_perf_lookup, journald_gperf_lookup,
+ CONFIG_PARSE_WARN, s, NULL);
if (r < 0)
return r;
.notify_fd = -1,
.compress.enabled = true,
- .compress.threshold_bytes = (uint64_t) -1,
+ .compress.threshold_bytes = UINT64_MAX,
.seal = true,
.set_audit = true,
if (isempty(rvalue)) {
compress->enabled = true;
- compress->threshold_bytes = (uint64_t) -1;
+ compress->threshold_bytes = UINT64_MAX;
} else if (streq(rvalue, "1")) {
log_syntax(unit, LOG_WARNING, filename, line, 0,
"Compress= ambiguously specified as 1, enabling compression with default threshold");
return 0;
}
+static int syslog_parse_priority_and_facility(const char *s) {
+ int prio, r;
+
+ /* Parses both facility and priority in one value, i.e. is different from log_level_from_string()
+ * which only parses the priority and refuses any facility value */
+
+ r = safe_atoi(s, &prio);
+ if (r < 0)
+ return r;
+
+ if (prio < 0 || prio > 999)
+ return -ERANGE;
+
+ return prio;
+}
+
static int stdout_stream_line(StdoutStream *s, char *p, LineBreak line_break) {
char *orig;
int r;
s->state = STDOUT_STREAM_PRIORITY;
return 0;
- case STDOUT_STREAM_PRIORITY:
- r = safe_atoi(p, &s->priority);
- if (r < 0 || s->priority < 0 || s->priority > 999) {
- log_warning("Failed to parse log priority line.");
- return -EINVAL;
- }
+ case STDOUT_STREAM_PRIORITY: {
+ int priority;
+
+ priority = syslog_parse_priority_and_facility(p);
+ if (priority < 0)
+ return log_warning_errno(priority, "Failed to parse log priority line: %m");
+ s->priority = priority;
s->state = STDOUT_STREAM_LEVEL_PREFIX;
return 0;
+ }
case STDOUT_STREAM_LEVEL_PREFIX:
r = parse_boolean(p);
- if (r < 0) {
- log_warning("Failed to parse level prefix line.");
- return -EINVAL;
- }
+ if (r < 0)
+ return log_warning_errno(r, "Failed to parse level prefix line: %m");
s->level_prefix = r;
s->state = STDOUT_STREAM_FORWARD_TO_SYSLOG;
case STDOUT_STREAM_FORWARD_TO_SYSLOG:
r = parse_boolean(p);
- if (r < 0) {
- log_warning("Failed to parse forward to syslog line.");
- return -EINVAL;
- }
+ if (r < 0)
+ return log_warning_errno(r, "Failed to parse forward to syslog line: %m");
s->forward_to_syslog = r;
s->state = STDOUT_STREAM_FORWARD_TO_KMSG;
case STDOUT_STREAM_FORWARD_TO_KMSG:
r = parse_boolean(p);
- if (r < 0) {
- log_warning("Failed to parse copy to kmsg line.");
- return -EINVAL;
- }
+ if (r < 0)
+ return log_warning_errno(r, "Failed to parse copy to kmsg line: %m");
s->forward_to_kmsg = r;
s->state = STDOUT_STREAM_FORWARD_TO_CONSOLE;
case STDOUT_STREAM_FORWARD_TO_CONSOLE:
r = parse_boolean(p);
- if (r < 0) {
- log_warning("Failed to parse copy to console line.");
- return -EINVAL;
- }
+ if (r < 0)
+ return log_warning_errno(r, "Failed to parse copy to console line.");
s->forward_to_console = r;
s->state = STDOUT_STREAM_RUNNING;
if (priority) {
int p;
- p = log_level_from_string(priority);
+ p = syslog_parse_priority_and_facility(priority);
if (p >= 0)
stream->priority = p;
}
# the system.conf.d/ subdirectory. The latter is generally recommended.
# Defaults can be restored by simply deleting this file and all drop-ins.
#
+# Use 'systemd-analyze cat-config systemd/journald.conf' to display the full config.
+#
# See journald.conf(5) for details.
[Journal]
/* Invalid Case */
COMPRESS_PARSE_CHECK("-1", true, 111);
COMPRESS_PARSE_CHECK("blah blah", true, 111);
- COMPRESS_PARSE_CHECK("", true, (uint64_t)-1);
+ COMPRESS_PARSE_CHECK("", true, UINT64_MAX);
}
int main(int argc, char *argv[]) {
#include "sd-dhcp-client.h"
#include "dhcp-protocol.h"
+#include "log-link.h"
#include "socket-util.h"
typedef struct sd_dhcp_option {
#define DHCP_CLIENT_DONT_DESTROY(client) \
_cleanup_(sd_dhcp_client_unrefp) _unused_ sd_dhcp_client *_dont_destroy_##client = sd_dhcp_client_ref(client)
-#define log_dhcp_client_errno(client, error, fmt, ...) log_internal(LOG_DEBUG, error, PROJECT_FILE, __LINE__, __func__, "DHCP CLIENT (0x%x): " fmt, client->xid, ##__VA_ARGS__)
-#define log_dhcp_client(client, fmt, ...) log_dhcp_client_errno(client, 0, fmt, ##__VA_ARGS__)
+#define log_dhcp_client_errno(client, error, fmt, ...) \
+ ({ \
+ int _e = (error); \
+ if (DEBUG_LOGGING) \
+ log_interface_full_errno( \
+ sd_dhcp_client_get_ifname(client), \
+ LOG_DEBUG, _e, "DHCPv4 client: " fmt, \
+ ##__VA_ARGS__); \
+ -ERRNO_VALUE(_e); \
+ })
+#define log_dhcp_client(client, fmt, ...) \
+ log_dhcp_client_errno(client, 0, fmt, ##__VA_ARGS__)
#include "dhcp-internal.h"
#include "ordered-set.h"
-#include "log.h"
+#include "log-link.h"
#include "time-util.h"
typedef enum DHCPRawOption {
int fd_raw;
int ifindex;
+ char *ifname;
be32_t address;
be32_t netmask;
be32_t subnet;
uint32_t lifetime;
} DHCPRequest;
-#define log_dhcp_server(client, fmt, ...) log_internal(LOG_DEBUG, 0, PROJECT_FILE, __LINE__, __func__, "DHCP SERVER: " fmt, ##__VA_ARGS__)
-#define log_dhcp_server_errno(client, error, fmt, ...) log_internal(LOG_DEBUG, error, PROJECT_FILE, __LINE__, __func__, "DHCP SERVER: " fmt, ##__VA_ARGS__)
-
int dhcp_server_handle_message(sd_dhcp_server *server, DHCPMessage *message,
size_t length);
int dhcp_server_send_packet(sd_dhcp_server *server,
void client_id_hash_func(const DHCPClientId *p, struct siphash *state);
int client_id_compare_func(const DHCPClientId *a, const DHCPClientId *b);
+
+#define log_dhcp_server_errno(server, error, fmt, ...) \
+ ({ \
+ int _e = (error); \
+ if (DEBUG_LOGGING) \
+ log_interface_full_errno( \
+ sd_dhcp_server_get_ifname(server), \
+ LOG_DEBUG, _e, "DHCPv4 server: " fmt, \
+ ##__VA_ARGS__); \
+ -ERRNO_VALUE(_e); \
+ })
+#define log_dhcp_server(server, fmt, ...) \
+ log_dhcp_server_errno(server, 0, fmt, ##__VA_ARGS__)
#include <netinet/in.h>
#include "sd-event.h"
+#include "sd-dhcp6-client.h"
-#include "list.h"
#include "hashmap.h"
+#include "list.h"
+#include "log-link.h"
#include "macro.h"
#include "sparse-endian.h"
be32_t id;
} _packed_;
-struct DHCP6IA {
+typedef struct DHCP6IA {
uint16_t type;
union {
struct ia_na ia_na;
};
LIST_HEAD(DHCP6Address, addresses);
-};
-
-typedef struct DHCP6IA DHCP6IA;
-
-#define log_dhcp6_client_errno(p, error, fmt, ...) log_internal(LOG_DEBUG, error, PROJECT_FILE, __LINE__, __func__, "DHCPv6 CLIENT: " fmt, ##__VA_ARGS__)
-#define log_dhcp6_client(p, fmt, ...) log_dhcp6_client_errno(p, 0, fmt, ##__VA_ARGS__)
+} DHCP6IA;
int dhcp6_option_append(uint8_t **buf, size_t *buflen, uint16_t code,
size_t optlen, const void *optval);
int dhcp6_option_parse(uint8_t **buf, size_t *buflen, uint16_t *optcode,
size_t *optlen, uint8_t **optvalue);
int dhcp6_option_parse_status(DHCP6Option *option, size_t len);
-int dhcp6_option_parse_ia(DHCP6Option *iaoption, DHCP6IA *ia, uint16_t *ret_status_code);
+int dhcp6_option_parse_ia(sd_dhcp6_client *client, DHCP6Option *iaoption, DHCP6IA *ia, uint16_t *ret_status_code);
int dhcp6_option_parse_ip6addrs(uint8_t *optval, uint16_t optlen,
struct in6_addr **addrs, size_t count,
size_t *allocated);
int dhcp6_message_type_from_string(const char *s) _pure_;
const char *dhcp6_message_status_to_string(int s) _const_;
int dhcp6_message_status_from_string(const char *s) _pure_;
+
+#define log_dhcp6_client_errno(client, error, fmt, ...) \
+ ({ \
+ int _e = (error); \
+ if (DEBUG_LOGGING) \
+ log_interface_full_errno( \
+ sd_dhcp6_client_get_ifname(client), \
+ LOG_DEBUG, _e, "DHCPv6 client: " fmt, \
+ ##__VA_ARGS__); \
+ -ERRNO_VALUE(_e); \
+ })
+#define log_dhcp6_client(client, fmt, ...) \
+ log_dhcp6_client_errno(client, 0, fmt, ##__VA_ARGS__)
len += r;
}
- if (hint_pd_prefix) {
+ if (hint_pd_prefix && hint_pd_prefix->iapdprefix.prefixlen > 0) {
r = option_append_pd_prefix(buf, buflen, hint_pd_prefix);
- if (r < 0 && r != -EINVAL)
+ if (r < 0)
return r;
len += r;
return be16toh(statusopt->status);
}
-static int dhcp6_option_parse_address(DHCP6Option *option, DHCP6IA *ia, uint32_t *ret_lifetime_valid) {
+static int dhcp6_option_parse_address(sd_dhcp6_client *client, DHCP6Option *option, DHCP6IA *ia, uint32_t *ret_lifetime_valid) {
DHCP6AddressOption *addr_option = (DHCP6AddressOption *)option;
DHCP6Address *addr;
uint32_t lt_valid, lt_pref;
lt_valid = be32toh(addr_option->iaaddr.lifetime_valid);
lt_pref = be32toh(addr_option->iaaddr.lifetime_preferred);
- if (lt_valid == 0 || lt_pref > lt_valid) {
- log_dhcp6_client(client,
- "Valid lifetime of an IA address is zero or "
- "preferred lifetime %"PRIu32" > valid lifetime %"PRIu32,
- lt_pref, lt_valid);
- return -EINVAL;
- }
+ if (lt_valid == 0 || lt_pref > lt_valid)
+ return log_dhcp6_client_errno(client, SYNTHETIC_ERRNO(EINVAL),
+ "Valid lifetime of an IA address is zero or "
+ "preferred lifetime %"PRIu32" > valid lifetime %"PRIu32,
+ lt_pref, lt_valid);
if (be16toh(option->len) + offsetof(DHCP6Option, data) > sizeof(*addr_option)) {
r = dhcp6_option_parse_status((DHCP6Option *)addr_option->options, be16toh(option->len) + offsetof(DHCP6Option, data) - sizeof(*addr_option));
if (r < 0)
return r;
- if (r > 0) {
- log_dhcp6_client(client, "Non-zero status code '%s' for address is received",
- dhcp6_message_status_to_string(r));
- return -EINVAL;
- }
+ if (r > 0)
+ return log_dhcp6_client_errno(client, SYNTHETIC_ERRNO(EINVAL),
+ "Non-zero status code '%s' for address is received",
+ dhcp6_message_status_to_string(r));
}
addr = new0(DHCP6Address, 1);
return 0;
}
-static int dhcp6_option_parse_pdprefix(DHCP6Option *option, DHCP6IA *ia, uint32_t *ret_lifetime_valid) {
+static int dhcp6_option_parse_pdprefix(sd_dhcp6_client *client, DHCP6Option *option, DHCP6IA *ia, uint32_t *ret_lifetime_valid) {
DHCP6PDPrefixOption *pdprefix_option = (DHCP6PDPrefixOption *)option;
DHCP6Address *prefix;
uint32_t lt_valid, lt_pref;
lt_valid = be32toh(pdprefix_option->iapdprefix.lifetime_valid);
lt_pref = be32toh(pdprefix_option->iapdprefix.lifetime_preferred);
- if (lt_valid == 0 || lt_pref > lt_valid) {
- log_dhcp6_client(client,
- "Valid lifetieme of a PD prefix is zero or "
- "preferred lifetime %"PRIu32" > valid lifetime %"PRIu32,
- lt_pref, lt_valid);
- return -EINVAL;
- }
+ if (lt_valid == 0 || lt_pref > lt_valid)
+ return log_dhcp6_client_errno(client, SYNTHETIC_ERRNO(EINVAL),
+ "Valid lifetieme of a PD prefix is zero or "
+ "preferred lifetime %"PRIu32" > valid lifetime %"PRIu32,
+ lt_pref, lt_valid);
if (be16toh(option->len) + offsetof(DHCP6Option, data) > sizeof(*pdprefix_option)) {
r = dhcp6_option_parse_status((DHCP6Option *)pdprefix_option->options, be16toh(option->len) + offsetof(DHCP6Option, data) - sizeof(*pdprefix_option));
if (r < 0)
return r;
- if (r > 0) {
- log_dhcp6_client(client, "Non-zero status code '%s' for PD prefix is received",
- dhcp6_message_status_to_string(r));
- return -EINVAL;
- }
+ if (r > 0)
+ return log_dhcp6_client_errno(client, SYNTHETIC_ERRNO(EINVAL),
+ "Non-zero status code '%s' for PD prefix is received",
+ dhcp6_message_status_to_string(r));
}
prefix = new0(DHCP6Address, 1);
return 0;
}
-int dhcp6_option_parse_ia(DHCP6Option *iaoption, DHCP6IA *ia, uint16_t *ret_status_code) {
+int dhcp6_option_parse_ia(sd_dhcp6_client *client, DHCP6Option *iaoption, DHCP6IA *ia, uint16_t *ret_status_code) {
uint32_t lt_t1, lt_t2, lt_valid = 0, lt_min = UINT32_MAX;
uint16_t iatype, optlen;
size_t iaaddr_offset;
lt_t1 = be32toh(ia->ia_na.lifetime_t1);
lt_t2 = be32toh(ia->ia_na.lifetime_t2);
- if (lt_t1 && lt_t2 && lt_t1 > lt_t2) {
- log_dhcp6_client(client, "IA NA T1 %"PRIu32"sec > T2 %"PRIu32"sec", lt_t1, lt_t2);
- return -EINVAL;
- }
+ if (lt_t1 > lt_t2)
+ return log_dhcp6_client_errno(client, SYNTHETIC_ERRNO(EINVAL),
+ "IA NA T1 %"PRIu32"sec > T2 %"PRIu32"sec",
+ lt_t1, lt_t2);
break;
lt_t1 = be32toh(ia->ia_pd.lifetime_t1);
lt_t2 = be32toh(ia->ia_pd.lifetime_t2);
- if (lt_t1 && lt_t2 && lt_t1 > lt_t2) {
- log_dhcp6_client(client, "IA PD T1 %"PRIu32"sec > T2 %"PRIu32"sec", lt_t1, lt_t2);
- return -EINVAL;
- }
+ if (lt_t1 > lt_t2)
+ return log_dhcp6_client_errno(client, SYNTHETIC_ERRNO(EINVAL),
+ "IA PD T1 %"PRIu32"sec > T2 %"PRIu32"sec",
+ lt_t1, lt_t2);
break;
switch (opt) {
case SD_DHCP6_OPTION_IAADDR:
- if (!IN_SET(ia->type, SD_DHCP6_OPTION_IA_NA, SD_DHCP6_OPTION_IA_TA)) {
- log_dhcp6_client(client, "IA Address option not in IA NA or TA option");
- return -EINVAL;
- }
+ if (!IN_SET(ia->type, SD_DHCP6_OPTION_IA_NA, SD_DHCP6_OPTION_IA_TA))
+ return log_dhcp6_client_errno(client, SYNTHETIC_ERRNO(EINVAL),
+ "IA Address option not in IA NA or TA option");
- r = dhcp6_option_parse_address(option, ia, <_valid);
+ r = dhcp6_option_parse_address(client, option, ia, <_valid);
if (r < 0 && r != -EINVAL)
return r;
if (r >= 0 && lt_valid < lt_min)
case SD_DHCP6_OPTION_IA_PD_PREFIX:
- if (!IN_SET(ia->type, SD_DHCP6_OPTION_IA_PD)) {
- log_dhcp6_client(client, "IA PD Prefix option not in IA PD option");
- return -EINVAL;
- }
+ if (!IN_SET(ia->type, SD_DHCP6_OPTION_IA_PD))
+ return log_dhcp6_client_errno(client, SYNTHETIC_ERRNO(EINVAL),
+ "IA PD Prefix option not in IA PD option");
- r = dhcp6_option_parse_pdprefix(option, ia, <_valid);
+ r = dhcp6_option_parse_pdprefix(client, option, ia, <_valid);
if (r < 0 && r != -EINVAL)
return r;
if (r >= 0 && lt_valid < lt_min)
switch(iatype) {
case SD_DHCP6_OPTION_IA_NA:
- if (!ia->ia_na.lifetime_t1 && !ia->ia_na.lifetime_t2 && lt_min != UINT32_MAX) {
+ if (ia->ia_na.lifetime_t1 == 0 && ia->ia_na.lifetime_t2 == 0 && lt_min != UINT32_MAX) {
lt_t1 = lt_min / 2;
lt_t2 = lt_min / 10 * 8;
ia->ia_na.lifetime_t1 = htobe32(lt_t1);
break;
case SD_DHCP6_OPTION_IA_PD:
- if (!ia->ia_pd.lifetime_t1 && !ia->ia_pd.lifetime_t2 && lt_min != UINT32_MAX) {
+ if (ia->ia_pd.lifetime_t1 == 0 && ia->ia_pd.lifetime_t2 == 0 && lt_min != UINT32_MAX) {
lt_t1 = lt_min / 2;
lt_t2 = lt_min / 10 * 8;
ia->ia_pd.lifetime_t1 = htobe32(lt_t1);
assert_se(write(test_dhcp_fd[1], data, size) == (ssize_t) size);
- sd_event_run(e, (uint64_t) -1);
+ sd_event_run(e, UINT64_MAX);
assert_se(sd_dhcp6_client_stop(client) >= 0);
assert_se(sd_ndisc_set_mac(nd, &mac_addr) >= 0);
assert_se(sd_ndisc_start(nd) >= 0);
assert_se(write(test_fd[1], data, size) == (ssize_t) size);
- (void) sd_event_run(e, (uint64_t) -1);
+ (void) sd_event_run(e, UINT64_MAX);
assert_se(sd_ndisc_stop(nd) >= 0);
close(test_fd[1]);
#include "sd-lldp.h"
#include "hashmap.h"
-#include "log.h"
+#include "log-link.h"
#include "prioq.h"
struct sd_lldp {
unsigned n_ref;
int ifindex;
+ char *ifname;
int fd;
sd_event *event;
struct ether_addr filter_address;
};
-#define log_lldp_errno(error, fmt, ...) log_internal(LOG_DEBUG, error, PROJECT_FILE, __LINE__, __func__, "LLDP: " fmt, ##__VA_ARGS__)
-#define log_lldp(fmt, ...) log_lldp_errno(0, fmt, ##__VA_ARGS__)
-
const char* lldp_event_to_string(sd_lldp_event_t e) _const_;
sd_lldp_event_t lldp_event_from_string(const char *s) _pure_;
+
+#define log_lldp_errno(lldp, error, fmt, ...) \
+ ({ \
+ int _e = (error); \
+ if (DEBUG_LOGGING) \
+ log_interface_full_errno( \
+ sd_lldp_get_ifname(lldp), \
+ LOG_DEBUG, _e, "LLDP: " fmt, \
+ ##__VA_ARGS__); \
+ -ERRNO_VALUE(_e); \
+ })
+#define log_lldp(lldp, fmt, ...) \
+ log_lldp_errno(lldp, 0, fmt, ##__VA_ARGS__)
return n;
}
-static int parse_string(char **s, const void *q, size_t n) {
+static int parse_string(sd_lldp *lldp, char **s, const void *q, size_t n) {
const char *p = q;
char *k;
assert(p || n == 0);
if (*s) {
- log_lldp("Found duplicate string, ignoring field.");
+ log_lldp(lldp, "Found duplicate string, ignoring field.");
return 0;
}
/* Look for inner NULs */
if (memchr(p, 0, n)) {
- log_lldp("Found inner NUL in string, ignoring field.");
+ log_lldp(lldp, "Found inner NUL in string, ignoring field.");
return 0;
}
/* Let's escape weird chars, for security reasons */
k = cescape_length(p, n);
if (!k)
- return -ENOMEM;
+ return log_oom_debug();
free(*s);
*s = k;
assert(n);
- if (n->raw_size < sizeof(struct ether_header)) {
- log_lldp("Received truncated packet, ignoring.");
- return -EBADMSG;
- }
+ if (n->raw_size < sizeof(struct ether_header))
+ return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+ "Received truncated packet, ignoring.");
memcpy(&h, LLDP_NEIGHBOR_RAW(n), sizeof(h));
- if (h.ether_type != htobe16(ETHERTYPE_LLDP)) {
- log_lldp("Received packet with wrong type, ignoring.");
- return -EBADMSG;
- }
+ if (h.ether_type != htobe16(ETHERTYPE_LLDP))
+ return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+ "Received packet with wrong type, ignoring.");
if (h.ether_dhost[0] != 0x01 ||
h.ether_dhost[1] != 0x80 ||
h.ether_dhost[2] != 0xc2 ||
h.ether_dhost[3] != 0x00 ||
h.ether_dhost[4] != 0x00 ||
- !IN_SET(h.ether_dhost[5], 0x00, 0x03, 0x0e)) {
- log_lldp("Received packet with wrong destination address, ignoring.");
- return -EBADMSG;
- }
+ !IN_SET(h.ether_dhost[5], 0x00, 0x03, 0x0e))
+ return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+ "Received packet with wrong destination address, ignoring.");
memcpy(&n->source_address, h.ether_shost, sizeof(struct ether_addr));
memcpy(&n->destination_address, h.ether_dhost, sizeof(struct ether_addr));
uint8_t type;
uint16_t length;
- if (left < 2) {
- log_lldp("TLV lacks header, ignoring.");
- return -EBADMSG;
- }
+ if (left < 2)
+ return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+ "TLV lacks header, ignoring.");
type = p[0] >> 1;
length = p[1] + (((uint16_t) (p[0] & 1)) << 8);
p += 2, left -= 2;
- if (left < length) {
- log_lldp("TLV truncated, ignoring datagram.");
- return -EBADMSG;
- }
+ if (left < length)
+ return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+ "TLV truncated, ignoring datagram.");
switch (type) {
case SD_LLDP_TYPE_END:
- if (length != 0) {
- log_lldp("End marker TLV not zero-sized, ignoring datagram.");
- return -EBADMSG;
- }
+ if (length != 0)
+ return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+ "End marker TLV not zero-sized, ignoring datagram.");
/* Note that after processing the SD_LLDP_TYPE_END left could still be > 0
* as the message may contain padding (see IEEE 802.1AB-2016, sec. 8.5.12) */
goto end_marker;
case SD_LLDP_TYPE_CHASSIS_ID:
- if (length < 2 || length > 256) { /* includes the chassis subtype, hence one extra byte */
- log_lldp("Chassis ID field size out of range, ignoring datagram.");
- return -EBADMSG;
- }
- if (n->id.chassis_id) {
- log_lldp("Duplicate chassis ID field, ignoring datagram.");
- return -EBADMSG;
- }
+ if (length < 2 || length > 256)
+ /* includes the chassis subtype, hence one extra byte */
+ return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+ "Chassis ID field size out of range, ignoring datagram.");
+
+ if (n->id.chassis_id)
+ return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+ "Duplicate chassis ID field, ignoring datagram.");
n->id.chassis_id = memdup(p, length);
if (!n->id.chassis_id)
- return -ENOMEM;
+ return log_oom_debug();
n->id.chassis_id_size = length;
break;
case SD_LLDP_TYPE_PORT_ID:
- if (length < 2 || length > 256) { /* includes the port subtype, hence one extra byte */
- log_lldp("Port ID field size out of range, ignoring datagram.");
- return -EBADMSG;
- }
- if (n->id.port_id) {
- log_lldp("Duplicate port ID field, ignoring datagram.");
- return -EBADMSG;
- }
+ if (length < 2 || length > 256)
+ /* includes the port subtype, hence one extra byte */
+ return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+ "Port ID field size out of range, ignoring datagram.");
+
+ if (n->id.port_id)
+ return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+ "Duplicate port ID field, ignoring datagram.");
n->id.port_id = memdup(p, length);
if (!n->id.port_id)
- return -ENOMEM;
+ return log_oom_debug();
n->id.port_id_size = length;
break;
case SD_LLDP_TYPE_TTL:
- if (length != 2) {
- log_lldp("TTL field has wrong size, ignoring datagram.");
- return -EBADMSG;
- }
+ if (length != 2)
+ return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+ "TTL field has wrong size, ignoring datagram.");
- if (n->has_ttl) {
- log_lldp("Duplicate TTL field, ignoring datagram.");
- return -EBADMSG;
- }
+ if (n->has_ttl)
+ return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+ "Duplicate TTL field, ignoring datagram.");
n->ttl = unaligned_read_be16(p);
n->has_ttl = true;
break;
case SD_LLDP_TYPE_PORT_DESCRIPTION:
- r = parse_string(&n->port_description, p, length);
+ r = parse_string(n->lldp, &n->port_description, p, length);
if (r < 0)
return r;
break;
case SD_LLDP_TYPE_SYSTEM_NAME:
- r = parse_string(&n->system_name, p, length);
+ r = parse_string(n->lldp, &n->system_name, p, length);
if (r < 0)
return r;
break;
case SD_LLDP_TYPE_SYSTEM_DESCRIPTION:
- r = parse_string(&n->system_description, p, length);
+ r = parse_string(n->lldp, &n->system_description, p, length);
if (r < 0)
return r;
break;
case SD_LLDP_TYPE_SYSTEM_CAPABILITIES:
if (length != 4)
- log_lldp("System capabilities field has wrong size, ignoring.");
- else {
- n->system_capabilities = unaligned_read_be16(p);
- n->enabled_capabilities = unaligned_read_be16(p + 2);
- n->has_capabilities = true;
- }
+ return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+ "System capabilities field has wrong size.");
+ n->system_capabilities = unaligned_read_be16(p);
+ n->enabled_capabilities = unaligned_read_be16(p + 2);
+ n->has_capabilities = true;
break;
- case SD_LLDP_TYPE_PRIVATE: {
+ case SD_LLDP_TYPE_PRIVATE:
if (length < 4)
- log_lldp("Found private TLV that is too short, ignoring.");
- else {
- /* RFC 8520: MUD URL */
- if (memcmp(p, SD_LLDP_OUI_MUD, sizeof(SD_LLDP_OUI_MUD)) == 0 &&
- p[sizeof(SD_LLDP_OUI_MUD)] == SD_LLDP_OUI_SUBTYPE_MUD_USAGE_DESCRIPTION) {
- r = parse_string(&n->mud_url, p + sizeof(SD_LLDP_OUI_MUD) + 1,
- length - 1 - sizeof(SD_LLDP_OUI_MUD));
- if (r < 0)
- return r;
- }
+ return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+ "Found private TLV that is too short, ignoring.");
+
+ /* RFC 8520: MUD URL */
+ if (memcmp(p, SD_LLDP_OUI_MUD, sizeof(SD_LLDP_OUI_MUD)) == 0 &&
+ p[sizeof(SD_LLDP_OUI_MUD)] == SD_LLDP_OUI_SUBTYPE_MUD_USAGE_DESCRIPTION) {
+ r = parse_string(n->lldp, &n->mud_url, p + sizeof(SD_LLDP_OUI_MUD) + 1,
+ length - 1 - sizeof(SD_LLDP_OUI_MUD));
+ if (r < 0)
+ return r;
}
- }
-
break;
}
}
end_marker:
- if (!n->id.chassis_id || !n->id.port_id || !n->has_ttl) {
- log_lldp("One or more mandatory TLV missing in datagram. Ignoring.");
- return -EBADMSG;
-
- }
+ if (!n->id.chassis_id || !n->id.port_id || !n->has_ttl)
+ return log_lldp_errno(n->lldp, SYNTHETIC_ERRNO(EBADMSG),
+ "One or more mandatory TLV missing in datagram. Ignoring.");
n->rindex = sizeof(struct ether_header);
BPF_STMT(BPF_LD + BPF_H + BPF_ABS, offsetof(struct ethhdr, h_proto)), /* A <- protocol */
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ETHERTYPE_LLDP, 1, 0), /* A != ETHERTYPE_LLDP */
BPF_STMT(BPF_RET + BPF_K, 0), /* drop packet */
- BPF_STMT(BPF_RET + BPF_K, (uint32_t) -1), /* accept packet */
+ BPF_STMT(BPF_RET + BPF_K, UINT32_MAX), /* accept packet */
};
static const struct sock_fprog fprog = {
sd-ipv4acd.c
arp-util.h
arp-util.c
+ network-common.c
+ network-common.h
network-internal.c
network-internal.h
sd-ndisc.c
Copyright © 2014 Intel Corporation. All rights reserved.
***/
-#include "log.h"
-#include "time-util.h"
-
#include "sd-ndisc.h"
+#include "log-link.h"
+#include "time-util.h"
+
#define NDISC_ROUTER_SOLICITATION_INTERVAL (4U * USEC_PER_SEC)
#define NDISC_MAX_ROUTER_SOLICITATION_INTERVAL (3600U * USEC_PER_SEC)
#define NDISC_MAX_ROUTER_SOLICITATIONS 3U
unsigned n_ref;
int ifindex;
+ char *ifname;
int fd;
sd_event *event;
void *userdata;
};
-#define log_ndisc_errno(error, fmt, ...) log_internal(LOG_DEBUG, error, PROJECT_FILE, __LINE__, __func__, "NDISC: " fmt, ##__VA_ARGS__)
-#define log_ndisc(fmt, ...) log_ndisc_errno(0, fmt, ##__VA_ARGS__)
-
const char* ndisc_event_to_string(sd_ndisc_event_t e) _const_;
sd_ndisc_event_t ndisc_event_from_string(const char *s) _pure_;
+
+#define log_ndisc_errno(ndisc, error, fmt, ...) \
+ ({ \
+ int _e = (error); \
+ if (DEBUG_LOGGING) \
+ log_interface_full_errno( \
+ sd_ndisc_get_ifname(ndisc), \
+ LOG_DEBUG, _e, "NDISC: " fmt, \
+ ##__VA_ARGS__); \
+ -ERRNO_VALUE(_e); \
+ })
+#define log_ndisc(ndisc, fmt, ...) \
+ log_ndisc_errno(ndisc, 0, fmt, ##__VA_ARGS__)
return -ENOMEM;
memcpy(NDISC_ROUTER_RAW(rt), raw, raw_size);
- r = ndisc_router_parse(rt);
+ r = ndisc_router_parse(NULL, rt);
if (r < 0)
return r;
return 0;
}
-int ndisc_router_parse(sd_ndisc_router *rt) {
+int ndisc_router_parse(sd_ndisc *nd, sd_ndisc_router *rt) {
struct nd_router_advert *a;
const uint8_t *p;
bool has_mtu = false, has_flag_extension = false;
assert(rt);
- if (rt->raw_size < sizeof(struct nd_router_advert)) {
- log_ndisc("Too small to be a router advertisement, ignoring.");
- return -EBADMSG;
- }
+ if (rt->raw_size < sizeof(struct nd_router_advert))
+ return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
+ "Too small to be a router advertisement, ignoring.");
/* Router advertisement packets are neatly aligned to 64bit boundaries, hence we can access them directly */
a = NDISC_ROUTER_RAW(rt);
- if (a->nd_ra_type != ND_ROUTER_ADVERT) {
- log_ndisc("Received ND packet that is not a router advertisement, ignoring.");
- return -EBADMSG;
- }
+ if (a->nd_ra_type != ND_ROUTER_ADVERT)
+ return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
+ "Received ND packet that is not a router advertisement, ignoring.");
- if (a->nd_ra_code != 0) {
- log_ndisc("Received ND packet with wrong RA code, ignoring.");
- return -EBADMSG;
- }
+ if (a->nd_ra_code != 0)
+ return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
+ "Received ND packet with wrong RA code, ignoring.");
rt->hop_limit = a->nd_ra_curhoplimit;
rt->flags = a->nd_ra_flags_reserved; /* the first 8bit */
if (left == 0)
break;
- if (left < 2) {
- log_ndisc("Option lacks header, ignoring datagram.");
- return -EBADMSG;
- }
+ if (left < 2)
+ return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
+ "Option lacks header, ignoring datagram.");
type = p[0];
length = p[1] * 8;
- if (length == 0) {
- log_ndisc("Zero-length option, ignoring datagram.");
- return -EBADMSG;
- }
- if (left < length) {
- log_ndisc("Option truncated, ignoring datagram.");
- return -EBADMSG;
- }
+ if (length == 0)
+ return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
+ "Zero-length option, ignoring datagram.");
+ if (left < length)
+ return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
+ "Option truncated, ignoring datagram.");
switch (type) {
case SD_NDISC_OPTION_PREFIX_INFORMATION:
- if (length != 4*8) {
- log_ndisc("Prefix option of invalid size, ignoring datagram.");
- return -EBADMSG;
- }
+ if (length != 4*8)
+ return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
+ "Prefix option of invalid size, ignoring datagram.");
- if (p[2] > 128) {
- log_ndisc("Bad prefix length, ignoring datagram.");
- return -EBADMSG;
- }
+ if (p[2] > 128)
+ return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
+ "Bad prefix length, ignoring datagram.");
break;
uint32_t m;
if (has_mtu) {
- log_ndisc("MTU option specified twice, ignoring.");
+ log_ndisc(nd, "MTU option specified twice, ignoring.");
break;
}
- if (length != 8) {
- log_ndisc("MTU option of invalid size, ignoring datagram.");
- return -EBADMSG;
- }
+ if (length != 8)
+ return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
+ "MTU option of invalid size, ignoring datagram.");
m = be32toh(*(uint32_t*) (p + 4));
if (m >= IPV6_MIN_MTU) /* ignore invalidly small MTUs */
}
case SD_NDISC_OPTION_ROUTE_INFORMATION:
- if (length < 1*8 || length > 3*8) {
- log_ndisc("Route information option of invalid size, ignoring datagram.");
- return -EBADMSG;
- }
+ if (length < 1*8 || length > 3*8)
+ return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
+ "Route information option of invalid size, ignoring datagram.");
- if (p[2] > 128) {
- log_ndisc("Bad route prefix length, ignoring datagram.");
- return -EBADMSG;
- }
+ if (p[2] > 128)
+ return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
+ "Bad route prefix length, ignoring datagram.");
break;
case SD_NDISC_OPTION_RDNSS:
- if (length < 3*8 || (length % (2*8)) != 1*8) {
- log_ndisc("RDNSS option has invalid size.");
- return -EBADMSG;
- }
+ if (length < 3*8 || (length % (2*8)) != 1*8)
+ return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG), "RDNSS option has invalid size.");
break;
case SD_NDISC_OPTION_FLAGS_EXTENSION:
if (has_flag_extension) {
- log_ndisc("Flags extension option specified twice, ignoring.");
+ log_ndisc(nd, "Flags extension option specified twice, ignoring.");
break;
}
- if (length < 1*8) {
- log_ndisc("Flags extension option has invalid size.");
- return -EBADMSG;
- }
+ if (length < 1*8)
+ return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
+ "Flags extension option has invalid size.");
/* Add in the additional flags bits */
rt->flags |=
break;
case SD_NDISC_OPTION_DNSSL:
- if (length < 2*8) {
- log_ndisc("DNSSL option has invalid size.");
- return -EBADMSG;
- }
+ if (length < 2*8)
+ return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG),
+ "DNSSL option has invalid size.");
break;
}
flags = pi->nd_opt_pi_flags_reserved;
if ((flags & ND_OPT_PI_FLAG_AUTO) && (pi->nd_opt_pi_prefix_len != 64)) {
- log_ndisc("Invalid prefix length, ignoring prefix for stateless autoconfiguration.");
+ log_ndisc(NULL, "Invalid prefix length, ignoring prefix for stateless autoconfiguration.");
flags &= ~ND_OPT_PI_FLAG_AUTO;
}
}
sd_ndisc_router *ndisc_router_new(size_t raw_size);
-int ndisc_router_parse(sd_ndisc_router *rt);
+int ndisc_router_parse(sd_ndisc *nd, sd_ndisc_router *rt);
--- /dev/null
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include "format-util.h"
+#include "network-common.h"
+#include "string-util.h"
+
+const char *get_ifname(int ifindex, char **ifname) {
+ char buf[IF_NAMESIZE + 1];
+
+ assert(ifname);
+
+ /* This sets ifname only when it is not set yet. */
+
+ if (*ifname)
+ return *ifname;
+
+ if (ifindex <= 0)
+ return NULL;
+
+ if (!format_ifname(ifindex, buf))
+ return NULL;
+
+ return *ifname = strdup(buf);
+}
--- /dev/null
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#pragma once
+
+const char *get_ifname(int ifindex, char **ifname);
#include "sd-radv.h"
-#include "log.h"
+#include "log-link.h"
#include "list.h"
#include "sparse-endian.h"
RAdvState state;
int ifindex;
+ char *ifname;
sd_event *event;
int event_priority;
LIST_FIELDS(struct sd_radv_route_prefix, prefix);
};
-#define log_radv_full(level, error, fmt, ...) log_internal(level, error, PROJECT_FILE, __LINE__, __func__, "RADV: " fmt, ##__VA_ARGS__)
-#define log_radv_errno(error, fmt, ...) log_radv_full(LOG_DEBUG, error, fmt, ##__VA_ARGS__)
-#define log_radv(fmt, ...) log_radv_errno(0, fmt, ##__VA_ARGS__)
+#define log_radv_errno(radv, error, fmt, ...) \
+ ({ \
+ int _e = (error); \
+ if (DEBUG_LOGGING) \
+ log_interface_full_errno( \
+ sd_radv_get_ifname(radv), \
+ LOG_DEBUG, _e, "RADV: " fmt, \
+ ##__VA_ARGS__); \
+ -ERRNO_VALUE(_e); \
+ })
+#define log_radv(radv, fmt, ...) \
+ log_radv_errno(radv, 0, fmt, ##__VA_ARGS__)
#include "hostname-util.h"
#include "io-util.h"
#include "memory-util.h"
+#include "network-common.h"
#include "random-util.h"
#include "set.h"
#include "sort-util.h"
int event_priority;
sd_event_source *timeout_resend;
int ifindex;
+ char *ifname;
int fd;
uint16_t port;
union sockaddr_union link;
return 0;
}
+int sd_dhcp_client_set_ifname(sd_dhcp_client *client, const char *ifname) {
+ assert_return(client, -EINVAL);
+ assert_return(ifname, -EINVAL);
+
+ if (!ifname_valid_full(ifname, IFNAME_VALID_ALTERNATIVE))
+ return -EINVAL;
+
+ return free_and_strdup(&client->ifname, ifname);
+}
+
+const char *sd_dhcp_client_get_ifname(sd_dhcp_client *client) {
+ if (!client)
+ return NULL;
+
+ return get_ifname(client->ifindex, &client->ifname);
+}
+
int sd_dhcp_client_set_mac(
sd_dhcp_client *client,
const uint8_t *addr,
client->user_class = strv_free(client->user_class);
ordered_hashmap_free(client->extra_options);
ordered_hashmap_free(client->vendor_options);
+ free(client->ifname);
return mfree(client);
}
.mtu = DHCP_DEFAULT_MIN_SIZE,
.port = DHCP_PORT_CLIENT,
.anonymize = !!anonymize,
- .max_attempts = (uint64_t) -1,
+ .max_attempts = UINT64_MAX,
.ip_service_type = -1,
};
/* NOTE: this could be moved to a function. */
}
int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
- _cleanup_free_ char *temp_path = NULL;
+ _cleanup_(unlink_and_freep) char *temp_path = NULL;
_cleanup_fclose_ FILE *f = NULL;
struct sd_dhcp_raw_option *option;
struct in_addr address;
r = fopen_temporary(lease_file, &f, &temp_path);
if (r < 0)
- goto fail;
+ return r;
(void) fchmod(fileno(f), 0644);
_cleanup_free_ char *client_id_hex = NULL;
client_id_hex = hexmem(client_id, client_id_len);
- if (!client_id_hex) {
- r = -ENOMEM;
- goto fail;
- }
+ if (!client_id_hex)
+ return -ENOMEM;
fprintf(f, "CLIENTID=%s\n", client_id_hex);
}
_cleanup_free_ char *option_hex = NULL;
option_hex = hexmem(data, data_len);
- if (!option_hex) {
- r = -ENOMEM;
- goto fail;
- }
+ if (!option_hex)
+ return -ENOMEM;
fprintf(f, "VENDOR_SPECIFIC=%s\n", option_hex);
}
xsprintf(key, "OPTION_%" PRIu8, option->tag);
r = serialize_dhcp_option(f, key, option->data, option->length);
if (r < 0)
- goto fail;
+ return r;
}
r = fflush_and_check(f);
if (r < 0)
- goto fail;
+ return r;
r = conservative_rename(temp_path, lease_file);
if (r < 0)
- goto fail;
-
- return 0;
+ return r;
-fail:
- if (temp_path)
- (void) unlink(temp_path);
+ temp_path = mfree(temp_path);
- return log_error_errno(r, "Failed to save lease data %s: %m", lease_file);
+ return 0;
}
int dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file) {
-
_cleanup_(sd_dhcp_lease_unrefp) sd_dhcp_lease *lease = NULL;
_cleanup_free_ char
*address = NULL,
}
if (client_id_hex) {
- r = unhexmem(client_id_hex, (size_t) -1, &lease->client_id, &lease->client_id_len);
+ r = unhexmem(client_id_hex, SIZE_MAX, &lease->client_id, &lease->client_id_len);
if (r < 0)
log_debug_errno(r, "Failed to parse client ID %s, ignoring: %m", client_id_hex);
}
if (vendor_specific_hex) {
- r = unhexmem(vendor_specific_hex, (size_t) -1, &lease->vendor_specific, &lease->vendor_specific_len);
+ r = unhexmem(vendor_specific_hex, SIZE_MAX, &lease->vendor_specific, &lease->vendor_specific_len);
if (r < 0)
log_debug_errno(r, "Failed to parse vendor specific data %s, ignoring: %m", vendor_specific_hex);
}
if (!options[i])
continue;
- r = unhexmem(options[i], (size_t) -1, &data, &len);
+ r = unhexmem(options[i], SIZE_MAX, &data, &len);
if (r < 0) {
log_debug_errno(r, "Failed to parse private DHCP option %s, ignoring: %m", options[i]);
continue;
#include "fd-util.h"
#include "in-addr-util.h"
#include "io-util.h"
+#include "network-common.h"
#include "ordered-set.h"
#include "siphash24.h"
#include "string-util.h"
ordered_set_free(server->vendor_options);
free(server->bound_leases);
+
+ free(server->ifname);
return mfree(server);
}
assert_return(ret, -EINVAL);
assert_return(ifindex > 0, -EINVAL);
- server = new0(sd_dhcp_server, 1);
+ server = new(sd_dhcp_server, 1);
if (!server)
return -ENOMEM;
- server->n_ref = 1;
- server->fd_raw = -1;
- server->fd = -1;
- server->address = htobe32(INADDR_ANY);
- server->netmask = htobe32(INADDR_ANY);
- server->ifindex = ifindex;
+ *server = (sd_dhcp_server) {
+ .n_ref = 1,
+ .fd_raw = -1,
+ .fd = -1,
+ .address = htobe32(INADDR_ANY),
+ .netmask = htobe32(INADDR_ANY),
+ .ifindex = ifindex,
+ .default_lease_time = DIV_ROUND_UP(DHCP_DEFAULT_LEASE_TIME_USEC, USEC_PER_SEC),
+ .max_lease_time = DIV_ROUND_UP(DHCP_MAX_LEASE_TIME_USEC, USEC_PER_SEC),
+ };
server->leases_by_client_id = hashmap_new(&dhcp_lease_hash_ops);
if (!server->leases_by_client_id)
return -ENOMEM;
- server->default_lease_time = DIV_ROUND_UP(DHCP_DEFAULT_LEASE_TIME_USEC, USEC_PER_SEC);
- server->max_lease_time = DIV_ROUND_UP(DHCP_MAX_LEASE_TIME_USEC, USEC_PER_SEC);
-
*ret = TAKE_PTR(server);
return 0;
}
+int sd_dhcp_server_set_ifname(sd_dhcp_server *server, const char *ifname) {
+ assert_return(server, -EINVAL);
+ assert_return(ifname, -EINVAL);
+
+ if (!ifname_valid_full(ifname, IFNAME_VALID_ALTERNATIVE))
+ return -EINVAL;
+
+ return free_and_strdup(&server->ifname, ifname);
+}
+
+const char *sd_dhcp_server_get_ifname(sd_dhcp_server *server) {
+ if (!server)
+ return NULL;
+
+ return get_ifname(server->ifindex, &server->ifname);
+}
+
int sd_dhcp_server_attach_event(sd_dhcp_server *server, sd_event *event, int64_t priority) {
int r;
return 0;
}
-static int server_send_offer(sd_dhcp_server *server, DHCPRequest *req,
- be32_t address) {
- _cleanup_free_ DHCPPacket *packet = NULL;
- size_t offset;
- be32_t lease_time;
- int r;
-
- r = server_message_init(server, &packet, DHCP_OFFER, &offset, req);
- if (r < 0)
- return r;
-
- packet->dhcp.yiaddr = address;
-
- lease_time = htobe32(req->lifetime);
- r = dhcp_option_append(&packet->dhcp, req->max_optlen, &offset, 0,
- SD_DHCP_OPTION_IP_ADDRESS_LEASE_TIME, 4,
- &lease_time);
- if (r < 0)
- return r;
-
- r = dhcp_option_append(&packet->dhcp, req->max_optlen, &offset, 0,
- SD_DHCP_OPTION_SUBNET_MASK, 4, &server->netmask);
- if (r < 0)
- return r;
-
- if (server->emit_router) {
- r = dhcp_option_append(&packet->dhcp, req->max_optlen, &offset, 0,
- SD_DHCP_OPTION_ROUTER, 4, &server->address);
- if (r < 0)
- return r;
- }
-
- r = dhcp_server_send_packet(server, req, packet, DHCP_OFFER, offset);
- if (r < 0)
- return r;
-
- return 0;
-}
-
-static int server_send_ack(
+static int server_send_offer_or_ack(
sd_dhcp_server *server,
DHCPRequest *req,
- be32_t address) {
-
- static const uint8_t option_map[_SD_DHCP_LEASE_SERVER_TYPE_MAX] = {
- [SD_DHCP_LEASE_DNS] = SD_DHCP_OPTION_DOMAIN_NAME_SERVER,
- [SD_DHCP_LEASE_NTP] = SD_DHCP_OPTION_NTP_SERVER,
- [SD_DHCP_LEASE_SIP] = SD_DHCP_OPTION_SIP_SERVER,
- [SD_DHCP_LEASE_POP3] = SD_DHCP_OPTION_POP3_SERVER,
- [SD_DHCP_LEASE_SMTP] = SD_DHCP_OPTION_SMTP_SERVER,
- [SD_DHCP_LEASE_LPR] = SD_DHCP_OPTION_LPR_SERVER,
- };
+ be32_t address,
+ uint8_t type) {
_cleanup_free_ DHCPPacket *packet = NULL;
- be32_t lease_time;
sd_dhcp_option *j;
+ be32_t lease_time;
size_t offset;
int r;
- r = server_message_init(server, &packet, DHCP_ACK, &offset, req);
+ assert(server);
+ assert(req);
+ assert(IN_SET(type, DHCP_OFFER, DHCP_ACK));
+
+ r = server_message_init(server, &packet, type, &offset, req);
if (r < 0)
return r;
return r;
}
- for (sd_dhcp_lease_server_type_t k = 0; k < _SD_DHCP_LEASE_SERVER_TYPE_MAX; k++) {
-
- if (server->servers[k].size <= 0)
- continue;
-
- r = dhcp_option_append(
- &packet->dhcp, req->max_optlen, &offset, 0,
- option_map[k],
- sizeof(struct in_addr) * server->servers[k].size, server->servers[k].addr);
- if (r < 0)
- return r;
- }
+ if (type == DHCP_ACK) {
+ static const uint8_t option_map[_SD_DHCP_LEASE_SERVER_TYPE_MAX] = {
+ [SD_DHCP_LEASE_DNS] = SD_DHCP_OPTION_DOMAIN_NAME_SERVER,
+ [SD_DHCP_LEASE_NTP] = SD_DHCP_OPTION_NTP_SERVER,
+ [SD_DHCP_LEASE_SIP] = SD_DHCP_OPTION_SIP_SERVER,
+ [SD_DHCP_LEASE_POP3] = SD_DHCP_OPTION_POP3_SERVER,
+ [SD_DHCP_LEASE_SMTP] = SD_DHCP_OPTION_SMTP_SERVER,
+ [SD_DHCP_LEASE_LPR] = SD_DHCP_OPTION_LPR_SERVER,
+ };
+
+ for (sd_dhcp_lease_server_type_t k = 0; k < _SD_DHCP_LEASE_SERVER_TYPE_MAX; k++) {
+ if (server->servers[k].size <= 0)
+ continue;
+
+ r = dhcp_option_append(
+ &packet->dhcp, req->max_optlen, &offset, 0,
+ option_map[k],
+ sizeof(struct in_addr) * server->servers[k].size,
+ server->servers[k].addr);
+ if (r < 0)
+ return r;
+ }
- if (server->timezone) {
- r = dhcp_option_append(
- &packet->dhcp, req->max_optlen, &offset, 0,
- SD_DHCP_OPTION_NEW_TZDB_TIMEZONE,
- strlen(server->timezone), server->timezone);
- if (r < 0)
- return r;
+ if (server->timezone) {
+ r = dhcp_option_append(
+ &packet->dhcp, req->max_optlen, &offset, 0,
+ SD_DHCP_OPTION_NEW_TZDB_TIMEZONE,
+ strlen(server->timezone), server->timezone);
+ if (r < 0)
+ return r;
+ }
}
ORDERED_SET_FOREACH(j, server->extra_options) {
return r;
}
- r = dhcp_server_send_packet(server, req, packet, DHCP_ACK, offset);
+ r = dhcp_server_send_packet(server, req, packet, type, offset);
if (r < 0)
return r;
/* no free addresses left */
return 0;
- r = server_send_offer(server, req, address);
+ r = server_send_offer_or_ack(server, req, address, DHCP_OFFER);
if (r < 0)
/* this only fails on critical errors */
return log_dhcp_server_errno(server, r, "Could not send offer: %m");
lease->expiration = req->lifetime * USEC_PER_SEC + time_now;
- r = server_send_ack(server, req, address);
+ r = server_send_offer_or_ack(server, req, address, DHCP_ACK);
if (r < 0) {
/* this only fails on critical errors */
log_dhcp_server_errno(server, r, "Could not send ack: %m");
#include "hexdecoct.h"
#include "hostname-util.h"
#include "in-addr-util.h"
+#include "network-common.h"
#include "random-util.h"
#include "socket-util.h"
#include "string-table.h"
sd_event *event;
int event_priority;
int ifindex;
+ char *ifname;
DHCP6Address hint_pd_prefix;
struct in6_addr local_address;
uint8_t mac_addr[MAX_MAC_ADDR_LEN];
return 0;
}
+int sd_dhcp6_client_set_ifname(sd_dhcp6_client *client, const char *ifname) {
+ assert_return(client, -EINVAL);
+ assert_return(ifname, -EINVAL);
+
+ if (!ifname_valid_full(ifname, IFNAME_VALID_ALTERNATIVE))
+ return -EINVAL;
+
+ return free_and_strdup(&client->ifname, ifname);
+}
+
+const char *sd_dhcp6_client_get_ifname(sd_dhcp6_client *client) {
+ if (!client)
+ return NULL;
+
+ return get_ifname(client->ifindex, &client->ifname);
+}
+
int sd_dhcp6_client_set_local_address(
sd_dhcp6_client *client,
const struct in6_addr *local_address) {
break;
}
- r = dhcp6_option_parse_ia(option, &lease->ia, &ia_na_status);
+ r = dhcp6_option_parse_ia(client, option, &lease->ia, &ia_na_status);
if (r < 0 && r != -ENOMSG)
return r;
break;
}
- r = dhcp6_option_parse_ia(option, &lease->pd, &ia_pd_status);
+ r = dhcp6_option_parse_ia(client, option, &lease->pd, &ia_pd_status);
if (r < 0 && r != -ENOMSG)
return r;
ordered_hashmap_free(client->extra_options);
strv_free(client->user_class);
strv_free(client->vendor_class);
+ free(client->ifname);
return mfree(client);
}
lease->dns_count,
&lease->dns_allocated);
if (r < 0)
- return log_dhcp6_client_errno(client, r, "Invalid DNS server option: %m");
+ return r;
lease->dns_count = r;
if (!optlen)
return 0;
- if (lease->ntp || lease->ntp_fqdn) {
- log_dhcp6_client(client, "NTP information already provided");
+ if (lease->ntp || lease->ntp_fqdn)
+ return -EEXIST;
- return 0;
- }
-
- log_dhcp6_client(client, "Using deprecated SNTP information");
+ /* Using deprecated SNTP information */
r = dhcp6_option_parse_ip6addrs(optval, optlen, &lease->ntp,
lease->ntp_count,
&lease->ntp_allocated);
if (r < 0)
- return log_dhcp6_client_errno(client, r, "Invalid SNTP server option: %m");
+ return r;
lease->ntp_count = r;
#include "ether-addr-util.h"
#include "event-util.h"
#include "fd-util.h"
-#include "format-util.h"
#include "in-addr-util.h"
#include "log-link.h"
+#include "network-common.h"
#include "random-util.h"
#include "siphash24.h"
#include "string-table.h"
int ifindex;
int fd;
- char ifname[IF_NAMESIZE + 1];
+ char *ifname;
unsigned n_iteration;
unsigned n_conflict;
};
#define log_ipv4acd_errno(acd, error, fmt, ...) \
- log_interface_full_errno(sd_ipv4acd_get_ifname(acd), LOG_DEBUG, error, "IPV4ACD: " fmt, ##__VA_ARGS__)
+ ({ \
+ int _e = (error); \
+ if (DEBUG_LOGGING) \
+ log_interface_full_errno( \
+ sd_ipv4acd_get_ifname(acd), \
+ LOG_DEBUG, _e, "IPv4ACD: " fmt, \
+ ##__VA_ARGS__); \
+ -ERRNO_VALUE(_e); \
+ })
#define log_ipv4acd(acd, fmt, ...) \
log_ipv4acd_errno(acd, 0, fmt, ##__VA_ARGS__)
ipv4acd_reset(acd);
sd_ipv4acd_detach_event(acd);
-
+ free(acd->ifname);
return mfree(acd);
}
}
int sd_ipv4acd_set_ifindex(sd_ipv4acd *acd, int ifindex) {
- char ifname[IF_NAMESIZE + 1];
-
assert_return(acd, -EINVAL);
assert_return(ifindex > 0, -EINVAL);
assert_return(acd->state == IPV4ACD_STATE_INIT, -EBUSY);
- if (!format_ifname(ifindex, ifname))
- return -ENODEV;
-
- strcpy(acd->ifname, ifname);
acd->ifindex = ifindex;
return 0;
return acd->ifindex;
}
+int sd_ipv4acd_set_ifname(sd_ipv4acd *acd, const char *ifname) {
+ assert_return(acd, -EINVAL);
+ assert_return(ifname, -EINVAL);
+
+ if (!ifname_valid_full(ifname, IFNAME_VALID_ALTERNATIVE))
+ return -EINVAL;
+
+ return free_and_strdup(&acd->ifname, ifname);
+}
+
const char *sd_ipv4acd_get_ifname(sd_ipv4acd *acd) {
if (!acd)
return NULL;
- return empty_to_null(acd->ifname);
+ return get_ifname(acd->ifindex, &acd->ifname);
}
int sd_ipv4acd_set_mac(sd_ipv4acd *acd, const struct ether_addr *addr) {
};
#define log_ipv4ll_errno(ll, error, fmt, ...) \
- log_interface_full_errno(sd_ipv4ll_get_ifname(ll), LOG_DEBUG, error, "IPV4LL: " fmt, ##__VA_ARGS__)
+ ({ \
+ int _e = (error); \
+ if (DEBUG_LOGGING) \
+ log_interface_full_errno( \
+ sd_ipv4ll_get_ifname(ll), \
+ LOG_DEBUG, _e, "IPv4LL: " fmt, \
+ ##__VA_ARGS__); \
+ -ERRNO_VALUE(_e); \
+ })
#define log_ipv4ll(ll, fmt, ...) \
log_ipv4ll_errno(ll, 0, fmt, ##__VA_ARGS__)
return sd_ipv4acd_get_ifindex(ll->acd);
}
+int sd_ipv4ll_set_ifname(sd_ipv4ll *ll, const char *ifname) {
+ assert_return(ll, -EINVAL);
+ assert_return(ifname, -EINVAL);
+
+ return sd_ipv4acd_set_ifname(ll->acd, ifname);
+}
+
const char *sd_ipv4ll_get_ifname(sd_ipv4ll *ll) {
if (!ll)
return NULL;
#include "lldp-neighbor.h"
#include "lldp-network.h"
#include "memory-util.h"
+#include "network-common.h"
#include "socket-util.h"
#include "sort-util.h"
#include "string-table.h"
assert(lldp);
assert(event >= 0 && event < _SD_LLDP_EVENT_MAX);
- if (!lldp->callback) {
- log_lldp("Received '%s' event.", lldp_event_to_string(event));
- return;
- }
+ if (!lldp->callback)
+ return (void) log_lldp(lldp, "Received '%s' event.", lldp_event_to_string(event));
- log_lldp("Invoking callback for '%s' event.", lldp_event_to_string(event));
+ log_lldp(lldp, "Invoking callback for '%s' event.", lldp_event_to_string(event));
lldp->callback(lldp, event, n, lldp->userdata);
}
r = lldp_add_neighbor(lldp, n);
if (r < 0) {
- log_lldp_errno(r, "Failed to add datagram. Ignoring.");
+ log_lldp_errno(lldp, r, "Failed to add datagram. Ignoring.");
return 0;
}
- log_lldp("Successfully processed LLDP datagram.");
+ log_lldp(lldp, "Successfully processed LLDP datagram.");
return 0;
}
assert(lldp);
space = next_datagram_size_fd(fd);
- if (space < 0)
- return log_lldp_errno(space, "Failed to determine datagram size to read: %m");
+ if (space < 0) {
+ log_lldp_errno(lldp, space, "Failed to determine datagram size to read, ignoring: %m");
+ return 0;
+ }
n = lldp_neighbor_new(space);
if (!n)
if (IN_SET(errno, EAGAIN, EINTR))
return 0;
- return log_lldp_errno(errno, "Failed to read LLDP datagram: %m");
+ log_lldp_errno(lldp, errno, "Failed to read LLDP datagram, ignoring: %m");
+ return 0;
}
if ((size_t) length != n->raw_size) {
- log_lldp("Packet size mismatch.");
- return -EINVAL;
+ log_lldp(lldp, "Packet size mismatch, ignoring");
+ return 0;
}
/* Try to get the timestamp of this packet if it is known */
(void) sd_event_source_set_description(lldp->io_event_source, "lldp-io");
- log_lldp("Started LLDP client");
+ log_lldp(lldp, "Started LLDP client");
return 1;
fail:
if (lldp->fd < 0)
return 0;
- log_lldp("Stopping LLDP client");
+ log_lldp(lldp, "Stopping LLDP client");
lldp_reset(lldp);
lldp_flush_neighbors(lldp);
return 0;
}
+int sd_lldp_set_ifname(sd_lldp *lldp, const char *ifname) {
+ assert_return(lldp, -EINVAL);
+ assert_return(ifname, -EINVAL);
+
+ if (!ifname_valid_full(ifname, IFNAME_VALID_ALTERNATIVE))
+ return -EINVAL;
+
+ return free_and_strdup(&lldp->ifname, ifname);
+}
+
+const char *sd_lldp_get_ifname(sd_lldp *lldp) {
+ if (!lldp)
+ return NULL;
+
+ return get_ifname(lldp->ifindex, &lldp->ifname);
+}
+
static sd_lldp* lldp_free(sd_lldp *lldp) {
assert(lldp);
hashmap_free(lldp->neighbor_by_id);
prioq_free(lldp->neighbor_by_expiry);
+ free(lldp->ifname);
return mfree(lldp);
}
.n_ref = 1,
.fd = -1,
.neighbors_max = LLDP_DEFAULT_NEIGHBORS_MAX,
- .capability_mask = (uint16_t) -1,
+ .capability_mask = UINT16_MAX,
};
lldp->neighbor_by_id = hashmap_new(&lldp_neighbor_hash_ops);
int r;
r = lldp_make_space(lldp, 0);
- if (r < 0)
- return log_lldp_errno(r, "Failed to make space: %m");
+ if (r < 0) {
+ log_lldp_errno(lldp, r, "Failed to make space, ignoring: %m");
+ return 0;
+ }
r = lldp_start_timer(lldp, NULL);
- if (r < 0)
- return log_lldp_errno(r, "Failed to restart timer: %m");
+ if (r < 0) {
+ log_lldp_errno(lldp, r, "Failed to restart timer, ignoring: %m");
+ return 0;
+ }
return 0;
}
#include "memory-util.h"
#include "ndisc-internal.h"
#include "ndisc-router.h"
+#include "network-common.h"
#include "random-util.h"
#include "socket-util.h"
#include "string-table.h"
assert(ndisc);
assert(event >= 0 && event < _SD_NDISC_EVENT_MAX);
- if (!ndisc->callback) {
- log_ndisc("Received '%s' event.", ndisc_event_to_string(event));
- return;
- }
+ if (!ndisc->callback)
+ return (void) log_ndisc(ndisc, "Received '%s' event.", ndisc_event_to_string(event));
- log_ndisc("Invoking callback for '%s' event.", ndisc_event_to_string(event));
+ log_ndisc(ndisc, "Invoking callback for '%s' event.", ndisc_event_to_string(event));
ndisc->callback(ndisc, event, rt, ndisc->userdata);
}
return 0;
}
+int sd_ndisc_set_ifname(sd_ndisc *nd, const char *ifname) {
+ assert_return(nd, -EINVAL);
+ assert_return(ifname, -EINVAL);
+
+ if (!ifname_valid_full(ifname, IFNAME_VALID_ALTERNATIVE))
+ return -EINVAL;
+
+ return free_and_strdup(&nd->ifname, ifname);
+}
+
+const char *sd_ndisc_get_ifname(sd_ndisc *nd) {
+ if (!nd)
+ return NULL;
+
+ return get_ifname(nd->ifindex, &nd->ifname);
+}
+
_public_ int sd_ndisc_set_mac(sd_ndisc *nd, const struct ether_addr *mac_addr) {
assert_return(nd, -EINVAL);
ndisc_reset(nd);
sd_ndisc_detach_event(nd);
+ free(nd->ifname);
return mfree(nd);
}
assert(nd);
assert(rt);
- r = ndisc_router_parse(rt);
+ r = ndisc_router_parse(nd, rt);
if (r == -EBADMSG) /* Bad packet */
return 0;
if (r < 0)
if (rt->hop_limit > 0)
nd->hop_limit = rt->hop_limit;
- log_ndisc("Received Router Advertisement: flags %s preference %s lifetime %" PRIu16 " sec",
+ log_ndisc(nd, "Received Router Advertisement: flags %s preference %s lifetime %" PRIu16 " sec",
rt->flags & ND_RA_FLAG_MANAGED ? "MANAGED" : rt->flags & ND_RA_FLAG_OTHER ? "OTHER" : "none",
rt->preference == SD_NDISC_PREFERENCE_HIGH ? "high" : rt->preference == SD_NDISC_PREFERENCE_LOW ? "low" : "medium",
rt->lifetime);
assert(nd->event);
buflen = next_datagram_size_fd(fd);
- if (buflen < 0)
- return log_ndisc_errno(buflen, "Failed to determine datagram size to read: %m");
+ if (buflen < 0) {
+ log_ndisc_errno(nd, buflen, "Failed to determine datagram size to read, ignoring: %m");
+ return 0;
+ }
rt = ndisc_router_new(buflen);
if (!rt)
switch (r) {
case -EADDRNOTAVAIL:
(void) in_addr_to_string(AF_INET6, (const union in_addr_union*) &rt->address, &addr);
- log_ndisc("Received RA from non-link-local address %s. Ignoring", addr);
+ log_ndisc(nd, "Received RA from non-link-local address %s. Ignoring", addr);
break;
case -EMULTIHOP:
- log_ndisc("Received RA with invalid hop limit. Ignoring.");
+ log_ndisc(nd, "Received RA with invalid hop limit. Ignoring.");
break;
case -EPFNOSUPPORT:
- log_ndisc("Received invalid source address from ICMPv6 socket. Ignoring.");
+ log_ndisc(nd, "Received invalid source address from ICMPv6 socket. Ignoring.");
break;
case -EAGAIN: /* ignore spurious wakeups */
break;
default:
- log_ndisc_errno(r, "Unexpected error while reading from ICMPv6, ignoring: %m");
+ log_ndisc_errno(nd, r, "Unexpected error while reading from ICMPv6, ignoring: %m");
break;
}
r = icmp6_send_router_solicitation(nd->fd, &nd->mac_addr);
if (r < 0) {
- log_ndisc_errno(r, "Error sending Router Solicitation: %m");
+ log_ndisc_errno(nd, r, "Error sending Router Solicitation: %m");
goto fail;
}
- log_ndisc("Sent Router Solicitation, next solicitation in %s",
+ log_ndisc(nd, "Sent Router Solicitation, next solicitation in %s",
format_timespan(time_string, FORMAT_TIMESPAN_MAX,
nd->retransmit_time, USEC_PER_SEC));
assert(s);
assert(nd);
- log_ndisc("No RA received before link confirmation timeout");
+ log_ndisc(nd, "No RA received before link confirmation timeout");
(void) event_source_disable(nd->timeout_no_ra);
ndisc_callback(nd, SD_NDISC_EVENT_TIMEOUT, NULL);
if (nd->fd < 0)
return 0;
- log_ndisc("Stopping IPv6 Router Solicitation client");
+ log_ndisc(nd, "Stopping IPv6 Router Solicitation client");
ndisc_reset(nd);
return 1;
if (r < 0)
goto fail;
- log_ndisc("Started IPv6 Router Solicitation client");
+ log_ndisc(nd, "Started IPv6 Router Solicitation client");
return 1;
fail:
#include "io-util.h"
#include "macro.h"
#include "memory-util.h"
+#include "network-common.h"
#include "radv-internal.h"
#include "random-util.h"
#include "socket-util.h"
sd_radv_detach_event(ra);
ra->fd = safe_close(ra->fd);
+ free(ra->ifname);
return mfree(ra);
}
switch (r) {
case -EADDRNOTAVAIL:
(void) in_addr_to_string(AF_INET6, (const union in_addr_union*) &src, &addr);
- log_radv("Received RS from non-link-local address %s. Ignoring", addr);
+ log_radv(ra, "Received RS from non-link-local address %s. Ignoring", addr);
break;
case -EMULTIHOP:
- log_radv("Received RS with invalid hop limit. Ignoring.");
+ log_radv(ra, "Received RS with invalid hop limit. Ignoring.");
break;
case -EPFNOSUPPORT:
- log_radv("Received invalid source address from ICMPv6 socket. Ignoring.");
+ log_radv(ra, "Received invalid source address from ICMPv6 socket. Ignoring.");
break;
case -EAGAIN: /* ignore spurious wakeups */
break;
default:
- log_radv_errno(r, "Unexpected error receiving from ICMPv6 socket: %m");
+ log_radv_errno(ra, r, "Unexpected error receiving from ICMPv6 socket, Ignoring: %m");
break;
}
}
if ((size_t) buflen < sizeof(struct nd_router_solicit)) {
- log_radv("Too short packet received");
+ log_radv(ra, "Too short packet received, ignoring");
return 0;
}
r = radv_send(ra, &src, ra->lifetime);
if (r < 0)
- log_radv_errno(r, "Unable to send solicited Router Advertisement to %s: %m", strnull(addr));
+ log_radv_errno(ra, r, "Unable to send solicited Router Advertisement to %s, ignoring: %m", strnull(addr));
else
- log_radv("Sent solicited Router Advertisement to %s", strnull(addr));
+ log_radv(ra, "Sent solicited Router Advertisement to %s", strnull(addr));
return 0;
}
r = radv_send(ra, NULL, ra->lifetime);
if (r < 0)
- log_radv_errno(r, "Unable to send Router Advertisement: %m");
+ log_radv_errno(ra, r, "Unable to send Router Advertisement: %m");
/* RFC 4861, Section 6.2.4, sending initial Router Advertisements */
if (ra->ra_sent < SD_RADV_MAX_INITIAL_RTR_ADVERTISEMENTS) {
timeout = radv_compute_timeout(min_timeout, max_timeout);
- log_radv("Next Router Advertisement in %s",
+ log_radv(ra, "Next Router Advertisement in %s",
format_timespan(time_string, FORMAT_TIMESPAN_MAX,
timeout, USEC_PER_SEC));
if (ra->state == SD_RADV_STATE_IDLE)
return 0;
- log_radv("Stopping IPv6 Router Advertisement daemon");
+ log_radv(ra, "Stopping IPv6 Router Advertisement daemon");
/* RFC 4861, Section 6.2.5, send at least one Router Advertisement
with zero lifetime */
r = radv_send(ra, NULL, 0);
if (r < 0)
- log_radv_errno(r, "Unable to send last Router Advertisement with router lifetime set to zero: %m");
+ log_radv_errno(ra, r, "Unable to send last Router Advertisement with router lifetime set to zero: %m");
radv_reset(ra);
ra->fd = safe_close(ra->fd);
ra->state = SD_RADV_STATE_ADVERTISING;
- log_radv("Started IPv6 Router Advertisement daemon");
+ log_radv(ra, "Started IPv6 Router Advertisement daemon");
return 0;
return 0;
}
+int sd_radv_set_ifname(sd_radv *ra, const char *ifname) {
+ assert_return(ra, -EINVAL);
+ assert_return(ifname, -EINVAL);
+
+ if (!ifname_valid_full(ifname, IFNAME_VALID_ALTERNATIVE))
+ return -EINVAL;
+
+ return free_and_strdup(&ra->ifname, ifname);
+}
+
+const char *sd_radv_get_ifname(sd_radv *ra) {
+ if (!ra)
+ return NULL;
+
+ return get_ifname(ra->ifindex, &ra->ifname);
+}
+
_public_ int sd_radv_set_mac(sd_radv *ra, const struct ether_addr *mac_addr) {
assert_return(ra, -EINVAL);
(void) in_addr_prefix_to_string(AF_INET6,
(const union in_addr_union*) &cur->opt.in6_addr,
cur->opt.prefixlen, &addr_cur);
- log_radv("IPv6 prefix %s already configured, ignoring %s",
- strna(addr_cur), strna(addr_p));
-
- return -EEXIST;
+ return log_radv_errno(ra, SYNTHETIC_ERRNO(EEXIST),
+ "IPv6 prefix %s already configured, ignoring %s",
+ strna(addr_cur), strna(addr_p));
}
p = sd_radv_prefix_ref(p);
ra->n_prefixes++;
if (!dynamic) {
- log_radv("Added prefix %s", strna(addr_p));
+ log_radv(ra, "Added prefix %s", strna(addr_p));
return 0;
}
if (ra->ra_sent > 0) {
r = radv_send(ra, NULL, ra->lifetime);
if (r < 0)
- log_radv_errno(r, "Unable to send Router Advertisement for added prefix: %m");
+ log_radv_errno(ra, r, "Unable to send Router Advertisement for added prefix: %m");
else
- log_radv("Sent Router Advertisement for added prefix");
+ log_radv(ra, "Sent Router Advertisement for added prefix");
}
update:
cur->valid_until = valid_until;
cur->preferred_until = preferred_until;
- log_radv("Updated prefix %s preferred %s valid %s",
+ log_radv(ra, "Updated prefix %s preferred %s valid %s",
strna(addr_p),
format_timespan(time_string_preferred, FORMAT_TIMESPAN_MAX,
preferred, USEC_PER_SEC),
(void) in_addr_prefix_to_string(AF_INET6,
(const union in_addr_union*) &cur->opt.in6_addr,
cur->opt.prefixlen, &addr);
- log_radv("IPv6 route prefix %s already configured, ignoring %s",
- strna(addr), strna(pretty));
-
- return -EEXIST;
+ return log_radv_errno(ra, SYNTHETIC_ERRNO(EEXIST),
+ "IPv6 route prefix %s already configured, ignoring %s",
+ strna(addr), strna(pretty));
}
p = sd_radv_route_prefix_ref(p);
ra->n_route_prefixes++;
if (!dynamic) {
- log_radv("Added prefix %s", strna(pretty));
+ log_radv(ra, "Added prefix %s", strna(pretty));
return 0;
}
if (ra->ra_sent > 0) {
r = radv_send(ra, NULL, ra->lifetime);
if (r < 0)
- log_radv_errno(r, "Unable to send Router Advertisement for added route prefix: %m");
+ log_radv_errno(ra, r, "Unable to send Router Advertisement for added route prefix: %m");
else
- log_radv("Sent Router Advertisement for added route prefix");
+ log_radv(ra, "Sent Router Advertisement for added route prefix");
}
update:
if (valid_until == USEC_INFINITY)
return -EOVERFLOW;
- log_radv("Updated route prefix %s valid %s",
+ log_radv(ra, "Updated route prefix %s valid %s",
strna(pretty),
format_timespan(time_string_valid, FORMAT_TIMESPAN_MAX, valid, USEC_PER_SEC));
if (prefixlen > 64)
/* unusual but allowed, log it */
- log_radv("Unusual prefix length %d greater than 64", prefixlen);
+ log_radv(NULL, "Unusual prefix length %d greater than 64", prefixlen);
p->opt.in6_addr = *in6_addr;
p->opt.prefixlen = prefixlen;
if (prefixlen > 64)
/* unusual but allowed, log it */
- log_radv("Unusual prefix length %u greater than 64", prefixlen);
+ log_radv(NULL, "Unusual prefix length %u greater than 64", prefixlen);
p->opt.in6_addr = *in6_addr;
p->opt.prefixlen = prefixlen;
assert_se(IN_SET(res, 0, -EINPROGRESS));
- sd_event_run(e, (uint64_t) -1);
+ sd_event_run(e, UINT64_MAX);
sd_dhcp_client_stop(client);
sd_dhcp_client_unref(client);
option = (DHCP6Option *)option1;
assert_se(sizeof(option1) == sizeof(DHCP6Option) + be16toh(option->len));
- r = dhcp6_option_parse_ia(option, &ia, NULL);
+ r = dhcp6_option_parse_ia(NULL, option, &ia, NULL);
assert_se(r == 0);
assert_se(ia.addresses == NULL);
option->len = htobe16(17);
- r = dhcp6_option_parse_ia(option, &ia, NULL);
+ r = dhcp6_option_parse_ia(NULL, option, &ia, NULL);
assert_se(r == -ENOBUFS);
assert_se(ia.addresses == NULL);
option->len = htobe16(sizeof(DHCP6Option));
- r = dhcp6_option_parse_ia(option, &ia, NULL);
+ r = dhcp6_option_parse_ia(NULL, option, &ia, NULL);
assert_se(r == -ENOBUFS);
assert_se(ia.addresses == NULL);
option = (DHCP6Option *)option2;
assert_se(sizeof(option2) == sizeof(DHCP6Option) + be16toh(option->len));
- r = dhcp6_option_parse_ia(option, &ia, NULL);
+ r = dhcp6_option_parse_ia(NULL, option, &ia, NULL);
assert_se(r >= 0);
assert_se(ia.addresses == NULL);
option = (DHCP6Option *)option3;
assert_se(sizeof(option3) == sizeof(DHCP6Option) + be16toh(option->len));
- r = dhcp6_option_parse_ia(option, &ia, NULL);
+ r = dhcp6_option_parse_ia(NULL, option, &ia, NULL);
assert_se(r >= 0);
assert_se(ia.addresses != NULL);
dhcp6_lease_free_ia(&ia);
option = (DHCP6Option *)option4;
assert_se(sizeof(option4) == sizeof(DHCP6Option) + be16toh(option->len));
- r = dhcp6_option_parse_ia(option, &pd, NULL);
+ r = dhcp6_option_parse_ia(NULL, option, &pd, NULL);
assert_se(r >= 0);
assert_se(pd.addresses != NULL);
assert_se(memcmp(&pd.ia_pd.id, &option4[4], 4) == 0);
option = (DHCP6Option *)option5;
assert_se(sizeof(option5) == sizeof(DHCP6Option) + be16toh(option->len));
- r = dhcp6_option_parse_ia(option, &pd, NULL);
+ r = dhcp6_option_parse_ia(NULL, option, &pd, NULL);
assert_se(r >= 0);
assert_se(pd.addresses != NULL);
dhcp6_lease_free_ia(&pd);
case SD_DHCP6_OPTION_IA_NA:
assert_se(optlen == 94);
+ assert_se(optval == &msg_advertise[26]);
assert_se(!memcmp(optval, &msg_advertise[26], optlen));
val = htobe32(0x0ecfa37d);
val = htobe32(120);
assert_se(!memcmp(optval + 8, &val, sizeof(val)));
- assert_se(dhcp6_option_parse_ia(option, &lease->ia, NULL) >= 0);
+ assert_se(dhcp6_option_parse_ia(NULL, option, &lease->ia, NULL) >= 0);
break;
case SD_DHCP6_OPTION_SERVERID:
assert_se(optlen == 14);
+ assert_se(optval == &msg_advertise[179]);
assert_se(!memcmp(optval, &msg_advertise[179], optlen));
assert_se(dhcp6_lease_set_serverid(lease, optval,
assert_se(!memcmp(optval + 8, &val, sizeof(val)));
/* Then, this should refuse all addresses. */
- assert_se(dhcp6_option_parse_ia(option, &lease->ia, NULL) >= 0);
+ assert_se(dhcp6_option_parse_ia(NULL, option, &lease->ia, NULL) >= 0);
break;
assert_se(sd_ipv4ll_set_ifindex(ll, 1) == 0);
assert_se(sd_ipv4ll_start(ll) == 1);
- sd_event_run(e, (uint64_t) -1);
+ sd_event_run(e, UINT64_MAX);
assert_se(sd_ipv4ll_start(ll) == 0);
assert_se(sd_ipv4ll_is_running(ll));
/* PROBE */
- sd_event_run(e, (uint64_t) -1);
+ sd_event_run(e, UINT64_MAX);
assert_se(recv(test_fd[1], &arp, sizeof(struct ether_arp), 0) == sizeof(struct ether_arp));
if (extended) {
/* PROBE */
- sd_event_run(e, (uint64_t) -1);
+ sd_event_run(e, UINT64_MAX);
assert_se(recv(test_fd[1], &arp, sizeof(struct ether_arp), 0) == sizeof(struct ether_arp));
/* PROBE */
- sd_event_run(e, (uint64_t) -1);
+ sd_event_run(e, UINT64_MAX);
assert_se(recv(test_fd[1], &arp, sizeof(struct ether_arp), 0) == sizeof(struct ether_arp));
- sd_event_run(e, (uint64_t) -1);
+ sd_event_run(e, UINT64_MAX);
assert_se(basic_request_handler_bind == 1);
}
[['src/libsystemd/sd-bus/test-bus-vtable-cc.cc']],
]
endif
+
+############################################################
+
+fuzzers += [
+ [['src/libsystemd/sd-bus/fuzz-bus-message.c']],
+
+ [['src/libsystemd/sd-bus/fuzz-bus-match.c']],
+]
mask &= ~SD_BUS_CREDS_AUGMENT;
do_label = bus->label && (mask & SD_BUS_CREDS_SELINUX_CONTEXT);
- do_groups = bus->n_groups != (size_t) -1 && (mask & SD_BUS_CREDS_SUPPLEMENTARY_GIDS);
+ do_groups = bus->n_groups != SIZE_MAX && (mask & SD_BUS_CREDS_SUPPLEMENTARY_GIDS);
/* Avoid allocating anything if we have no chance of returning useful data */
if (!bus->ucred_valid && !do_label && !do_groups)
const char *p;
p = procfs_file_alloca(pid, "cmdline");
- r = read_full_file(p, &c->cmdline, &c->cmdline_size);
+ r = read_full_virtual_file(p, &c->cmdline, &c->cmdline_size);
if (r == -ENOENT)
return -ESRCH;
if (r < 0) {
m->header->version);
/* Display synthetic message serial number in a more readable
- * format than (uint32_t) -1 */
+ * format than UINT32_MAX */
if (BUS_MESSAGE_COOKIE(m) == 0xFFFFFFFFULL)
fprintf(f, " Cookie=-1");
else
* the bus error table, and BUS_ERROR_MAP_ELF_USE has to be used at
* least once per compilation unit (i.e. per library), to ensure that
* the error map is really added to the final binary.
+ *
+ * In addition, set the retain attribute so that the section cannot be
+ * discarded by ld --gc-sections -z start-stop-gc. Older compilers would
+ * warn for the unknown attribute, so just disable -Wattributes.
*/
#define BUS_ERROR_MAP_ELF_REGISTER \
+ _Pragma("GCC diagnostic ignored \"-Wattributes\"") \
_section_("SYSTEMD_BUS_ERROR_MAP") \
_used_ \
+ __attribute__((retain)) \
_alignptr_ \
_variable_no_sanitize_address_
unsigned last_iteration;
/* Don't dispatch this slot with messages that arrived in any iteration before or at the this
- * one. We use this to ensure that matches don't apply "retroactively" and thus can confuse the
- * caller: matches will only match incoming messages from the moment on the match was installed. */
+ * one. We use this to ensure that matches don't apply "retroactively" and confuse the caller:
+ * only messages received after the match was installed will be considered. */
uint64_t after;
char *match_string;
if (r != 0)
return r;
}
- } else {
- struct bus_match_node *c;
-
+ } else
/* No hash table, so let's iterate manually... */
-
- for (c = node->child; c; c = c->next) {
+ for (struct bus_match_node *c = node->child; c; c = c->next) {
if (!value_node_test(c, node->type, test_u8, test_str, test_strv, m))
continue;
if (bus && bus->match_callbacks_modified)
return 0;
}
- }
if (bus && bus->match_callbacks_modified)
return 0;
const char *value_str,
struct bus_match_node **ret) {
- struct bus_match_node *c = NULL, *n = NULL;
+ struct bus_match_node *c, *n = NULL;
int r;
assert(where);
;
if (c) {
- /* Comparison node already exists? Then let's see if
- * the value node exists too. */
+ /* Comparison node already exists? Then let's see if the value node exists too. */
if (t == BUS_MATCH_MESSAGE_TYPE)
n = hashmap_get(c->compare.children, UINT_TO_PTR(value_u8));
else if (BUS_MATCH_CAN_HASH(t))
n = hashmap_get(c->compare.children, value_str);
- else {
+ else
for (n = c->child; n && !value_node_same(n, t, value_u8, value_str); n = n->next)
;
- }
if (n) {
*ret = n;
return 0;
}
} else {
- /* Comparison node, doesn't exist yet? Then let's
- * create it. */
+ /* Comparison node, doesn't exist yet? Then let's create it. */
c = new0(struct bus_match_node, 1);
if (!c) {
}
void bus_match_parse_free(struct bus_match_component *components, unsigned n_components) {
- unsigned i;
-
- for (i = 0; i < n_components; i++)
+ for (unsigned i = 0; i < n_components; i++)
free(components[i].value_str);
free(components);
int bus_match_parse(
const char *match,
- struct bus_match_component **_components,
- unsigned *_n_components) {
+ struct bus_match_component **ret_components,
+ unsigned *ret_n_components) {
- const char *p = match;
struct bus_match_component *components = NULL;
size_t components_allocated = 0;
- unsigned n_components = 0, i;
- _cleanup_free_ char *value = NULL;
+ unsigned n_components = 0;
int r;
assert(match);
- assert(_components);
- assert(_n_components);
+ assert(ret_components);
+ assert(ret_n_components);
- while (*p != 0) {
+ while (*match != '\0') {
const char *eq, *q;
enum bus_match_node_type t;
unsigned j = 0;
+ _cleanup_free_ char *value = NULL;
size_t value_allocated = 0;
bool escaped = false, quoted;
uint8_t u;
/* Avahi's match rules appear to include whitespace, skip over it */
- p += strspn(p, " ");
+ match += strspn(match, " ");
- eq = strchr(p, '=');
- if (!eq)
- return -EINVAL;
+ eq = strchr(match, '=');
+ if (!eq) {
+ r = -EINVAL;
+ goto fail;
+ }
- t = bus_match_node_type_from_string(p, eq - p);
- if (t < 0)
- return -EINVAL;
+ t = bus_match_node_type_from_string(match, eq - match);
+ if (t < 0) {
+ r = -EINVAL;
+ goto fail;
+ }
quoted = eq[1] == '\'';
for (q = eq + 1 + quoted;; q++) {
- if (*q == 0) {
+ if (*q == '\0') {
if (quoted) {
r = -EINVAL;
goto fail;
} else {
if (value)
- value[j] = 0;
+ value[j] = '\0';
break;
}
}
if (quoted) {
if (*q == '\'') {
if (value)
- value[j] = 0;
+ value[j] = '\0';
break;
}
} else {
if (*q == ',') {
if (value)
- value[j] = 0;
-
+ value[j] = '\0';
break;
}
}
goto fail;
}
- components[n_components].type = t;
- components[n_components].value_str = TAKE_PTR(value);
- components[n_components].value_u8 = u;
- n_components++;
+ components[n_components++] = (struct bus_match_component) {
+ .type = t,
+ .value_str = TAKE_PTR(value),
+ .value_u8 = u,
+ };
if (q[quoted] == 0)
break;
goto fail;
}
- p = q + 1 + quoted;
+ match = q + 1 + quoted;
}
/* Order the whole thing, so that we always generate the same tree */
typesafe_qsort(components, n_components, match_component_compare);
/* Check for duplicates */
- for (i = 0; i+1 < n_components; i++)
+ for (unsigned i = 0; i+1 < n_components; i++)
if (components[i].type == components[i+1].type) {
r = -EINVAL;
goto fail;
}
- *_components = components;
- *_n_components = n_components;
+ *ret_components = components;
+ *ret_n_components = n_components;
return 0;
}
char *bus_match_to_string(struct bus_match_component *components, unsigned n_components) {
- _cleanup_fclose_ FILE *f = NULL;
- char *buffer = NULL;
+ _cleanup_free_ char *buffer = NULL;
size_t size = 0;
- unsigned i;
int r;
if (n_components <= 0)
assert(components);
- f = open_memstream_unlocked(&buffer, &size);
+ FILE *f = open_memstream_unlocked(&buffer, &size);
if (!f)
return NULL;
- for (i = 0; i < n_components; i++) {
+ for (unsigned i = 0; i < n_components; i++) {
char buf[32];
if (i != 0)
}
r = fflush_and_check(f);
+ safe_fclose(f);
if (r < 0)
return NULL;
-
- return buffer;
+ return TAKE_PTR(buffer);
}
int bus_match_add(
unsigned n_components,
struct match_callback *callback) {
- unsigned i;
- struct bus_match_node *n;
int r;
assert(root);
assert(callback);
- n = root;
- for (i = 0; i < n_components; i++) {
- r = bus_match_add_compare_value(
- n, components[i].type,
- components[i].value_u8, components[i].value_str, &n);
+ for (unsigned i = 0; i < n_components; i++) {
+ r = bus_match_add_compare_value(root,
+ components[i].type,
+ components[i].value_u8,
+ components[i].value_str,
+ &root);
if (r < 0)
return r;
}
- return bus_match_add_leaf(n, callback);
+ return bus_match_add_leaf(root, callback);
}
int bus_match_remove(
}
}
-void bus_match_dump(struct bus_match_node *node, unsigned level) {
- struct bus_match_node *c;
- _cleanup_free_ char *pfx = NULL;
+void bus_match_dump(FILE *out, struct bus_match_node *node, unsigned level) {
char buf[32];
if (!node)
return;
- pfx = strrep(" ", level);
- printf("%s[%s]", strempty(pfx), bus_match_node_type_to_string(node->type, buf, sizeof(buf)));
+ fprintf(out, "%*s[%s]", 2 * level, "", bus_match_node_type_to_string(node->type, buf, sizeof(buf)));
if (node->type == BUS_MATCH_VALUE) {
if (node->parent->type == BUS_MATCH_MESSAGE_TYPE)
- printf(" <%u>\n", node->value.u8);
+ fprintf(out, " <%u>\n", node->value.u8);
else
- printf(" <%s>\n", node->value.str);
+ fprintf(out, " <%s>\n", node->value.str);
} else if (node->type == BUS_MATCH_ROOT)
- puts(" root");
+ fputs(" root\n", out);
else if (node->type == BUS_MATCH_LEAF)
- printf(" %p/%p\n", node->leaf.callback->callback, container_of(node->leaf.callback, sd_bus_slot, match_callback)->userdata);
+ fprintf(out, " %p/%p\n", node->leaf.callback->callback,
+ container_of(node->leaf.callback, sd_bus_slot, match_callback)->userdata);
else
- putchar('\n');
+ putc('\n', out);
if (BUS_MATCH_CAN_HASH(node->type)) {
-
+ struct bus_match_node *c;
HASHMAP_FOREACH(c, node->compare.children)
- bus_match_dump(c, level + 1);
+ bus_match_dump(out, c, level + 1);
}
- for (c = node->child; c; c = c->next)
- bus_match_dump(c, level + 1);
+ for (struct bus_match_node *c = node->child; c; c = c->next)
+ bus_match_dump(out, c, level + 1);
}
enum bus_match_scope bus_match_get_scope(const struct bus_match_component *components, unsigned n_components) {
bool found_driver = false;
- unsigned i;
if (n_components <= 0)
return BUS_MATCH_GENERIC;
* local messages, then we check if it only matches on the
* driver. */
- for (i = 0; i < n_components; i++) {
+ for (unsigned i = 0; i < n_components; i++) {
const struct bus_match_component *c = components + i;
if (c->type == BUS_MATCH_SENDER) {
}
return found_driver ? BUS_MATCH_DRIVER : BUS_MATCH_GENERIC;
-
}
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#pragma once
+#include <stdio.h>
+
#include "sd-bus.h"
#include "hashmap.h"
void bus_match_free(struct bus_match_node *node);
-void bus_match_dump(struct bus_match_node *node, unsigned level);
+void bus_match_dump(FILE *out, struct bus_match_node *node, unsigned level);
const char* bus_match_node_type_to_string(enum bus_match_node_type t, char buf[], size_t l);
enum bus_match_node_type bus_match_node_type_from_string(const char *k, size_t n);
-int bus_match_parse(const char *match, struct bus_match_component **_components, unsigned *_n_components);
+int bus_match_parse(const char *match, struct bus_match_component **ret_components, unsigned *ret_n_components);
void bus_match_parse_free(struct bus_match_component *components, unsigned n_components);
char *bus_match_to_string(struct bus_match_component *components, unsigned n_components);
start = ALIGN_TO(old_size, align);
new_size = start + sz;
- if (new_size < start ||
- new_size > (size_t) ((uint32_t) -1))
+ if (new_size < start || new_size > UINT32_MAX)
goto poison;
if (old_size == new_size)
added = padding + sz;
/* Check for 32bit overflows */
- if (end_body > (size_t) ((uint32_t) -1) ||
- end_body < start_body) {
+ if (end_body < start_body || end_body > UINT32_MAX) {
m->poisoned = true;
return NULL;
}
assert_return(!m->sealed, -EPERM);
assert_return(!m->poisoned, -ESTALE);
- n_array = (unsigned) -1;
+ n_array = UINT_MAX;
n_struct = strlen(types);
for (;;) {
const char *t;
- if (n_array == 0 || (n_array == (unsigned) -1 && n_struct == 0)) {
+ if (n_array == 0 || (n_array == UINT_MAX && n_struct == 0)) {
r = type_stack_pop(stack, ELEMENTSOF(stack), &stack_ptr, &types, &n_struct, &n_array);
if (r < 0)
return r;
}
t = types;
- if (n_array != (unsigned) -1)
+ if (n_array != UINT_MAX)
n_array--;
else {
types++;
return r;
}
- if (n_array == (unsigned) -1) {
+ if (n_array == UINT_MAX) {
types += k;
n_struct -= k;
}
types = s;
n_struct = strlen(s);
- n_array = (unsigned) -1;
+ n_array = UINT_MAX;
break;
}
return r;
}
- if (n_array == (unsigned) -1) {
+ if (n_array == UINT_MAX) {
types += k - 1;
n_struct -= k - 1;
}
types = t + 1;
n_struct = k - 2;
- n_array = (unsigned) -1;
+ n_array = UINT_MAX;
break;
}
if (r < 0)
return r;
- if (offset == 0 && size == (uint64_t) -1)
+ if (offset == 0 && size == UINT64_MAX)
size = real_size;
else if (offset + size > real_size)
return -EMSGSIZE;
if (size % sz != 0)
return -EINVAL;
- if (size > (uint64_t) (uint32_t) -1)
+ if (size > (uint64_t) UINT32_MAX)
return -EINVAL;
r = sd_bus_message_open_container(m, SD_BUS_TYPE_ARRAY, CHAR_TO_STR(type));
if (r < 0)
return r;
- if (offset == 0 && size == (uint64_t) -1)
+ if (offset == 0 && size == UINT64_MAX)
size = real_size;
else if (offset + size > real_size)
return -EMSGSIZE;
if (size == 0)
return -EINVAL;
- if (size > (uint64_t) (uint32_t) -1)
+ if (size > (uint64_t) UINT32_MAX)
return -EINVAL;
c = message_get_last_container(m);
* in a single stackframe. We hence implement our own
* home-grown stack in an array. */
- n_array = (unsigned) -1; /* length of current array entries */
+ n_array = UINT_MAX; /* length of current array entries */
n_struct = strlen(types); /* length of current struct contents signature */
for (;;) {
n_loop++;
- if (n_array == 0 || (n_array == (unsigned) -1 && n_struct == 0)) {
+ if (n_array == 0 || (n_array == UINT_MAX && n_struct == 0)) {
r = type_stack_pop(stack, ELEMENTSOF(stack), &stack_ptr, &types, &n_struct, &n_array);
if (r < 0)
return r;
}
t = types;
- if (n_array != (unsigned) -1)
+ if (n_array != UINT_MAX)
n_array--;
else {
types++;
}
}
- if (n_array == (unsigned) -1) {
+ if (n_array == UINT_MAX) {
types += k;
n_struct -= k;
}
types = s;
n_struct = strlen(s);
- n_array = (unsigned) -1;
+ n_array = UINT_MAX;
break;
}
}
}
- if (n_array == (unsigned) -1) {
+ if (n_array == UINT_MAX) {
types += k - 1;
n_struct -= k - 1;
}
types = t + 1;
n_struct = k - 2;
- n_array = (unsigned) -1;
+ n_array = UINT_MAX;
break;
}
char t;
size_t l;
- if (array_size != (uint32_t) -1 &&
+ if (array_size != UINT32_MAX &&
array_size <= *ri - original_index)
return 0;
if (r < 0)
return r;
- r = message_skip_fields(m, ri, (uint32_t) -1, (const char**) &s);
+ r = message_skip_fields(m, ri, UINT32_MAX, (const char**) &s);
if (r < 0)
return r;
strncpy(sig, *signature + 1, l);
sig[l] = '\0';
- r = message_skip_fields(m, ri, (uint32_t) -1, (const char**) &s);
+ r = message_skip_fields(m, ri, UINT32_MAX, (const char**) &s);
if (r < 0)
return r;
}
_cleanup_free_ char *sig = NULL;
const char *signature;
uint64_t field_type;
- size_t item_size = (size_t) -1;
+ size_t item_size = SIZE_MAX;
if (BUS_MESSAGE_IS_GVARIANT(m)) {
uint64_t *u64;
default:
if (!BUS_MESSAGE_IS_GVARIANT(m))
- r = message_skip_fields(m, &ri, (uint32_t) -1, (const char **) &signature);
+ r = message_skip_fields(m, &ri, UINT32_MAX, (const char **) &signature);
}
if (r < 0)
assert(b);
assert(!b->ucred_valid);
assert(!b->label);
- assert(b->n_groups == (size_t) -1);
+ assert(b->n_groups == SIZE_MAX);
/* Get the peer for socketpair() sockets */
b->ucred_valid = getpeercred(b->input_fd, &b->ucred) >= 0;
--- /dev/null
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include "alloc-util.h"
+#include "bus-internal.h"
+#include "bus-match.h"
+#include "env-util.h"
+#include "fd-util.h"
+#include "fileio.h"
+#include "fuzz.h"
+
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+ _cleanup_free_ char *out = NULL; /* out should be freed after g */
+ size_t out_size;
+ _cleanup_fclose_ FILE *g = NULL;
+ _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
+ int r;
+
+ /* We don't want to fill the logs with messages about parse errors.
+ * Disable most logging if not running standalone */
+ if (!getenv("SYSTEMD_LOG_LEVEL"))
+ log_set_max_level(LOG_CRIT);
+
+ r = sd_bus_new(&bus);
+ assert_se(r >= 0);
+
+ struct bus_match_node root = {
+ .type = BUS_MATCH_ROOT,
+ };
+
+ /* Note that we use the pointer to match_callback substructure, but the code
+ * uses container_of() to access outside of the passed-in type. */
+ sd_bus_slot slot = {
+ .type = BUS_MATCH_CALLBACK,
+ .match_callback = {},
+ };
+
+ if (getenv_bool("SYSTEMD_FUZZ_OUTPUT") <= 0)
+ assert_se(g = open_memstream_unlocked(&out, &out_size));
+
+ for (size_t offset = 0; offset < size; ) {
+ _cleanup_free_ char *line = NULL;
+ char *end;
+
+ end = memchr((char*) data + offset, '\n', size - offset);
+
+ line = memdup_suffix0((char*) data + offset,
+ end ? end - (char*) data - offset : size - offset);
+ if (!line)
+ return log_oom_debug();
+
+ offset = end ? (size_t) (end - (char*) data + 1) : size;
+
+ struct bus_match_component *components;
+ unsigned n_components;
+ r = bus_match_parse(line, &components, &n_components);
+ if (IN_SET(r, -EINVAL, -ENOMEM)) {
+ log_debug_errno(r, "Failed to parse line: %m");
+ continue;
+ }
+ assert_se(r >= 0); /* We only expect EINVAL and ENOMEM errors, or success. */
+
+ log_debug("Parsed %u components.", n_components);
+
+ _cleanup_free_ char *again = bus_match_to_string(components, n_components);
+ if (!again) {
+ bus_match_parse_free(components, n_components);
+ log_oom();
+ break;
+ }
+
+ if (g)
+ fprintf(g, "%s\n", again);
+
+ r = bus_match_add(&root, components, n_components, &slot.match_callback);
+ bus_match_parse_free(components, n_components);
+ if (r < 0) {
+ log_error_errno(r, "Failed to add match: %m");
+ break;
+ }
+ }
+
+ bus_match_dump(g ?: stdout, &root, 0); /* We do this even on failure, to check consistency after error. */
+ bus_match_free(&root);
+
+ return 0;
+}
#include <endian.h>
#include <netdb.h>
-#include <poll.h>
#include <pthread.h>
#include <signal.h>
#include <stdlib.h>
#include "fd-util.h"
#include "hexdecoct.h"
#include "hostname-util.h"
+#include "io-util.h"
#include "macro.h"
#include "memory-util.h"
#include "missing_syscall.h"
.creds_mask = SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME,
.accept_fd = true,
.original_pid = getpid_cached(),
- .n_groups = (size_t) -1,
+ .n_groups = SIZE_MAX,
.close_on_exit = true,
};
* hence let's fill something in for synthetic messages. Since
* synthetic messages might have a fake sender and we don't
* want to interfere with the real sender's serial numbers we
- * pick a fixed, artificial one. We use (uint32_t) -1 rather
- * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
+ * pick a fixed, artificial one. We use UINT32_MAX rather
+ * than UINT64_MAX since dbus1 only had 32bit identifiers,
* even though kdbus can do 64bit. */
return sd_bus_message_seal(m, 0xFFFFFFFFULL, 0);
}
static usec_t calc_elapse(sd_bus *bus, uint64_t usec) {
assert(bus);
- if (usec == (uint64_t) -1)
+ assert_cc(sizeof(usec_t) == sizeof(uint64_t));
+
+ if (usec == USEC_INFINITY)
return 0;
/* We start all timeouts the instant we enter BUS_HELLO/BUS_RUNNING state, so that the don't run in parallel
if (IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING))
return usec;
else
- return now(CLOCK_MONOTONIC) + usec;
+ return usec_add(now(CLOCK_MONOTONIC), usec);
}
static int timeout_compare(const void *a, const void *b) {
if (r > 0)
continue;
- r = sd_bus_wait(bus, (uint64_t) -1);
+ r = sd_bus_wait(bus, UINT64_MAX);
if (r < 0)
return r;
}
left = timeout - n;
} else
- left = (uint64_t) -1;
+ left = UINT64_MAX;
r = bus_poll(bus, true, left);
if (r < 0)
c = prioq_peek(bus->reply_callbacks_prioq);
if (!c) {
- *timeout_usec = (uint64_t) -1;
+ *timeout_usec = UINT64_MAX;
return 0;
}
if (c->timeout_usec == 0) {
- *timeout_usec = (uint64_t) -1;
+ *timeout_usec = UINT64_MAX;
return 0;
}
case BUS_WATCH_BIND:
case BUS_OPENING:
- *timeout_usec = (uint64_t) -1;
+ *timeout_usec = UINT64_MAX;
return 0;
default:
static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
struct pollfd p[2] = {};
- int r, n;
- struct timespec ts;
usec_t m = USEC_INFINITY;
+ int r, n;
assert(bus);
}
}
- if (timeout_usec != (uint64_t) -1 && (m == USEC_INFINITY || timeout_usec < m))
+ if (timeout_usec != UINT64_MAX && (m == USEC_INFINITY || timeout_usec < m))
m = timeout_usec;
- r = ppoll(p, n, m == USEC_INFINITY ? NULL : timespec_store(&ts, m), NULL);
- if (r < 0)
- return -errno;
- if (r == 0)
- return 0;
-
- if (p[0].revents & POLLNVAL)
- return -EBADF;
- if (n >= 2 && (p[1].revents & POLLNVAL))
- return -EBADF;
+ r = ppoll_usec(p, n, m);
+ if (r <= 0)
+ return r;
return 1;
}
if (bus->wqueue_size <= 0)
return 0;
- r = bus_poll(bus, false, (uint64_t) -1);
+ r = bus_poll(bus, false, UINT64_MAX);
if (r < 0)
return r;
}
goto fail;
}
- bus_match_dump(&bus->match_callbacks, 0);
+ bus_match_dump(stdout, &bus->match_callbacks, 0);
*_bus = bus;
return 0;
}
if (r == 0) {
- r = sd_bus_wait(bus, (uint64_t) -1);
+ r = sd_bus_wait(bus, UINT64_MAX);
if (r < 0) {
log_error_errno(r, "Failed to wait: %m");
goto fail;
goto finish;
}
if (r == 0) {
- r = sd_bus_wait(bus, (uint64_t) -1);
+ r = sd_bus_wait(bus, UINT64_MAX);
if (r < 0) {
log_error_errno(r, "Failed to wait: %m");
goto finish;
}
static int match_add(sd_bus_slot *slots, struct bus_match_node *root, const char *match, int value) {
- struct bus_match_component *components = NULL;
- unsigned n_components = 0;
+ struct bus_match_component *components;
+ unsigned n_components;
sd_bus_slot *s;
int r;
s = slots + value;
- zero(*s);
r = bus_match_parse(match, &components, &n_components);
if (r < 0)
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
_cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
- enum bus_match_node_type i;
- sd_bus_slot slots[19];
+ sd_bus_slot slots[19] = {};
int r;
test_setup_logging(LOG_INFO);
assert_se(match_add(slots, &root, "arg4has='po'", 17) >= 0);
assert_se(match_add(slots, &root, "arg4='pi'", 18) >= 0);
- bus_match_dump(&root, 0);
+ bus_match_dump(stdout, &root, 0);
assert_se(sd_bus_message_new_signal(bus, &m, "/foo/bar", "bar.x", "waldo") >= 0);
assert_se(sd_bus_message_append(m, "ssssas", "one", "two", "/prefix/three", "prefix.four", 3, "pi", "pa", "po") >= 0);
assert_se(bus_match_remove(&root, &slots[8].match_callback) >= 0);
assert_se(bus_match_remove(&root, &slots[13].match_callback) >= 0);
- bus_match_dump(&root, 0);
+ bus_match_dump(stdout, &root, 0);
zero(mask);
assert_se(bus_match_run(NULL, &root, m) == 0);
assert_se(mask_contains((unsigned[]) { 9, 5, 10, 12, 14, 7, 15, 16, 17 }, 9));
- for (i = 0; i < _BUS_MATCH_NODE_TYPE_MAX; i++) {
+ for (enum bus_match_node_type i = 0; i < _BUS_MATCH_NODE_TYPE_MAX; i++) {
char buf[32];
const char *x;
}
if (r == 0) {
- r = sd_bus_wait(bus, (uint64_t) -1);
+ r = sd_bus_wait(bus, UINT64_MAX);
if (r < 0) {
log_error_errno(r, "Failed to wait: %m");
goto fail;
}
if (r == 0) {
- r = sd_bus_wait(bus, (uint64_t) -1);
+ r = sd_bus_wait(bus, UINT64_MAX);
if (r < 0) {
log_error_errno(r, "Failed to wait: %m");
goto fail;
else
hashmap = &enumerator->nomatch_sysattr;
+ /* Do not use string_has_ops_free_free or hashmap_put_strdup() here, as this may be called
+ * multiple times with the same sysattr but different value. */
r = hashmap_put_strdup_full(hashmap, &trivial_hash_ops_free_free, sysattr, value);
if (r <= 0)
return r;
assert_return(enumerator, -EINVAL);
assert_return(property, -EINVAL);
+ /* Do not use string_has_ops_free_free or hashmap_put_strdup() here, as this may be called
+ * multiple times with the same property but different value. */
r = hashmap_put_strdup_full(&enumerator->match_property, &trivial_hash_ops_free_free, property, value);
if (r <= 0)
return r;
}
int device_monitor_allow_unicast_sender(sd_device_monitor *m, sd_device_monitor *sender) {
- assert_return(m, -EINVAL);
- assert_return(sender, -EINVAL);
+ assert(m);
+ assert(sender);
m->snl_trusted_sender.nl.nl_pid = sender->snl.nl.nl_pid;
return 0;
}
int device_monitor_get_fd(sd_device_monitor *m) {
- assert_return(m, -EINVAL);
+ assert(m);
return m->sock;
}
_cleanup_close_ int sock = -1;
int r;
+ assert(group >= 0 && group < _MONITOR_NETLINK_GROUP_MAX);
assert_return(ret, -EINVAL);
- assert_return(group >= 0 && group < _MONITOR_NETLINK_GROUP_MAX, -EINVAL);
if (group == MONITOR_GROUP_UDEV &&
access("/run/udev/control", F_OK) < 0 &&
int device_monitor_enable_receiving(sd_device_monitor *m) {
int r;
- assert_return(m, -EINVAL);
+ assert(m);
r = sd_device_monitor_filter_update(m);
if (r < 0)
(void) sd_device_monitor_detach_event(m);
- hashmap_free_free_free(m->subsystem_filter);
- set_free_free(m->tag_filter);
+ hashmap_free(m->subsystem_filter);
+ set_free(m->tag_filter);
return mfree(m);
}
const char *tag, *subsystem, *devtype, *s, *d = NULL;
int r;
- assert_return(m, -EINVAL);
- assert_return(device, -EINVAL);
+ assert(m);
+ assert(device);
if (hashmap_isempty(m->subsystem_filter))
goto tag;
bool is_initialized = false;
int r;
+ assert(m);
assert(ret);
buflen = recvmsg(m->sock, &smsg, 0);
uint64_t bits = 0;
uint32_t hash = string_hash32(str);
- bits |= 1LLU << (hash & 63);
- bits |= 1LLU << ((hash >> 6) & 63);
- bits |= 1LLU << ((hash >> 12) & 63);
- bits |= 1LLU << ((hash >> 18) & 63);
+ bits |= UINT64_C(1) << (hash & 63);
+ bits |= UINT64_C(1) << ((hash >> 6) & 63);
+ bits |= UINT64_C(1) << ((hash >> 12) & 63);
+ bits |= UINT64_C(1) << ((hash >> 18) & 63);
return bits;
}
}
_public_ int sd_device_monitor_filter_add_match_subsystem_devtype(sd_device_monitor *m, const char *subsystem, const char *devtype) {
- _cleanup_free_ char *s = NULL, *d = NULL;
int r;
assert_return(m, -EINVAL);
assert_return(subsystem, -EINVAL);
- s = strdup(subsystem);
- if (!s)
- return -ENOMEM;
-
- if (devtype) {
- d = strdup(devtype);
- if (!d)
- return -ENOMEM;
- }
-
- r = hashmap_ensure_put(&m->subsystem_filter, NULL, s, d);
- if (r < 0)
+ /* Do not use string_has_ops_free_free or hashmap_put_strdup() here, as this may be called
+ * multiple times with the same subsystem but different devtypes. */
+ r = hashmap_put_strdup_full(&m->subsystem_filter, &trivial_hash_ops_free_free, subsystem, devtype);
+ if (r <= 0)
return r;
- TAKE_PTR(s);
- TAKE_PTR(d);
-
m->filter_uptodate = false;
-
- return 0;
+ return r;
}
_public_ int sd_device_monitor_filter_add_match_tag(sd_device_monitor *m, const char *tag) {
+ int r;
+
assert_return(m, -EINVAL);
assert_return(tag, -EINVAL);
- int r = set_put_strdup(&m->tag_filter, tag);
- if (r > 0)
- m->filter_uptodate = false;
+ r = set_put_strdup(&m->tag_filter, tag);
+ if (r <= 0)
+ return r;
+
+ m->filter_uptodate = false;
return r;
}
assert_return(m, -EINVAL);
- m->subsystem_filter = hashmap_free_free_free(m->subsystem_filter);
- m->tag_filter = set_free_free(m->tag_filter);
+ m->subsystem_filter = hashmap_free(m->subsystem_filter);
+ m->tag_filter = set_free(m->tag_filter);
if (setsockopt(m->sock, SOL_SOCKET, SO_DETACH_FILTER, &filter, sizeof(filter)) < 0)
return -errno;
if (r < 0)
return r;
- if (device->devmode == (mode_t) -1)
+ if (device->devmode == MODE_INVALID)
return -ENOENT;
if (mode)
if (r < 0)
return r;
- if (device->devuid == (uid_t) -1)
+ if (device->devuid == UID_INVALID)
return -ENOENT;
if (uid)
if (r < 0)
return r;
- if (device->devgid == (gid_t) -1)
+ if (device->devgid == GID_INVALID)
return -ENOENT;
if (gid)
#include "string-util.h"
#include "strv.h"
#include "strxcpyx.h"
+#include "user-util.h"
#include "util.h"
int device_new_aux(sd_device **ret) {
*device = (sd_device) {
.n_ref = 1,
.watch_handle = -1,
- .devmode = (mode_t) -1,
- .devuid = (uid_t) -1,
- .devgid = (gid_t) -1,
+ .devmode = MODE_INVALID,
+ .devuid = UID_INVALID,
+ .devgid = GID_INVALID,
.action = _SD_DEVICE_ACTION_INVALID,
};
path = strjoina(syspath, "/uevent");
- r = read_full_file(path, &uevent, &uevent_len);
+ r = read_full_virtual_file(path, &uevent, &uevent_len);
if (r == -EACCES) {
/* empty uevent files may be write-only */
device->uevent_loaded = true;
const char *key, *value;
int r;
- unsetenv("SYSTEMD_MEMPOOL");
-
r = sd_device_new_from_syspath(&loopback, "/sys/class/net/lo");
if (r < 0)
return handle_error_errno(r, "Failed to create loopback device object");
}
}
- return 0;
+ return 1;
}
static sd_event_source *source_new(sd_event *e, bool floating, EventSourceType type) {
assert_return(e, -EINVAL);
assert_return(e = event_resolve(e), -ENOPKG);
- assert_return(accuracy != (uint64_t) -1, -EINVAL);
+ assert_return(accuracy != UINT64_MAX, -EINVAL);
assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
assert_return(!event_pid_changed(e), -ECHILD);
if (r < 0)
return r;
- if (usec >= USEC_INFINITY - t)
+ usec = usec_add(t, usec);
+ if (usec == USEC_INFINITY)
return -EOVERFLOW;
- return sd_event_source_set_time(s, t + usec);
+ return sd_event_source_set_time(s, usec);
}
_public_ int sd_event_source_get_time_accuracy(sd_event_source *s, uint64_t *usec) {
int r;
assert_return(s, -EINVAL);
- assert_return(usec != (uint64_t) -1, -EINVAL);
+ assert_return(usec != UINT64_MAX, -EINVAL);
assert_return(EVENT_SOURCE_IS_TIME(s->type), -EDOM);
assert_return(s->event->state != SD_EVENT_FINISHED, -ESTALE);
assert_return(!event_pid_changed(s->event), -ECHILD);
return 0;
}
-static int process_child(sd_event *e) {
+static int process_child(sd_event *e, int64_t threshold, int64_t *ret_min_priority) {
+ int64_t min_priority = threshold;
+ bool something_new = false;
sd_event_source *s;
int r;
assert(e);
+ assert(ret_min_priority);
+
+ if (!e->need_process_child) {
+ *ret_min_priority = min_priority;
+ return 0;
+ }
e->need_process_child = false;
HASHMAP_FOREACH(s, e->child_sources) {
assert(s->type == SOURCE_CHILD);
+ if (s->priority > threshold)
+ continue;
+
if (s->pending)
continue;
r = source_set_pending(s, true);
if (r < 0)
return r;
+ if (r > 0) {
+ something_new = true;
+ min_priority = MIN(min_priority, s->priority);
+ }
}
}
- return 0;
+ *ret_min_priority = min_priority;
+ return something_new;
}
static int process_pidfd(sd_event *e, sd_event_source *s, uint32_t revents) {
return source_set_pending(s, true);
}
-static int process_signal(sd_event *e, struct signal_data *d, uint32_t events) {
- bool read_one = false;
+static int process_signal(sd_event *e, struct signal_data *d, uint32_t events, int64_t *min_priority) {
int r;
assert(e);
assert(d);
assert_return(events == EPOLLIN, -EIO);
+ assert(min_priority);
/* If there's a signal queued on this priority and SIGCHLD is
on this priority too, then make sure to recheck the
n = read(d->fd, &si, sizeof(si));
if (n < 0) {
if (IN_SET(errno, EAGAIN, EINTR))
- return read_one;
+ return 0;
return -errno;
}
assert(SIGNAL_VALID(si.ssi_signo));
- read_one = true;
-
if (e->signal_sources)
s = e->signal_sources[si.ssi_signo];
if (!s)
r = source_set_pending(s, true);
if (r < 0)
return r;
+ if (r > 0 && *min_priority >= s->priority) {
+ *min_priority = s->priority;
+ return 1; /* an event source with smaller priority is queued. */
+ }
- return 1;
+ return 0;
}
}
-static int event_inotify_data_read(sd_event *e, struct inotify_data *d, uint32_t revents) {
+static int event_inotify_data_read(sd_event *e, struct inotify_data *d, uint32_t revents, int64_t threshold) {
ssize_t n;
assert(e);
if (d->buffer_filled > 0)
return 0;
+ if (d->priority > threshold)
+ return 0;
+
n = read(d->fd, &d->buffer, sizeof(d->buffer));
if (n < 0) {
if (IN_SET(errno, EAGAIN, EINTR))
int maxevents,
usec_t timeout) {
- static bool epoll_pwait2_absent = false;
int r, msec;
+#if 0
+ static bool epoll_pwait2_absent = false;
- /* A wrapper that uses epoll_pwait2() if available, and falls back to epoll_wait() if not */
+ /* A wrapper that uses epoll_pwait2() if available, and falls back to epoll_wait() if not.
+ *
+ * FIXME: this is temporarily disabled until epoll_pwait2() becomes more widely available.
+ * See https://github.com/systemd/systemd/pull/18973 and
+ * https://github.com/systemd/systemd/issues/19052. */
if (!epoll_pwait2_absent && timeout != USEC_INFINITY) {
struct timespec ts;
NULL);
if (r >= 0)
return r;
- if (!ERRNO_IS_NOT_SUPPORTED(r) && !ERRNO_IS_PRIVILEGE(r))
+ if (!ERRNO_IS_NOT_SUPPORTED(errno) && !ERRNO_IS_PRIVILEGE(errno))
return -errno; /* Only fallback to old epoll_wait() if the syscall is masked or not
* supported. */
epoll_pwait2_absent = true;
}
+#endif
if (timeout == USEC_INFINITY)
msec = -1;
return r;
}
-_public_ int sd_event_wait(sd_event *e, uint64_t timeout) {
+static int process_epoll(sd_event *e, usec_t timeout, int64_t threshold, int64_t *ret_min_priority) {
+ int64_t min_priority = threshold;
+ bool something_new = false;
size_t n_event_queue, m;
int r;
- assert_return(e, -EINVAL);
- assert_return(e = event_resolve(e), -ENOPKG);
- assert_return(!event_pid_changed(e), -ECHILD);
- assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
- assert_return(e->state == SD_EVENT_ARMED, -EBUSY);
-
- if (e->exit_requested) {
- e->state = SD_EVENT_PENDING;
- return 1;
- }
+ assert(e);
+ assert(ret_min_priority);
n_event_queue = MAX(e->n_sources, 1u);
if (!GREEDY_REALLOC(e->event_queue, e->event_queue_allocated, n_event_queue))
for (;;) {
r = epoll_wait_usec(e->epoll_fd, e->event_queue, e->event_queue_allocated, timeout);
- if (r == -EINTR) {
- e->state = SD_EVENT_PENDING;
- return 1;
- }
if (r < 0)
- goto finish;
+ return r;
m = (size_t) r;
timeout = 0;
}
- triple_timestamp_get(&e->timestamp);
+ /* Set timestamp only when this is called first time. */
+ if (threshold == INT64_MAX)
+ triple_timestamp_get(&e->timestamp);
for (size_t i = 0; i < m; i++) {
assert(s);
+ if (s->priority > threshold)
+ continue;
+
+ min_priority = MIN(min_priority, s->priority);
+
switch (s->type) {
case SOURCE_IO:
}
case WAKEUP_SIGNAL_DATA:
- r = process_signal(e, e->event_queue[i].data.ptr, e->event_queue[i].events);
+ r = process_signal(e, e->event_queue[i].data.ptr, e->event_queue[i].events, &min_priority);
break;
case WAKEUP_INOTIFY_DATA:
- r = event_inotify_data_read(e, e->event_queue[i].data.ptr, e->event_queue[i].events);
+ r = event_inotify_data_read(e, e->event_queue[i].data.ptr, e->event_queue[i].events, threshold);
break;
default:
assert_not_reached("Invalid wake-up pointer");
}
}
+ if (r < 0)
+ return r;
+ if (r > 0)
+ something_new = true;
+ }
+
+ *ret_min_priority = min_priority;
+ return something_new;
+}
+
+_public_ int sd_event_wait(sd_event *e, uint64_t timeout) {
+ int r;
+
+ assert_return(e, -EINVAL);
+ assert_return(e = event_resolve(e), -ENOPKG);
+ assert_return(!event_pid_changed(e), -ECHILD);
+ assert_return(e->state != SD_EVENT_FINISHED, -ESTALE);
+ assert_return(e->state == SD_EVENT_ARMED, -EBUSY);
+
+ if (e->exit_requested) {
+ e->state = SD_EVENT_PENDING;
+ return 1;
+ }
+
+ for (int64_t threshold = INT64_MAX; ; threshold--) {
+ int64_t epoll_min_priority, child_min_priority;
+
+ /* There may be a possibility that new epoll (especially IO) and child events are
+ * triggered just after process_epoll() call but before process_child(), and the new IO
+ * events may have higher priority than the child events. To salvage these events,
+ * let's call epoll_wait() again, but accepts only events with higher priority than the
+ * previous. See issue https://github.com/systemd/systemd/issues/18190 and comments
+ * https://github.com/systemd/systemd/pull/18750#issuecomment-785801085
+ * https://github.com/systemd/systemd/pull/18922#issuecomment-792825226 */
+
+ r = process_epoll(e, timeout, threshold, &epoll_min_priority);
+ if (r == -EINTR) {
+ e->state = SD_EVENT_PENDING;
+ return 1;
+ }
if (r < 0)
goto finish;
+ if (r == 0 && threshold < INT64_MAX)
+ /* No new epoll event. */
+ break;
+
+ r = process_child(e, threshold, &child_min_priority);
+ if (r < 0)
+ goto finish;
+ if (r == 0)
+ /* No new child event. */
+ break;
+
+ threshold = MIN(epoll_min_priority, child_min_priority);
+ if (threshold == INT64_MIN)
+ break;
+
+ timeout = 0;
}
r = process_watchdog(e);
if (r < 0)
goto finish;
- if (e->need_process_child) {
- r = process_child(e);
- if (r < 0)
- goto finish;
- }
-
r = process_inotify(e);
if (r < 0)
goto finish;
if (event_next_pending(e)) {
e->state = SD_EVENT_PENDING;
-
return 1;
}
_unused_ _cleanup_(sd_event_unrefp) sd_event *ref = NULL;
while (e->state != SD_EVENT_FINISHED) {
- r = sd_event_run(e, (uint64_t) -1);
+ r = sd_event_run(e, UINT64_MAX);
if (r < 0)
return r;
}
#include "parse-util.h"
#include "path-util.h"
#include "process-util.h"
+#include "random-util.h"
#include "rm-rf.h"
#include "signal-util.h"
#include "stdio-util.h"
uint64_t event_now;
int64_t priority;
+ log_info("/* %s(pidfd=%s) */", __func__, yes_no(with_pidfd));
+
assert_se(setenv("SYSTEMD_PIDFD", yes_no(with_pidfd), 1) >= 0);
assert_se(pipe(a) >= 0);
got_unref = false;
assert_se(sd_event_add_io(e, &t, k[0], EPOLLIN, unref_handler, NULL) >= 0);
assert_se(write(k[1], &ch, 1) == 1);
- assert_se(sd_event_run(e, (uint64_t) -1) >= 1);
+ assert_se(sd_event_run(e, UINT64_MAX) >= 1);
assert_se(got_unref);
got_a = false, got_b = false, got_c = false, got_d = 0;
assert_se(sd_event_add_io(e, &w, d[0], EPOLLIN, io_handler, INT_TO_PTR('d')) >= 0);
assert_se(sd_event_source_set_enabled(w, SD_EVENT_ONESHOT) >= 0);
assert_se(write(d[1], &ch, 1) >= 0);
- assert_se(sd_event_run(e, (uint64_t) -1) >= 1);
+ assert_se(sd_event_run(e, UINT64_MAX) >= 1);
assert_se(got_d == 1);
assert_se(write(d[1], &ch, 1) >= 0);
- assert_se(sd_event_run(e, (uint64_t) -1) >= 1);
+ assert_se(sd_event_run(e, UINT64_MAX) >= 1);
assert_se(got_d == 2);
assert_se(sd_event_add_io(e, &x, a[0], EPOLLIN, io_handler, INT_TO_PTR('a')) >= 0);
assert_se(!got_a && !got_b && !got_c);
- assert_se(sd_event_run(e, (uint64_t) -1) >= 1);
+ assert_se(sd_event_run(e, UINT64_MAX) >= 1);
assert_se(!got_a && got_b && !got_c);
- assert_se(sd_event_run(e, (uint64_t) -1) >= 1);
+ assert_se(sd_event_run(e, UINT64_MAX) >= 1);
assert_se(!got_a && got_b && got_c);
- assert_se(sd_event_run(e, (uint64_t) -1) >= 1);
+ assert_se(sd_event_run(e, UINT64_MAX) >= 1);
assert_se(got_a && got_b && got_c);
_cleanup_(sd_event_unrefp) sd_event *e = NULL;
uint64_t event_now;
+ log_info("/* %s */", __func__);
+
assert_se(sd_event_new(&e) >= 0);
assert_se(sd_event_now(e, CLOCK_MONOTONIC, &event_now) > 0);
assert_se(sd_event_now(e, CLOCK_REALTIME, &event_now) > 0);
sd_event_source *u = NULL, *v = NULL, *s = NULL;
sd_event *e = NULL;
+ log_info("/* %s */", __func__);
+
assert_se(sd_event_default(&e) >= 0);
assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGRTMIN+2, SIGRTMIN+3, SIGUSR2, -1) >= 0);
assert_se(n_rtqueue == 0);
assert_se(last_rtqueue_sigval == 0);
- assert_se(sd_event_run(e, (uint64_t) -1) >= 1);
+ assert_se(sd_event_run(e, UINT64_MAX) >= 1);
assert_se(n_rtqueue == 1);
assert_se(last_rtqueue_sigval == 2); /* first SIGRTMIN+3 */
- assert_se(sd_event_run(e, (uint64_t) -1) >= 1);
+ assert_se(sd_event_run(e, UINT64_MAX) >= 1);
assert_se(n_rtqueue == 2);
assert_se(last_rtqueue_sigval == 4); /* second SIGRTMIN+3 */
- assert_se(sd_event_run(e, (uint64_t) -1) >= 1);
+ assert_se(sd_event_run(e, UINT64_MAX) >= 1);
assert_se(n_rtqueue == 3);
assert_se(last_rtqueue_sigval == 3); /* first SIGUSR2 */
- assert_se(sd_event_run(e, (uint64_t) -1) >= 1);
+ assert_se(sd_event_run(e, UINT64_MAX) >= 1);
assert_se(n_rtqueue == 4);
assert_se(last_rtqueue_sigval == 1); /* SIGRTMIN+2 */
const char *q;
unsigned i;
+ log_info("/* %s(%u) */", __func__, n_create_events);
+
assert_se(sd_event_default(&e) >= 0);
assert_se(mkdtemp_malloc("/tmp/test-inotify-XXXXXX", &p) >= 0);
int pidfd;
pid_t pid, pid2;
+ log_info("/* %s */", __func__);
+
assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, -1) >= 0);
pid = fork();
uint64_t interval;
unsigned count, burst;
+ log_info("/* %s */", __func__);
+
assert_se(sd_event_default(&e) >= 0);
assert_se(pipe2(p, O_CLOEXEC|O_NONBLOCK) >= 0);
assert_se(count == 20);
}
+static void test_simple_timeout(void) {
+ _cleanup_(sd_event_unrefp) sd_event *e = NULL;
+ usec_t f, t, some_time;
+
+ some_time = random_u64_range(2 * USEC_PER_SEC);
+
+ assert_se(sd_event_default(&e) >= 0);
+
+ assert_se(sd_event_prepare(e) == 0);
+
+ f = now(CLOCK_MONOTONIC);
+ assert_se(sd_event_wait(e, some_time) >= 0);
+ t = now(CLOCK_MONOTONIC);
+
+ /* The event loop may sleep longer than the specified time (timer accuracy, scheduling latencies, …),
+ * but never shorter. Let's check that. */
+ assert_se(t >= usec_add(f, some_time));
+}
+
int main(int argc, char *argv[]) {
test_setup_logging(LOG_DEBUG);
+ test_simple_timeout();
+
test_basic(true); /* test with pidfd */
test_basic(false); /* test without pidfd */
if (ret != LZMA_OK)
return -ENOMEM;
- space = MIN(src_size * 2, dst_max ?: (size_t) -1);
+ space = MIN(src_size * 2, dst_max ?: SIZE_MAX);
if (!greedy_realloc(dst, dst_alloc_size, space, 1))
return -ENOMEM;
return -ENOBUFS;
used = space - s.avail_out;
- space = MIN(2 * space, dst_max ?: (size_t) -1);
+ space = MIN(2 * space, dst_max ?: SIZE_MAX);
if (!greedy_realloc(dst, dst_alloc_size, space, 1))
return -ENOMEM;
size_t m = sizeof(buf);
ssize_t n;
- if (max_bytes != (uint64_t) -1 && (uint64_t) m > max_bytes)
+ if (max_bytes != UINT64_MAX && (uint64_t) m > max_bytes)
m = (size_t) max_bytes;
n = read(fdf, buf, m);
s.next_in = buf;
s.avail_in = n;
- if (max_bytes != (uint64_t) -1) {
+ if (max_bytes != UINT64_MAX) {
assert(max_bytes >= (uint64_t) n);
max_bytes -= n;
}
offset += n;
total_out += n;
- if (max_bytes != (uint64_t) -1 && total_out > (size_t) max_bytes) {
+ if (max_bytes != UINT64_MAX && total_out > (size_t) max_bytes) {
r = log_debug_errno(SYNTHETIC_ERRNO(EFBIG),
"Compressed stream longer than %" PRIu64 " bytes", max_bytes);
goto cleanup;
n = sizeof(out) - s.avail_out;
- if (max_bytes != (uint64_t) -1) {
+ if (max_bytes != UINT64_MAX) {
if (max_bytes < (uint64_t) n)
return -EFBIG;
total_in += used;
total_out += produced;
- if (max_bytes != (uint64_t) -1 && total_out > (size_t) max_bytes) {
+ if (max_bytes != UINT64_MAX && total_out > (size_t) max_bytes) {
log_debug("Decompressed stream longer than %"PRIu64" bytes", max_bytes);
r = -EFBIG;
goto cleanup;
http://pubs.opengroup.org/onlinepubs/000095399/basedefs/xbd_chap08.html */
- if (l == (size_t) -1)
+ if (l == SIZE_MAX)
l = strlen(p);
/* No empty field names */
uint64_t *ret_offset,
uint64_t *ret_idx) {
- uint64_t a, p, t = 0, i = 0, last_p = 0, last_index = (uint64_t) -1;
+ uint64_t a, p, t = 0, i = 0, last_p = 0, last_index = UINT64_MAX;
bool subtract_one = false;
Object *o, *array = NULL;
int r;
left = 0;
right -= 1;
- if (last_index != (uint64_t) -1) {
+ if (last_index != UINT64_MAX) {
assert(last_index <= right);
/* If we cached the last index we
n -= k;
t += k;
- last_index = (uint64_t) -1;
+ last_index = UINT64_MAX;
a = le64toh(array->entry_array.next_entry_array_offset);
}
return 0;
/* Let's cache this item for the next invocation */
- chain_cache_put(f->chain_cache, ci, first, a, le64toh(array->entry_array.items[0]), t, subtract_one ? (i > 0 ? i-1 : (uint64_t) -1) : i);
+ chain_cache_put(f->chain_cache, ci, first, a, le64toh(array->entry_array.items[0]), t, subtract_one ? (i > 0 ? i-1 : UINT64_MAX) : i);
if (subtract_one && i == 0)
p = last_p;
#elif HAVE_XZ
.compress_xz = compress,
#endif
- .compress_threshold_bytes = compress_threshold_bytes == (uint64_t) -1 ?
+ .compress_threshold_bytes = compress_threshold_bytes == UINT64_MAX ?
DEFAULT_COMPRESS_THRESHOLD :
MAX(MIN_COMPRESS_THRESHOLD, compress_threshold_bytes),
#if HAVE_GCRYPT
/* Set everything to "pick automatic values". */
*m = (JournalMetrics) {
- .min_use = (uint64_t) -1,
- .max_use = (uint64_t) -1,
- .min_size = (uint64_t) -1,
- .max_size = (uint64_t) -1,
- .keep_free = (uint64_t) -1,
- .n_max_files = (uint64_t) -1,
+ .min_use = UINT64_MAX,
+ .max_use = UINT64_MAX,
+ .min_size = UINT64_MAX,
+ .max_size = UINT64_MAX,
+ .keep_free = UINT64_MAX,
+ .n_max_files = UINT64_MAX,
};
}
else
log_debug_errno(errno, "Failed to determine disk size: %m");
- if (m->max_use == (uint64_t) -1) {
+ if (m->max_use == UINT64_MAX) {
if (fs_size > 0)
m->max_use = CLAMP(PAGE_ALIGN(fs_size / 10), /* 10% of file system size */
m->max_use = JOURNAL_FILE_SIZE_MIN*2;
}
- if (m->min_use == (uint64_t) -1) {
+ if (m->min_use == UINT64_MAX) {
if (fs_size > 0)
m->min_use = CLAMP(PAGE_ALIGN(fs_size / 50), /* 2% of file system size */
MIN_USE_LOW, MIN_USE_HIGH);
if (m->min_use > m->max_use)
m->min_use = m->max_use;
- if (m->max_size == (uint64_t) -1)
+ if (m->max_size == UINT64_MAX)
m->max_size = MIN(PAGE_ALIGN(m->max_use / 8), /* 8 chunks */
MAX_SIZE_UPPER);
else
m->max_use = m->max_size*2;
}
- if (m->min_size == (uint64_t) -1)
+ if (m->min_size == UINT64_MAX)
m->min_size = JOURNAL_FILE_SIZE_MIN;
else
m->min_size = CLAMP(PAGE_ALIGN(m->min_size),
JOURNAL_FILE_SIZE_MIN,
m->max_size ?: UINT64_MAX);
- if (m->keep_free == (uint64_t) -1) {
+ if (m->keep_free == UINT64_MAX) {
if (fs_size > 0)
m->keep_free = MIN(PAGE_ALIGN(fs_size / 20), /* 5% of file system size */
KEEP_FREE_UPPER);
m->keep_free = DEFAULT_KEEP_FREE;
}
- if (m->n_max_files == (uint64_t) -1)
+ if (m->n_max_files == UINT64_MAX)
m->n_max_files = DEFAULT_N_MAX_FILES;
log_debug("Fixed min_use=%s max_use=%s max_size=%s min_size=%s keep_free=%s n_max_files=%" PRIu64,
return fd;
if (!j->on_network) {
- *timeout_usec = (uint64_t) -1;
+ *timeout_usec = UINT64_MAX;
return 0;
}
if (r < 0)
return r;
- if (t != (uint64_t) -1) {
- usec_t n;
+ if (t != UINT64_MAX) {
+ t = usec_sub_unsigned(t, now(CLOCK_MONOTONIC));
- n = now(CLOCK_MONOTONIC);
- t = t > n ? t - n : 0;
-
- if (timeout_usec == (uint64_t) -1 || timeout_usec > t)
+ if (timeout_usec == UINT64_MAX || timeout_usec > t)
timeout_usec = t;
}
static JournalFile *test_open(const char *name) {
JournalFile *f;
- assert_ret(journal_file_open(-1, name, O_RDWR|O_CREAT, 0644, true, (uint64_t) -1, false, NULL, NULL, NULL, NULL, &f));
+ assert_ret(journal_file_open(-1, name, O_RDWR|O_CREAT, 0644, true, UINT64_MAX, false, NULL, NULL, NULL, NULL, &f));
return f;
}
mkdtemp_chdir_chattr(t);
assert_se(journal_file_open(-1, "one.journal", O_RDWR|O_CREAT, 0644,
- true, (uint64_t) -1, false, NULL, NULL, NULL, NULL, &one) == 0);
+ true, UINT64_MAX, false, NULL, NULL, NULL, NULL, &one) == 0);
append_number(one, 1, &seqnum);
printf("seqnum=%"PRIu64"\n", seqnum);
memcpy(&seqnum_id, &one->header->seqnum_id, sizeof(sd_id128_t));
assert_se(journal_file_open(-1, "two.journal", O_RDWR|O_CREAT, 0644,
- true, (uint64_t) -1, false, NULL, NULL, NULL, one, &two) == 0);
+ true, UINT64_MAX, false, NULL, NULL, NULL, one, &two) == 0);
assert_se(two->header->state == STATE_ONLINE);
assert_se(!sd_id128_equal(two->header->file_id, one->header->file_id));
seqnum = 0;
assert_se(journal_file_open(-1, "two.journal", O_RDWR, 0,
- true, (uint64_t) -1, false, NULL, NULL, NULL, NULL, &two) == 0);
+ true, UINT64_MAX, false, NULL, NULL, NULL, NULL, &two) == 0);
assert_se(sd_id128_equal(two->header->seqnum_id, seqnum_id));
assert_se(chdir(t) >= 0);
(void) chattr_path(t, FS_NOCOW_FL, FS_NOCOW_FL, NULL);
- assert_se(journal_file_open(-1, "one.journal", O_RDWR|O_CREAT, 0666, true, (uint64_t) -1, false, NULL, NULL, NULL, NULL, &one) == 0);
- assert_se(journal_file_open(-1, "two.journal", O_RDWR|O_CREAT, 0666, true, (uint64_t) -1, false, NULL, NULL, NULL, NULL, &two) == 0);
- assert_se(journal_file_open(-1, "three.journal", O_RDWR|O_CREAT, 0666, true, (uint64_t) -1, false, NULL, NULL, NULL, NULL, &three) == 0);
+ assert_se(journal_file_open(-1, "one.journal", O_RDWR|O_CREAT, 0666, true, UINT64_MAX, false, NULL, NULL, NULL, NULL, &one) == 0);
+ assert_se(journal_file_open(-1, "two.journal", O_RDWR|O_CREAT, 0666, true, UINT64_MAX, false, NULL, NULL, NULL, NULL, &two) == 0);
+ assert_se(journal_file_open(-1, "three.journal", O_RDWR|O_CREAT, 0666, true, UINT64_MAX, false, NULL, NULL, NULL, NULL, &three) == 0);
for (i = 0; i < N_ENTRIES; i++) {
char *p, *q;
JournalFile *f;
int r;
- r = journal_file_open(-1, fn, O_RDONLY, 0666, true, (uint64_t) -1, !!verification_key, NULL, NULL, NULL, NULL, &f);
+ r = journal_file_open(-1, fn, O_RDONLY, 0666, true, UINT64_MAX, !!verification_key, NULL, NULL, NULL, NULL, &f);
if (r < 0)
return r;
log_info("Generating...");
- assert_se(journal_file_open(-1, "test.journal", O_RDWR|O_CREAT, 0666, true, (uint64_t) -1, !!verification_key, NULL, NULL, NULL, NULL, &f) == 0);
+ assert_se(journal_file_open(-1, "test.journal", O_RDWR|O_CREAT, 0666, true, UINT64_MAX, !!verification_key, NULL, NULL, NULL, NULL, &f) == 0);
for (n = 0; n < N_ENTRIES; n++) {
struct iovec iovec;
log_info("Verifying...");
- assert_se(journal_file_open(-1, "test.journal", O_RDONLY, 0666, true, (uint64_t) -1, !!verification_key, NULL, NULL, NULL, NULL, &f) == 0);
+ assert_se(journal_file_open(-1, "test.journal", O_RDONLY, 0666, true, UINT64_MAX, !!verification_key, NULL, NULL, NULL, NULL, &f) == 0);
/* journal_file_print_header(f); */
journal_file_dump(f);
mkdtemp_chdir_chattr(t);
- assert_se(journal_file_open(-1, "test.journal", O_RDWR|O_CREAT, 0666, true, (uint64_t) -1, true, NULL, NULL, NULL, NULL, &f) == 0);
+ assert_se(journal_file_open(-1, "test.journal", O_RDWR|O_CREAT, 0666, true, UINT64_MAX, true, NULL, NULL, NULL, NULL, &f) == 0);
assert_se(dual_timestamp_get(&ts));
assert_se(sd_id128_randomize(&fake_boot_id) == 0);
assert_se(journal_file_move_to_entry_by_seqnum(f, 10, DIRECTION_DOWN, &o, NULL) == 0);
- journal_file_rotate(&f, true, (uint64_t) -1, true, NULL);
- journal_file_rotate(&f, true, (uint64_t) -1, true, NULL);
+ journal_file_rotate(&f, true, UINT64_MAX, true, NULL);
+ journal_file_rotate(&f, true, UINT64_MAX, true, NULL);
(void) journal_file_close(f);
mkdtemp_chdir_chattr(t);
- assert_se(journal_file_open(-1, "test.journal", O_RDWR|O_CREAT, 0666, false, (uint64_t) -1, false, NULL, NULL, NULL, NULL, &f1) == 0);
+ assert_se(journal_file_open(-1, "test.journal", O_RDWR|O_CREAT, 0666, false, UINT64_MAX, false, NULL, NULL, NULL, NULL, &f1) == 0);
- assert_se(journal_file_open(-1, "test-compress.journal", O_RDWR|O_CREAT, 0666, true, (uint64_t) -1, false, NULL, NULL, NULL, NULL, &f2) == 0);
+ assert_se(journal_file_open(-1, "test-compress.journal", O_RDWR|O_CREAT, 0666, true, UINT64_MAX, false, NULL, NULL, NULL, NULL, &f2) == 0);
- assert_se(journal_file_open(-1, "test-seal.journal", O_RDWR|O_CREAT, 0666, false, (uint64_t) -1, true, NULL, NULL, NULL, NULL, &f3) == 0);
+ assert_se(journal_file_open(-1, "test-seal.journal", O_RDWR|O_CREAT, 0666, false, UINT64_MAX, true, NULL, NULL, NULL, NULL, &f3) == 0);
- assert_se(journal_file_open(-1, "test-seal-compress.journal", O_RDWR|O_CREAT, 0666, true, (uint64_t) -1, true, NULL, NULL, NULL, NULL, &f4) == 0);
+ assert_se(journal_file_open(-1, "test-seal-compress.journal", O_RDWR|O_CREAT, 0666, true, UINT64_MAX, true, NULL, NULL, NULL, NULL, &f4) == 0);
journal_file_print_header(f1);
puts("");
* carefully */
/* DEFAULT_MIN_COMPRESS_SIZE is 512 */
- assert_se(!check_compressed((uint64_t) -1, 255));
- assert_se(check_compressed((uint64_t) -1, 513));
+ assert_se(!check_compressed(UINT64_MAX, 255));
+ assert_se(check_compressed(UINT64_MAX, 513));
/* compress everything */
assert_se(check_compressed(0, 96));
assert_return(m, -EINVAL);
assert_return(timeout_usec, -EINVAL);
- /* For now we will only return (uint64_t) -1, since we don't
+ /* For now we will only return UINT64_MAX, since we don't
* need any timeout. However, let's have this API to keep our
* options open should we later on need it. */
- *timeout_usec = (uint64_t) -1;
+ *timeout_usec = UINT64_MAX;
return 0;
}
nw = now(CLOCK_MONOTONIC);
r = poll(&pollfd, 1,
- timeout == (uint64_t) -1 ? -1 :
+ timeout == UINT64_MAX ? -1 :
timeout > nw ? (int) ((timeout - nw) / 1000) :
0);
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
const NLType *genl_cmd_type, *nl_type;
const NLTypeSystem *type_system;
- struct genlmsghdr *genl;
size_t size;
int r;
m->hdr->nlmsg_type = nlmsg_type;
type_get_type_system(nl_type, &m->containers[0].type_system);
- genl = NLMSG_DATA(m->hdr);
- genl->cmd = cmd;
- genl->version = genl_families[family].version;
+
+ *(struct genlmsghdr *) NLMSG_DATA(m->hdr) = (struct genlmsghdr) {
+ .cmd = cmd,
+ .version = genl_families[family].version,
+ };
*ret = TAKE_PTR(m);
size_t message_length;
struct nlmsghdr *new_hdr;
struct rtattr *rta;
- unsigned i;
int offset;
assert(m);
rtattr_append_attribute_internal(rta, type, data, data_length);
/* if we are inside containers, extend them */
- for (i = 0; i < m->n_containers; i++)
+ for (unsigned i = 0; i < m->n_containers; i++)
GET_CONTAINER(m, i)->rta_len += RTA_SPACE(data_length);
/* update message size */
}
int sd_netlink_message_cancel_array(sd_netlink_message *m) {
- unsigned i;
uint32_t rta_len;
assert_return(m, -EINVAL);
rta_len = GET_CONTAINER(m, (m->n_containers - 1))->rta_len;
- for (i = 0; i < m->n_containers; i++)
+ for (unsigned i = 0; i < m->n_containers; i++)
GET_CONTAINER(m, i)->rta_len -= rta_len;
m->hdr->nlmsg_len -= rta_len;
const NLType *nl_type;
uint16_t type;
size_t size;
- unsigned i;
int r;
assert_return(m, -EINVAL);
if (!m->sealed)
rtnl_message_seal(m);
- for (i = 1; i <= m->n_containers; i++)
+ for (unsigned i = 1; i <= m->n_containers; i++)
m->containers[i].attributes = mfree(m->containers[i].attributes);
m->n_containers = 0;
static int broadcast_groups_get(sd_netlink *nl) {
_cleanup_free_ uint32_t *groups = NULL;
socklen_t len = 0, old_len;
- unsigned i, j;
int r;
assert(nl);
r = getsockopt(nl->fd, SOL_NETLINK, NETLINK_LIST_MEMBERSHIPS, NULL, &len);
if (r < 0) {
- if (errno == ENOPROTOOPT) {
- nl->broadcast_group_dont_leave = true;
- return 0;
- } else
+ if (errno != ENOPROTOOPT)
return -errno;
+
+ nl->broadcast_group_dont_leave = true;
+ return 0;
}
if (len == 0)
if (r < 0)
return r;
- for (i = 0; i < len; i++) {
- for (j = 0; j < sizeof(uint32_t) * 8; j++) {
- uint32_t offset;
- unsigned group;
+ for (unsigned i = 0; i < len; i++)
+ for (unsigned j = 0; j < sizeof(uint32_t) * 8; j++)
+ if (groups[i] & (1U << j)) {
+ unsigned group = i * sizeof(uint32_t) * 8 + j + 1;
- offset = 1U << j;
-
- if (!(groups[i] & offset))
- continue;
-
- group = i * sizeof(uint32_t) * 8 + j + 1;
-
- r = hashmap_put(nl->broadcast_group_refs, UINT_TO_PTR(group), UINT_TO_PTR(1));
- if (r < 0)
- return r;
- }
- }
+ r = hashmap_put(nl->broadcast_group_refs, UINT_TO_PTR(group), UINT_TO_PTR(1));
+ if (r < 0)
+ return r;
+ }
return 0;
}
if (r < 0)
return -errno;
- r = broadcast_groups_get(nl);
- if (r < 0)
- return r;
-
- return 0;
+ return broadcast_groups_get(nl);
}
static unsigned broadcast_group_get_ref(sd_netlink *nl, unsigned group) {
}
static int broadcast_group_join(sd_netlink *nl, unsigned group) {
- int r;
-
assert(nl);
assert(nl->fd >= 0);
assert(group > 0);
- r = setsockopt(nl->fd, SOL_NETLINK, NETLINK_ADD_MEMBERSHIP, &group, sizeof(group));
- if (r < 0)
- return -errno;
-
- return 0;
+ /* group is "unsigned", but netlink(7) says the argument for NETLINK_ADD_MEMBERSHIP is "int" */
+ return setsockopt_int(nl->fd, SOL_NETLINK, NETLINK_ADD_MEMBERSHIP, group);
}
int socket_broadcast_group_ref(sd_netlink *nl, unsigned group) {
}
static int broadcast_group_leave(sd_netlink *nl, unsigned group) {
- int r;
-
assert(nl);
assert(nl->fd >= 0);
assert(group > 0);
if (nl->broadcast_group_dont_leave)
return 0;
- r = setsockopt(nl->fd, SOL_NETLINK, NETLINK_DROP_MEMBERSHIP, &group, sizeof(group));
- if (r < 0)
- return -errno;
-
- return 0;
+ /* group is "unsigned", but netlink(7) says the argument for NETLINK_DROP_MEMBERSHIP is "int" */
+ return setsockopt_int(nl->fd, SOL_NETLINK, NETLINK_DROP_MEMBERSHIP, group);
}
int socket_broadcast_group_unref(sd_netlink *nl, unsigned group) {
int socket_writev_message(sd_netlink *nl, sd_netlink_message **m, size_t msgcount) {
_cleanup_free_ struct iovec *iovs = NULL;
- ssize_t k;
- size_t i;
assert(nl);
assert(m);
if (!iovs)
return -ENOMEM;
- for (i = 0; i < msgcount; i++) {
+ for (size_t i = 0; i < msgcount; i++) {
assert(m[i]->hdr != NULL);
assert(m[i]->hdr->nlmsg_len > 0);
iovs[i] = IOVEC_MAKE(m[i]->hdr, m[i]->hdr->nlmsg_len);
}
- k = writev(nl->fd, iovs, msgcount);
+ ssize_t k = writev(nl->fd, iovs, msgcount);
if (k < 0)
return -errno;
struct iovec iov = {};
uint32_t group = 0;
bool multi_part = false, done = false;
- struct nlmsghdr *new_msg;
size_t len;
int r;
unsigned i = 0;
}
}
- for (new_msg = rtnl->rbuffer; NLMSG_OK(new_msg, len) && !done; new_msg = NLMSG_NEXT(new_msg, len)) {
+ for (struct nlmsghdr *new_msg = rtnl->rbuffer; NLMSG_OK(new_msg, len) && !done; new_msg = NLMSG_NEXT(new_msg, len)) {
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
const NLType *nl_type;
static int nft_message_new(sd_netlink *nfnl, sd_netlink_message **ret, int family, uint16_t type, uint16_t flags) {
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
- struct nfgenmsg *nfh;
const NLType *nl_type;
size_t size;
int r;
m->hdr->nlmsg_len = size;
m->hdr->nlmsg_type = NFNL_SUBSYS_NFTABLES << 8 | type;
- nfh = NLMSG_DATA(m->hdr);
- nfh->nfgen_family = family;
- nfh->version = NFNETLINK_V0;
- nfh->res_id = nfnl->serial;
+ *(struct nfgenmsg*) NLMSG_DATA(m->hdr) = (struct nfgenmsg) {
+ .nfgen_family = family,
+ .version = NFNETLINK_V0,
+ .res_id = nfnl->serial,
+ };
*ret = TAKE_PTR(m);
return 0;
static int sd_nfnl_message_batch(sd_netlink *nfnl, sd_netlink_message **ret, int v) {
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
- struct nfgenmsg *nfh;
int r;
r = message_new(nfnl, &m, v);
if (r < 0)
return r;
- nfh = NLMSG_DATA(m->hdr);
- nfh->nfgen_family = AF_UNSPEC;
- nfh->version = NFNETLINK_V0;
- nfh->res_id = NFNL_SUBSYS_NFTABLES;
+ *(struct nfgenmsg*) NLMSG_DATA(m->hdr) = (struct nfgenmsg) {
+ .nfgen_family = AF_UNSPEC,
+ .version = NFNETLINK_V0,
+ .res_id = NFNL_SUBSYS_NFTABLES,
+ };
*ret = TAKE_PTR(m);
return r;
}
static usec_t calc_elapse(uint64_t usec) {
- if (usec == (uint64_t) -1)
+ if (usec == UINT64_MAX)
return 0;
if (usec == 0)
usec = RTNL_DEFAULT_TIMEOUT;
- return now(CLOCK_MONOTONIC) + usec;
+ return usec_add(now(CLOCK_MONOTONIC), usec);
}
static int rtnl_poll(sd_netlink *rtnl, bool need_more, uint64_t timeout_usec) {
}
}
- if (timeout_usec != (uint64_t) -1 && (m == USEC_INFINITY || timeout_usec < m))
+ if (timeout_usec != UINT64_MAX && (m == USEC_INFINITY || timeout_usec < m))
m = timeout_usec;
r = fd_wait_for_event(rtnl->fd, e, m);
if (r < 0)
return r;
- if (usec != (uint64_t) -1) {
+ if (usec != UINT64_MAX) {
r = prioq_ensure_allocated(&nl->reply_callbacks_prioq, timeout_compare);
if (r < 0)
return r;
left = timeout - n;
} else
- left = (uint64_t) -1;
+ left = UINT64_MAX;
r = rtnl_poll(rtnl, true, left);
if (r < 0)
c = prioq_peek(rtnl->reply_callbacks_prioq);
if (!c) {
- *timeout_usec = (uint64_t) -1;
+ *timeout_usec = UINT64_MAX;
return 0;
}
assert_return(m, -EINVAL);
assert_return(timeout_usec, -EINVAL);
- /* For now we will only return (uint64_t) -1, since we don't
+ /* For now we will only return UINT64_MAX, since we don't
* need any timeout. However, let's have this API to keep our
* options open should we later on need it. */
- *timeout_usec = (uint64_t) -1;
+ *timeout_usec = UINT64_MAX;
return 0;
}
assert_return(usec, -EINVAL);
assert_return(!resolve_pid_changed(resolve), -ECHILD);
- *usec = (uint64_t) -1;
+ *usec = UINT64_MAX;
return 0;
}
for (;;) {
/* Wait for next message */
r = fd_wait_for_event(device_monitor_get_fd(udev_monitor->monitor), POLLIN, 0);
- if (r < 0) {
- if (IN_SET(r, -EINTR, -EAGAIN))
- continue;
-
+ if (r == -EINTR)
+ continue;
+ if (r < 0)
return r;
- }
if (r == 0)
return -EAGAIN;
pthread_t t;
int r;
- unsetenv("SYSTEMD_MEMPOOL");
-
loopback = udev_device_new_from_syspath(NULL, "/sys/class/net/lo");
if (!loopback)
return handle_error_errno(errno, "Failed to create loopback device object");
#include "bus-polkit.h"
#include "def.h"
#include "dlfcn-util.h"
+#include "kbd-util.h"
#include "keymap-util.h"
#include "locale-util.h"
#include "macro.h"
static int method_set_vc_keyboard(sd_bus_message *m, void *userdata, sd_bus_error *error) {
Context *c = userdata;
- const char *keymap, *keymap_toggle;
+ const char *name, *keymap, *keymap_toggle;
int convert, interactive, r;
assert(m);
r = vconsole_read_data(c, m);
if (r < 0) {
log_error_errno(r, "Failed to read virtual console keymap data: %m");
- return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Failed to read virtual console keymap data");
+ return sd_bus_error_set_errnof(error, r, "Failed to read virtual console keymap data: %m");
+ }
+
+ FOREACH_STRING(name, keymap ?: keymap_toggle, keymap ? keymap_toggle : NULL) {
+ r = keymap_exists(name); /* This also verifies that the keymap name is kosher. */
+ if (r < 0) {
+ log_error_errno(r, "Failed to check keymap %s: %m", name);
+ return sd_bus_error_set_errnof(error, r, "Failed to check keymap %s: %m", name);
+ }
+ if (r == 0)
+ return sd_bus_error_setf(error, SD_BUS_ERROR_FAILED, "Keymap %s is not installed.", name);
}
if (streq_ptr(keymap, c->vc_keymap) &&
streq_ptr(keymap_toggle, c->vc_keymap_toggle))
return sd_bus_reply_method_return(m, NULL);
- if ((keymap && (!filename_is_valid(keymap) || !string_is_safe(keymap))) ||
- (keymap_toggle && (!filename_is_valid(keymap_toggle) || !string_is_safe(keymap_toggle))))
- return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Received invalid keymap data");
-
r = bus_verify_polkit_async(
m,
CAP_SYS_ADMIN,
return bus_log_parse_error(r);
if (table_get_rows(table) > 1) {
- r = table_set_sort(table, (size_t) 1, (size_t) 0, (size_t) 5, (size_t) 6, (size_t) -1);
+ r = table_set_sort(table, (size_t) 1, (size_t) 0, (size_t) 5, (size_t) 6);
if (r < 0)
return table_log_sort_error(r);
assert(word);
if (table_get_rows(table) > 1 || OUTPUT_MODE_IS_JSON(arg_output)) {
- r = table_set_sort(table, (size_t) 0, (size_t) -1);
+ r = table_set_sort(table, (size_t) 0);
if (r < 0)
return table_log_sort_error(r);
assert(w->child == 0);
assert(!w->child_event_source);
- r = safe_fork("(sd-bright)", FORK_DEATHSIG|FORK_NULL_STDIO|FORK_CLOSE_ALL_FDS|FORK_LOG, &w->child);
+ r = safe_fork("(sd-bright)", FORK_DEATHSIG|FORK_NULL_STDIO|FORK_CLOSE_ALL_FDS|FORK_LOG|FORK_REOPEN_LOG, &w->child);
if (r < 0)
return r;
if (r == 0) {
m->action_what = w;
/* Make sure the lid switch is ignored for a while */
- manager_set_lid_switch_ignore(m, now(CLOCK_MONOTONIC) + m->holdoff_timeout_usec);
+ manager_set_lid_switch_ignore(m, usec_add(now(CLOCK_MONOTONIC), m->holdoff_timeout_usec));
return 0;
return r;
/* disable TasksMax= for the session scope, rely on the slice setting for it */
- r = sd_bus_message_append(m, "(sv)", "TasksMax", "t", (uint64_t)-1);
+ r = sd_bus_message_append(m, "(sv)", "TasksMax", "t", UINT64_MAX);
if (r < 0)
return bus_log_create_error(r);
if (r > 0)
continue;
- r = sd_event_run(m->event, (uint64_t) -1);
+ r = sd_event_run(m->event, UINT64_MAX);
if (r < 0)
return r;
}
# the system.conf.d/ subdirectory. The latter is generally recommended.
# Defaults can be restored by simply deleting this file and all drop-ins.
#
+# Use 'systemd-analyze cat-config systemd/logind.conf' to display the full config.
+#
# See logind.conf(5) for details.
[Login]
send_interface="org.freedesktop.login1.Manager"
send_member="PowerOff"/>
+ <allow send_destination="org.freedesktop.login1"
+ send_interface="org.freedesktop.login1.Manager"
+ send_member="PowerOffWithFlags"/>
+
<allow send_destination="org.freedesktop.login1"
send_interface="org.freedesktop.login1.Manager"
send_member="Reboot"/>
+ <allow send_destination="org.freedesktop.login1"
+ send_interface="org.freedesktop.login1.Manager"
+ send_member="RebootWithFlags"/>
+
<allow send_destination="org.freedesktop.login1"
send_interface="org.freedesktop.login1.Manager"
send_member="Halt"/>
+ <allow send_destination="org.freedesktop.login1"
+ send_interface="org.freedesktop.login1.Manager"
+ send_member="HaltWithFlags"/>
+
<allow send_destination="org.freedesktop.login1"
send_interface="org.freedesktop.login1.Manager"
send_member="Suspend"/>
+ <allow send_destination="org.freedesktop.login1"
+ send_interface="org.freedesktop.login1.Manager"
+ send_member="SuspendWithFlags"/>
+
<allow send_destination="org.freedesktop.login1"
send_interface="org.freedesktop.login1.Manager"
send_member="Hibernate"/>
+ <allow send_destination="org.freedesktop.login1"
+ send_interface="org.freedesktop.login1.Manager"
+ send_member="HibernateWithFlags"/>
+
<allow send_destination="org.freedesktop.login1"
send_interface="org.freedesktop.login1.Manager"
send_member="HybridSleep"/>
+ <allow send_destination="org.freedesktop.login1"
+ send_interface="org.freedesktop.login1.Manager"
+ send_member="HybridSleepWithFlags"/>
+
<allow send_destination="org.freedesktop.login1"
send_interface="org.freedesktop.login1.Manager"
send_member="SuspendThenHibernate"/>
+ <allow send_destination="org.freedesktop.login1"
+ send_interface="org.freedesktop.login1.Manager"
+ send_member="SuspendThenHibernateWithFlags"/>
+
<allow send_destination="org.freedesktop.login1"
send_interface="org.freedesktop.login1.Manager"
send_member="CanPowerOff"/>
return PAM_SUCCESS;
if (streq(limit, "infinity")) {
- r = sd_bus_message_append(m, "(sv)", "MemoryMax", "t", (uint64_t)-1);
+ r = sd_bus_message_append(m, "(sv)", "MemoryMax", "t", UINT64_MAX);
if (r < 0)
return pam_bus_log_create_error(handle, r);
assert(prefix);
if (flags & OUTPUT_FULL_WIDTH)
- max_width = (size_t) -1;
+ max_width = SIZE_MAX;
else if (n_columns < 10)
max_width = 10;
else
return -ENOMEM;
r = show_sysfs_one(seat, dev_list, i_dev, n_dev, sysfs, p,
- n_columns == (unsigned) -1 || n_columns < 2 ? n_columns : n_columns - 2,
+ n_columns == UINT_MAX || n_columns < 2 ? n_columns : n_columns - 2,
flags);
if (r < 0)
return r;
if (r < 0)
_exit(EXIT_FAILURE);
- r = copy_bytes(fd, pair[1], (uint64_t) -1, 0);
+ r = copy_bytes(fd, pair[1], UINT64_MAX, 0);
if (r < 0)
_exit(EXIT_FAILURE);
assert(word);
if (table_get_rows(table) > 1 || OUTPUT_MODE_IS_JSON(arg_output)) {
- r = table_set_sort(table, (size_t) 0, (size_t) -1);
+ r = table_set_sort(table, (size_t) 0);
if (r < 0)
return table_log_sort_error(r);
};
PoolStatusInfo info = {
- .usage = (uint64_t) -1,
- .limit = (uint64_t) -1,
+ .usage = UINT64_MAX,
+ .limit = UINT64_MAX,
};
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
polkit_agent_open_if_enabled(arg_transport, arg_ask_password);
if (STR_IN_SET(argv[argc-1], "-", "none", "infinity"))
- limit = (uint64_t) -1;
+ limit = UINT64_MAX;
else {
r = parse_size(argv[argc-1], 1024, &limit);
if (r < 0)
sd_bus_error *error) {
_cleanup_close_ int fd = -1;
- uint64_t usage = (uint64_t) -1;
+ uint64_t usage = UINT64_MAX;
assert(bus);
assert(reply);
sd_bus_error *error) {
_cleanup_close_ int fd = -1;
- uint64_t size = (uint64_t) -1;
+ uint64_t size = UINT64_MAX;
assert(bus);
assert(reply);
if (arg_full)
table_set_width(table, 0);
- r = table_set_sort(table, (size_t) 0, (size_t) SIZE_MAX);
+ r = table_set_sort(table, (size_t) 0);
if (r < 0)
return log_error_errno(r, "Failed to set sort index: %m");
networkd-speed-meter.h
networkd-sriov.c
networkd-sriov.h
+ networkd-state-file.c
+ networkd-state-file.h
networkd-sysctl.c
networkd-sysctl.h
networkd-util.c
return 0;
}
- if (k/1000/100 > UINT32_MAX) {
+ if (k/1000/100 > UINT32_MAX)
log_syntax(unit, LOG_WARNING, filename, line, 0,
"The value of '%s=', is outside of 0...429496729500000 range: %s",
lvalue, rvalue);
- }
*bandwidth = k/1000/100;
int netdev_load_one(Manager *manager, const char *filename) {
_cleanup_(netdev_unrefp) NetDev *netdev_raw = NULL, *netdev = NULL;
- _cleanup_fclose_ FILE *file = NULL;
const char *dropin_dirname;
bool independent = false;
int r;
assert(manager);
assert(filename);
- file = fopen(filename, "re");
- if (!file) {
- if (errno == ENOENT)
- return 0;
-
- return -errno;
- }
-
- if (null_or_empty_fd(fileno(file))) {
+ r = null_or_empty_path(filename);
+ if (r == -ENOENT)
+ return 0;
+ if (r < 0)
+ return r;
+ if (r > 0) {
log_debug("Skipping empty file: %s", filename);
return 0;
}
return 0;
}
- r = fseek(file, 0, SEEK_SET);
- if (r < 0)
- return -errno;
-
netdev = malloc0(NETDEV_VTABLE(netdev_raw)->object_size);
if (!netdev)
return log_oom();
if (t->allow_localremote >= 0)
SET_FLAG(t->flags, IP6_TNL_F_ALLOW_LOCAL_REMOTE, t->allow_localremote);
- if (t->encap_limit != IPV6_DEFAULT_TNL_ENCAP_LIMIT) {
+ if (t->encap_limit != 0) {
r = sd_netlink_message_append_u8(m, IFLA_IPTUN_ENCAP_LIMIT, t->encap_limit);
if (r < 0)
return log_netdev_error_errno(netdev, r, "Could not append IFLA_IPTUN_ENCAP_LIMIT attribute: %m");
if (arg_full)
table_set_width(table, 0);
- r = table_set_sort(table, (size_t) 0, (size_t) SIZE_MAX);
+ r = table_set_sort(table, (size_t) 0);
if (r < 0)
return r;
if (r < 0) {
char ifname[IF_NAMESIZE + 1];
- return log_error_errno(r, "Failed to %s interface %s: %m",
- argv[1], format_ifname_full(index, ifname, FORMAT_IFNAME_IFINDEX));
+ return log_error_errno(r, "Failed to bring %s interface %s: %m",
+ argv[0], format_ifname_full(index, ifname, FORMAT_IFNAME_IFINDEX));
}
}
#include "networkd-link.h"
#include "networkd-manager.h"
#include "networkd-network.h"
+#include "networkd-state-file.h"
#include "string-table.h"
#include "strv.h"
#include "sysctl-util.h"
}
if (streq(rvalue, "infinity")) {
- network->dhcp_max_attempts = (uint64_t) -1;
+ network->dhcp_max_attempts = UINT64_MAX;
return 0;
}
#include "networkd-link-bus.h"
#include "networkd-link.h"
#include "networkd-manager.h"
+#include "networkd-state-file.h"
#include "parse-util.h"
#include "resolve-util.h"
#include "socket-netlink.h"
goto finalize;
}
- if (l->n_dns != (unsigned) -1)
+ if (l->n_dns != UINT_MAX)
for (unsigned i = 0; i < l->n_dns; i++)
in_addr_full_free(l->dns[i]);
#include "bond.h"
#include "bridge.h"
#include "bus-util.h"
+#include "device-private.h"
+#include "device-util.h"
#include "dhcp-identifier.h"
#include "dhcp-lease-internal.h"
#include "env-file.h"
#include "networkd-sysctl.h"
#include "networkd-radv.h"
#include "networkd-routing-policy-rule.h"
+#include "networkd-state-file.h"
#include "networkd-wifi.h"
#include "set.h"
#include "socket-util.h"
.ifindex = ifindex,
.iftype = iftype,
- .n_dns = (unsigned) -1,
+ .n_dns = UINT_MAX,
.dns_default_route = -1,
.llmnr = _RESOLVE_SUPPORT_INVALID,
.mdns = _RESOLVE_SUPPORT_INVALID,
}
void link_dns_settings_clear(Link *link) {
- if (link->n_dns != (unsigned) -1)
+ if (link->n_dns != UINT_MAX)
for (unsigned i = 0; i < link->n_dns; i++)
in_addr_full_free(link->dns[i]);
link->dns = mfree(link->dns);
- link->n_dns = (unsigned) -1;
+ link->n_dns = UINT_MAX;
link->search_domains = ordered_set_free_free(link->search_domains);
link->route_domains = ordered_set_free_free(link->route_domains);
link->ndisc_addresses = set_free(link->ndisc_addresses);
link_free_engines(link);
- free(link->lease_file);
- free(link->lldp_file);
free(link->ifname);
strv_free(link->alternative_names);
free(link->ssid);
free(link->driver);
- (void) unlink(link->state_file);
- free(link->state_file);
+ unlink_and_free(link->lease_file);
+ unlink_and_free(link->lldp_file);
+ unlink_and_free(link->state_file);
sd_device_unref(link->sd_device);
link_unref(link);
}
-void link_drop(Link *link) {
+static void link_drop(Link *link) {
if (!link || link->state == LINK_STATE_LINGER)
return;
return 1;
}
-int link_initialized(Link *link, sd_device *device) {
+static int link_initialized(Link *link, sd_device *device) {
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
int r;
return 0;
}
-int link_add(Manager *m, sd_netlink_message *message, Link **ret) {
+static int link_add(Manager *m, sd_netlink_message *message, Link **ret) {
_cleanup_(sd_device_unrefp) sd_device *device = NULL;
char ifindex_str[2 + DECIMAL_STR_MAX(int)];
Link *link;
return 0;
}
+int manager_udev_process_link(sd_device_monitor *monitor, sd_device *device, void *userdata) {
+ sd_device_action_t action;
+ Manager *m = userdata;
+ Link *link = NULL;
+ int r, ifindex;
+
+ assert(m);
+ assert(device);
+
+ r = sd_device_get_action(device, &action);
+ if (r < 0) {
+ log_device_debug_errno(device, r, "Failed to get udev action, ignoring device: %m");
+ return 0;
+ }
+
+ /* Ignore the "remove" uevent — let's remove a device only if rtnetlink says so. All other uevents
+ * are "positive" events in some form, i.e. inform us about a changed or new network interface, that
+ * still exists — and we are interested in that. */
+ if (action == SD_DEVICE_REMOVE)
+ return 0;
+
+ r = sd_device_get_ifindex(device, &ifindex);
+ if (r < 0) {
+ log_device_debug_errno(device, r, "Ignoring udev %s event for device without ifindex or with invalid ifindex: %m",
+ device_action_to_string(action));
+ return 0;
+ }
+
+ r = device_is_renaming(device);
+ if (r < 0) {
+ log_device_error_errno(device, r, "Failed to determine the device is renamed or not, ignoring '%s' uevent: %m",
+ device_action_to_string(action));
+ return 0;
+ }
+ if (r > 0) {
+ log_device_debug(device, "Interface is under renaming, wait for the interface to be renamed.");
+ return 0;
+ }
+
+ r = link_get(m, ifindex, &link);
+ if (r < 0) {
+ if (r != -ENODEV)
+ log_debug_errno(r, "Failed to get link from ifindex %i, ignoring: %m", ifindex);
+ return 0;
+ }
+
+ (void) link_initialized(link, device);
+
+ return 0;
+}
+
static int link_carrier_gained(Link *link) {
int r;
return 0;
}
-/* This is called every time an interface admin state changes to up;
- * specifically, when IFF_UP flag changes from unset to set */
static int link_admin_state_up(Link *link) {
int r;
assert(link);
+ /* This is called every time an interface admin state changes to up;
+ * specifically, when IFF_UP flag changes from unset to set. */
+
if (!link->network)
return 0;
}
static int link_admin_state_down(Link *link) {
-
assert(link);
if (!link->network)
return 0;
}
-int link_update(Link *link, sd_netlink_message *m) {
+static int link_update(Link *link, sd_netlink_message *m) {
_cleanup_strv_free_ char **s = NULL;
hw_addr_data hw_addr;
const char *ifname;
return 0;
}
-static void print_link_hashmap(FILE *f, const char *prefix, Hashmap* h) {
- bool space = false;
- Link *link;
-
- assert(f);
- assert(prefix);
-
- if (hashmap_isempty(h))
- return;
-
- fputs(prefix, f);
- HASHMAP_FOREACH(link, h) {
- if (space)
- fputc(' ', f);
-
- fprintf(f, "%i", link->ifindex);
- space = true;
- }
-
- fputc('\n', f);
-}
-
-static void link_save_dns(Link *link, FILE *f, struct in_addr_full **dns, unsigned n_dns, bool *space) {
- for (unsigned j = 0; j < n_dns; j++) {
- const char *str;
-
- if (dns[j]->ifindex != 0 && dns[j]->ifindex != link->ifindex)
- continue;
-
- str = in_addr_full_to_string(dns[j]);
- if (!str)
- continue;
-
- if (*space)
- fputc(' ', f);
- fputs(str, f);
- *space = true;
- }
-}
-
-static void serialize_addresses(
- FILE *f,
- const char *lvalue,
- bool *space,
- char **addresses,
- sd_dhcp_lease *lease,
- bool conditional,
- sd_dhcp_lease_server_type_t what,
- sd_dhcp6_lease *lease6,
- bool conditional6,
- int (*lease6_get_addr)(sd_dhcp6_lease*, const struct in6_addr**),
- int (*lease6_get_fqdn)(sd_dhcp6_lease*, char ***)) {
- int r;
-
- bool _space = false;
- if (!space)
- space = &_space;
+int manager_rtnl_process_link(sd_netlink *rtnl, sd_netlink_message *message, Manager *m) {
+ Link *link = NULL;
+ NetDev *netdev = NULL;
+ uint16_t type;
+ const char *name;
+ int r, ifindex;
- if (lvalue)
- fprintf(f, "%s=", lvalue);
- fputstrv(f, addresses, NULL, space);
+ assert(rtnl);
+ assert(message);
+ assert(m);
- if (lease && conditional) {
- const struct in_addr *lease_addresses;
+ if (sd_netlink_message_is_error(message)) {
+ r = sd_netlink_message_get_errno(message);
+ if (r < 0)
+ log_message_warning_errno(message, r, "rtnl: Could not receive link message, ignoring");
- r = sd_dhcp_lease_get_servers(lease, what, &lease_addresses);
- if (r > 0)
- serialize_in_addrs(f, lease_addresses, r, space, in4_addr_is_non_local);
+ return 0;
}
- if (lease6 && conditional6 && lease6_get_addr) {
- const struct in6_addr *in6_addrs;
-
- r = lease6_get_addr(lease6, &in6_addrs);
- if (r > 0)
- serialize_in6_addrs(f, in6_addrs, r, space);
+ r = sd_netlink_message_get_type(message, &type);
+ if (r < 0) {
+ log_warning_errno(r, "rtnl: Could not get message type, ignoring: %m");
+ return 0;
+ } else if (!IN_SET(type, RTM_NEWLINK, RTM_DELLINK)) {
+ log_warning("rtnl: Received unexpected message type %u when processing link, ignoring.", type);
+ return 0;
}
- if (lease6 && conditional6 && lease6_get_fqdn) {
- char **in6_hosts;
-
- r = lease6_get_fqdn(lease6, &in6_hosts);
- if (r > 0)
- fputstrv(f, in6_hosts, NULL, space);
+ r = sd_rtnl_message_link_get_ifindex(message, &ifindex);
+ if (r < 0) {
+ log_warning_errno(r, "rtnl: Could not get ifindex from link message, ignoring: %m");
+ return 0;
+ } else if (ifindex <= 0) {
+ log_warning("rtnl: received link message with invalid ifindex %d, ignoring.", ifindex);
+ return 0;
}
- if (lvalue)
- fputc('\n', f);
-}
-
-int link_save(Link *link) {
- const char *admin_state, *oper_state, *carrier_state, *address_state;
- _cleanup_free_ char *temp_path = NULL;
- _cleanup_fclose_ FILE *f = NULL;
- int r;
-
- assert(link);
- assert(link->state_file);
- assert(link->lease_file);
- assert(link->manager);
-
- if (link->state == LINK_STATE_LINGER) {
- (void) unlink(link->state_file);
+ r = sd_netlink_message_read_string(message, IFLA_IFNAME, &name);
+ if (r < 0) {
+ log_warning_errno(r, "rtnl: Received link message without ifname, ignoring: %m");
return 0;
}
- link_lldp_save(link);
-
- admin_state = link_state_to_string(link->state);
- assert(admin_state);
-
- oper_state = link_operstate_to_string(link->operstate);
- assert(oper_state);
-
- carrier_state = link_carrier_state_to_string(link->carrier_state);
- assert(carrier_state);
-
- address_state = link_address_state_to_string(link->address_state);
- assert(address_state);
-
- r = fopen_temporary(link->state_file, &f, &temp_path);
- if (r < 0)
- goto fail;
+ (void) link_get(m, ifindex, &link);
+ (void) netdev_get(m, name, &netdev);
- (void) fchmod(fileno(f), 0644);
-
- fprintf(f,
- "# This is private data. Do not parse.\n"
- "ADMIN_STATE=%s\n"
- "OPER_STATE=%s\n"
- "CARRIER_STATE=%s\n"
- "ADDRESS_STATE=%s\n",
- admin_state, oper_state, carrier_state, address_state);
-
- if (link->network) {
- char **dhcp6_domains = NULL, **dhcp_domains = NULL;
- const char *dhcp_domainname = NULL, *p;
- bool space;
-
- fprintf(f, "REQUIRED_FOR_ONLINE=%s\n",
- yes_no(link->network->required_for_online));
-
- LinkOperationalStateRange st = link->network->required_operstate_for_online;
- fprintf(f, "REQUIRED_OPER_STATE_FOR_ONLINE=%s%s%s\n",
- strempty(link_operstate_to_string(st.min)),
- st.max != LINK_OPERSTATE_RANGE_DEFAULT.max ? ":" : "",
- st.max != LINK_OPERSTATE_RANGE_DEFAULT.max ? strempty(link_operstate_to_string(st.max)) : "");
-
- fprintf(f, "ACTIVATION_POLICY=%s\n",
- activation_policy_to_string(link->network->activation_policy));
-
- fprintf(f, "NETWORK_FILE=%s\n", link->network->filename);
-
- /************************************************************/
-
- fputs("DNS=", f);
- space = false;
- if (link->n_dns != (unsigned) -1)
- link_save_dns(link, f, link->dns, link->n_dns, &space);
- else
- link_save_dns(link, f, link->network->dns, link->network->n_dns, &space);
-
- serialize_addresses(f, NULL, &space,
- NULL,
- link->dhcp_lease,
- link->network->dhcp_use_dns,
- SD_DHCP_LEASE_DNS,
- link->dhcp6_lease,
- link->network->dhcp6_use_dns,
- sd_dhcp6_lease_get_dns,
- NULL);
-
- /* Make sure to flush out old entries before we use the NDisc data */
- ndisc_vacuum(link);
-
- if (link->network->ipv6_accept_ra_use_dns && link->ndisc_rdnss) {
- NDiscRDNSS *dd;
-
- SET_FOREACH(dd, link->ndisc_rdnss)
- serialize_in6_addrs(f, &dd->address, 1, &space);
- }
-
- fputc('\n', f);
-
- /************************************************************/
-
- serialize_addresses(f, "NTP", NULL,
- link->ntp ?: link->network->ntp,
- link->dhcp_lease,
- link->network->dhcp_use_ntp,
- SD_DHCP_LEASE_NTP,
- link->dhcp6_lease,
- link->network->dhcp6_use_ntp,
- sd_dhcp6_lease_get_ntp_addrs,
- sd_dhcp6_lease_get_ntp_fqdn);
-
- serialize_addresses(f, "SIP", NULL,
- NULL,
- link->dhcp_lease,
- link->network->dhcp_use_sip,
- SD_DHCP_LEASE_SIP,
- NULL, false, NULL, NULL);
-
- /************************************************************/
-
- if (link->network->dhcp_use_domains != DHCP_USE_DOMAINS_NO) {
- if (link->dhcp_lease) {
- (void) sd_dhcp_lease_get_domainname(link->dhcp_lease, &dhcp_domainname);
- (void) sd_dhcp_lease_get_search_domains(link->dhcp_lease, &dhcp_domains);
+ switch (type) {
+ case RTM_NEWLINK:
+ if (!link) {
+ /* link is new, so add it */
+ r = link_add(m, message, &link);
+ if (r < 0) {
+ log_warning_errno(r, "Could not process new link message, ignoring: %m");
+ return 0;
}
- if (link->dhcp6_lease)
- (void) sd_dhcp6_lease_get_domains(link->dhcp6_lease, &dhcp6_domains);
- }
-
- fputs("DOMAINS=", f);
- space = false;
- ORDERED_SET_FOREACH(p, link->search_domains ?: link->network->search_domains)
- fputs_with_space(f, p, NULL, &space);
-
- if (link->network->dhcp_use_domains == DHCP_USE_DOMAINS_YES) {
- if (dhcp_domainname)
- fputs_with_space(f, dhcp_domainname, NULL, &space);
- if (dhcp_domains)
- fputstrv(f, dhcp_domains, NULL, &space);
- if (dhcp6_domains)
- fputstrv(f, dhcp6_domains, NULL, &space);
- }
-
- if (link->network->ipv6_accept_ra_use_domains == DHCP_USE_DOMAINS_YES) {
- NDiscDNSSL *dd;
-
- SET_FOREACH(dd, link->ndisc_dnssl)
- fputs_with_space(f, NDISC_DNSSL_DOMAIN(dd), NULL, &space);
}
- fputc('\n', f);
-
- /************************************************************/
-
- fputs("ROUTE_DOMAINS=", f);
- space = false;
- ORDERED_SET_FOREACH(p, link->route_domains ?: link->network->route_domains)
- fputs_with_space(f, p, NULL, &space);
-
- if (link->network->dhcp_use_domains == DHCP_USE_DOMAINS_ROUTE) {
- if (dhcp_domainname)
- fputs_with_space(f, dhcp_domainname, NULL, &space);
- if (dhcp_domains)
- fputstrv(f, dhcp_domains, NULL, &space);
- if (dhcp6_domains)
- fputstrv(f, dhcp6_domains, NULL, &space);
+ if (netdev) {
+ /* netdev exists, so make sure the ifindex matches */
+ r = netdev_set_ifindex(netdev, message);
+ if (r < 0) {
+ log_warning_errno(r, "Could not process new link message for netdev, ignoring: %m");
+ return 0;
+ }
}
- if (link->network->ipv6_accept_ra_use_domains == DHCP_USE_DOMAINS_ROUTE) {
- NDiscDNSSL *dd;
-
- SET_FOREACH(dd, link->ndisc_dnssl)
- fputs_with_space(f, NDISC_DNSSL_DOMAIN(dd), NULL, &space);
+ r = link_update(link, message);
+ if (r < 0) {
+ log_warning_errno(r, "Could not process link message, ignoring: %m");
+ return 0;
}
- fputc('\n', f);
-
- /************************************************************/
-
- fprintf(f, "LLMNR=%s\n",
- resolve_support_to_string(link->llmnr >= 0 ? link->llmnr : link->network->llmnr));
-
- /************************************************************/
-
- fprintf(f, "MDNS=%s\n",
- resolve_support_to_string(link->mdns >= 0 ? link->mdns : link->network->mdns));
-
- /************************************************************/
-
- int dns_default_route =
- link->dns_default_route >= 0 ? link->dns_default_route :
- link->network->dns_default_route;
- if (dns_default_route >= 0)
- fprintf(f, "DNS_DEFAULT_ROUTE=%s\n", yes_no(dns_default_route));
-
- /************************************************************/
-
- DnsOverTlsMode dns_over_tls_mode =
- link->dns_over_tls_mode != _DNS_OVER_TLS_MODE_INVALID ? link->dns_over_tls_mode :
- link->network->dns_over_tls_mode;
- if (dns_over_tls_mode != _DNS_OVER_TLS_MODE_INVALID)
- fprintf(f, "DNS_OVER_TLS=%s\n", dns_over_tls_mode_to_string(dns_over_tls_mode));
-
- /************************************************************/
-
- DnssecMode dnssec_mode =
- link->dnssec_mode != _DNSSEC_MODE_INVALID ? link->dnssec_mode :
- link->network->dnssec_mode;
- if (dnssec_mode != _DNSSEC_MODE_INVALID)
- fprintf(f, "DNSSEC=%s\n", dnssec_mode_to_string(dnssec_mode));
-
- /************************************************************/
+ break;
- Set *nta_anchors = link->dnssec_negative_trust_anchors;
- if (set_isempty(nta_anchors))
- nta_anchors = link->network->dnssec_negative_trust_anchors;
+ case RTM_DELLINK:
+ link_drop(link);
+ netdev_drop(netdev);
- if (!set_isempty(nta_anchors)) {
- const char *n;
+ break;
- fputs("DNSSEC_NTA=", f);
- space = false;
- SET_FOREACH(n, nta_anchors)
- fputs_with_space(f, n, NULL, &space);
- fputc('\n', f);
- }
+ default:
+ assert_not_reached("Received link message with invalid RTNL message type.");
}
- print_link_hashmap(f, "CARRIER_BOUND_TO=", link->bound_to_links);
- print_link_hashmap(f, "CARRIER_BOUND_BY=", link->bound_by_links);
-
- if (link->dhcp_lease) {
- r = dhcp_lease_save(link->dhcp_lease, link->lease_file);
- if (r < 0)
- goto fail;
-
- fprintf(f,
- "DHCP_LEASE=%s\n",
- link->lease_file);
- } else
- (void) unlink(link->lease_file);
-
- r = link_serialize_dhcp6_client(link, f);
- if (r < 0)
- goto fail;
-
- r = fflush_and_check(f);
- if (r < 0)
- goto fail;
-
- r = conservative_rename(temp_path, link->state_file);
- if (r < 0)
- goto fail;
-
- return 0;
-
-fail:
- (void) unlink(link->state_file);
- if (temp_path)
- (void) unlink(temp_path);
-
- return log_link_error_errno(link, r, "Failed to save link data to %s: %m", link->state_file);
-}
-
-/* The serialized state in /run is no longer up-to-date. */
-void link_dirty(Link *link) {
- int r;
-
- assert(link);
-
- /* mark manager dirty as link is dirty */
- manager_dirty(link->manager);
-
- r = set_ensure_put(&link->manager->dirty_links, NULL, link);
- if (r <= 0)
- /* Ignore allocation errors and don't take another ref if the link was already dirty */
- return;
- link_ref(link);
-}
-
-/* The serialized state in /run is up-to-date */
-void link_clean(Link *link) {
- assert(link);
- assert(link->manager);
-
- link_unref(set_remove(link->manager->dirty_links, link));
-}
-
-int link_save_and_clean(Link *link) {
- int r;
-
- r = link_save(link);
- if (r < 0)
- return r;
-
- link_clean(link);
- return 0;
+ return 1;
}
static const char* const link_state_table[_LINK_STATE_MAX] = {
DEFINE_TRIVIAL_DESTRUCTOR(link_netlink_destroy_callback, Link, link_unref);
int link_get(Manager *m, int ifindex, Link **ret);
-int link_add(Manager *manager, sd_netlink_message *message, Link **ret);
-void link_drop(Link *link);
int link_down(Link *link, link_netlink_message_handler_t callback);
void link_enter_failed(Link *link);
-int link_initialized(Link *link, sd_device *device);
void link_set_state(Link *link, LinkState state);
void link_check_ready(Link *link);
void link_update_operstate(Link *link, bool also_update_bond_master);
-int link_update(Link *link, sd_netlink_message *message);
-
-void link_dirty(Link *link);
-void link_clean(Link *link);
-int link_save(Link *link);
-int link_save_and_clean(Link *link);
int link_carrier_reset(Link *link);
bool link_has_carrier(Link *link);
int link_configure(Link *link);
int link_reconfigure(Link *link, bool force);
+int manager_udev_process_link(sd_device_monitor *monitor, sd_device *device, void *userdata);
+int manager_rtnl_process_link(sd_netlink *rtnl, sd_netlink_message *message, Manager *m);
+
int log_link_message_full_errno(Link *link, sd_netlink_message *m, int level, int err, const char *msg);
#define log_link_message_error_errno(link, m, err, msg) log_link_message_full_errno(link, m, LOG_ERR, err, msg)
#define log_link_message_warning_errno(link, m, err, msg) log_link_message_full_errno(link, m, LOG_WARNING, err, msg)
#include "fd-util.h"
#include "fileio.h"
+#include "fs-util.h"
#include "networkd-link.h"
#include "networkd-lldp-rx.h"
#include "networkd-lldp-tx.h"
}
int link_lldp_save(Link *link) {
- _cleanup_free_ char *temp_path = NULL;
+ _cleanup_(unlink_and_freep) char *temp_path = NULL;
_cleanup_fclose_ FILE *f = NULL;
sd_lldp_neighbor **l = NULL;
int n = 0, r, i;
r = sd_lldp_get_neighbors(link->lldp, &l);
if (r < 0)
- goto finish;
+ return r;
if (r == 0) {
(void) unlink(link->lldp_file);
- goto finish;
+ return 0;
}
n = r;
if (r < 0)
goto finish;
- if (rename(temp_path, link->lldp_file) < 0) {
- r = -errno;
+ r = conservative_rename(temp_path, link->lldp_file);
+ if (r < 0)
goto finish;
- }
finish:
- if (r < 0) {
- (void) unlink(link->lldp_file);
- if (temp_path)
- (void) unlink(temp_path);
-
+ if (r < 0)
log_link_error_errno(link, r, "Failed to save LLDP data to %s: %m", link->lldp_file);
- }
if (l) {
for (i = 0; i < n; i++)
#include "bus-util.h"
#include "conf-parser.h"
#include "def.h"
-#include "device-private.h"
-#include "device-util.h"
#include "dns-domain.h"
#include "fd-util.h"
#include "fileio.h"
#include "networkd-nexthop.h"
#include "networkd-routing-policy-rule.h"
#include "networkd-speed-meter.h"
+#include "networkd-state-file.h"
#include "ordered-set.h"
#include "path-lookup.h"
#include "path-util.h"
#include "strv.h"
#include "sysctl-util.h"
#include "tmpfile-util.h"
-#include "udev-util.h"
/* use 128 MB for receive socket kernel queue. */
#define RCVBUF_SIZE (128*1024*1024)
return 0;
}
-static int manager_udev_process_link(sd_device_monitor *monitor, sd_device *device, void *userdata) {
- sd_device_action_t action;
- Manager *m = userdata;
- Link *link = NULL;
- int r, ifindex;
-
- assert(m);
- assert(device);
-
- r = sd_device_get_action(device, &action);
- if (r < 0) {
- log_device_debug_errno(device, r, "Failed to get udev action, ignoring device: %m");
- return 0;
- }
-
- /* Ignore the "remove" uevent — let's remove a device only if rtnetlink says so. All other uevents
- * are "positive" events in some form, i.e. inform us about a changed or new network interface, that
- * still exists — and we are interested in that. */
- if (action == SD_DEVICE_REMOVE)
- return 0;
-
- r = sd_device_get_ifindex(device, &ifindex);
- if (r < 0) {
- log_device_debug_errno(device, r, "Ignoring udev %s event for device without ifindex or with invalid ifindex: %m",
- device_action_to_string(action));
- return 0;
- }
-
- r = device_is_renaming(device);
- if (r < 0) {
- log_device_error_errno(device, r, "Failed to determine the device is renamed or not, ignoring '%s' uevent: %m",
- device_action_to_string(action));
- return 0;
- }
- if (r > 0) {
- log_device_debug(device, "Interface is under renaming, wait for the interface to be renamed.");
- return 0;
- }
-
- r = link_get(m, ifindex, &link);
- if (r < 0) {
- if (r != -ENODEV)
- log_debug_errno(r, "Failed to get link from ifindex %i, ignoring: %m", ifindex);
- return 0;
- }
-
- (void) link_initialized(link, device);
-
- return 0;
-}
-
static int manager_connect_udev(Manager *m) {
int r;
return 0;
}
-static int manager_rtnl_process_link(sd_netlink *rtnl, sd_netlink_message *message, Manager *m) {
- Link *link = NULL;
- NetDev *netdev = NULL;
- uint16_t type;
- const char *name;
- int r, ifindex;
-
- assert(rtnl);
- assert(message);
- assert(m);
-
- if (sd_netlink_message_is_error(message)) {
- r = sd_netlink_message_get_errno(message);
- if (r < 0)
- log_message_warning_errno(message, r, "rtnl: Could not receive link message, ignoring");
-
- return 0;
- }
-
- r = sd_netlink_message_get_type(message, &type);
- if (r < 0) {
- log_warning_errno(r, "rtnl: Could not get message type, ignoring: %m");
- return 0;
- } else if (!IN_SET(type, RTM_NEWLINK, RTM_DELLINK)) {
- log_warning("rtnl: Received unexpected message type %u when processing link, ignoring.", type);
- return 0;
- }
-
- r = sd_rtnl_message_link_get_ifindex(message, &ifindex);
- if (r < 0) {
- log_warning_errno(r, "rtnl: Could not get ifindex from link message, ignoring: %m");
- return 0;
- } else if (ifindex <= 0) {
- log_warning("rtnl: received link message with invalid ifindex %d, ignoring.", ifindex);
- return 0;
- }
-
- r = sd_netlink_message_read_string(message, IFLA_IFNAME, &name);
- if (r < 0) {
- log_warning_errno(r, "rtnl: Received link message without ifname, ignoring: %m");
- return 0;
- }
-
- (void) link_get(m, ifindex, &link);
- (void) netdev_get(m, name, &netdev);
-
- switch (type) {
- case RTM_NEWLINK:
- if (!link) {
- /* link is new, so add it */
- r = link_add(m, message, &link);
- if (r < 0) {
- log_warning_errno(r, "Could not process new link message, ignoring: %m");
- return 0;
- }
- }
-
- if (netdev) {
- /* netdev exists, so make sure the ifindex matches */
- r = netdev_set_ifindex(netdev, message);
- if (r < 0) {
- log_warning_errno(r, "Could not process new link message for netdev, ignoring: %m");
- return 0;
- }
- }
-
- r = link_update(link, message);
- if (r < 0) {
- log_warning_errno(r, "Could not process link message, ignoring: %m");
- return 0;
- }
-
- break;
-
- case RTM_DELLINK:
- link_drop(link);
- netdev_drop(netdev);
-
- break;
-
- default:
- assert_not_reached("Received link message with invalid RTNL message type.");
- }
-
- return 1;
-}
-
static int systemd_netlink_fd(void) {
int n, fd, rtnl_fd = -EINVAL;
if (n <= 0)
return -EINVAL;
- for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + n; fd ++) {
+ for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + n; fd ++)
if (sd_is_socket(fd, AF_NETLINK, SOCK_RAW, -1) > 0) {
if (rtnl_fd >= 0)
return -EINVAL;
rtnl_fd = fd;
}
- }
return rtnl_fd;
}
return 0;
}
-static int ordered_set_put_dns_server(OrderedSet *s, int ifindex, struct in_addr_full *dns) {
- const char *p;
- int r;
-
- assert(s);
- assert(dns);
-
- if (dns->ifindex != 0 && dns->ifindex != ifindex)
- return 0;
-
- p = in_addr_full_to_string(dns);
- if (!p)
- return 0;
-
- r = ordered_set_put_strdup(s, p);
- if (r == -EEXIST)
- return 0;
-
- return r;
-}
-
-static int ordered_set_put_dns_servers(OrderedSet *s, int ifindex, struct in_addr_full **dns, unsigned n) {
- int r, c = 0;
-
- assert(s);
- assert(dns || n == 0);
-
- for (unsigned i = 0; i < n; i++) {
- r = ordered_set_put_dns_server(s, ifindex, dns[i]);
- if (r < 0)
- return r;
-
- c += r;
- }
-
- return c;
-}
-
-static int ordered_set_put_in4_addr(OrderedSet *s, const struct in_addr *address) {
- char *p;
- int r;
-
- assert(s);
- assert(address);
-
- r = in_addr_to_string(AF_INET, (const union in_addr_union*) address, &p);
- if (r < 0)
- return r;
-
- r = ordered_set_consume(s, p);
- if (r == -EEXIST)
- return 0;
-
- return r;
-}
-
-static int ordered_set_put_in4_addrv(OrderedSet *s,
- const struct in_addr *addresses,
- size_t n,
- bool (*predicate)(const struct in_addr *addr)) {
- int r, c = 0;
-
- assert(s);
- assert(n == 0 || addresses);
-
- for (size_t i = 0; i < n; i++) {
- if (predicate && !predicate(&addresses[i]))
- continue;
- r = ordered_set_put_in4_addr(s, addresses+i);
- if (r < 0)
- return r;
-
- c += r;
- }
-
- return c;
-}
-
-static int manager_save(Manager *m) {
- _cleanup_ordered_set_free_free_ OrderedSet *dns = NULL, *ntp = NULL, *sip = NULL, *search_domains = NULL, *route_domains = NULL;
- const char *operstate_str, *carrier_state_str, *address_state_str;
- LinkOperationalState operstate = LINK_OPERSTATE_OFF;
- LinkCarrierState carrier_state = LINK_CARRIER_STATE_OFF;
- LinkAddressState address_state = LINK_ADDRESS_STATE_OFF;
- _cleanup_free_ char *temp_path = NULL;
- _cleanup_strv_free_ char **p = NULL;
- _cleanup_fclose_ FILE *f = NULL;
+static int manager_dirty_handler(sd_event_source *s, void *userdata) {
+ Manager *m = userdata;
Link *link;
int r;
assert(m);
- assert(m->state_file);
-
- /* We add all NTP and DNS server to a set, to filter out duplicates */
- dns = ordered_set_new(&string_hash_ops);
- if (!dns)
- return -ENOMEM;
-
- ntp = ordered_set_new(&string_hash_ops);
- if (!ntp)
- return -ENOMEM;
- sip = ordered_set_new(&string_hash_ops);
- if (!sip)
- return -ENOMEM;
-
- search_domains = ordered_set_new(&dns_name_hash_ops);
- if (!search_domains)
- return -ENOMEM;
-
- route_domains = ordered_set_new(&dns_name_hash_ops);
- if (!route_domains)
- return -ENOMEM;
-
- HASHMAP_FOREACH(link, m->links) {
- const struct in_addr *addresses;
-
- if (link->flags & IFF_LOOPBACK)
- continue;
-
- if (link->operstate > operstate)
- operstate = link->operstate;
-
- if (link->carrier_state > carrier_state)
- carrier_state = link->carrier_state;
-
- if (link->address_state > address_state)
- address_state = link->address_state;
-
- if (!link->network)
- continue;
-
- /* First add the static configured entries */
- if (link->n_dns != (unsigned) -1)
- r = ordered_set_put_dns_servers(dns, link->ifindex, link->dns, link->n_dns);
- else
- r = ordered_set_put_dns_servers(dns, link->ifindex, link->network->dns, link->network->n_dns);
+ if (m->dirty) {
+ r = manager_save(m);
if (r < 0)
- return r;
-
- r = ordered_set_put_strdupv(ntp, link->ntp ?: link->network->ntp);
- if (r < 0)
- return r;
-
- r = ordered_set_put_string_set(search_domains, link->search_domains ?: link->network->search_domains);
- if (r < 0)
- return r;
-
- r = ordered_set_put_string_set(route_domains, link->route_domains ?: link->network->route_domains);
- if (r < 0)
- return r;
-
- if (!link->dhcp_lease)
- continue;
-
- /* Secondly, add the entries acquired via DHCP */
- if (link->network->dhcp_use_dns) {
- r = sd_dhcp_lease_get_dns(link->dhcp_lease, &addresses);
- if (r > 0) {
- r = ordered_set_put_in4_addrv(dns, addresses, r, in4_addr_is_non_local);
- if (r < 0)
- return r;
- } else if (r < 0 && r != -ENODATA)
- return r;
- }
-
- if (link->network->dhcp_use_ntp) {
- r = sd_dhcp_lease_get_ntp(link->dhcp_lease, &addresses);
- if (r > 0) {
- r = ordered_set_put_in4_addrv(ntp, addresses, r, in4_addr_is_non_local);
- if (r < 0)
- return r;
- } else if (r < 0 && r != -ENODATA)
- return r;
- }
-
- if (link->network->dhcp_use_sip) {
- r = sd_dhcp_lease_get_sip(link->dhcp_lease, &addresses);
- if (r > 0) {
- r = ordered_set_put_in4_addrv(sip, addresses, r, in4_addr_is_non_local);
- if (r < 0)
- return r;
- } else if (r < 0 && r != -ENODATA)
- return r;
- }
-
- if (link->network->dhcp_use_domains != DHCP_USE_DOMAINS_NO) {
- const char *domainname;
- char **domains = NULL;
-
- OrderedSet *target_domains = (link->network->dhcp_use_domains == DHCP_USE_DOMAINS_YES) ? search_domains : route_domains;
- r = sd_dhcp_lease_get_domainname(link->dhcp_lease, &domainname);
- if (r >= 0) {
- r = ordered_set_put_strdup(target_domains, domainname);
- if (r < 0)
- return r;
- } else if (r != -ENODATA)
- return r;
-
- r = sd_dhcp_lease_get_search_domains(link->dhcp_lease, &domains);
- if (r >= 0) {
- r = ordered_set_put_strdupv(target_domains, domains);
- if (r < 0)
- return r;
- } else if (r != -ENODATA)
- return r;
- }
- }
-
- if (carrier_state >= LINK_CARRIER_STATE_ENSLAVED)
- carrier_state = LINK_CARRIER_STATE_CARRIER;
-
- operstate_str = link_operstate_to_string(operstate);
- assert(operstate_str);
-
- carrier_state_str = link_carrier_state_to_string(carrier_state);
- assert(carrier_state_str);
-
- address_state_str = link_address_state_to_string(address_state);
- assert(address_state_str);
-
- r = fopen_temporary(m->state_file, &f, &temp_path);
- if (r < 0)
- return r;
-
- (void) fchmod(fileno(f), 0644);
-
- fprintf(f,
- "# This is private data. Do not parse.\n"
- "OPER_STATE=%s\n"
- "CARRIER_STATE=%s\n"
- "ADDRESS_STATE=%s\n",
- operstate_str, carrier_state_str, address_state_str);
-
- ordered_set_print(f, "DNS=", dns);
- ordered_set_print(f, "NTP=", ntp);
- ordered_set_print(f, "SIP=", sip);
- ordered_set_print(f, "DOMAINS=", search_domains);
- ordered_set_print(f, "ROUTE_DOMAINS=", route_domains);
-
- r = fflush_and_check(f);
- if (r < 0)
- goto fail;
-
- r = conservative_rename(temp_path, m->state_file);
- if (r < 0)
- goto fail;
-
- if (m->operational_state != operstate) {
- m->operational_state = operstate;
- if (strv_extend(&p, "OperationalState") < 0)
- log_oom();
+ log_warning_errno(r, "Failed to update state file %s, ignoring: %m", m->state_file);
}
- if (m->carrier_state != carrier_state) {
- m->carrier_state = carrier_state;
- if (strv_extend(&p, "CarrierState") < 0)
- log_oom();
- }
-
- if (m->address_state != address_state) {
- m->address_state = address_state;
- if (strv_extend(&p, "AddressState") < 0)
- log_oom();
- }
-
- if (p) {
- r = manager_send_changed_strv(m, p);
+ SET_FOREACH(link, m->dirty_links) {
+ r = link_save_and_clean(link);
if (r < 0)
- log_error_errno(r, "Could not emit changed properties: %m");
+ log_link_warning_errno(link, r, "Failed to update link state file %s, ignoring: %m", link->state_file);
}
- m->dirty = false;
-
- return 0;
-
-fail:
- (void) unlink(m->state_file);
- (void) unlink(temp_path);
-
- return log_error_errno(r, "Failed to save network state to %s: %m", m->state_file);
-}
-
-static int manager_dirty_handler(sd_event_source *s, void *userdata) {
- Manager *m = userdata;
- Link *link;
-
- assert(m);
-
- if (m->dirty)
- manager_save(m);
-
- SET_FOREACH(link, m->dirty_links)
- (void) link_save_and_clean(link);
-
return 1;
}
/* The dirty handler will deal with future serialization, but the first one
must be done explicitly. */
- manager_save(m);
+ r = manager_save(m);
+ if (r < 0)
+ log_warning_errno(r, "Failed to update state file %s, ignoring: %m", m->state_file);
- HASHMAP_FOREACH(link, m->links)
- (void) link_save(link);
+ HASHMAP_FOREACH(link, m->links) {
+ r = link_save(link);
+ if (r < 0)
+ log_link_warning_errno(link, r, "Failed to update link state file %s, ignoring: %m", link->state_file);
+ }
return 0;
}
return NULL;
}
-void manager_dirty(Manager *manager) {
- assert(manager);
-
- /* the serialized state in /run is no longer up-to-date */
- manager->dirty = true;
-}
-
static int set_hostname_handler(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
const sd_bus_error *e;
int r;
int manager_enumerate(Manager *m);
-void manager_dirty(Manager *m);
-
Link* manager_find_uplink(Manager *m, Link *exclude);
int manager_set_hostname(Manager *m, const char *hostname);
#include "networkd-dhcp6.h"
#include "networkd-manager.h"
#include "networkd-ndisc.h"
+#include "networkd-state-file.h"
#include "string-table.h"
#include "string-util.h"
#include "strv.h"
route->pref = preference;
route->gw_family = AF_INET6;
route->gw = gateway;
- route->lifetime = time_now + lifetime * USEC_PER_SEC;
+ route->lifetime = usec_add(time_now, lifetime * USEC_PER_SEC);
route->mtu = mtu;
r = ndisc_route_configure(route, link, rt);
route_gw->protocol = RTPROT_RA;
if (!route_gw->pref_set)
route->pref = preference;
- route_gw->lifetime = time_now + lifetime * USEC_PER_SEC;
+ route_gw->lifetime = usec_add(time_now, lifetime * USEC_PER_SEC);
if (route_gw->mtu == 0)
route_gw->mtu = mtu;
route->protocol = RTPROT_RA;
route->flags = RTM_F_PREFIX;
route->dst_prefixlen = prefixlen;
- route->lifetime = time_now + lifetime * USEC_PER_SEC;
+ route->lifetime = usec_add(time_now, lifetime * USEC_PER_SEC);
r = sd_ndisc_router_prefix_get_address(rt, &route->dst.in6);
if (r < 0)
route->gw_family = AF_INET6;
route->dst = dst;
route->dst_prefixlen = prefixlen;
- route->lifetime = time_now + lifetime * USEC_PER_SEC;
+ route->lifetime = usec_add(time_now, lifetime * USEC_PER_SEC);
r = ndisc_route_configure(route, link, rt);
if (r < 0)
int network_load_one(Manager *manager, OrderedHashmap **networks, const char *filename) {
_cleanup_free_ char *fname = NULL, *name = NULL;
_cleanup_(network_unrefp) Network *network = NULL;
- _cleanup_fclose_ FILE *file = NULL;
const char *dropin_dirname;
char *d;
int r;
assert(manager);
assert(filename);
- file = fopen(filename, "re");
- if (!file) {
- if (errno == ENOENT)
- return 0;
-
- return -errno;
- }
-
- if (null_or_empty_fd(fileno(file))) {
+ r = null_or_empty_path(filename);
+ if (r == -ENOENT)
+ return 0;
+ if (r < 0)
+ return r;
+ if (r > 0) {
log_debug("Skipping empty file: %s", filename);
return 0;
}
return -ENOMEM;
*sr_iov = (SRIOV) {
- .vf = (uint32_t) -1,
+ .vf = UINT32_MAX,
.vlan_proto = ETH_P_8021Q,
.vf_spoof_check_setting = -1,
.trust = -1,
if (section_is_invalid(sr_iov->section))
return -EINVAL;
- if (sr_iov->vf == (uint32_t) -1)
+ if (sr_iov->vf == UINT32_MAX)
return log_warning_errno(SYNTHETIC_ERRNO(EINVAL),
"%s: [SRIOV] section without VirtualFunction= field configured. "
"Ignoring [SRIOV] section from line %u.",
if (isempty(rvalue)) {
if (streq(lvalue, "VirtualFunction"))
- sr_iov->vf = (uint32_t) -1;
+ sr_iov->vf = UINT32_MAX;
else if (streq(lvalue, "VLANId"))
sr_iov->vlan = 0;
else if (streq(lvalue, "QualityOfService"))
--- /dev/null
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include <netinet/in.h>
+#include <linux/if.h>
+
+#include "alloc-util.h"
+#include "dns-domain.h"
+#include "fd-util.h"
+#include "fileio.h"
+#include "fs-util.h"
+#include "network-internal.h"
+#include "networkd-link.h"
+#include "networkd-manager-bus.h"
+#include "networkd-manager.h"
+#include "networkd-network.h"
+#include "networkd-state-file.h"
+#include "ordered-set.h"
+#include "set.h"
+#include "strv.h"
+#include "tmpfile-util.h"
+
+static int ordered_set_put_dns_server(OrderedSet *s, int ifindex, struct in_addr_full *dns) {
+ const char *p;
+ int r;
+
+ assert(s);
+ assert(dns);
+
+ if (dns->ifindex != 0 && dns->ifindex != ifindex)
+ return 0;
+
+ p = in_addr_full_to_string(dns);
+ if (!p)
+ return 0;
+
+ r = ordered_set_put_strdup(s, p);
+ if (r == -EEXIST)
+ return 0;
+
+ return r;
+}
+
+static int ordered_set_put_dns_servers(OrderedSet *s, int ifindex, struct in_addr_full **dns, unsigned n) {
+ int r, c = 0;
+
+ assert(s);
+ assert(dns || n == 0);
+
+ for (unsigned i = 0; i < n; i++) {
+ r = ordered_set_put_dns_server(s, ifindex, dns[i]);
+ if (r < 0)
+ return r;
+
+ c += r;
+ }
+
+ return c;
+}
+
+static int ordered_set_put_in4_addr(OrderedSet *s, const struct in_addr *address) {
+ char *p;
+ int r;
+
+ assert(s);
+ assert(address);
+
+ r = in_addr_to_string(AF_INET, (const union in_addr_union*) address, &p);
+ if (r < 0)
+ return r;
+
+ r = ordered_set_consume(s, p);
+ if (r == -EEXIST)
+ return 0;
+
+ return r;
+}
+
+static int ordered_set_put_in4_addrv(
+ OrderedSet *s,
+ const struct in_addr *addresses,
+ size_t n,
+ bool (*predicate)(const struct in_addr *addr)) {
+
+ int r, c = 0;
+
+ assert(s);
+ assert(n == 0 || addresses);
+
+ for (size_t i = 0; i < n; i++) {
+ if (predicate && !predicate(&addresses[i]))
+ continue;
+ r = ordered_set_put_in4_addr(s, addresses+i);
+ if (r < 0)
+ return r;
+
+ c += r;
+ }
+
+ return c;
+}
+
+int manager_save(Manager *m) {
+ _cleanup_ordered_set_free_free_ OrderedSet *dns = NULL, *ntp = NULL, *sip = NULL, *search_domains = NULL, *route_domains = NULL;
+ const char *operstate_str, *carrier_state_str, *address_state_str;
+ LinkOperationalState operstate = LINK_OPERSTATE_OFF;
+ LinkCarrierState carrier_state = LINK_CARRIER_STATE_OFF;
+ LinkAddressState address_state = LINK_ADDRESS_STATE_OFF;
+ _cleanup_(unlink_and_freep) char *temp_path = NULL;
+ _cleanup_strv_free_ char **p = NULL;
+ _cleanup_fclose_ FILE *f = NULL;
+ Link *link;
+ int r;
+
+ assert(m);
+ assert(m->state_file);
+
+ /* We add all NTP and DNS server to a set, to filter out duplicates */
+ dns = ordered_set_new(&string_hash_ops);
+ if (!dns)
+ return -ENOMEM;
+
+ ntp = ordered_set_new(&string_hash_ops);
+ if (!ntp)
+ return -ENOMEM;
+
+ sip = ordered_set_new(&string_hash_ops);
+ if (!sip)
+ return -ENOMEM;
+
+ search_domains = ordered_set_new(&dns_name_hash_ops);
+ if (!search_domains)
+ return -ENOMEM;
+
+ route_domains = ordered_set_new(&dns_name_hash_ops);
+ if (!route_domains)
+ return -ENOMEM;
+
+ HASHMAP_FOREACH(link, m->links) {
+ const struct in_addr *addresses;
+
+ if (link->flags & IFF_LOOPBACK)
+ continue;
+
+ if (link->operstate > operstate)
+ operstate = link->operstate;
+
+ if (link->carrier_state > carrier_state)
+ carrier_state = link->carrier_state;
+
+ if (link->address_state > address_state)
+ address_state = link->address_state;
+
+ if (!link->network)
+ continue;
+
+ /* First add the static configured entries */
+ if (link->n_dns != UINT_MAX)
+ r = ordered_set_put_dns_servers(dns, link->ifindex, link->dns, link->n_dns);
+ else
+ r = ordered_set_put_dns_servers(dns, link->ifindex, link->network->dns, link->network->n_dns);
+ if (r < 0)
+ return r;
+
+ r = ordered_set_put_strdupv(ntp, link->ntp ?: link->network->ntp);
+ if (r < 0)
+ return r;
+
+ r = ordered_set_put_string_set(search_domains, link->search_domains ?: link->network->search_domains);
+ if (r < 0)
+ return r;
+
+ r = ordered_set_put_string_set(route_domains, link->route_domains ?: link->network->route_domains);
+ if (r < 0)
+ return r;
+
+ if (!link->dhcp_lease)
+ continue;
+
+ /* Secondly, add the entries acquired via DHCP */
+ if (link->network->dhcp_use_dns) {
+ r = sd_dhcp_lease_get_dns(link->dhcp_lease, &addresses);
+ if (r > 0) {
+ r = ordered_set_put_in4_addrv(dns, addresses, r, in4_addr_is_non_local);
+ if (r < 0)
+ return r;
+ } else if (r < 0 && r != -ENODATA)
+ return r;
+ }
+
+ if (link->network->dhcp_use_ntp) {
+ r = sd_dhcp_lease_get_ntp(link->dhcp_lease, &addresses);
+ if (r > 0) {
+ r = ordered_set_put_in4_addrv(ntp, addresses, r, in4_addr_is_non_local);
+ if (r < 0)
+ return r;
+ } else if (r < 0 && r != -ENODATA)
+ return r;
+ }
+
+ if (link->network->dhcp_use_sip) {
+ r = sd_dhcp_lease_get_sip(link->dhcp_lease, &addresses);
+ if (r > 0) {
+ r = ordered_set_put_in4_addrv(sip, addresses, r, in4_addr_is_non_local);
+ if (r < 0)
+ return r;
+ } else if (r < 0 && r != -ENODATA)
+ return r;
+ }
+
+ if (link->network->dhcp_use_domains != DHCP_USE_DOMAINS_NO) {
+ const char *domainname;
+ char **domains = NULL;
+
+ OrderedSet *target_domains = (link->network->dhcp_use_domains == DHCP_USE_DOMAINS_YES) ? search_domains : route_domains;
+ r = sd_dhcp_lease_get_domainname(link->dhcp_lease, &domainname);
+ if (r >= 0) {
+ r = ordered_set_put_strdup(target_domains, domainname);
+ if (r < 0)
+ return r;
+ } else if (r != -ENODATA)
+ return r;
+
+ r = sd_dhcp_lease_get_search_domains(link->dhcp_lease, &domains);
+ if (r >= 0) {
+ r = ordered_set_put_strdupv(target_domains, domains);
+ if (r < 0)
+ return r;
+ } else if (r != -ENODATA)
+ return r;
+ }
+ }
+
+ if (carrier_state >= LINK_CARRIER_STATE_ENSLAVED)
+ carrier_state = LINK_CARRIER_STATE_CARRIER;
+
+ operstate_str = link_operstate_to_string(operstate);
+ assert(operstate_str);
+
+ carrier_state_str = link_carrier_state_to_string(carrier_state);
+ assert(carrier_state_str);
+
+ address_state_str = link_address_state_to_string(address_state);
+ assert(address_state_str);
+
+ r = fopen_temporary(m->state_file, &f, &temp_path);
+ if (r < 0)
+ return r;
+
+ (void) fchmod(fileno(f), 0644);
+
+ fprintf(f,
+ "# This is private data. Do not parse.\n"
+ "OPER_STATE=%s\n"
+ "CARRIER_STATE=%s\n"
+ "ADDRESS_STATE=%s\n",
+ operstate_str, carrier_state_str, address_state_str);
+
+ ordered_set_print(f, "DNS=", dns);
+ ordered_set_print(f, "NTP=", ntp);
+ ordered_set_print(f, "SIP=", sip);
+ ordered_set_print(f, "DOMAINS=", search_domains);
+ ordered_set_print(f, "ROUTE_DOMAINS=", route_domains);
+
+ r = fflush_and_check(f);
+ if (r < 0)
+ return r;
+
+ r = conservative_rename(temp_path, m->state_file);
+ if (r < 0)
+ return r;
+
+ temp_path = mfree(temp_path);
+
+ if (m->operational_state != operstate) {
+ m->operational_state = operstate;
+ if (strv_extend(&p, "OperationalState") < 0)
+ log_oom();
+ }
+
+ if (m->carrier_state != carrier_state) {
+ m->carrier_state = carrier_state;
+ if (strv_extend(&p, "CarrierState") < 0)
+ log_oom();
+ }
+
+ if (m->address_state != address_state) {
+ m->address_state = address_state;
+ if (strv_extend(&p, "AddressState") < 0)
+ log_oom();
+ }
+
+ if (p) {
+ r = manager_send_changed_strv(m, p);
+ if (r < 0)
+ log_warning_errno(r, "Could not emit changed properties, ignoring: %m");
+ }
+
+ m->dirty = false;
+
+ return 0;
+}
+
+static void print_link_hashmap(FILE *f, const char *prefix, Hashmap* h) {
+ bool space = false;
+ Link *link;
+
+ assert(f);
+ assert(prefix);
+
+ if (hashmap_isempty(h))
+ return;
+
+ fputs(prefix, f);
+ HASHMAP_FOREACH(link, h) {
+ if (space)
+ fputc(' ', f);
+
+ fprintf(f, "%i", link->ifindex);
+ space = true;
+ }
+
+ fputc('\n', f);
+}
+
+static void link_save_dns(Link *link, FILE *f, struct in_addr_full **dns, unsigned n_dns, bool *space) {
+ for (unsigned j = 0; j < n_dns; j++) {
+ const char *str;
+
+ if (dns[j]->ifindex != 0 && dns[j]->ifindex != link->ifindex)
+ continue;
+
+ str = in_addr_full_to_string(dns[j]);
+ if (!str)
+ continue;
+
+ if (*space)
+ fputc(' ', f);
+ fputs(str, f);
+ *space = true;
+ }
+}
+
+static void serialize_addresses(
+ FILE *f,
+ const char *lvalue,
+ bool *space,
+ char **addresses,
+ sd_dhcp_lease *lease,
+ bool conditional,
+ sd_dhcp_lease_server_type_t what,
+ sd_dhcp6_lease *lease6,
+ bool conditional6,
+ int (*lease6_get_addr)(sd_dhcp6_lease*, const struct in6_addr**),
+ int (*lease6_get_fqdn)(sd_dhcp6_lease*, char ***)) {
+
+ bool _space = false;
+ int r;
+
+ if (!space)
+ space = &_space;
+
+ if (lvalue)
+ fprintf(f, "%s=", lvalue);
+ fputstrv(f, addresses, NULL, space);
+
+ if (lease && conditional) {
+ const struct in_addr *lease_addresses;
+
+ r = sd_dhcp_lease_get_servers(lease, what, &lease_addresses);
+ if (r > 0)
+ serialize_in_addrs(f, lease_addresses, r, space, in4_addr_is_non_local);
+ }
+
+ if (lease6 && conditional6 && lease6_get_addr) {
+ const struct in6_addr *in6_addrs;
+
+ r = lease6_get_addr(lease6, &in6_addrs);
+ if (r > 0)
+ serialize_in6_addrs(f, in6_addrs, r, space);
+ }
+
+ if (lease6 && conditional6 && lease6_get_fqdn) {
+ char **in6_hosts;
+
+ r = lease6_get_fqdn(lease6, &in6_hosts);
+ if (r > 0)
+ fputstrv(f, in6_hosts, NULL, space);
+ }
+
+ if (lvalue)
+ fputc('\n', f);
+}
+
+int link_save(Link *link) {
+ const char *admin_state, *oper_state, *carrier_state, *address_state;
+ _cleanup_(unlink_and_freep) char *temp_path = NULL;
+ _cleanup_fclose_ FILE *f = NULL;
+ int r;
+
+ assert(link);
+ assert(link->state_file);
+ assert(link->lease_file);
+ assert(link->manager);
+
+ if (link->state == LINK_STATE_LINGER)
+ return 0;
+
+ link_lldp_save(link);
+
+ admin_state = link_state_to_string(link->state);
+ assert(admin_state);
+
+ oper_state = link_operstate_to_string(link->operstate);
+ assert(oper_state);
+
+ carrier_state = link_carrier_state_to_string(link->carrier_state);
+ assert(carrier_state);
+
+ address_state = link_address_state_to_string(link->address_state);
+ assert(address_state);
+
+ r = fopen_temporary(link->state_file, &f, &temp_path);
+ if (r < 0)
+ return r;
+
+ (void) fchmod(fileno(f), 0644);
+
+ fprintf(f,
+ "# This is private data. Do not parse.\n"
+ "ADMIN_STATE=%s\n"
+ "OPER_STATE=%s\n"
+ "CARRIER_STATE=%s\n"
+ "ADDRESS_STATE=%s\n",
+ admin_state, oper_state, carrier_state, address_state);
+
+ if (link->network) {
+ char **dhcp6_domains = NULL, **dhcp_domains = NULL;
+ const char *dhcp_domainname = NULL, *p;
+ bool space;
+
+ fprintf(f, "REQUIRED_FOR_ONLINE=%s\n",
+ yes_no(link->network->required_for_online));
+
+ LinkOperationalStateRange st = link->network->required_operstate_for_online;
+ fprintf(f, "REQUIRED_OPER_STATE_FOR_ONLINE=%s%s%s\n",
+ strempty(link_operstate_to_string(st.min)),
+ st.max != LINK_OPERSTATE_RANGE_DEFAULT.max ? ":" : "",
+ st.max != LINK_OPERSTATE_RANGE_DEFAULT.max ? strempty(link_operstate_to_string(st.max)) : "");
+
+ fprintf(f, "ACTIVATION_POLICY=%s\n",
+ activation_policy_to_string(link->network->activation_policy));
+
+ fprintf(f, "NETWORK_FILE=%s\n", link->network->filename);
+
+ /************************************************************/
+
+ fputs("DNS=", f);
+ space = false;
+ if (link->n_dns != UINT_MAX)
+ link_save_dns(link, f, link->dns, link->n_dns, &space);
+ else
+ link_save_dns(link, f, link->network->dns, link->network->n_dns, &space);
+
+ serialize_addresses(f, NULL, &space,
+ NULL,
+ link->dhcp_lease,
+ link->network->dhcp_use_dns,
+ SD_DHCP_LEASE_DNS,
+ link->dhcp6_lease,
+ link->network->dhcp6_use_dns,
+ sd_dhcp6_lease_get_dns,
+ NULL);
+
+ /* Make sure to flush out old entries before we use the NDisc data */
+ ndisc_vacuum(link);
+
+ if (link->network->ipv6_accept_ra_use_dns && link->ndisc_rdnss) {
+ NDiscRDNSS *dd;
+
+ SET_FOREACH(dd, link->ndisc_rdnss)
+ serialize_in6_addrs(f, &dd->address, 1, &space);
+ }
+
+ fputc('\n', f);
+
+ /************************************************************/
+
+ serialize_addresses(f, "NTP", NULL,
+ link->ntp ?: link->network->ntp,
+ link->dhcp_lease,
+ link->network->dhcp_use_ntp,
+ SD_DHCP_LEASE_NTP,
+ link->dhcp6_lease,
+ link->network->dhcp6_use_ntp,
+ sd_dhcp6_lease_get_ntp_addrs,
+ sd_dhcp6_lease_get_ntp_fqdn);
+
+ serialize_addresses(f, "SIP", NULL,
+ NULL,
+ link->dhcp_lease,
+ link->network->dhcp_use_sip,
+ SD_DHCP_LEASE_SIP,
+ NULL, false, NULL, NULL);
+
+ /************************************************************/
+
+ if (link->network->dhcp_use_domains != DHCP_USE_DOMAINS_NO) {
+ if (link->dhcp_lease) {
+ (void) sd_dhcp_lease_get_domainname(link->dhcp_lease, &dhcp_domainname);
+ (void) sd_dhcp_lease_get_search_domains(link->dhcp_lease, &dhcp_domains);
+ }
+ if (link->dhcp6_lease)
+ (void) sd_dhcp6_lease_get_domains(link->dhcp6_lease, &dhcp6_domains);
+ }
+
+ fputs("DOMAINS=", f);
+ space = false;
+ ORDERED_SET_FOREACH(p, link->search_domains ?: link->network->search_domains)
+ fputs_with_space(f, p, NULL, &space);
+
+ if (link->network->dhcp_use_domains == DHCP_USE_DOMAINS_YES) {
+ if (dhcp_domainname)
+ fputs_with_space(f, dhcp_domainname, NULL, &space);
+ if (dhcp_domains)
+ fputstrv(f, dhcp_domains, NULL, &space);
+ if (dhcp6_domains)
+ fputstrv(f, dhcp6_domains, NULL, &space);
+ }
+
+ if (link->network->ipv6_accept_ra_use_domains == DHCP_USE_DOMAINS_YES) {
+ NDiscDNSSL *dd;
+
+ SET_FOREACH(dd, link->ndisc_dnssl)
+ fputs_with_space(f, NDISC_DNSSL_DOMAIN(dd), NULL, &space);
+ }
+
+ fputc('\n', f);
+
+ /************************************************************/
+
+ fputs("ROUTE_DOMAINS=", f);
+ space = false;
+ ORDERED_SET_FOREACH(p, link->route_domains ?: link->network->route_domains)
+ fputs_with_space(f, p, NULL, &space);
+
+ if (link->network->dhcp_use_domains == DHCP_USE_DOMAINS_ROUTE) {
+ if (dhcp_domainname)
+ fputs_with_space(f, dhcp_domainname, NULL, &space);
+ if (dhcp_domains)
+ fputstrv(f, dhcp_domains, NULL, &space);
+ if (dhcp6_domains)
+ fputstrv(f, dhcp6_domains, NULL, &space);
+ }
+
+ if (link->network->ipv6_accept_ra_use_domains == DHCP_USE_DOMAINS_ROUTE) {
+ NDiscDNSSL *dd;
+
+ SET_FOREACH(dd, link->ndisc_dnssl)
+ fputs_with_space(f, NDISC_DNSSL_DOMAIN(dd), NULL, &space);
+ }
+
+ fputc('\n', f);
+
+ /************************************************************/
+
+ fprintf(f, "LLMNR=%s\n",
+ resolve_support_to_string(link->llmnr >= 0 ? link->llmnr : link->network->llmnr));
+
+ /************************************************************/
+
+ fprintf(f, "MDNS=%s\n",
+ resolve_support_to_string(link->mdns >= 0 ? link->mdns : link->network->mdns));
+
+ /************************************************************/
+
+ int dns_default_route =
+ link->dns_default_route >= 0 ? link->dns_default_route :
+ link->network->dns_default_route;
+ if (dns_default_route >= 0)
+ fprintf(f, "DNS_DEFAULT_ROUTE=%s\n", yes_no(dns_default_route));
+
+ /************************************************************/
+
+ DnsOverTlsMode dns_over_tls_mode =
+ link->dns_over_tls_mode != _DNS_OVER_TLS_MODE_INVALID ? link->dns_over_tls_mode :
+ link->network->dns_over_tls_mode;
+ if (dns_over_tls_mode != _DNS_OVER_TLS_MODE_INVALID)
+ fprintf(f, "DNS_OVER_TLS=%s\n", dns_over_tls_mode_to_string(dns_over_tls_mode));
+
+ /************************************************************/
+
+ DnssecMode dnssec_mode =
+ link->dnssec_mode != _DNSSEC_MODE_INVALID ? link->dnssec_mode :
+ link->network->dnssec_mode;
+ if (dnssec_mode != _DNSSEC_MODE_INVALID)
+ fprintf(f, "DNSSEC=%s\n", dnssec_mode_to_string(dnssec_mode));
+
+ /************************************************************/
+
+ Set *nta_anchors = link->dnssec_negative_trust_anchors;
+ if (set_isempty(nta_anchors))
+ nta_anchors = link->network->dnssec_negative_trust_anchors;
+
+ if (!set_isempty(nta_anchors)) {
+ const char *n;
+
+ fputs("DNSSEC_NTA=", f);
+ space = false;
+ SET_FOREACH(n, nta_anchors)
+ fputs_with_space(f, n, NULL, &space);
+ fputc('\n', f);
+ }
+ }
+
+ print_link_hashmap(f, "CARRIER_BOUND_TO=", link->bound_to_links);
+ print_link_hashmap(f, "CARRIER_BOUND_BY=", link->bound_by_links);
+
+ if (link->dhcp_lease) {
+ r = dhcp_lease_save(link->dhcp_lease, link->lease_file);
+ if (r < 0)
+ return r;
+
+ fprintf(f,
+ "DHCP_LEASE=%s\n",
+ link->lease_file);
+ } else
+ (void) unlink(link->lease_file);
+
+ r = link_serialize_dhcp6_client(link, f);
+ if (r < 0)
+ return r;
+
+ r = fflush_and_check(f);
+ if (r < 0)
+ return r;
+
+ r = conservative_rename(temp_path, link->state_file);
+ if (r < 0)
+ return r;
+
+ temp_path = mfree(temp_path);
+
+ return 0;
+}
+
+void link_dirty(Link *link) {
+ int r;
+
+ assert(link);
+ assert(link->manager);
+
+ /* The serialized state in /run is no longer up-to-date. */
+
+ /* Also mark manager dirty as link is dirty */
+ link->manager->dirty = true;
+
+ r = set_ensure_put(&link->manager->dirty_links, NULL, link);
+ if (r <= 0)
+ /* Ignore allocation errors and don't take another ref if the link was already dirty */
+ return;
+ link_ref(link);
+}
+
+void link_clean(Link *link) {
+ assert(link);
+ assert(link->manager);
+
+ /* The serialized state in /run is up-to-date */
+
+ link_unref(set_remove(link->manager->dirty_links, link));
+}
+
+int link_save_and_clean(Link *link) {
+ int r;
+
+ r = link_save(link);
+ if (r < 0)
+ return r;
+
+ link_clean(link);
+ return 0;
+}
--- /dev/null
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#pragma once
+
+typedef struct Link Link;
+typedef struct Manager Manager;
+
+void link_dirty(Link *link);
+void link_clean(Link *link);
+int link_save(Link *link);
+int link_save_and_clean(Link *link);
+
+int manager_save(Manager *m);
if (r < 0)
return r;
- r = fw_ctx_new(&m->fw_ctx);
- if (r < 0)
- log_warning_errno(r, "Could not initialize firewall, IPMasquerade= option not available: %m");
-
r = manager_start(m);
if (r < 0)
return log_error_errno(r, "Could not start manager: %m");
(void) sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL);
if (timeout > 0) {
- usec_t usec;
-
- usec = now(clock_boottime_or_monotonic()) + timeout;
-
- r = sd_event_add_time(m->event, NULL, clock_boottime_or_monotonic(), usec, 0, NULL, INT_TO_PTR(-ETIMEDOUT));
- if (r < 0)
+ r = sd_event_add_time_relative(m->event, NULL, clock_boottime_or_monotonic(), timeout, 0, NULL, INT_TO_PTR(-ETIMEDOUT));
+ if (r < 0 && r != -EOVERFLOW)
return r;
}
ucred data, and sd_pid_notify() uses the real UID for filling in ucred. */
if (arg_gid != GID_INVALID &&
- setregid(arg_gid, (gid_t) -1) < 0)
+ setregid(arg_gid, GID_INVALID) < 0)
return log_error_errno(errno, "Failed to change GID: %m");
if (arg_uid != UID_INVALID &&
- setreuid(arg_uid, (uid_t) -1) < 0)
+ setreuid(arg_uid, UID_INVALID) < 0)
return log_error_errno(errno, "Failed to change UID: %m");
if (arg_pid > 0)
m |= UINT64_C(1) << cap;
}
- if (*mask == (uint64_t) -1)
+ if (*mask == UINT64_MAX)
*mask = m;
else
*mask |= m;
if (r < 0)
return r;
- if (s->full_capabilities.bounding != (uint64_t) -1) {
+ if (s->full_capabilities.bounding != UINT64_MAX) {
s->capability = s->full_capabilities.bounding;
s->drop_capability = ~s->full_capabilities.bounding;
}
assert_cc(sizeof(uid_t) == sizeof(gid_t));
/* This is very much like oci_uid_gid(), except the checks are a bit different, as this is a UID range rather
- * than a specific UID, and hence (uid_t) -1 has no special significance. OTOH a range of zero makes no
+ * than a specific UID, and hence UID_INVALID has no special significance. OTOH a range of zero makes no
* sense. */
k = json_variant_unsigned(v);
*node = (DeviceNode) {
.uid = UID_INVALID,
.gid = GID_INVALID,
- .major = (unsigned) -1,
- .minor = (unsigned) -1,
+ .major = UINT_MAX,
+ .minor = UINT_MAX,
.mode = 0644,
};
if (S_ISCHR(node->mode) || S_ISBLK(node->mode)) {
_cleanup_free_ char *path = NULL;
- if (node->major == (unsigned) -1 || node->minor == (unsigned) -1) {
+ if (node->major == UINT_MAX || node->minor == UINT_MAX) {
r = json_log(e, flags, SYNTHETIC_ERRNO(EINVAL),
"Major/minor required when device node is device node");
goto fail_element;
JSON_VARIANT_ARRAY_FOREACH(e, v) {
struct device_data data = {
- .major = (unsigned) -1,
- .minor = (unsigned) -1,
+ .major = UINT_MAX,
+ .minor = UINT_MAX,
}, *a;
static const JsonDispatch table[] = {
* is really borked in the spec, with one exception: the entry that's supposed to
* drop the kernel's default we ignore silently */
- if (!data.r || !data.w || !data.m || data.type != 0 || data.major != (unsigned) -1 || data.minor != (unsigned) -1)
+ if (!data.r || !data.w || !data.m || data.type != 0 || data.major != UINT_MAX || data.minor != UINT_MAX)
json_log(v, flags|JSON_WARNING, 0, "Devices cgroup allow list with arbitrary 'allow' entries not supported, ignoring.");
/* We ignore the 'deny' entry as for us that's implied */
continue;
}
- if (data.minor != (unsigned) -1 && data.major == (unsigned) -1)
+ if (data.minor != UINT_MAX && data.major == UINT_MAX)
return json_log(v, flags, SYNTHETIC_ERRNO(EOPNOTSUPP),
"Device cgroup allow list entries with minors but no majors not supported.");
- if (data.major != (unsigned) -1 && data.type == 0)
+ if (data.major != UINT_MAX && data.type == 0)
return json_log(v, flags, SYNTHETIC_ERRNO(EOPNOTSUPP),
"Device cgroup allow list entries with majors but no device node type not supported.");
char access[4];
size_t n = 0;
- if (list[i].minor == (unsigned) -1) {
+ if (list[i].minor == UINT_MAX) {
const char *t;
if (list[i].type == S_IFBLK)
t = "char";
}
- if (list[i].major == (unsigned) -1) {
+ if (list[i].major == UINT_MAX) {
pattern = strjoin(t, "-*");
if (!pattern)
return log_oom();
}
} else {
- assert(list[i].major != (unsigned) -1); /* If a minor is specified, then a major also needs to be specified */
+ assert(list[i].major != UINT_MAX); /* If a minor is specified, then a major also needs to be specified */
r = device_path_make_major_minor(list[i].type, makedev(list[i].major, list[i].minor), &pattern);
if (r < 0)
unsigned minor;
uintmax_t weight;
} data = {
- .major = (unsigned) -1,
- .minor = (unsigned) -1,
+ .major = UINT_MAX,
+ .minor = UINT_MAX,
.weight = UINTMAX_MAX,
};
unsigned minor;
uintmax_t rate;
} data = {
- .major = (unsigned) -1,
- .minor = (unsigned) -1,
+ .major = UINT_MAX,
+ .minor = UINT_MAX,
};
static const JsonDispatch table[] = {
{ "args", JSON_VARIANT_ARRAY, oci_seccomp_args, 0, 0 },
};
struct syscall_rule rule = {
- .action = (uint32_t) -1,
+ .action = UINT32_MAX,
};
char **i;
.gid = GID_INVALID,
.console_mode = _CONSOLE_MODE_INVALID,
- .console_width = (unsigned) -1,
- .console_height = (unsigned) -1,
+ .console_width = UINT_MAX,
+ .console_height = UINT_MAX,
- .clone_ns_flags = (unsigned long) -1,
+ .clone_ns_flags = ULONG_MAX,
.use_cgns = -1,
};
break;
if (streq(word, "all"))
- u = (uint64_t) -1;
+ u = UINT64_MAX;
else {
r = capability_from_name(word);
if (r < 0) {
static CPUSet arg_cpu_set = {};
static ResolvConfMode arg_resolv_conf = RESOLV_CONF_AUTO;
static TimezoneMode arg_timezone = TIMEZONE_AUTO;
-static unsigned arg_console_width = (unsigned) -1, arg_console_height = (unsigned) -1;
+static unsigned arg_console_width = UINT_MAX, arg_console_height = UINT_MAX;
static DeviceNode* arg_extra_nodes = NULL;
static size_t arg_n_extra_nodes = 0;
static char **arg_sysctl = NULL;
}
if (streq(t, "all"))
- mask = (uint64_t) -1;
+ mask = UINT64_MAX;
else {
r = capability_from_name(t);
if (r < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Cannot use --port= without private networking.");
if (arg_caps_ambient) {
- if (arg_caps_ambient == (uint64_t)-1)
+ if (arg_caps_ambient == UINT64_MAX)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "AmbientCapability= does not support the value all.");
if ((arg_caps_ambient & arg_caps_retain) != arg_caps_ambient)
if (capability_quintet_is_set(&arg_full_capabilities)) {
q = arg_full_capabilities;
- if (q.bounding == (uint64_t) -1)
+ if (q.bounding == UINT64_MAX)
q.bounding = uid == 0 ? arg_caps_retain : 0;
- if (q.effective == (uint64_t) -1)
+ if (q.effective == UINT64_MAX)
q.effective = uid == 0 ? q.bounding : 0;
- if (q.inheritable == (uint64_t) -1)
+ if (q.inheritable == UINT64_MAX)
q.inheritable = uid == 0 ? q.bounding : arg_caps_ambient;
- if (q.permitted == (uint64_t) -1)
+ if (q.permitted == UINT64_MAX)
q.permitted = uid == 0 ? q.bounding : arg_caps_ambient;
- if (q.ambient == (uint64_t) -1 && ambient_capabilities_supported())
+ if (q.ambient == UINT64_MAX && ambient_capabilities_supported())
q.ambient = arg_caps_ambient;
if (capability_quintet_mangle(&q))
.effective = uid == 0 ? arg_caps_retain : 0,
.inheritable = uid == 0 ? arg_caps_retain : arg_caps_ambient,
.permitted = uid == 0 ? arg_caps_retain : arg_caps_ambient,
- .ambient = ambient_capabilities_supported() ? arg_caps_ambient : (uint64_t) -1,
+ .ambient = ambient_capabilities_supported() ? arg_caps_ambient : UINT64_MAX,
};
/* If we're not using OCI, proceed with mangled capabilities (so we don't error out)
arg_uid_range = UINT32_C(0x10000);
}
- if (arg_uid_shift > (uid_t) -1 - arg_uid_range)
+ if (arg_uid_shift > UID_INVALID - arg_uid_range)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"UID base too high for UID range.");
}
if ((arg_settings_mask & SETTING_CLONE_NS_FLAGS) == 0 &&
- settings->clone_ns_flags != (unsigned long) -1) {
+ settings->clone_ns_flags != ULONG_MAX) {
if (!arg_settings_trusted)
log_warning("Ignoring namespace setting, file '%s' is not trusted.", path);
if (child_netns_fd < 0)
return log_error_errno(errno, "Cannot open file %s: %m", arg_network_namespace_path);
- r = fd_is_network_ns(child_netns_fd);
+ r = fd_is_ns(child_netns_fd, CLONE_NEWNET);
if (r == -EUCLEAN)
log_debug_errno(r, "Cannot determine if passed network namespace path '%s' really refers to a network namespace, assuming it does.", arg_network_namespace_path);
else if (r < 0)
if (r < 0)
return log_error_errno(r, "Failed to create PTY forwarder: %m");
- if (arg_console_width != (unsigned) -1 || arg_console_height != (unsigned) -1)
+ if (arg_console_width != UINT_MAX || arg_console_height != UINT_MAX)
(void) pty_forward_set_width_height(forward,
arg_console_width,
arg_console_height);
/* Try to flush whatever is still queued in the pty */
if (master >= 0) {
- (void) copy_bytes(master, STDOUT_FILENO, (uint64_t) -1, 0);
+ (void) copy_bytes(master, STDOUT_FILENO, UINT64_MAX, 0);
master = safe_close(master);
}
return bus_log_parse_error(r);
fflush(stdout);
- return copy_bytes(fd, STDOUT_FILENO, (uint64_t) -1, 0);
+ return copy_bytes(fd, STDOUT_FILENO, UINT64_MAX, 0);
}
static int parse_argv(int argc, char *argv[]) {
continue;
}
- ret = oomd_insert_cgroup_context(NULL, monitor_hm, empty_to_root(reply.path));
+ ret = oomd_insert_cgroup_context(NULL, monitor_hm, reply.path);
if (ret == -ENOMEM) {
r = ret;
goto finish;
}
+ if (ret < 0 && ret != -EEXIST)
+ log_debug_errno(ret, "Failed to insert reply, ignoring: %m");
/* Always update the limit in case it was changed. For non-memory pressure detection the value is
* ignored so always updating it here is not a problem. */
return r;
else if (r == 0) { /* No subgroups? We're a leaf node */
r = oomd_insert_cgroup_context(NULL, new_h, path);
- return (r == -ENOMEM) ? r : 0;
+ if (r == -ENOMEM)
+ return r;
+ if (r < 0)
+ log_debug_errno(r, "Failed to insert context for %s, ignoring: %m", path);
+ return 0;
}
do {
r = cg_get_attribute_as_bool("memory", cg_path, "memory.oom.group", &oom_group);
/* The cgroup might be gone. Skip it as a candidate since we can't get information on it. */
- if (r < 0)
- return (r == -ENOMEM) ? r : 0;
+ if (r == -ENOMEM)
+ return r;
+ if (r < 0) {
+ log_debug_errno(r, "Failed to read memory.oom.group from %s, ignoring: %m", cg_path);
+ return 0;
+ }
if (oom_group)
r = oomd_insert_cgroup_context(NULL, new_h, cg_path);
r = recursively_get_cgroup_context(new_h, cg_path);
if (r == -ENOMEM)
return r;
+ if (r < 0)
+ log_debug_errno(r, "Failed to insert or recursively get from %s, ignoring: %m", cg_path);
} while ((r = cg_read_subgroup(d, &subpath)) > 0);
return 0;
r = oomd_insert_cgroup_context(*monitored_cgroups, new_base, ctx->path);
if (r == -ENOMEM)
return r;
+ if (r < 0 && !IN_SET(r, -EEXIST, -ENOENT))
+ log_debug_errno(r, "Failed to insert context for %s, ignoring: %m", ctx->path);
}
hashmap_free(*monitored_cgroups);
r = recursively_get_cgroup_context(candidates, ctx->path);
if (r == -ENOMEM)
return r;
+ if (r < 0)
+ log_debug_errno(r, "Failed to recursively get contexts for %s, ignoring: %m", ctx->path);
}
*ret_candidates = TAKE_PTR(candidates);
return 0;
}
+static int update_monitored_cgroup_contexts_candidates(Hashmap *monitored_cgroups, Hashmap **candidates) {
+ _cleanup_hashmap_free_ Hashmap *new_candidates = NULL;
+ int r;
+
+ assert(monitored_cgroups);
+ assert(candidates);
+ assert(*candidates);
+
+ r = get_monitored_cgroup_contexts_candidates(monitored_cgroups, &new_candidates);
+ if (r < 0)
+ return log_debug_errno(r, "Failed to get candidate contexts: %m");
+
+ oomd_update_cgroup_contexts_between_hashmaps(*candidates, new_candidates);
+
+ hashmap_free(*candidates);
+ *candidates = TAKE_PTR(new_candidates);
+
+ return 0;
+}
+
static int acquire_managed_oom_connect(Manager *m) {
_cleanup_(varlink_close_unrefp) Varlink *link = NULL;
int r;
/* Reset timer */
r = sd_event_now(sd_event_source_get_event(s), CLOCK_MONOTONIC, &usec_now);
if (r < 0)
- return log_error_errno(r, "Failed to reset event timer");
+ return log_error_errno(r, "Failed to reset event timer: %m");
r = sd_event_source_set_time_relative(s, INTERVAL_USEC);
if (r < 0)
- return log_error_errno(r, "Failed to set relative time for timer");
+ return log_error_errno(r, "Failed to set relative time for timer: %m");
/* Reconnect if our connection dropped */
if (!m->varlink) {
r = acquire_managed_oom_connect(m);
if (r < 0)
- return log_error_errno(r, "Failed to acquire varlink connection");
+ return log_error_errno(r, "Failed to acquire varlink connection: %m");
}
/* Update the cgroups used for detection/action */
r = update_monitored_cgroup_contexts(&m->monitored_swap_cgroup_contexts);
if (r == -ENOMEM)
- return log_error_errno(r, "Failed to update monitored swap cgroup contexts");
+ return log_oom();
+ if (r < 0)
+ log_debug_errno(r, "Failed to update monitored swap cgroup contexts, ignoring: %m");
r = update_monitored_cgroup_contexts(&m->monitored_mem_pressure_cgroup_contexts);
if (r == -ENOMEM)
- return log_error_errno(r, "Failed to update monitored memory pressure cgroup contexts");
+ return log_oom();
+ if (r < 0)
+ log_debug_errno(r, "Failed to update monitored memory pressure cgroup contexts, ignoring: %m");
+
+ r = update_monitored_cgroup_contexts_candidates(
+ m->monitored_mem_pressure_cgroup_contexts, &m->monitored_mem_pressure_cgroup_contexts_candidates);
+ if (r == -ENOMEM)
+ return log_oom();
+ if (r < 0)
+ log_debug_errno(r, "Failed to update monitored memory pressure candidate cgroup contexts, ignoring: %m");
r = oomd_system_context_acquire("/proc/swaps", &m->system_context);
/* If there aren't units depending on swap actions, the only error we exit on is ENOMEM.
* Allow ENOENT in the event that swap is disabled on the system. */
if (r == -ENOMEM || (r < 0 && r != -ENOENT && !hashmap_isempty(m->monitored_swap_cgroup_contexts)))
- return log_error_errno(r, "Failed to acquire system context");
+ return log_error_errno(r, "Failed to acquire system context: %m");
else if (r == -ENOENT)
zero(m->system_context);
r = oomd_pressure_above(m->monitored_mem_pressure_cgroup_contexts, m->default_mem_pressure_duration_usec, &targets);
if (r == -ENOMEM)
- return log_error_errno(r, "Failed to check if memory pressure exceeded limits");
+ return log_oom();
+ if (r < 0)
+ log_debug_errno(r, "Failed to check if memory pressure exceeded limits, ignoring: %m");
else if (r == 1) {
/* Check if there was reclaim activity in the given interval. The concern is the following case:
* Pressure climbed, a lot of high-frequency pages were reclaimed, and we killed the offending
* this will cause pressure to remain high. Thus if there isn't any reclaim pressure, no need
* to kill something (it won't help anyways). */
if ((usec_now - m->last_reclaim_at) <= RECLAIM_DURATION_USEC) {
- _cleanup_hashmap_free_ Hashmap *candidates = NULL;
OomdCGroupContext *t;
- r = get_monitored_cgroup_contexts_candidates(m->monitored_mem_pressure_cgroup_contexts, &candidates);
- if (r == -ENOMEM)
- return log_error_errno(r, "Failed to get monitored memory pressure cgroup candidates");
-
SET_FOREACH(t, targets) {
- log_notice("Memory pressure for %s is greater than %lu for more than %"PRIu64" seconds and there was reclaim activity",
- t->path, LOAD_INT(t->mem_pressure_limit), m->default_mem_pressure_duration_usec / USEC_PER_SEC);
-
- r = oomd_kill_by_pgscan(candidates, t->path, m->dry_run);
+ _cleanup_free_ char *selected = NULL;
+ char ts[FORMAT_TIMESPAN_MAX];
+
+ log_debug("Memory pressure for %s is %lu.%02lu%% > %lu.%02lu%% for > %s with reclaim activity",
+ t->path,
+ LOAD_INT(t->memory_pressure.avg10), LOAD_FRAC(t->memory_pressure.avg10),
+ LOAD_INT(t->mem_pressure_limit), LOAD_FRAC(t->mem_pressure_limit),
+ format_timespan(ts, sizeof ts,
+ m->default_mem_pressure_duration_usec,
+ USEC_PER_SEC));
+
+ r = oomd_kill_by_pgscan_rate(m->monitored_mem_pressure_cgroup_contexts_candidates, t->path, m->dry_run, &selected);
if (r == -ENOMEM)
- return log_error_errno(r, "Failed to kill cgroup processes by pgscan");
+ return log_oom();
if (r < 0)
- log_info("Failed to kill any cgroup(s) under %s based on pressure", t->path);
+ log_notice_errno(r, "Failed to kill any cgroup(s) under %s based on pressure: %m", t->path);
else {
/* Don't act on all the high pressure cgroups at once; return as soon as we kill one */
m->post_action_delay_start = usec_now;
+ if (selected)
+ log_notice("Killed %s due to memory pressure for %s being %lu.%02lu%% > %lu.%02lu%%"
+ " for > %s with reclaim activity",
+ selected, t->path,
+ LOAD_INT(t->memory_pressure.avg10), LOAD_FRAC(t->memory_pressure.avg10),
+ LOAD_INT(t->mem_pressure_limit), LOAD_FRAC(t->mem_pressure_limit),
+ format_timespan(ts, sizeof ts,
+ m->default_mem_pressure_duration_usec,
+ USEC_PER_SEC));
return 0;
}
}
if (oomd_swap_free_below(&m->system_context, 10000 - m->swap_used_limit_permyriad)) {
_cleanup_hashmap_free_ Hashmap *candidates = NULL;
+ _cleanup_free_ char *selected = NULL;
- log_notice("Swap used (%"PRIu64") / total (%"PRIu64") is more than " PERMYRIAD_AS_PERCENT_FORMAT_STR,
- m->system_context.swap_used, m->system_context.swap_total, PERMYRIAD_AS_PERCENT_FORMAT_VAL(m->swap_used_limit_permyriad));
+ log_debug("Swap used (%"PRIu64") / total (%"PRIu64") is more than " PERMYRIAD_AS_PERCENT_FORMAT_STR,
+ m->system_context.swap_used, m->system_context.swap_total,
+ PERMYRIAD_AS_PERCENT_FORMAT_VAL(m->swap_used_limit_permyriad));
r = get_monitored_cgroup_contexts_candidates(m->monitored_swap_cgroup_contexts, &candidates);
if (r == -ENOMEM)
- return log_error_errno(r, "Failed to get monitored swap cgroup candidates");
+ return log_oom();
+ if (r < 0)
+ log_debug_errno(r, "Failed to get monitored swap cgroup candidates, ignoring: %m");
- r = oomd_kill_by_swap_usage(candidates, m->dry_run);
+ r = oomd_kill_by_swap_usage(candidates, m->dry_run, &selected);
if (r == -ENOMEM)
- return log_error_errno(r, "Failed to kill cgroup processes by swap usage");
+ return log_oom();
if (r < 0)
- log_info("Failed to kill any cgroup(s) based on swap");
+ log_notice_errno(r, "Failed to kill any cgroup(s) based on swap: %m");
else {
m->post_action_delay_start = usec_now;
+ if (selected)
+ log_notice("Killed %s due to swap used (%"PRIu64") / total (%"PRIu64") being more than "
+ PERMYRIAD_AS_PERCENT_FORMAT_STR,
+ selected, m->system_context.swap_used, m->system_context.swap_total,
+ PERMYRIAD_AS_PERCENT_FORMAT_VAL(m->swap_used_limit_permyriad));
return 0;
}
}
hashmap_free(m->monitored_swap_cgroup_contexts);
hashmap_free(m->monitored_mem_pressure_cgroup_contexts);
+ hashmap_free(m->monitored_mem_pressure_cgroup_contexts_candidates);
return mfree(m);
}
if (!m->monitored_mem_pressure_cgroup_contexts)
return -ENOMEM;
+ m->monitored_mem_pressure_cgroup_contexts_candidates = hashmap_new(&oomd_cgroup_ctx_hash_ops);
+ if (!m->monitored_mem_pressure_cgroup_contexts_candidates)
+ return -ENOMEM;
+
*ret = TAKE_PTR(m);
return 0;
}
* Used to detect when to take action. */
Hashmap *monitored_swap_cgroup_contexts;
Hashmap *monitored_mem_pressure_cgroup_contexts;
+ Hashmap *monitored_mem_pressure_cgroup_contexts_candidates;
OomdSystemContext system_context;
return set_size(pids_killed) != 0;
}
-int oomd_kill_by_pgscan(Hashmap *h, const char *prefix, bool dry_run) {
+int oomd_kill_by_pgscan_rate(Hashmap *h, const char *prefix, bool dry_run, char **ret_selected) {
_cleanup_free_ OomdCGroupContext **sorted = NULL;
- int r;
+ int n, r, ret = 0;
assert(h);
+ assert(ret_selected);
- r = oomd_sort_cgroup_contexts(h, compare_pgscan_and_memory_usage, prefix, &sorted);
- if (r < 0)
- return r;
+ n = oomd_sort_cgroup_contexts(h, compare_pgscan_rate_and_memory_usage, prefix, &sorted);
+ if (n < 0)
+ return n;
- for (int i = 0; i < r; i++) {
- /* Skip cgroups with no reclaim and memory usage; it won't alleviate pressure. */
- /* Don't break since there might be "avoid" cgroups at the end. */
+ for (int i = 0; i < n; i++) {
+ /* Skip cgroups with no reclaim and memory usage; it won't alleviate pressure.
+ * Continue since there might be "avoid" cgroups at the end. */
if (sorted[i]->pgscan == 0 && sorted[i]->current_memory_usage == 0)
continue;
r = oomd_cgroup_kill(sorted[i]->path, true, dry_run);
- if (r > 0 || r == -ENOMEM)
- break;
+ if (r == 0)
+ continue; /* We didn't find anything to kill */
+ if (r == -ENOMEM)
+ return r; /* Treat oom as a hard error */
+ if (r < 0) {
+ if (ret == 0)
+ ret = r;
+ continue; /* Try to find something else to kill */
+ }
+
+ char *selected = strdup(sorted[i]->path);
+ if (!selected)
+ return -ENOMEM;
+ *ret_selected = selected;
+ return 1;
}
- return r;
+ return ret;
}
-int oomd_kill_by_swap_usage(Hashmap *h, bool dry_run) {
+int oomd_kill_by_swap_usage(Hashmap *h, bool dry_run, char **ret_selected) {
_cleanup_free_ OomdCGroupContext **sorted = NULL;
- int r;
+ int n, r, ret = 0;
assert(h);
+ assert(ret_selected);
- r = oomd_sort_cgroup_contexts(h, compare_swap_usage, NULL, &sorted);
- if (r < 0)
- return r;
+ n = oomd_sort_cgroup_contexts(h, compare_swap_usage, NULL, &sorted);
+ if (n < 0)
+ return n;
/* Try to kill cgroups with non-zero swap usage until we either succeed in
* killing or we get to a cgroup with no swap usage. */
- for (int i = 0; i < r; i++) {
- /* Skip over cgroups with no resource usage. Don't break since there might be "avoid"
- * cgroups at the end. */
+ for (int i = 0; i < n; i++) {
+ /* Skip over cgroups with no resource usage.
+ * Continue break since there might be "avoid" cgroups at the end. */
if (sorted[i]->swap_usage == 0)
continue;
r = oomd_cgroup_kill(sorted[i]->path, true, dry_run);
- if (r > 0 || r == -ENOMEM)
- break;
+ if (r == 0)
+ continue; /* We didn't find anything to kill */
+ if (r == -ENOMEM)
+ return r; /* Treat oom as a hard error */
+ if (r < 0) {
+ if (ret == 0)
+ ret = r;
+ continue; /* Try to find something else to kill */
+ }
+
+ char *selected = strdup(sorted[i]->path);
+ if (!selected)
+ return -ENOMEM;
+ *ret_selected = selected;
+ return 1;
}
- return r;
+ return ret;
}
int oomd_cgroup_context_acquire(const char *path, OomdCGroupContext **ret) {
int oomd_insert_cgroup_context(Hashmap *old_h, Hashmap *new_h, const char *path) {
_cleanup_(oomd_cgroup_context_freep) OomdCGroupContext *curr_ctx = NULL;
- OomdCGroupContext *old_ctx, *ctx;
+ OomdCGroupContext *old_ctx;
int r;
assert(new_h);
assert(path);
+ path = empty_to_root(path);
+
r = oomd_cgroup_context_acquire(path, &curr_ctx);
if (r < 0)
return log_debug_errno(r, "Failed to get OomdCGroupContext for %s: %m", path);
+ assert_se(streq(path, curr_ctx->path));
+
old_ctx = hashmap_get(old_h, path);
if (old_ctx) {
curr_ctx->last_pgscan = old_ctx->pgscan;
curr_ctx->last_hit_mem_pressure_limit = old_ctx->last_hit_mem_pressure_limit;
}
- ctx = TAKE_PTR(curr_ctx);
- r = hashmap_put(new_h, ctx->path, ctx);
+ r = hashmap_put(new_h, curr_ctx->path, curr_ctx);
if (r < 0)
return r;
+ TAKE_PTR(curr_ctx);
return 0;
}
+void oomd_update_cgroup_contexts_between_hashmaps(Hashmap *old_h, Hashmap *curr_h) {
+ OomdCGroupContext *ctx;
+
+ assert(old_h);
+ assert(curr_h);
+
+ HASHMAP_FOREACH(ctx, curr_h) {
+ OomdCGroupContext *old_ctx;
+
+ old_ctx = hashmap_get(old_h, ctx->path);
+ if (!old_ctx)
+ continue;
+
+ ctx->last_pgscan = old_ctx->pgscan;
+ ctx->mem_pressure_limit = old_ctx->mem_pressure_limit;
+ ctx->last_hit_mem_pressure_limit = old_ctx->last_hit_mem_pressure_limit;
+ }
+}
+
void oomd_dump_swap_cgroup_context(const OomdCGroupContext *ctx, FILE *f, const char *prefix) {
char swap[FORMAT_BYTES_MAX];
fprintf(f,
"%s\tMemory Min: %s\n"
"%s\tMemory Low: %s\n"
- "%s\tPgscan: %" PRIu64 "\n",
+ "%s\tPgscan: %" PRIu64 "\n"
+ "%s\tLast Pgscan: %" PRIu64 "\n",
strempty(prefix), format_bytes_cgroup_protection(mem_min, sizeof(mem_min), ctx->memory_min),
strempty(prefix), format_bytes_cgroup_protection(mem_low, sizeof(mem_low), ctx->memory_low),
- strempty(prefix), ctx->pgscan);
+ strempty(prefix), ctx->pgscan,
+ strempty(prefix), ctx->last_pgscan);
}
void oomd_dump_system_context(const OomdSystemContext *ctx, FILE *f, const char *prefix) {
/* The compare functions will sort from largest to smallest, putting all the contexts with "avoid" at the end
* (after the smallest values). */
-static inline int compare_pgscan_and_memory_usage(OomdCGroupContext * const *c1, OomdCGroupContext * const *c2) {
+static inline int compare_pgscan_rate_and_memory_usage(OomdCGroupContext * const *c1, OomdCGroupContext * const *c2) {
+ uint64_t last1, last2;
int r;
assert(c1);
if (r != 0)
return r;
- r = CMP((*c2)->pgscan, (*c1)->pgscan);
+ /* If last_pgscan > pgscan, assume the cgroup was recreated and reset last_pgscan to zero. */
+ last2 = (*c2)->last_pgscan;
+ if ((*c2)->last_pgscan > (*c2)->pgscan) {
+ log_info("Last pgscan %" PRIu64 "greater than current pgscan %" PRIu64 "for %s. Using last pgscan of zero.",
+ (*c2)->last_pgscan, (*c2)->pgscan, (*c2)->path);
+ last2 = 0;
+ }
+
+ last1 = (*c1)->last_pgscan;
+ if ((*c1)->last_pgscan > (*c1)->pgscan) {
+ log_info("Last pgscan %" PRIu64 "greater than current pgscan %" PRIu64 "for %s. Using last pgscan of zero.",
+ (*c1)->last_pgscan, (*c1)->pgscan, (*c1)->path);
+ last1 = 0;
+ }
+
+ r = CMP((*c2)->pgscan - last2, (*c1)->pgscan - last1);
if (r != 0)
return r;
/* The following oomd_kill_by_* functions return 1 if processes were killed, or negative otherwise. */
/* If `prefix` is supplied, only cgroups whose paths start with `prefix` are eligible candidates. Otherwise,
- * everything in `h` is a candidate. */
-int oomd_kill_by_pgscan(Hashmap *h, const char *prefix, bool dry_run);
-int oomd_kill_by_swap_usage(Hashmap *h, bool dry_run);
+ * everything in `h` is a candidate.
+ * Returns the killed cgroup in ret_selected. */
+int oomd_kill_by_pgscan_rate(Hashmap *h, const char *prefix, bool dry_run, char **ret_selected);
+int oomd_kill_by_swap_usage(Hashmap *h, bool dry_run, char **ret_selected);
int oomd_cgroup_context_acquire(const char *path, OomdCGroupContext **ret);
int oomd_system_context_acquire(const char *proc_swaps_path, OomdSystemContext *ret);
* was no prior data to reference. */
int oomd_insert_cgroup_context(Hashmap *old_h, Hashmap *new_h, const char *path);
+/* Update each OomdCGroupContext in `curr_h` with prior interval information from `old_h`. */
+void oomd_update_cgroup_contexts_between_hashmaps(Hashmap *old_h, Hashmap *curr_h);
+
void oomd_dump_swap_cgroup_context(const OomdCGroupContext *ctx, FILE *f, const char *prefix);
void oomd_dump_memory_pressure_cgroup_context(const OomdCGroupContext *ctx, FILE *f, const char *prefix);
void oomd_dump_system_context(const OomdSystemContext *ctx, FILE *f, const char *prefix);
notify_msg = notify_start(NOTIFY_READY, NOTIFY_STOPPING);
- log_info("systemd-oomd starting%s!", arg_dry_run ? " in dry run mode" : "");
+ log_debug("systemd-oomd started%s.", arg_dry_run ? " in dry run mode" : "");
r = sd_event_loop(m->event);
if (r < 0)
# the system.conf.d/ subdirectory. The latter is generally recommended.
# Defaults can be restored by simply deleting this file and all drop-ins.
#
+# Use 'systemd-analyze cat-config systemd/oomd.conf' to display the full config.
+#
# See oomd.conf(5) for details
[OOM]
assert_se(oomd_insert_cgroup_context(NULL, h1, cgroup) == 0);
c1 = hashmap_get(h1, cgroup);
assert_se(c1);
+ assert_se(oomd_insert_cgroup_context(NULL, h1, cgroup) == -EEXIST);
/* make sure certain values from h1 get updated in h2 */
c1->pgscan = 5555;
}
}
+static void test_oomd_update_cgroup_contexts_between_hashmaps(void) {
+ _cleanup_hashmap_free_ Hashmap *h_old = NULL, *h_new = NULL;
+ OomdCGroupContext *c_old, *c_new;
+ char **paths = STRV_MAKE("/0.slice",
+ "/1.slice");
+
+ OomdCGroupContext ctx_old[3] = {
+ { .path = paths[0],
+ .mem_pressure_limit = 5,
+ .last_hit_mem_pressure_limit = 777,
+ .pgscan = 57 },
+ { .path = paths[1],
+ .mem_pressure_limit = 6,
+ .last_hit_mem_pressure_limit = 888,
+ .pgscan = 42 },
+ };
+
+ OomdCGroupContext ctx_new[3] = {
+ { .path = paths[0],
+ .pgscan = 100 },
+ { .path = paths[1],
+ .pgscan = 101 },
+ };
+
+ assert_se(h_old = hashmap_new(&string_hash_ops));
+ assert_se(hashmap_put(h_old, paths[0], &ctx_old[0]) >= 0);
+ assert_se(hashmap_put(h_old, paths[1], &ctx_old[1]) >= 0);
+
+ assert_se(h_new = hashmap_new(&string_hash_ops));
+ assert_se(hashmap_put(h_new, paths[0], &ctx_new[0]) >= 0);
+ assert_se(hashmap_put(h_new, paths[1], &ctx_new[1]) >= 0);
+
+ oomd_update_cgroup_contexts_between_hashmaps(h_old, h_new);
+
+ assert_se(c_old = hashmap_get(h_old, "/0.slice"));
+ assert_se(c_new = hashmap_get(h_new, "/0.slice"));
+ assert_se(c_old->pgscan == c_new->last_pgscan);
+ assert_se(c_old->mem_pressure_limit == c_new->mem_pressure_limit);
+ assert_se(c_old->last_hit_mem_pressure_limit == c_new->last_hit_mem_pressure_limit);
+
+ assert_se(c_old = hashmap_get(h_old, "/1.slice"));
+ assert_se(c_new = hashmap_get(h_new, "/1.slice"));
+ assert_se(c_old->pgscan == c_new->last_pgscan);
+ assert_se(c_old->mem_pressure_limit == c_new->mem_pressure_limit);
+ assert_se(c_old->last_hit_mem_pressure_limit == c_new->last_hit_mem_pressure_limit);
+}
+
static void test_oomd_system_context_acquire(void) {
_cleanup_(unlink_tempfilep) char path[] = "/oomdgetsysctxtestXXXXXX";
OomdSystemContext ctx;
"/herp.slice/derp.scope",
"/herp.slice/derp.scope/sheep.service",
"/zupa.slice",
+ "/boop.slice",
"/omitted.slice",
"/avoid.slice");
- OomdCGroupContext ctx[6] = {
+ OomdCGroupContext ctx[7] = {
{ .path = paths[0],
.swap_usage = 20,
- .pgscan = 60,
+ .last_pgscan = 0,
+ .pgscan = 33,
.current_memory_usage = 10 },
{ .path = paths[1],
.swap_usage = 60,
- .pgscan = 40,
+ .last_pgscan = 33,
+ .pgscan = 1,
.current_memory_usage = 20 },
{ .path = paths[2],
.swap_usage = 40,
- .pgscan = 40,
+ .last_pgscan = 1,
+ .pgscan = 33,
.current_memory_usage = 40 },
{ .path = paths[3],
.swap_usage = 10,
- .pgscan = 80,
+ .last_pgscan = 33,
+ .pgscan = 2,
.current_memory_usage = 10 },
{ .path = paths[4],
+ .swap_usage = 11,
+ .last_pgscan = 33,
+ .pgscan = 33,
+ .current_memory_usage = 10 },
+ { .path = paths[5],
.swap_usage = 90,
- .pgscan = 100,
+ .last_pgscan = 0,
+ .pgscan = UINT64_MAX,
.preference = MANAGED_OOM_PREFERENCE_OMIT },
- { .path = paths[5],
+ { .path = paths[6],
.swap_usage = 99,
- .pgscan = 200,
+ .last_pgscan = 0,
+ .pgscan = UINT64_MAX,
.preference = MANAGED_OOM_PREFERENCE_AVOID },
};
assert_se(hashmap_put(h, "/herp.slice/derp.scope", &ctx[1]) >= 0);
assert_se(hashmap_put(h, "/herp.slice/derp.scope/sheep.service", &ctx[2]) >= 0);
assert_se(hashmap_put(h, "/zupa.slice", &ctx[3]) >= 0);
- assert_se(hashmap_put(h, "/omitted.slice", &ctx[4]) >= 0);
- assert_se(hashmap_put(h, "/avoid.slice", &ctx[5]) >= 0);
+ assert_se(hashmap_put(h, "/boop.slice", &ctx[4]) >= 0);
+ assert_se(hashmap_put(h, "/omitted.slice", &ctx[5]) >= 0);
+ assert_se(hashmap_put(h, "/avoid.slice", &ctx[6]) >= 0);
- assert_se(oomd_sort_cgroup_contexts(h, compare_swap_usage, NULL, &sorted_cgroups) == 5);
+ assert_se(oomd_sort_cgroup_contexts(h, compare_swap_usage, NULL, &sorted_cgroups) == 6);
assert_se(sorted_cgroups[0] == &ctx[1]);
assert_se(sorted_cgroups[1] == &ctx[2]);
assert_se(sorted_cgroups[2] == &ctx[0]);
- assert_se(sorted_cgroups[3] == &ctx[3]);
- assert_se(sorted_cgroups[4] == &ctx[5]);
+ assert_se(sorted_cgroups[3] == &ctx[4]);
+ assert_se(sorted_cgroups[4] == &ctx[3]);
+ assert_se(sorted_cgroups[5] == &ctx[6]);
sorted_cgroups = mfree(sorted_cgroups);
- assert_se(oomd_sort_cgroup_contexts(h, compare_pgscan_and_memory_usage, NULL, &sorted_cgroups) == 5);
- assert_se(sorted_cgroups[0] == &ctx[3]);
- assert_se(sorted_cgroups[1] == &ctx[0]);
- assert_se(sorted_cgroups[2] == &ctx[2]);
+ assert_se(oomd_sort_cgroup_contexts(h, compare_pgscan_rate_and_memory_usage, NULL, &sorted_cgroups) == 6);
+ assert_se(sorted_cgroups[0] == &ctx[0]);
+ assert_se(sorted_cgroups[1] == &ctx[2]);
+ assert_se(sorted_cgroups[2] == &ctx[3]);
assert_se(sorted_cgroups[3] == &ctx[1]);
- assert_se(sorted_cgroups[4] == &ctx[5]);
+ assert_se(sorted_cgroups[4] == &ctx[4]);
+ assert_se(sorted_cgroups[5] == &ctx[6]);
sorted_cgroups = mfree(sorted_cgroups);
- assert_se(oomd_sort_cgroup_contexts(h, compare_pgscan_and_memory_usage, "/herp.slice/derp.scope", &sorted_cgroups) == 2);
+ assert_se(oomd_sort_cgroup_contexts(h, compare_pgscan_rate_and_memory_usage, "/herp.slice/derp.scope", &sorted_cgroups) == 2);
assert_se(sorted_cgroups[0] == &ctx[2]);
assert_se(sorted_cgroups[1] == &ctx[1]);
assert_se(sorted_cgroups[2] == 0);
assert_se(sorted_cgroups[3] == 0);
assert_se(sorted_cgroups[4] == 0);
assert_se(sorted_cgroups[5] == 0);
+ assert_se(sorted_cgroups[6] == 0);
sorted_cgroups = mfree(sorted_cgroups);
}
test_setup_logging(LOG_DEBUG);
+ test_oomd_update_cgroup_contexts_between_hashmaps();
test_oomd_system_context_acquire();
test_oomd_pressure_above();
test_oomd_memory_reclaim();
void *data,
void *userdata) {
- _cleanup_free_ char16_t *recoded = NULL;
_cleanup_free_ char *resolved = NULL;
char **label = data;
int r;
return 0;
}
- recoded = utf8_to_utf16(resolved, strlen(resolved));
- if (!recoded)
- return log_oom();
-
- if (char16_strlen(recoded) > 36) {
+ r = gpt_partition_label_valid(resolved);
+ if (r < 0) {
+ log_syntax(unit, LOG_WARNING, filename, line, r,
+ "Failed to check if string is valid as GPT partition label, ignoring: \"%s\" (from \"%s\")",
+ resolved, rvalue);
+ return 0;
+ }
+ if (!r) {
log_syntax(unit, LOG_WARNING, filename, line, 0,
"Partition label too long for GPT table, ignoring: \"%s\" (from \"%s\")",
resolved, rvalue);
if (!DEBUG_LOGGING) {
if (arg_json_format_flags & JSON_FORMAT_OFF)
(void) table_set_display(t, (size_t) 0, (size_t) 1, (size_t) 2, (size_t) 3, (size_t) 4,
- (size_t) 8, (size_t) 11, (size_t) -1);
+ (size_t) 8, (size_t) 11);
else
(void) table_set_display(t, (size_t) 0, (size_t) 1, (size_t) 2, (size_t) 3, (size_t) 4,
- (size_t) 5, (size_t) 6, (size_t) 7, (size_t) 9, (size_t) 10, (size_t) 12, (size_t) -1);
+ (size_t) 5, (size_t) 6, (size_t) 7, (size_t) 9, (size_t) 10, (size_t) 12);
}
(void) table_set_align_percent(t, table_get_cell(t, 0, 4), 100);
break;
label = mfree(label);
-
-
if (asprintf(&label, "%s-%u", prefix, ++k) < 0)
return log_oom();
}
static int acquire_root_devno(const char *p, int mode, char **ret, int *ret_fd) {
_cleanup_close_ int fd = -1;
struct stat st;
- dev_t devno, fd_devno = (mode_t) -1;
+ dev_t devno, fd_devno = MODE_INVALID;
int r;
assert(p);
/* Only if we still lock at the same block device we can reuse the fd. Otherwise return an
* invalidated fd. */
- *ret_fd = fd_devno != (mode_t) -1 && fd_devno == devno ? TAKE_FD(fd) : -1;
+ *ret_fd = fd_devno != MODE_INVALID && fd_devno == devno ? TAKE_FD(fd) : -1;
return 0;
}
return log_error_errno(SYNTHETIC_ERRNO(ENODEV), "Failed to discover root block device.");
}
+static int resize_pt(int fd) {
+ char procfs_path[STRLEN("/proc/self/fd/") + DECIMAL_STR_MAX(int)];
+ _cleanup_(fdisk_unref_contextp) struct fdisk_context *c = NULL;
+ int r;
+
+ /* After resizing the backing file we need to resize the partition table itself too, so that it takes
+ * possession of the enlarged backing file. For this it suffices to open the device with libfdisk and
+ * immediately write it again, with no changes. */
+
+ c = fdisk_new_context();
+ if (!c)
+ return log_oom();
+
+ xsprintf(procfs_path, "/proc/self/fd/%i", fd);
+ r = fdisk_assign_device(c, procfs_path, 0);
+ if (r < 0)
+ return log_error_errno(r, "Failed to open device '%s': %m", procfs_path);
+
+ r = fdisk_has_label(c);
+ if (r < 0)
+ return log_error_errno(r, "Failed to determine whether disk '%s' has a disk label: %m", procfs_path);
+ if (r == 0) {
+ log_debug("Not resizing partition table, as there currently is none.");
+ return 0;
+ }
+
+ r = fdisk_write_disklabel(c);
+ if (r < 0)
+ return log_error_errno(r, "Failed to write resized partition table: %m");
+
+ log_info("Resized partition table.");
+ return 1;
+}
+
static int resize_backing_fd(const char *node, int *fd) {
char buf1[FORMAT_BYTES_MAX], buf2[FORMAT_BYTES_MAX];
_cleanup_close_ int writable_fd = -1;
/* Fallback to truncation, if fallocate() is not supported. */
log_debug("Backing file system does not support fallocate(), falling back to ftruncate().");
} else {
+ r = resize_pt(writable_fd);
+ if (r < 0)
+ return r;
+
if (st.st_size == 0) /* Likely regular file just created by us */
log_info("Allocated %s for '%s'.", buf2, node);
else
return log_error_errno(errno, "Failed to grow '%s' from %s to %s by truncation: %m",
node, buf1, buf2);
+ r = resize_pt(writable_fd);
+ if (r < 0)
+ return r;
+
if (st.st_size == 0) /* Likely regular file just created by us */
log_info("Sized '%s' to %s.", node, buf2);
else
# SPDX-License-Identifier: LGPL-2.1-or-later
set -ex
-[[ -f /dev/loop-control ]] || exit 77
+[[ -e /dev/loop-control ]] || exit 77
repart=$1
test -x $repart
return bus_log_parse_error(r);
if (table_get_rows(table) > 1) {
- r = table_set_sort(table, (size_t) 0, (size_t) -1);
+ r = table_set_sort(table, (size_t) 0);
if (r < 0)
return table_log_sort_error(r);
(void) polkit_agent_open_if_enabled(arg_transport, arg_ask_password);
if (STR_IN_SET(argv[argc-1], "-", "none", "infinity"))
- limit = (uint64_t) -1;
+ limit = UINT64_MAX;
else {
r = parse_size(argv[argc-1], 1024, &limit);
if (r < 0)
sd_bus_error *error) {
_cleanup_close_ int fd = -1;
- uint64_t usage = (uint64_t) -1;
+ uint64_t usage = UINT64_MAX;
assert(bus);
assert(reply);
sd_bus_error *error) {
_cleanup_close_ int fd = -1;
- uint64_t size = (uint64_t) -1;
+ uint64_t size = UINT64_MAX;
assert(bus);
assert(reply);
size_t buf_size;
/* Now read contents of pstore file */
- r = read_full_file(ifd_path, &buf, &buf_size);
+ r = read_full_virtual_file(ifd_path, &buf, &buf_size);
if (r < 0) {
log_warning_errno(r, "Failed to read file %s, skipping: %m", ifd_path);
continue;
resolved-dns-answer.h
resolved-dns-question.c
resolved-dns-question.h
+ resolved-util.c
+ resolved-util.h
dns-type.c
dns-type.h
'''.split())
libgpg_error,
libm]],
- [['src/resolve/test-dnssec-complex.c',
- 'src/resolve/dns-type.c'],
- [], [], resolve_includes, '', 'manual'],
+ [['src/resolve/test-dnssec-complex.c'],
+ [libsystemd_resolve_core,
+ libshared],
+ [libgcrypt,
+ libgpg_error,
+ libm],
+ [], '', 'manual'],
]
fuzzers += [
#include "format-table.h"
#include "format-util.h"
#include "gcrypt-util.h"
+#include "hostname-util.h"
#include "main-func.h"
#include "missing_network.h"
#include "netlink-util.h"
#include "resolvectl.h"
#include "resolved-def.h"
#include "resolved-dns-packet.h"
+#include "resolved-util.h"
#include "socket-netlink.h"
#include "sort-util.h"
#include "stdio-util.h"
return false;
}
+static bool single_label_nonsynthetic(const char *name) {
+ _cleanup_free_ char *first_label = NULL;
+ int r;
+
+ if (!dns_name_is_single_label(name))
+ return false;
+
+ if (is_localhost(name) || is_gateway_hostname(name))
+ return false;
+
+ r = resolve_system_hostname(NULL, &first_label);
+ if (r < 0) {
+ log_warning_errno(r, "Failed to determine the hostname: %m");
+ return false;
+ }
+
+ return !streq(name, first_label);
+}
+
static int resolve_record(sd_bus *bus, const char *name, uint16_t class, uint16_t type, bool warn_missing) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *req = NULL, *reply = NULL;
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
log_debug("Resolving %s %s %s (interface %s).", name, dns_class_to_string(class), dns_type_to_string(type), isempty(arg_ifname) ? "*" : arg_ifname);
- if (dns_name_is_single_label(name))
- log_notice("(Note that search domains are not appended when resolving raw record types. "
- "Please specify fully qualified domain names when resolving raw records, or remove --type= switch from invocation in order to request regular hostname resolution.)");
+ if (dns_name_dot_suffixed(name) == 0 && single_label_nonsynthetic(name))
+ log_notice("(Note that search domains are not appended when --type= is specified. "
+ "Please specify fully qualified domain names, or remove --type= switch from invocation in order to request regular hostname resolution.)");
r = idna_candidate(name, &idnafied);
if (r < 0)
return r;
if (r > 0)
- log_notice("(Note that IDNA translation is not applied when resolving raw record types. "
+ log_notice("(Note that IDNA translation is not applied when --type= is specified. "
"Please specify translated domain names — i.e. '%s' — when resolving raw records, or remove --type= switch from invocation in order to request regular hostname resolution.",
idnafied);
goto finish;
}
- r = dns_query_process_cname(q);
+ r = dns_query_process_cname_many(q);
if (r == -ELOOP) {
r = sd_bus_reply_method_errorf(q->bus_request, BUS_ERROR_CNAME_LOOP, "CNAME loop detected, or CNAME resolving disabled on '%s'", dns_query_string(q));
goto finish;
}
if (r < 0)
goto finish;
- if (r == DNS_QUERY_RESTARTED) /* This was a cname, and the query was restarted. */
+ if (r == DNS_QUERY_CNAME) /* This was a cname, and the query was restarted. */
return;
r = sd_bus_message_new_method_return(q->bus_request, &reply);
goto finish;
}
- r = dns_query_process_cname(q);
+ r = dns_query_process_cname_many(q);
if (r == -ELOOP) {
r = sd_bus_reply_method_errorf(q->bus_request, BUS_ERROR_CNAME_LOOP, "CNAME loop detected, or CNAME resolving disabled on '%s'", dns_query_string(q));
goto finish;
}
if (r < 0)
goto finish;
- if (r == DNS_QUERY_RESTARTED) /* This was a cname, and the query was restarted. */
+ if (r == DNS_QUERY_CNAME) /* This was a cname, and the query was restarted. */
return;
r = sd_bus_message_new_method_return(q->bus_request, &reply);
goto finish;
}
- r = dns_query_process_cname(q);
+ r = dns_query_process_cname_many(q);
if (r == -ELOOP) {
r = sd_bus_reply_method_errorf(q->bus_request, BUS_ERROR_CNAME_LOOP, "CNAME loop detected, or CNAME resolving disabled on '%s'", dns_query_string(q));
goto finish;
}
if (r < 0)
goto finish;
- if (r == DNS_QUERY_RESTARTED) /* This was a cname, and the query was restarted. */
+ if (r == DNS_QUERY_CNAME) /* This was a cname, and the query was restarted. */
return;
r = sd_bus_message_new_method_return(q->bus_request, &reply);
return;
}
- r = dns_query_process_cname(q);
- if (r == DNS_QUERY_RESTARTED) /* This was a cname, and the query was restarted. */
+ r = dns_query_process_cname_many(q);
+ if (r == DNS_QUERY_CNAME) /* This was a cname, and the query was restarted. */
return;
/* This auxiliary lookup is finished or failed, let's see if all are finished now. */
goto finish;
}
- r = dns_query_process_cname(q);
+ r = dns_query_process_cname_many(q);
if (r == -ELOOP) {
r = sd_bus_reply_method_errorf(q->bus_request, BUS_ERROR_CNAME_LOOP, "CNAME loop detected, or CNAME resolving disabled on '%s'", dns_query_string(q));
goto finish;
}
if (r < 0)
goto finish;
- if (r == DNS_QUERY_RESTARTED) /* This was a cname, and the query was restarted. */
+ if (r == DNS_QUERY_CNAME) /* This was a cname, and the query was restarted. */
return;
question = dns_query_question_for_protocol(q, q->answer_protocol);
int r;
r = extract_first_word(&rvalue, &word, NULL,
- EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX);
+ EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_RELAX);
if (r == 0)
break;
if (r == -ENOMEM)
return 1;
}
+int dns_answer_remove_by_answer_keys(DnsAnswer **a, DnsAnswer *b) {
+ _cleanup_(dns_resource_key_unrefp) DnsResourceKey *prev = NULL;
+ DnsAnswerItem *item;
+ int r;
+
+ /* Removes all items from '*a' that have a matching key in 'b' */
+
+ DNS_ANSWER_FOREACH_ITEM(item, b) {
+
+ if (prev && dns_resource_key_equal(item->rr->key, prev)) /* Skip this one, we already looked at it */
+ continue;
+
+ r = dns_answer_remove_by_key(a, item->rr->key);
+ if (r < 0)
+ return r;
+
+ /* Let's remember this entry's RR key, to optimize the loop a bit: if we have an RRset with
+ * more than one item then we don't need to remove the key multiple times */
+ dns_resource_key_unref(prev);
+ prev = dns_resource_key_ref(item->rr->key);
+ }
+
+ return 0;
+}
+
int dns_answer_copy_by_key(
DnsAnswer **a,
DnsAnswer *source,
}
fputs(t, f);
-
- if (item->ifindex != 0 || item->rrsig || item->flags != 0)
- fputs("\t;", f);
+ fputs("\t;", f);
+ fprintf(f, " ttl=%" PRIu32, item->rr->ttl);
if (item->ifindex != 0)
fprintf(f, " ifindex=%i", item->ifindex);
SWAP_TWO(a->items[i], a->items[k]);
}
}
+
+uint32_t dns_answer_min_ttl(DnsAnswer *a) {
+ uint32_t ttl = UINT32_MAX;
+ DnsResourceRecord *rr;
+
+ /* Return the smallest TTL of all RRs in this answer */
+
+ DNS_ANSWER_FOREACH(rr, a) {
+ /* Don't consider OPT (where the TTL field is used for other purposes than an actual TTL) */
+
+ if (dns_type_is_pseudo(rr->key->type) ||
+ dns_class_is_pseudo(rr->key->class))
+ continue;
+
+ ttl = MIN(ttl, rr->ttl);
+ }
+
+ return ttl;
+}
int dns_answer_remove_by_key(DnsAnswer **a, const DnsResourceKey *key);
int dns_answer_remove_by_rr(DnsAnswer **a, DnsResourceRecord *rr);
+int dns_answer_remove_by_answer_keys(DnsAnswer **a, DnsAnswer *b);
int dns_answer_copy_by_key(DnsAnswer **a, DnsAnswer *source, const DnsResourceKey *key, DnsAnswerFlags or_flags, DnsResourceRecord *rrsig);
int dns_answer_move_by_key(DnsAnswer **to, DnsAnswer **from, const DnsResourceKey *key, DnsAnswerFlags or_flags, DnsResourceRecord *rrsig);
void dns_answer_randomize(DnsAnswer *a);
+uint32_t dns_answer_min_ttl(DnsAnswer *a);
+
DEFINE_TRIVIAL_CLEANUP_FUNC(DnsAnswer*, dns_answer_unref);
#define _DNS_ANSWER_FOREACH(q, kk, a) \
return NULL;
}
-static usec_t calculate_until(DnsResourceRecord *rr, uint32_t nsec_ttl, usec_t timestamp, bool use_soa_minimum) {
+static usec_t calculate_until(
+ DnsResourceRecord *rr,
+ uint32_t min_ttl,
+ uint32_t nsec_ttl,
+ usec_t timestamp,
+ bool use_soa_minimum) {
+
uint32_t ttl;
usec_t u;
assert(rr);
- ttl = MIN(rr->ttl, nsec_ttl);
+ ttl = MIN(min_ttl, nsec_ttl);
if (rr->key->type == DNS_TYPE_SOA && use_soa_minimum) {
- /* If this is a SOA RR, and it is requested, clamp to
- * the SOA's minimum field. This is used when we do
- * negative caching, to determine the TTL for the
- * negative caching entry. See RFC 2308, Section
- * 5. */
+ /* If this is a SOA RR, and it is requested, clamp to the SOA's minimum field. This is used
+ * when we do negative caching, to determine the TTL for the negative caching entry. See RFC
+ * 2308, Section 5. */
if (ttl > rr->soa.minimum)
ttl = rr->soa.minimum;
if (rr->expiry != USEC_INFINITY) {
usec_t left;
- /* Make use of the DNSSEC RRSIG expiry info, if we
- * have it */
+ /* Make use of the DNSSEC RRSIG expiry info, if we have it */
left = LESS_BY(rr->expiry, now(CLOCK_REALTIME));
if (u > left)
DnsResourceRecord *rr,
DnsAnswer *answer,
DnsPacket *full_packet,
+ uint32_t min_ttl,
uint64_t query_flags,
bool shared_owner,
DnssecResult dnssec_result,
dns_packet_unref(i->full_packet);
i->full_packet = full_packet;
- i->until = calculate_until(rr, UINT32_MAX, timestamp, false);
+ i->until = calculate_until(rr, min_ttl, UINT32_MAX, timestamp, false);
i->query_flags = query_flags & CACHEABLE_QUERY_FLAGS;
i->shared_owner = shared_owner;
i->dnssec_result = dnssec_result;
const union in_addr_union *owner_address) {
_cleanup_(dns_cache_item_freep) DnsCacheItem *i = NULL;
- DnsCacheItem *existing;
char key_str[DNS_RESOURCE_KEY_STRING_MAX];
- int r, k;
+ DnsCacheItem *existing;
+ uint32_t min_ttl;
+ int r;
assert(c);
assert(rr);
if (dns_type_is_pseudo(rr->key->type))
return 0;
+ /* Determine the minimal TTL of all RRs in the answer plus the one by the main RR we are supposed to
+ * cache. Since we cache whole answers to questions we should never return answers where only some
+ * RRs are still valid, hence find the lowest here */
+ min_ttl = MIN(dns_answer_min_ttl(answer), rr->ttl);
+
/* New TTL is 0? Delete this specific entry... */
- if (rr->ttl <= 0) {
- k = dns_cache_remove_by_rr(c, rr);
+ if (min_ttl <= 0) {
+ r = dns_cache_remove_by_rr(c, rr);
log_debug("%s: %s",
- k > 0 ? "Removed zero TTL entry from cache" : "Not caching zero TTL cache entry",
+ r > 0 ? "Removed zero TTL entry from cache" : "Not caching zero TTL cache entry",
dns_resource_key_to_string(rr->key, key_str, sizeof key_str));
return 0;
}
rr,
answer,
full_packet,
+ min_ttl,
query_flags,
shared_owner,
dnssec_result,
.rr = dns_resource_record_ref(rr),
.answer = dns_answer_ref(answer),
.full_packet = dns_packet_ref(full_packet),
- .until = calculate_until(rr, (uint32_t) -1, timestamp, false),
+ .until = calculate_until(rr, min_ttl, UINT32_MAX, timestamp, false),
.query_flags = query_flags & CACHEABLE_QUERY_FLAGS,
.shared_owner = shared_owner,
.dnssec_result = dnssec_result,
.full_packet = dns_packet_ref(full_packet),
};
+ /* Determine how long to cache this entry. In case we have some RRs in the answer use the lowest TTL
+ * of any of them. Typically that's the SOA's TTL, which is OK, but could possibly be lower because
+ * of some other RR. Let's better take the lowest option here than a needlessly high one */
i->until =
i->type == DNS_CACHE_RCODE ? timestamp + CACHE_TTL_STRANGE_RCODE_USEC :
- calculate_until(soa, nsec_ttl, timestamp, true);
+ calculate_until(soa, dns_answer_min_ttl(answer), nsec_ttl, timestamp, true);
if (i->type == DNS_CACHE_NXDOMAIN) {
/* NXDOMAIN entries should apply equally to all types, so we use ANY as
* short time.) */
if (IN_SET(rcode, DNS_RCODE_SUCCESS, DNS_RCODE_NXDOMAIN)) {
- if (dns_answer_size(answer) <= 0) {
+ if (dns_answer_isempty(answer)) {
if (key) {
char key_str[DNS_RESOURCE_KEY_STRING_MAX];
if (r > 0)
return 0;
- /* But not if it has a matching CNAME/DNAME (the negative
- * caching will be done on the canonical name, not on the
- * alias) */
+ /* But not if it has a matching CNAME/DNAME (the negative caching will be done on the canonical name,
+ * not on the alias) */
r = dns_answer_find_cname_or_dname(answer, key, NULL, NULL);
if (r < 0)
goto fail;
if (r == 0 && !weird_rcode)
return 0;
if (r > 0) {
- /* Refuse using the SOA data if it is unsigned, but the key is
- * signed */
+ /* Refuse using the SOA data if it is unsigned, but the key is signed */
if (FLAGS_SET(query_flags, SD_RESOLVED_AUTHENTICATED) &&
(flags & DNS_ANSWER_AUTHENTICATED) == 0)
return 0;
if (cache_mode == DNS_CACHE_MODE_NO_NEGATIVE) {
char key_str[DNS_RESOURCE_KEY_STRING_MAX];
log_debug("Not caching negative entry for: %s, cache mode set to no-negative",
- dns_resource_key_to_string(key, key_str, sizeof key_str));
+ dns_resource_key_to_string(key, key_str, sizeof key_str));
return 0;
}
assert(rr);
if (FLAGS_SET(query_flags, SD_RESOLVED_CLAMP_TTL)) {
+ uint32_t left_ttl;
+
+ /* Let's determine how much time is left for this cache entry. Note that we round down, but
+ * clamp this to be 1s at minimum, since we usually want records to remain cached better too
+ * short a time than too long a time, but otoh don't want to return 0 ever, since that has
+ * special semantics in various contexts — in particular in mDNS */
+
+ left_ttl = MAX(1U, LESS_BY(until, current) / USEC_PER_SEC);
+
patched = dns_resource_record_ref(rr);
- r = dns_resource_record_clamp_ttl(&patched, LESS_BY(until, current) / USEC_PER_SEC);
+ r = dns_resource_record_clamp_ttl(&patched, left_ttl);
if (r < 0)
return r;
if (rrsig) {
patched_rrsig = dns_resource_record_ref(rrsig);
- r = dns_resource_record_clamp_ttl(&patched_rrsig, LESS_BY(until, current) / USEC_PER_SEC);
+ r = dns_resource_record_clamp_ttl(&patched_rrsig, left_ttl);
if (r < 0)
return r;
DnsAnswerItem *item;
DNS_ANSWER_FOREACH_ITEM(item, j->answer) {
- r = answer_add_clamp_ttl(&answer, item->rr, item->ifindex, item->flags, item->rrsig, query_flags, j->until, current);
+ r = answer_add_clamp_ttl(
+ &answer,
+ item->rr,
+ item->ifindex,
+ item->flags,
+ item->rrsig,
+ query_flags,
+ j->until,
+ current);
if (r < 0)
return r;
}
}
} else if (j->rr) {
- r = answer_add_clamp_ttl(&answer,
- j->rr,
- j->ifindex,
- FLAGS_SET(j->query_flags, SD_RESOLVED_AUTHENTICATED) ? DNS_ANSWER_AUTHENTICATED : 0,
- NULL,
- query_flags,
- j->until,
- current);
+ r = answer_add_clamp_ttl(
+ &answer,
+ j->rr,
+ j->ifindex,
+ FLAGS_SET(j->query_flags, SD_RESOLVED_AUTHENTICATED) ? DNS_ANSWER_AUTHENTICATED : 0,
+ NULL,
+ query_flags,
+ j->until,
+ current);
if (r < 0)
return r;
}
assert(rrsig->key->type == DNS_TYPE_RRSIG);
/* Check if this RRSIG RR is already prepared */
- if (rrsig->n_skip_labels_source != (unsigned) -1)
+ if (rrsig->n_skip_labels_source != UINT_MAX)
return 0;
if (rrsig->rrsig.inception > rrsig->rrsig.expiration)
/* Ignore NSEC3 RRs generated from wildcards. If these NSEC3 RRs weren't correctly signed we can't make this
* check (since rr->n_skip_labels_source is -1), but that's OK, as we won't trust them anyway in that case. */
- if (!IN_SET(rr->n_skip_labels_source, 0, (unsigned) -1))
+ if (!IN_SET(rr->n_skip_labels_source, 0, UINT_MAX))
return 0;
/* Ignore NSEC3 RRs that are located anywhere else than one label below the zone */
- if (!IN_SET(rr->n_skip_labels_signer, 1, (unsigned) -1))
+ if (!IN_SET(rr->n_skip_labels_signer, 1, UINT_MAX))
return 0;
if (!nsec3)
.rindex = DNS_PACKET_HEADER_SIZE,
.allocated = a,
.max_size = max_size,
- .opt_start = (size_t) -1,
- .opt_size = (size_t) -1,
+ .opt_start = SIZE_MAX,
+ .opt_size = SIZE_MAX,
};
*ret = p;
.rindex = DNS_PACKET_HEADER_SIZE,
.allocated = p->size,
.max_size = p->max_size,
- .opt_start = (size_t) -1,
- .opt_size = (size_t) -1,
+ .opt_start = SIZE_MAX,
+ .opt_size = SIZE_MAX,
};
memcpy(DNS_PACKET_DATA(c), DNS_PACKET_DATA(p), p->size);
assert(rcode >= 0);
assert(rcode <= _DNS_RCODE_MAX);
- if (p->opt_start != (size_t) -1)
+ if (p->opt_start != SIZE_MAX)
return -EBUSY;
- assert(p->opt_size == (size_t) -1);
+ assert(p->opt_size == SIZE_MAX);
saved_size = p->size;
int dns_packet_truncate_opt(DnsPacket *p) {
assert(p);
- if (p->opt_start == (size_t) -1) {
- assert(p->opt_size == (size_t) -1);
+ if (p->opt_start == SIZE_MAX) {
+ assert(p->opt_size == SIZE_MAX);
return 0;
}
- assert(p->opt_size != (size_t) -1);
+ assert(p->opt_size != SIZE_MAX);
assert(DNS_PACKET_ARCOUNT(p) > 0);
if (p->opt_start + p->opt_size != p->size)
dns_packet_truncate(p, p->opt_start);
DNS_PACKET_HEADER(p)->arcount = htobe16(DNS_PACKET_ARCOUNT(p) - 1);
- p->opt_start = p->opt_size = (size_t) -1;
+ p->opt_start = p->opt_size = SIZE_MAX;
return 1;
}
bool cache_flush = false;
size_t start;
- if (p->rindex == p->size) {
+ if (p->rindex == p->size && p->opt) {
/* If we reached the end of the packet already, but there are still more RRs
* declared, then that's a corrupt packet. Let's accept the packet anyway, since it's
* apparently a common bug in routers. Let's however suppress OPT support in this
assert(p);
assert(max_udp_size >= DNS_PACKET_UNICAST_SIZE_MAX);
- if (p->opt_start == (size_t) -1) /* No OPT section, nothing to patch */
+ if (p->opt_start == SIZE_MAX) /* No OPT section, nothing to patch */
return 0;
- assert(p->opt_size != (size_t) -1);
+ assert(p->opt_size != SIZE_MAX);
assert(p->opt_size >= 5);
unaligned_write_be16(DNS_PACKET_DATA(p) + p->opt_start + 3, max_udp_size);
#include "resolved-etc-hosts.h"
#include "string-util.h"
-#define CNAME_MAX 8
#define QUERIES_MAX 2048
#define AUXILIARY_QUERIES_MAX 64
} else {
bool good = false;
+ /* This (primarily) checks two things:
+ *
+ * 1. That the question is not empty
+ * 2. That all RR keys in the question objects are for the same domain
+ *
+ * Or in other words, a single DnsQuery object may be used to look up A+AAAA combination for
+ * the same domain name, or SRV+TXT (for DNS-SD services), but not for unrelated lookups. */
+
if (dns_question_size(question_utf8) > 0) {
r = dns_question_is_valid_for_query(question_utf8);
if (r < 0)
assert(q);
q->n_cname_redirects++;
- if (q->n_cname_redirects > CNAME_MAX)
+ if (q->n_cname_redirects > CNAME_REDIRECT_MAX)
return -ELOOP;
r = dns_question_cname_redirect(q->question_idna, cname, &nq_idna);
if (r < 0)
return r;
- else if (r > 0)
+ if (r > 0)
log_debug("Following CNAME/DNAME %s → %s.", dns_question_first_name(q->question_idna), dns_question_first_name(nq_idna));
k = dns_question_is_equal(q->question_idna, q->question_utf8);
if (k < 0)
- return r;
+ return k;
if (k > 0) {
/* Same question? Shortcut new question generation */
nq_utf8 = dns_question_ref(nq_idna);
k = dns_question_cname_redirect(q->question_utf8, cname, &nq_utf8);
if (k < 0)
return k;
- else if (k > 0)
+ if (k > 0)
log_debug("Following UTF8 CNAME/DNAME %s → %s.", dns_question_first_name(q->question_utf8), dns_question_first_name(nq_utf8));
}
q->question_utf8 = TAKE_PTR(nq_utf8);
dns_query_unref_candidates(q);
- dns_query_reset_answer(q);
+
+ /* Note that we do *not* reset the answer here, because the answer we previously got might already
+ * include everything we need, let's check that first */
q->state = DNS_TRANSACTION_NULL;
return 0;
}
-int dns_query_process_cname(DnsQuery *q) {
+int dns_query_process_cname_one(DnsQuery *q) {
_cleanup_(dns_resource_record_unrefp) DnsResourceRecord *cname = NULL;
DnsQuestion *question;
DnsResourceRecord *rr;
+ bool full_match = true;
+ DnsResourceKey *k;
int r;
assert(q);
+ /* Processes a CNAME redirect if there's one. Returns one of three values:
+ *
+ * CNAME_QUERY_MATCH → direct RR match, caller should just use the RRs in this answer (and not
+ * bother with any CNAME/DNAME stuff)
+ *
+ * CNAME_QUERY_NOMATCH → no match at all, neither direct nor CNAME/DNAME, caller might decide to
+ * restart query or take things as NODATA reply.
+ *
+ * CNAME_QUERY_CNAME → no direct RR match, but a CNAME/DNAME match that we now followed for one step.
+ *
+ * The function might also return a failure, in particular -ELOOP if we encountered too many
+ * CNAMEs/DNAMEs in a chain or if following CNAMEs/DNAMEs was turned off.
+ *
+ * Note that this function doesn't actually restart the query. The caller can decide to do that in
+ * case of CNAME_QUERY_CNAME, though. */
+
if (!IN_SET(q->state, DNS_TRANSACTION_SUCCESS, DNS_TRANSACTION_NULL))
return DNS_QUERY_NOMATCH;
question = dns_query_question_for_protocol(q, q->answer_protocol);
- DNS_ANSWER_FOREACH(rr, q->answer) {
- r = dns_question_matches_rr(question, rr, DNS_SEARCH_DOMAIN_NAME(q->answer_search_domain));
- if (r < 0)
- return r;
- if (r > 0)
- return DNS_QUERY_MATCH; /* The answer matches directly, no need to follow cnames */
+ /* Small reminder: our question will consist of one or more RR keys that match in name, but not in
+ * record type. Specifically, when we do an address lookup the question will typically consist of one
+ * A and one AAAA key lookup for the same domain name. When we get a response from a server we need
+ * to check if the answer answers all our questions to use it. Note that a response of CNAME/DNAME
+ * can answer both an A and the AAAA question for us, but an A/AAAA response only the relevant
+ * type.
+ *
+ * Hence we first check of the answers we collected are sufficient to answer all our questions
+ * directly. If one question wasn't answered we go on, waiting for more replies. However, if there's
+ * a CNAME/DNAME response we use it, and redirect to it, regardless if it was a response to the A or
+ * the AAAA query.*/
+
+ DNS_QUESTION_FOREACH(k, question) {
+ bool match = false;
+
+ DNS_ANSWER_FOREACH(rr, q->answer) {
+ r = dns_resource_key_match_rr(k, rr, DNS_SEARCH_DOMAIN_NAME(q->answer_search_domain));
+ if (r < 0)
+ return r;
+ if (r > 0) {
+ match = true; /* Yay, we found an RR that matches the key we are looking for */
+ break;
+ }
+ }
+
+ if (!match) {
+ /* Hmm. :-( there's no response for this key. This doesn't match. */
+ full_match = false;
+ break;
+ }
+ }
+
+ if (full_match)
+ return DNS_QUERY_MATCH; /* The answer can answer our question in full, no need to follow CNAMEs/DNAMEs */
+ /* Let's see if there is a CNAME/DNAME to match. This case is simpler: we accept the CNAME/DNAME that
+ * matches any of our questions. */
+ DNS_ANSWER_FOREACH(rr, q->answer) {
r = dns_question_matches_cname_or_dname(question, rr, DNS_SEARCH_DOMAIN_NAME(q->answer_search_domain));
if (r < 0)
return r;
}
if (!cname)
- return DNS_QUERY_NOMATCH; /* No match and no cname to follow */
+ return DNS_QUERY_NOMATCH; /* No match and no CNAME/DNAME to follow */
if (q->flags & SD_RESOLVED_NO_CNAME)
return -ELOOP;
q->previous_redirect_unauthenticated = true;
if (!FLAGS_SET(q->answer_query_flags, SD_RESOLVED_CONFIDENTIAL))
q->previous_redirect_non_confidential = true;
+ if (!FLAGS_SET(q->answer_query_flags, SD_RESOLVED_SYNTHETIC))
+ q->previous_redirect_non_synthetic = true;
/* OK, let's actually follow the CNAME */
r = dns_query_cname_redirect(q, cname);
if (r < 0)
return r;
- /* Let's see if the answer can already answer the new
- * redirected question */
- r = dns_query_process_cname(q);
- if (r != DNS_QUERY_NOMATCH)
- return r;
+ return DNS_QUERY_CNAME; /* Tell caller that we did a single CNAME/DNAME redirection step */
+}
- /* OK, it cannot, let's begin with the new query */
- r = dns_query_go(q);
- if (r < 0)
- return r;
+int dns_query_process_cname_many(DnsQuery *q) {
+ int r;
+
+ assert(q);
+
+ /* Follows CNAMEs through the current packet: as long as the current packet can fulfill our
+ * redirected CNAME queries we keep going, and restart the query once the current packet isn't good
+ * enough anymore. It's a wrapper around dns_query_process_cname_one() and returns the same values,
+ * but with extended semantics. Specifically:
+ *
+ * DNS_QUERY_MATCH → as above
+ *
+ * DNS_QUERY_CNAME → we ran into a CNAME/DNAME redirect that we could not answer from the current
+ * message, and thus restarted the query to resolve it.
+ *
+ * DNS_QUERY_NOMATCH → we reached the end of CNAME/DNAME chain, and there are no direct matches nor a
+ * CNAME/DNAME match. i.e. this is a NODATA case.
+ *
+ * Note that this function will restart the query for the caller if needed, and that's the case
+ * DNS_QUERY_CNAME is returned.
+ */
+
+ r = dns_query_process_cname_one(q);
+ if (r != DNS_QUERY_CNAME)
+ return r; /* The first redirect is special: if it doesn't answer the question that's no
+ * reason to restart the query, we just accept this as a NODATA answer. */
- return DNS_QUERY_RESTARTED; /* We restarted the query for a new cname */
+ for (;;) {
+ r = dns_query_process_cname_one(q);
+ if (r < 0 || r == DNS_QUERY_MATCH)
+ return r;
+ if (r == DNS_QUERY_NOMATCH) {
+ /* OK, so we followed one or more CNAME/DNAME RR but the existing packet can't answer
+ * this. Let's restart the query hence, with the new question. Why the different
+ * handling than the first chain element? Because if the server answers a direct
+ * question with an empty answer then this is a NODATA response. But if it responds
+ * with a CNAME chain that ultimately is incomplete (i.e. a non-empty but truncated
+ * CNAME chain) then we better follow up ourselves and ask for the rest of the
+ * chain. This is particular relevant since our cache will store CNAME/DNAME
+ * redirects that we learnt about for lookups of certain DNS types, but later on we
+ * can reuse this data even for other DNS types, but in that case need to follow up
+ * with the final lookup of the chain ourselves with the RR type we ourselves are
+ * interested in. */
+ r = dns_query_go(q);
+ if (r < 0)
+ return r;
+
+ return DNS_QUERY_CNAME;
+ }
+
+ /* So we found a CNAME that the existing packet already answers, again via a CNAME, let's
+ * continue going then. */
+ assert(r == DNS_QUERY_CNAME);
+ }
}
DnsQuestion* dns_query_question_for_protocol(DnsQuery *q, DnsProtocol protocol) {
return FLAGS_SET(q->answer_query_flags, SD_RESOLVED_CONFIDENTIAL) && !q->previous_redirect_non_confidential;
}
-bool dns_query_fully_synthetic(DnsQuery *q) {
+bool dns_query_fully_authoritative(DnsQuery *q) {
assert(q);
- return (q->answer_query_flags & (SD_RESOLVED_SYNTHETIC | SD_RESOLVED_FROM_TRUST_ANCHOR)) &&
- !(q->answer_query_flags & SD_RESOLVED_FROM_MASK & ~SD_RESOLVED_FROM_TRUST_ANCHOR);
+ /* We are authoritative for everything synthetic (except if a previous CNAME/DNAME) wasn't
+ * synthetic. (Note: SD_RESOLVED_SYNTHETIC is reset on each CNAME/DNAME, hence the explicit check for
+ * previous synthetic DNAME/CNAME redirections.)*/
+ if ((q->answer_query_flags & SD_RESOLVED_SYNTHETIC) && !q->previous_redirect_non_synthetic)
+ return true;
+
+ /* We are also authoritative for everything coming only from the trust anchor and the local
+ * zones. (Note: the SD_RESOLVED_FROM_xyz flags we merge on each redirect, hence no need to
+ * explicitly check previous redirects here.)*/
+ return (q->answer_query_flags & SD_RESOLVED_FROM_MASK & ~(SD_RESOLVED_FROM_TRUST_ANCHOR | SD_RESOLVED_FROM_ZONE)) == 0;
}
* that even on classic DNS some labels might use UTF8 encoding. Specifically, DNS-SD service names
* (in contrast to their domain suffixes) use UTF-8 encoding even on DNS. Thus, the difference
* between these two fields is mostly relevant only for explicit *hostname* lookups as well as the
- * domain suffixes of service lookups. */
+ * domain suffixes of service lookups.
+ *
+ * Note that questions may consist of multiple RR keys at once, but they must be for the same domain
+ * name. This is used for A+AAAA and TXT+SRV lookups: we'll allocate a single DnsQuery object for
+ * them instead of two separate ones. That allows us minor optimizations with response handling:
+ * CNAME/DNAMEs of the first reply we get can already be used to follow the CNAME/DNAME chain for
+ * both, and we can take benefit of server replies that oftentimes put A responses into AAAA queries
+ * and vice versa (in the additional section). */
DnsQuestion *question_idna;
DnsQuestion *question_utf8;
int answer_errno; /* if state is DNS_TRANSACTION_ERRNO */
bool previous_redirect_unauthenticated;
bool previous_redirect_non_confidential;
+ bool previous_redirect_non_synthetic;
DnsPacket *answer_full_packet;
/* Bus + Varlink client information */
enum {
DNS_QUERY_MATCH,
DNS_QUERY_NOMATCH,
- DNS_QUERY_RESTARTED,
+ DNS_QUERY_CNAME,
};
DnsQueryCandidate* dns_query_candidate_ref(DnsQueryCandidate*);
int dns_query_go(DnsQuery *q);
void dns_query_ready(DnsQuery *q);
-int dns_query_process_cname(DnsQuery *q);
+int dns_query_process_cname_one(DnsQuery *q);
+int dns_query_process_cname_many(DnsQuery *q);
void dns_query_complete(DnsQuery *q, DnsTransactionState state);
bool dns_query_fully_authenticated(DnsQuery *q);
bool dns_query_fully_confidential(DnsQuery *q);
-bool dns_query_fully_synthetic(DnsQuery *q);
+bool dns_query_fully_authoritative(DnsQuery *q);
static inline uint64_t dns_query_reply_flags_make(DnsQuery *q) {
assert(q);
dns_query_fully_confidential(q)) |
(q->answer_query_flags & (SD_RESOLVED_FROM_MASK|SD_RESOLVED_SYNTHETIC));
}
+
+#define CNAME_REDIRECT_MAX 16
return 0;
}
+
+/*
+ * This function is not used in the code base, but is useful when debugging. Do not delete.
+ */
+void dns_question_dump(DnsQuestion *question, FILE *f) {
+ DnsResourceKey *k;
+
+ if (!f)
+ f = stdout;
+
+ DNS_QUESTION_FOREACH(k, question) {
+ char buf[DNS_RESOURCE_KEY_STRING_MAX];
+
+ fputc('\t', f);
+ fputs(dns_resource_key_to_string(k, buf, sizeof(buf)), f);
+ fputc('\n', f);
+ }
+}
int dns_question_cname_redirect(DnsQuestion *q, const DnsResourceRecord *cname, DnsQuestion **ret);
+void dns_question_dump(DnsQuestion *q, FILE *f);
+
const char *dns_question_first_name(DnsQuestion *q);
static inline size_t dns_question_size(DnsQuestion *q) {
/* Static/const keys created with DNS_RESOURCE_KEY_CONST will
* set this to -1, they should not be reffed/unreffed */
- assert(k->n_ref != (unsigned) -1);
+ assert(k->n_ref != UINT_MAX);
assert(k->n_ref > 0);
k->n_ref++;
if (!k)
return NULL;
- assert(k->n_ref != (unsigned) -1);
+ assert(k->n_ref != UINT_MAX);
assert(k->n_ref > 0);
if (k->n_ref == 1) {
if (cname->class != key->class && key->class != DNS_CLASS_ANY)
return 0;
+ if (!dns_type_may_redirect(key->type))
+ return 0;
+
if (cname->type == DNS_TYPE_CNAME)
r = dns_name_equal(dns_resource_key_name(key), dns_resource_key_name(cname));
else if (cname->type == DNS_TYPE_DNAME)
return false;
/* We refuse merging const keys */
- if ((*a)->n_ref == (unsigned) -1)
+ if ((*a)->n_ref == UINT_MAX)
return false;
- if ((*b)->n_ref == (unsigned) -1)
+ if ((*b)->n_ref == UINT_MAX)
return false;
/* Already the same? */
.n_ref = 1,
.key = dns_resource_key_ref(key),
.expiry = USEC_INFINITY,
- .n_skip_labels_signer = (unsigned) -1,
- .n_skip_labels_source = (unsigned) -1,
+ .n_skip_labels_signer = UINT_MAX,
+ .n_skip_labels_source = UINT_MAX,
};
return rr;
}
const char *dns_resource_record_to_string(DnsResourceRecord *rr) {
- _cleanup_free_ char *t = NULL;
- char *s, k[DNS_RESOURCE_KEY_STRING_MAX];
+ _cleanup_free_ char *s = NULL, *t = NULL;
+ char k[DNS_RESOURCE_KEY_STRING_MAX];
int r;
assert(rr);
return NULL;
break;
- case DNS_TYPE_A: {
- _cleanup_free_ char *x = NULL;
-
- r = in_addr_to_string(AF_INET, (const union in_addr_union*) &rr->a.in_addr, &x);
+ case DNS_TYPE_A:
+ r = in_addr_to_string(AF_INET, (const union in_addr_union*) &rr->a.in_addr, &t);
if (r < 0)
return NULL;
- s = strjoin(k, " ", x);
+ s = strjoin(k, " ", t);
if (!s)
return NULL;
break;
- }
case DNS_TYPE_AAAA:
r = in_addr_to_string(AF_INET6, (const union in_addr_union*) &rr->aaaa.in6_addr, &t);
case DNS_TYPE_DNSKEY: {
_cleanup_free_ char *alg = NULL;
- char *ss;
uint16_t key_tag;
key_tag = dnssec_keytag(rr, true);
if (r < 0)
return NULL;
- r = asprintf(&s, "%s %u %u %s",
+ r = asprintf(&t, "%s %u %u %s",
k,
rr->dnskey.flags,
rr->dnskey.protocol,
if (r < 0)
return NULL;
- r = base64_append(&s, r,
+ r = base64_append(&t, r,
rr->dnskey.key, rr->dnskey.key_size,
8, columns());
if (r < 0)
return NULL;
- r = asprintf(&ss, "%s\n"
+ r = asprintf(&s, "%s\n"
" -- Flags:%s%s%s\n"
" -- Key tag: %u",
- s,
+ t,
rr->dnskey.flags & DNSKEY_FLAG_SEP ? " SEP" : "",
rr->dnskey.flags & DNSKEY_FLAG_REVOKE ? " REVOKE" : "",
rr->dnskey.flags & DNSKEY_FLAG_ZONE_KEY ? " ZONE_KEY" : "",
key_tag);
if (r < 0)
return NULL;
- free(s);
- s = ss;
break;
}
break;
}
- case DNS_TYPE_CAA: {
- _cleanup_free_ char *value;
-
- value = octescape(rr->caa.value, rr->caa.value_size);
- if (!value)
+ case DNS_TYPE_CAA:
+ t = octescape(rr->caa.value, rr->caa.value_size);
+ if (!t)
return NULL;
r = asprintf(&s, "%s %u %s \"%s\"%s%s%s%.0u",
k,
rr->caa.flags,
rr->caa.tag,
- value,
+ t,
rr->caa.flags ? "\n -- Flags:" : "",
rr->caa.flags & CAA_FLAG_CRITICAL ? " critical" : "",
rr->caa.flags & ~CAA_FLAG_CRITICAL ? " " : "",
return NULL;
break;
- }
- case DNS_TYPE_OPENPGPKEY: {
+ case DNS_TYPE_OPENPGPKEY:
r = asprintf(&s, "%s", k);
if (r < 0)
return NULL;
if (r < 0)
return NULL;
break;
- }
default:
t = hexmem(rr->generic.data, rr->generic.data_size);
}
rr->to_string = s;
- return s;
+ return TAKE_PTR(s);
}
ssize_t dns_resource_record_payload(DnsResourceRecord *rr, void **out) {
/* Returns the RRset's signer, if it is known. */
- if (rr->n_skip_labels_signer == (unsigned) -1)
+ if (rr->n_skip_labels_signer == UINT_MAX)
return -ENODATA;
n = dns_resource_key_name(rr->key);
/* Returns the RRset's synthesizing source, if it is known. */
- if (rr->n_skip_labels_source == (unsigned) -1)
+ if (rr->n_skip_labels_source == UINT_MAX)
return -ENODATA;
n = dns_resource_key_name(rr->key);
/* Returns > 0 if the RR is generated from a wildcard, and is not the asterisk name itself */
- if (rr->n_skip_labels_source == (unsigned) -1)
+ if (rr->n_skip_labels_source == UINT_MAX)
return -ENODATA;
if (rr->n_skip_labels_source == 0)
assert(key);
assert(cname);
+ /* Checks if the RR `cname` is a CNAME/DNAME RR that matches the specified `key`. If so, returns the
+ * target domain. If not, returns -EUNATCH */
+
if (key->class != cname->key->class && key->class != DNS_CLASS_ANY)
return -EUNATCH;
+ if (!dns_type_may_redirect(key->type)) /* This key type is not subject to CNAME/DNAME redirection?
+ * Then let's refuse right-away */
+ return -EUNATCH;
+
if (cname->key->type == DNS_TYPE_CNAME) {
r = dns_name_equal(dns_resource_key_name(key),
dns_resource_key_name(cname->key));
* resource key object. */
#define DNS_RESOURCE_KEY_CONST(c, t, n) \
((DnsResourceKey) { \
- .n_ref = (unsigned) -1, \
+ .n_ref = UINT_MAX, \
.class = c, \
.type = t, \
._name = (char*) n, \
if (m->current_dns_server == s)
return s;
+ /* Let's log about the server switch, at debug level. Except if we switch from a non-fallback server
+ * to a fallback server or back, since that is noteworthy and possibly a configuration issue */
if (s)
- log_debug("Switching to %s DNS server %s.",
- dns_server_type_to_string(s->type),
- strna(dns_server_string_full(s)));
+ log_full((s->type == DNS_SERVER_FALLBACK) != (m->current_dns_server && m->current_dns_server->type == DNS_SERVER_FALLBACK) ? LOG_NOTICE : LOG_DEBUG,
+ "Switching to %s DNS server %s.", dns_server_type_to_string(s->type), strna(dns_server_string_full(s)));
dns_server_unref(m->current_dns_server);
m->current_dns_server = dns_server_ref(s);
DnsQuestion *question,
bool with_rrsig) { /* Add RRSIG RR matching each RR */
- _cleanup_(dns_resource_key_unrefp) DnsResourceKey *redirected_key = NULL;
DnsAnswerItem *item;
int r;
/* Copies all RRs from 'answer' into 'reply', if they match 'question'. */
DNS_ANSWER_FOREACH_ITEM(item, answer) {
- if (question) {
- r = dns_question_matches_rr(question, item->rr, NULL);
- if (r < 0)
- return r;
- if (r == 0) {
- _cleanup_free_ char *target = NULL;
-
- /* OK, so the RR doesn't directly match. Let's see if the RR is a matching
- * CNAME or DNAME */
-
- r = dns_resource_record_get_cname_target(
- question->keys[0],
- item->rr,
- &target);
- if (r == -EUNATCH)
- continue; /* Not a CNAME/DNAME or doesn't match */
- if (r < 0)
- return r;
-
- dns_resource_key_unref(redirected_key);
-
- /* There can only be one CNAME per name, hence no point in storing more than one here */
- redirected_key = dns_resource_key_new(question->keys[0]->class, question->keys[0]->type, target);
- if (!redirected_key)
- return -ENOMEM;
- }
- }
-
- /* Mask the section info, we want the primary answers to always go without section info, so
- * that it is added to the answer section when we synthesize a reply. */
- r = reply_add_with_rrsig(
- reply,
- item->rr,
- item->ifindex,
- item->flags & ~DNS_ANSWER_MASK_SECTIONS,
- item->rrsig,
- with_rrsig);
+ /* We have a question, let's see if this RR matches it */
+ r = dns_question_matches_rr(question, item->rr, NULL);
if (r < 0)
return r;
- }
-
- if (!redirected_key)
- return 0;
-
- /* This is a CNAME/DNAME answer. In this case also append where the redirections point to to the main
- * answer section */
-
- DNS_ANSWER_FOREACH_ITEM(item, answer) {
+ if (!r) {
+ /* Maybe there's a CNAME/DNAME in here? If so, that's an answer too */
+ r = dns_question_matches_cname_or_dname(question, item->rr, NULL);
+ if (r < 0)
+ return r;
+ if (!r)
+ continue;
+ }
- r = dns_resource_key_match_rr(redirected_key, item->rr, NULL);
- if (r < 0)
- return r;
- if (r == 0)
- continue;
+ /* Mask the section info, we want the primary answers to always go without section
+ * info, so that it is added to the answer section when we synthesize a reply. */
r = reply_add_with_rrsig(
reply,
dns_type_is_dnssec(item->rr->key->type))
continue;
- if (((item->flags ^ section) & (DNS_ANSWER_SECTION_ANSWER|DNS_ANSWER_SECTION_AUTHORITY|DNS_ANSWER_SECTION_ADDITIONAL)) != 0)
+ if (((item->flags ^ section) & DNS_ANSWER_MASK_SECTIONS) != 0)
continue;
r = reply_add_with_rrsig(
if (r < 0)
return r;
- /* Include all RRs that originate from the answer or authority sections, and aren't listed in the
+ /* Include all RRs that originate from the authority sections, and aren't already listed in the
* answer section, in the authority section */
r = dns_stub_collect_answer_by_section(
&q->reply_authoritative,
q->answer,
- DNS_ANSWER_SECTION_ANSWER,
+ DNS_ANSWER_SECTION_AUTHORITY,
q->reply_answer, NULL,
edns0_do);
if (r < 0)
return r;
+
+ /* Include all RRs that originate from the answer or additional sections in the additional section
+ * (except if already listed in the other two sections). Also add all RRs with no section marking. */
r = dns_stub_collect_answer_by_section(
- &q->reply_authoritative,
+ &q->reply_additional,
q->answer,
- DNS_ANSWER_SECTION_AUTHORITY,
- q->reply_answer, NULL,
+ DNS_ANSWER_SECTION_ANSWER,
+ q->reply_answer, q->reply_authoritative,
edns0_do);
if (r < 0)
return r;
-
- /* Include all RRs that originate from the additional sections in the additional section (except if
- * already listed in the other two sections). Also add all RRs with no section marking. */
r = dns_stub_collect_answer_by_section(
&q->reply_additional,
q->answer,
return 0;
}
+static int dns_stub_reply_with_edns0_do(DnsQuery *q) {
+ assert(q);
+
+ /* Reply with DNSSEC DO set? Only if client supports it; and we did any DNSSEC verification
+ * ourselves, or consider the data fully authenticated because we generated it locally, or the client
+ * set cd */
+
+ return DNS_PACKET_DO(q->request_packet) &&
+ (q->answer_dnssec_result >= 0 || /* we did proper DNSSEC validation … */
+ dns_query_fully_authenticated(q) || /* … or we considered it authentic otherwise … */
+ DNS_PACKET_CD(q->request_packet)); /* … or client set CD */
+}
+
+static void dns_stub_suppress_duplicate_section_rrs(DnsQuery *q) {
+ /* If we follow a CNAME/DNAME chain we might end up populating our sections with redundant RRs
+ * because we built up the sections from multiple reply packets (one from each CNAME/DNAME chain
+ * element). E.g. it could be that an RR that was included in the first reply's additional section
+ * ends up being relevant as main answer in a subsequent reply in the chain. Let's clean this up, and
+ * remove everything in the "higher priority" sections from the "lower priority" sections.
+ *
+ * Note that this removal matches by RR keys instead of the full RRs. This is because RRsets should
+ * always end up in one section fully or not at all, but never be split among sections.
+ *
+ * Specifically: we remove ANSWER section RRs from the AUTHORITATIVE and ADDITIONAL sections, as well
+ * as AUTHORITATIVE section RRs from the ADDITIONAL section. */
+
+ dns_answer_remove_by_answer_keys(&q->reply_authoritative, q->reply_answer);
+ dns_answer_remove_by_answer_keys(&q->reply_additional, q->reply_answer);
+ dns_answer_remove_by_answer_keys(&q->reply_additional, q->reply_authoritative);
+}
+
static int dns_stub_send_reply(
DnsQuery *q,
int rcode) {
assert(q);
- /* Reply with DNSSEC DO set? Only if client supports it; and we did any DNSSEC verification
- * ourselves, or consider the data fully authenticated because we generated it locally, or
- * the client set cd */
- edns0_do =
- DNS_PACKET_DO(q->request_packet) &&
- (q->answer_dnssec_result >= 0 || /* we did proper DNSSEC validation … */
- dns_query_fully_authenticated(q) || /* … or we considered it authentic otherwise … */
- DNS_PACKET_CD(q->request_packet)); /* … or client set CD */
-
- r = dns_stub_assign_sections(
- q,
- q->request_packet->question,
- edns0_do);
- if (r < 0)
- return log_debug_errno(r, "Failed to assign sections: %m");
+ edns0_do = dns_stub_reply_with_edns0_do(q); /* let's check if we shall reply with EDNS0 DO? */
r = dns_stub_make_reply_packet(
&reply,
if (r < 0)
return log_debug_errno(r, "Failed to build reply packet: %m");
+ dns_stub_suppress_duplicate_section_rrs(q);
+
r = dns_stub_add_reply_packet_body(
reply,
q->reply_answer,
DNS_PACKET_ID(q->request_packet),
rcode,
truncated,
- dns_query_fully_synthetic(q),
+ dns_query_fully_authoritative(q),
!!q->request_packet->opt,
edns0_do,
DNS_PACKET_AD(q->request_packet) && dns_query_fully_authenticated(q),
}
}
- /* Note that we don't bother with following CNAMEs here. We propagate the authoritative/additional
- * sections from the upstream answer however, hence if the upstream server collected that information
- * already we don't have to collect it ourselves anymore. */
+ /* Take all data from the current reply, and merge it into the three reply sections we are building
+ * up. We do this before processing CNAME redirects, so that we gradually build up our sections, and
+ * and keep adding all RRs in the CNAME chain. */
+ r = dns_stub_assign_sections(
+ q,
+ dns_query_question_for_protocol(q, DNS_PROTOCOL_DNS),
+ dns_stub_reply_with_edns0_do(q));
+ if (r < 0) {
+ log_debug_errno(r, "Failed to assign sections: %m");
+ dns_query_free(q);
+ return;
+ }
switch (q->state) {
- case DNS_TRANSACTION_SUCCESS:
+ case DNS_TRANSACTION_SUCCESS: {
+ bool first = true;
+
+ for (;;) {
+ int cname_result;
+
+ cname_result = dns_query_process_cname_one(q);
+ if (cname_result == -ELOOP) { /* CNAME loop, let's send what we already have */
+ log_debug_errno(r, "Detected CNAME loop, returning what we already have.");
+ (void) dns_stub_send_reply(q, q->answer_rcode);
+ break;
+ }
+ if (cname_result < 0) {
+ log_debug_errno(cname_result, "Failed to process CNAME: %m");
+ break;
+ }
+
+ if (cname_result == DNS_QUERY_NOMATCH) {
+ /* This answer doesn't contain any RR that would answer our question
+ * positively, i.e. neither directly nor via CNAME. */
+
+ if (first) /* We never followed a CNAME and the answer doesn't match our
+ * question at all? Then this is final, the empty answer is the
+ * answer. */
+ break;
+
+ /* Otherwise, we already followed a CNAME once within this packet, and the
+ * packet doesn't answer our question. In that case let's restart the query,
+ * now with the redirected question. We'll */
+ r = dns_query_go(q);
+ if (r < 0)
+ log_debug_errno(r, "Failed to restart query: %m");
+
+ return;
+ }
+
+ r = dns_stub_assign_sections(
+ q,
+ dns_query_question_for_protocol(q, DNS_PROTOCOL_DNS),
+ dns_stub_reply_with_edns0_do(q));
+ if (r < 0) {
+ log_debug_errno(r, "Failed to assign sections: %m");
+ dns_query_free(q);
+ return;
+ }
+
+ if (cname_result == DNS_QUERY_MATCH) /* A match? Then we are done, let's return what we got */
+ break;
+
+ /* We followed a CNAME. and collected the RRs that answer the redirected question
+ * successfully. Let's not try to do this again. */
+ assert(cname_result == DNS_QUERY_CNAME);
+ first = false;
+ }
+
+ _fallthrough_;
+ }
+
case DNS_TRANSACTION_RCODE_FAILURE:
(void) dns_stub_send_reply(q, q->answer_rcode);
break;
r = dns_query_new(m, &q, p->question, p->question, NULL, 0,
SD_RESOLVED_PROTOCOLS_ALL|
SD_RESOLVED_NO_SEARCH|
- SD_RESOLVED_NO_CNAME|
(DNS_PACKET_DO(p) ? SD_RESOLVED_REQUIRE_PRIMARY : 0)|
SD_RESOLVED_CLAMP_TTL);
if (r < 0) {
return r;
}
- if (IN_SET(key->type, DNS_TYPE_AAAA, DNS_TYPE_ANY)) {
+ if (IN_SET(key->type, DNS_TYPE_AAAA, DNS_TYPE_ANY) && socket_ipv6_is_enabled()) {
_cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL;
rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_AAAA, dns_resource_key_name(key));
.address.in.s_addr = htobe32(0x7F000002),
};
- if (IN_SET(af, AF_INET6, AF_UNSPEC))
+ if (IN_SET(af, AF_INET6, AF_UNSPEC) && socket_ipv6_is_enabled())
buffer[n++] = (struct local_address) {
.family = AF_INET6,
.ifindex = dns_synthesize_ifindex(ifindex),
t->answer_dnssec_result = _DNSSEC_RESULT_INVALID;
t->answer_source = _DNS_TRANSACTION_SOURCE_INVALID;
t->answer_query_flags = 0;
- t->answer_nsec_ttl = (uint32_t) -1;
+ t->answer_nsec_ttl = UINT32_MAX;
t->answer_errno = 0;
}
.dns_udp_fd = -1,
.answer_source = _DNS_TRANSACTION_SOURCE_INVALID,
.answer_dnssec_result = _DNSSEC_RESULT_INVALID,
- .answer_nsec_ttl = (uint32_t) -1,
+ .answer_nsec_ttl = UINT32_MAX,
.key = dns_resource_key_ref(key),
.query_flags = query_flags,
.bypass = dns_packet_ref(bypass),
#include "resolved-manager.h"
#include "resolved-mdns.h"
#include "resolved-resolv-conf.h"
+#include "resolved-util.h"
#include "resolved-varlink.h"
#include "socket-util.h"
#include "string-table.h"
return 0;
}
-static int determine_hostname(char **full_hostname, char **llmnr_hostname, char **mdns_hostname) {
+static int determine_hostnames(char **full_hostname, char **llmnr_hostname, char **mdns_hostname) {
_cleanup_free_ char *h = NULL, *n = NULL;
-#if HAVE_LIBIDN2
- _cleanup_free_ char *utf8 = NULL;
-#elif HAVE_LIBIDN
- int k;
-#endif
- char label[DNS_LABEL_MAX];
- const char *p, *decoded;
int r;
assert(full_hostname);
assert(llmnr_hostname);
assert(mdns_hostname);
- /* Extract and normalize the first label of the locally configured hostname, and check it's not "localhost". */
-
- r = gethostname_strict(&h);
- if (r < 0)
- return log_debug_errno(r, "Can't determine system hostname: %m");
-
- p = h;
- r = dns_label_unescape(&p, label, sizeof label, 0);
- if (r < 0)
- return log_error_errno(r, "Failed to unescape hostname: %m");
- if (r == 0)
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
- "Couldn't find a single label in hostname.");
-
-#if HAVE_LIBIDN || HAVE_LIBIDN2
- r = dlopen_idn();
- if (r < 0) {
- log_debug_errno(r, "Failed to initialize IDN support, ignoring: %m");
- decoded = label; /* no decoding */
- } else
-#endif
- {
-#if HAVE_LIBIDN2
- r = sym_idn2_to_unicode_8z8z(label, &utf8, 0);
- if (r != IDN2_OK)
- return log_error_errno(SYNTHETIC_ERRNO(EUCLEAN),
- "Failed to undo IDNA: %s", sym_idn2_strerror(r));
- assert(utf8_is_valid(utf8));
-
- r = strlen(utf8);
- decoded = utf8;
-#elif HAVE_LIBIDN
- k = dns_label_undo_idna(label, r, label, sizeof label);
- if (k < 0)
- return log_error_errno(k, "Failed to undo IDNA: %m");
- if (k > 0)
- r = k;
-
- if (!utf8_is_valid(label))
- return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
- "System hostname is not UTF-8 clean.");
- decoded = label;
-#else
- decoded = label; /* no decoding */
-#endif
- }
-
- r = dns_label_escape_new(decoded, r, &n);
+ r = resolve_system_hostname(&h, &n);
if (r < 0)
- return log_error_errno(r, "Failed to escape hostname: %m");
-
- if (is_localhost(n))
- return log_debug_errno(SYNTHETIC_ERRNO(EINVAL),
- "System hostname is 'localhost', ignoring.");
+ return r;
r = dns_name_concat(n, "local", 0, mdns_hostname);
if (r < 0)
assert(m);
- r = determine_hostname(&full_hostname, &llmnr_hostname, &mdns_hostname);
- if (r < 0)
+ r = determine_hostnames(&full_hostname, &llmnr_hostname, &mdns_hostname);
+ if (r < 0) {
+ log_warning_errno(r, "Failed to determine the local hostname and LLMNR/mDNS names, ignoring: %m");
return 0; /* ignore invalid hostnames */
+ }
llmnr_hostname_changed = !streq(llmnr_hostname, m->llmnr_hostname);
if (streq(full_hostname, m->full_hostname) &&
(void) sd_event_source_set_description(m->hostname_event_source, "hostname");
- r = determine_hostname(&m->full_hostname, &m->llmnr_hostname, &m->mdns_hostname);
+ r = determine_hostnames(&m->full_hostname, &m->llmnr_hostname, &m->mdns_hostname);
if (r < 0) {
_cleanup_free_ char *d = NULL;
if (dns_packet_validate_reply(p) > 0) {
DnsResourceRecord *rr;
+ DnsTransaction *t;
log_debug("Got mDNS reply packet");
dns_scope_check_conflicts(scope, p);
DNS_ANSWER_FOREACH(rr, p->answer) {
- const char *name = dns_resource_key_name(rr->key);
- DnsTransaction *t;
+ const char *name;
+
+ name = dns_resource_key_name(rr->key);
/* If the received reply packet contains ANY record that is not .local
* or .in-addr.arpa or .ip6.arpa, we assume someone's playing tricks on
/* See the section 10.1 of RFC6762 */
rr->ttl = 1;
}
+ }
- t = dns_scope_find_transaction(scope, rr->key, SD_RESOLVED_NO_CACHE|SD_RESOLVED_NO_ZONE);
- if (t)
- dns_transaction_process_reply(t, p, false);
-
- /* Also look for the various types of ANY transactions */
- t = dns_scope_find_transaction(scope, &DNS_RESOURCE_KEY_CONST(rr->key->class, DNS_TYPE_ANY, dns_resource_key_name(rr->key)), SD_RESOLVED_NO_CACHE|SD_RESOLVED_NO_ZONE);
- if (t)
- dns_transaction_process_reply(t, p, false);
-
- t = dns_scope_find_transaction(scope, &DNS_RESOURCE_KEY_CONST(DNS_CLASS_ANY, rr->key->type, dns_resource_key_name(rr->key)), SD_RESOLVED_NO_CACHE|SD_RESOLVED_NO_ZONE);
- if (t)
- dns_transaction_process_reply(t, p, false);
-
- t = dns_scope_find_transaction(scope, &DNS_RESOURCE_KEY_CONST(DNS_CLASS_ANY, DNS_TYPE_ANY, dns_resource_key_name(rr->key)), SD_RESOLVED_NO_CACHE|SD_RESOLVED_NO_ZONE);
- if (t)
+ LIST_FOREACH(transactions_by_scope, t, scope->transactions) {
+ r = dns_answer_match_key(p->answer, t->key, NULL);
+ if (r < 0)
+ log_debug_errno(r, "Failed to match resource key, ignoring: %m");
+ else if (r > 0) /* This packet matches the transaction, let's pass it on as reply */
dns_transaction_process_reply(t, p, false);
}
- dns_cache_put(&scope->cache, scope->manager->enable_cache, NULL, DNS_PACKET_RCODE(p), p->answer, NULL, false, _DNSSEC_RESULT_INVALID, (uint32_t) -1, p->family, &p->sender);
+ dns_cache_put(&scope->cache, scope->manager->enable_cache, NULL, DNS_PACKET_RCODE(p), p->answer, NULL, false, _DNSSEC_RESULT_INVALID, UINT32_MAX, p->family, &p->sender);
} else if (dns_packet_validate_query(p) > 0) {
log_debug("Got mDNS query packet for id %u", DNS_PACKET_ID(p));
--- /dev/null
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include "dns-def.h"
+#include "dns-domain.h"
+#include "hostname-util.h"
+#include "idn-util.h"
+#include "resolved-util.h"
+#include "utf8.h"
+
+int resolve_system_hostname(char **full_hostname, char **first_label) {
+ _cleanup_free_ char *h = NULL, *n = NULL;
+#if HAVE_LIBIDN2
+ _cleanup_free_ char *utf8 = NULL;
+#elif HAVE_LIBIDN
+ int k;
+#endif
+ char label[DNS_LABEL_MAX];
+ const char *p, *decoded;
+ int r;
+
+ /* Return the full hostname in *full_hostname, if nonnull.
+ *
+ * Extract and normalize the first label of the locally configured hostname, check it's not
+ * "localhost", and return it in *first_label, if nonnull. */
+
+ r = gethostname_strict(&h);
+ if (r < 0)
+ return log_debug_errno(r, "Can't determine system hostname: %m");
+
+ p = h;
+ r = dns_label_unescape(&p, label, sizeof label, 0);
+ if (r < 0)
+ return log_debug_errno(r, "Failed to unescape hostname: %m");
+ if (r == 0)
+ return log_debug_errno(SYNTHETIC_ERRNO(EINVAL),
+ "Couldn't find a single label in hostname.");
+
+#if HAVE_LIBIDN || HAVE_LIBIDN2
+ r = dlopen_idn();
+ if (r < 0) {
+ log_debug_errno(r, "Failed to initialize IDN support, ignoring: %m");
+ decoded = label; /* no decoding */
+ } else
+#endif
+ {
+#if HAVE_LIBIDN2
+ r = sym_idn2_to_unicode_8z8z(label, &utf8, 0);
+ if (r != IDN2_OK)
+ return log_debug_errno(SYNTHETIC_ERRNO(EUCLEAN),
+ "Failed to undo IDNA: %s", sym_idn2_strerror(r));
+ assert(utf8_is_valid(utf8));
+
+ r = strlen(utf8);
+ decoded = utf8;
+#elif HAVE_LIBIDN
+ k = dns_label_undo_idna(label, r, label, sizeof label);
+ if (k < 0)
+ return log_debug_errno(k, "Failed to undo IDNA: %m");
+ if (k > 0)
+ r = k;
+
+ if (!utf8_is_valid(label))
+ return log_debug_errno(SYNTHETIC_ERRNO(EINVAL),
+ "System hostname is not UTF-8 clean.");
+ decoded = label;
+#else
+ decoded = label; /* no decoding */
+#endif
+ }
+
+ r = dns_label_escape_new(decoded, r, &n);
+ if (r < 0)
+ return log_debug_errno(r, "Failed to escape hostname: %m");
+
+ if (is_localhost(n))
+ return log_debug_errno(SYNTHETIC_ERRNO(EINVAL),
+ "System hostname is 'localhost', ignoring.");
+
+ if (full_hostname)
+ *full_hostname = TAKE_PTR(h);
+ if (first_label)
+ *first_label = TAKE_PTR(n);
+ return 0;
+}
--- /dev/null
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#pragma once
+
+int resolve_system_hostname(char **full_hostname, char **first_label);
goto finish;
}
- r = dns_query_process_cname(q);
+ r = dns_query_process_cname_many(q);
if (r == -ELOOP) {
r = varlink_error(q->varlink_request, "io.systemd.Resolve.CNAMELoop", NULL);
goto finish;
}
if (r < 0)
goto finish;
- if (r == DNS_QUERY_RESTARTED) /* This was a cname, and the query was restarted. */
+ if (r == DNS_QUERY_CNAME) /* This was a cname, and the query was restarted. */
return;
question = dns_query_question_for_protocol(q, q->answer_protocol);
goto finish;
}
- r = dns_query_process_cname(q);
+ r = dns_query_process_cname_many(q);
if (r == -ELOOP) {
r = varlink_error(q->varlink_request, "io.systemd.Resolve.CNAMELoop", NULL);
goto finish;
}
if (r < 0)
goto finish;
- if (r == DNS_QUERY_RESTARTED) /* This was a cname, and the query was restarted. */
+ if (r == DNS_QUERY_CNAME) /* This was a cname, and the query was restarted. */
return;
question = dns_query_question_for_protocol(q, q->answer_protocol);
# the system.conf.d/ subdirectory. The latter is generally recommended.
# Defaults can be restored by simply deleting this file and all drop-ins.
#
+# Use 'systemd-analyze cat-config systemd/resolved.conf' to display the full config.
+#
# See resolved.conf(5) for details.
[Resolve]
return 0;
}
- /* We managed to get the unique name, then let's use that to
- * name our transient units. */
+ /* We managed to get the unique name, then let's use that to name our transient units. */
- id = startswith(unique, ":1.");
+ id = startswith(unique, ":1."); /* let' strip the usual prefix */
+ if (!id)
+ id = startswith(unique, ":"); /* the spec only requires things to start with a colon, hence
+ * let's add a generic fallback for that. */
if (!id)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Unique name %s has unexpected format.",
struct acpi_fpdt_boot_header hbrec;
struct acpi_fpdt_boot brec;
- r = read_full_file("/sys/firmware/acpi/tables/FPDT", &buf, &l);
+ r = read_full_virtual_file("/sys/firmware/acpi/tables/FPDT", &buf, &l);
if (r < 0)
return r;
#include <fcntl.h>
#include <inttypes.h>
#include <limits.h>
-#include <poll.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
return 0;
size_t m = utf8_n_codepoints(str);
- if (m == (size_t) -1)
+ if (m == SIZE_MAX)
m = strlen(str); /* Not a valid UTF-8 string? If so, let's backspace the number of bytes
* output. Most likely this happened because we are not in an UTF-8 locale,
* and in that case that is the correct thing to do. And even if it's not,
pollfd[POLL_INOTIFY].events = POLLIN;
for (;;) {
- int sleep_for = -1, j;
+ usec_t timeout;
- if (until > 0) {
- usec_t y;
-
- y = now(CLOCK_MONOTONIC);
-
- if (y > until) {
- r = -ETIME;
- goto finish;
- }
-
- sleep_for = (int) ((until - y) / USEC_PER_MSEC);
- }
+ if (until > 0)
+ timeout = usec_sub_unsigned(until, now(CLOCK_MONOTONIC));
+ else
+ timeout = USEC_INFINITY;
if (flag_file && access(flag_file, F_OK) < 0) {
r = -errno;
goto finish;
}
- j = poll(pollfd, notify >= 0 ? 2 : 1, sleep_for);
- if (j < 0) {
- if (errno == EINTR)
- continue;
-
- r = -errno;
+ r = ppoll_usec(pollfd, notify >= 0 ? 2 : 1, timeout);
+ if (r == -EINTR)
+ continue;
+ if (r < 0)
goto finish;
- } else if (j == 0) {
+ if (r == 0) {
r = -ETIME;
goto finish;
}
- if (pollfd[POLL_SOCKET].revents & POLLNVAL ||
- (notify >= 0 && pollfd[POLL_INOTIFY].revents & POLLNVAL)) {
- r = -EBADF;
- goto finish;
- }
-
if (notify >= 0 && pollfd[POLL_INOTIFY].revents != 0)
(void) flush_fd(notify);
for (;;) {
_cleanup_(erase_char) char c;
- int sleep_for = -1, k;
+ usec_t timeout;
ssize_t n;
- if (until > 0) {
- usec_t y;
-
- y = now(CLOCK_MONOTONIC);
-
- if (y > until) {
- r = -ETIME;
- goto finish;
- }
-
- sleep_for = (int) DIV_ROUND_UP(until - y, USEC_PER_MSEC);
- }
+ if (until > 0)
+ timeout = usec_sub_unsigned(until, now(CLOCK_MONOTONIC));
+ else
+ timeout = USEC_INFINITY;
if (flag_file)
if (access(flag_file, F_OK) < 0) {
goto finish;
}
- k = poll(pollfd, notify >= 0 ? 2 : 1, sleep_for);
- if (k < 0) {
- if (errno == EINTR)
- continue;
-
- r = -errno;
+ r = ppoll_usec(pollfd, notify >= 0 ? 2 : 1, timeout);
+ if (r == -EINTR)
+ continue;
+ if (r < 0)
goto finish;
- } else if (k == 0) {
+ if (r == 0) {
r = -ETIME;
goto finish;
}
- if ((pollfd[POLL_TTY].revents & POLLNVAL) ||
- (notify >= 0 && (pollfd[POLL_INOTIFY].revents & POLLNVAL))) {
- r = -EBADF;
- goto finish;
- }
-
if (notify >= 0 && pollfd[POLL_INOTIFY].revents != 0 && keyname) {
(void) flush_fd(notify);
* last one begins */
q = 0;
for (;;) {
- size_t z;
+ int z;
- z = utf8_encoded_valid_unichar(passphrase + q, (size_t) -1);
- if (z == 0) {
- q = (size_t) -1; /* Invalid UTF8! */
+ z = utf8_encoded_valid_unichar(passphrase + q, SIZE_MAX);
+ if (z <= 0) {
+ q = SIZE_MAX; /* Invalid UTF8! */
break;
}
q += z;
}
- p = codepoint = q == (size_t) -1 ? p - 1 : q;
+ p = codepoint = q == SIZE_MAX ? p - 1 : q;
explicit_bzero_safe(passphrase + p, sizeof(passphrase) - p);
} else if (!dirty && !(flags & ASK_PASSWORD_SILENT)) {
if (!(flags & ASK_PASSWORD_SILENT) && ttyfd >= 0) {
/* Check if we got a complete UTF-8 character now. If so, let's output one '*'. */
- n = utf8_encoded_valid_unichar(passphrase + codepoint, (size_t) -1);
+ n = utf8_encoded_valid_unichar(passphrase + codepoint, SIZE_MAX);
if (n >= 0) {
if (flags & ASK_PASSWORD_ECHO)
(void) loop_write(ttyfd, passphrase + codepoint, n, false);
char passphrase[LINE_MAX+1];
struct iovec iovec;
struct ucred *ucred;
+ usec_t timeout;
ssize_t n;
- int k;
- usec_t t;
-
- t = now(CLOCK_MONOTONIC);
-
- if (until > 0 && until <= t) {
- r = -ETIME;
- goto finish;
- }
- k = poll(pollfd, notify >= 0 ? _FD_MAX : _FD_MAX - 1, until > 0 ? (int) ((until-t)/USEC_PER_MSEC) : -1);
- if (k < 0) {
- if (errno == EINTR)
- continue;
+ if (until > 0)
+ timeout = usec_sub_unsigned(until, now(CLOCK_MONOTONIC));
+ else
+ timeout = USEC_INFINITY;
- r = -errno;
+ r = ppoll_usec(pollfd, notify >= 0 ? _FD_MAX : _FD_MAX - 1, timeout);
+ if (r == -EINTR)
+ continue;
+ if (r < 0)
goto finish;
- }
-
- if (k <= 0) {
+ if (r == 0) {
r = -ETIME;
goto finish;
}
- if (pollfd[FD_SOCKET].revents & POLLNVAL ||
- pollfd[FD_SIGNAL].revents & POLLNVAL ||
- (notify >= 0 && pollfd[FD_INOTIFY].revents & POLLNVAL)) {
- r = -EBADF;
- goto finish;
- }
-
if (pollfd[FD_SIGNAL].revents & POLLIN) {
r = -EINTR;
goto finish;
#include <errno.h>
#include <fcntl.h>
-#include <poll.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include "barrier.h"
#include "fd-util.h"
+#include "io-util.h"
#include "macro.h"
/**
uint64_t buf;
int r;
- r = poll(pfd, ELEMENTSOF(pfd), -1);
- if (r < 0) {
- if (IN_SET(errno, EAGAIN, EINTR))
- continue;
- goto error;
- }
- if (pfd[0].revents & POLLNVAL ||
- pfd[1].revents & POLLNVAL)
+ r = ppoll_usec(pfd, ELEMENTSOF(pfd), USEC_INFINITY);
+ if (r == -EINTR)
+ continue;
+ if (r < 0)
goto error;
if (pfd[1].revents) {
#define BITMAPS_MAX_ENTRY 0xffff
/* This indicates that we reached the end of the bitmap */
-#define BITMAP_END ((unsigned) -1)
+#define BITMAP_END (UINT_MAX)
#define BITMAP_NUM_TO_OFFSET(n) ((n) / (sizeof(uint64_t) * 8))
#define BITMAP_NUM_TO_REM(n) ((n) % (sizeof(uint64_t) * 8))
x = is_soft ? buf.rlim_cur : buf.rlim_max;
}
- /* rlim_t might have different sizes, let's map RLIMIT_INFINITY to (uint64_t) -1, so that it is the same on all
+ /* rlim_t might have different sizes, let's map RLIMIT_INFINITY to UINT64_MAX, so that it is the same on all
* archs */
- u = x == RLIM_INFINITY ? (uint64_t) -1 : (uint64_t) x;
+ u = x == RLIM_INFINITY ? UINT64_MAX : (uint64_t) x;
return sd_bus_message_append(reply, "t", u);
}
} else if ((STR_IN_SET(name, "CPUWeight", "StartupCPUWeight", "IOWeight", "StartupIOWeight") && u == CGROUP_WEIGHT_INVALID) ||
(STR_IN_SET(name, "CPUShares", "StartupCPUShares") && u == CGROUP_CPU_SHARES_INVALID) ||
(STR_IN_SET(name, "BlockIOWeight", "StartupBlockIOWeight") && u == CGROUP_BLKIO_WEIGHT_INVALID) ||
- (STR_IN_SET(name, "MemoryCurrent", "TasksCurrent") && u == (uint64_t) -1) ||
- (endswith(name, "NSec") && u == (uint64_t) -1))
+ (STR_IN_SET(name, "MemoryCurrent", "TasksCurrent") && u == UINT64_MAX) ||
+ (endswith(name, "NSec") && u == UINT64_MAX))
bus_print_property_value(name, expected_value, value, "[not set]");
else if ((STR_IN_SET(name, "DefaultMemoryLow", "DefaultMemoryMin", "MemoryLow", "MemoryHigh", "MemoryMax", "MemorySwapMax", "MemoryLimit") && u == CGROUP_LIMIT_MAX) ||
- (STR_IN_SET(name, "TasksMax", "DefaultTasksMax") && u == (uint64_t) -1) ||
- (startswith(name, "Limit") && u == (uint64_t) -1) ||
- (startswith(name, "DefaultLimit") && u == (uint64_t) -1))
+ (STR_IN_SET(name, "TasksMax", "DefaultTasksMax") && u == UINT64_MAX) ||
+ (startswith(name, "Limit") && u == UINT64_MAX) ||
+ (startswith(name, "DefaultLimit") && u == UINT64_MAX))
bus_print_property_value(name, expected_value, value, "infinity");
- else if (STR_IN_SET(name, "IPIngressBytes", "IPIngressPackets", "IPEgressBytes", "IPEgressPackets") && u == (uint64_t) -1)
+ else if (STR_IN_SET(name, "IPIngressBytes", "IPIngressPackets", "IPEgressBytes", "IPEgressPackets") && u == UINT64_MAX)
bus_print_property_value(name, expected_value, value, "[no data]");
else
bus_print_property_valuef(name, expected_value, value, "%"PRIu64, u);
"ProtectProc",
"ProcSubset",
"NetworkNamespacePath",
+ "IPCNamespacePath",
"LogNamespace"))
return bus_append_string(m, field, eq);
"PrivateNetwork",
"PrivateUsers",
"PrivateMounts",
+ "PrivateIPC",
"NoNewPrivileges",
"SyslogLevelPrefix",
"MemoryDenyWriteExecute",
_cleanup_free_ void *decoded = NULL;
size_t sz;
- r = unbase64mem(eq, (size_t) -1, &decoded, &sz);
+ r = unbase64mem(eq, SIZE_MAX, &decoded, &sz);
if (r < 0)
return log_error_errno(r, "Failed to decode base64 data '%s': %m", eq);
if (STR_IN_SET(field, "PIDFile",
"Type",
+ "ExitType",
"Restart",
"BusName",
"NotifyAccess",
else
idle = true;
- r = sd_event_run(e, exiting || !idle ? (uint64_t) -1 : timeout);
+ r = sd_event_run(e, exiting || !idle ? UINT64_MAX : timeout);
if (r < 0)
return r;
if (r > 0)
return 0;
- r = sd_bus_wait(bus, (uint64_t) -1);
+ r = sd_bus_wait(bus, UINT64_MAX);
if (r < 0)
return r;
}
if (r > 0)
continue;
- r = sd_bus_wait(d->bus, (uint64_t) -1);
+ r = sd_bus_wait(d->bus, UINT64_MAX);
if (r < 0)
return r;
}
return 0;
}
-static int find_end_of_month(struct tm *tm, bool utc, int day) {
+static int find_end_of_month(const struct tm *tm, bool utc, int day) {
struct tm t = *tm;
t.tm_mon++;
return t.tm_mday;
}
-static int find_matching_component(const CalendarSpec *spec, const CalendarComponent *c,
- struct tm *tm, int *val) {
- const CalendarComponent *p = c;
- int start, stop, d = -1;
+static int find_matching_component(
+ const CalendarSpec *spec,
+ const CalendarComponent *c,
+ const struct tm *tm, /* tm is only used for end-of-month calculations */
+ int *val) {
+
+ int d = -1, r;
bool d_set = false;
- int r;
assert(val);
+ /* Finds the *earliest* matching time specified by one of the CalendarCompoment items in chain c.
+ * If no matches can be found, returns -ENOENT.
+ * Otherwise, updates *val to the matching time. 1 is returned if *val was changed, 0 otherwise.
+ */
+
if (!c)
return 0;
+ bool end_of_month = spec->end_of_month && c == spec->day;
+
while (c) {
- start = c->start;
- stop = c->stop;
+ int start, stop;
- if (spec->end_of_month && p == spec->day) {
- start = find_end_of_month(tm, spec->utc, start);
- stop = find_end_of_month(tm, spec->utc, stop);
+ if (end_of_month) {
+ start = find_end_of_month(tm, spec->utc, c->start);
+ stop = find_end_of_month(tm, spec->utc, c->stop);
if (stop > 0)
SWAP_TWO(start, stop);
+ } else {
+ start = c->start;
+ stop = c->stop;
}
if (start >= *val) {
return negative_errno();
/* Did any normalization take place? If so, it was out of bounds before */
- bool good = t.tm_year == tm->tm_year &&
- t.tm_mon == tm->tm_mon &&
- t.tm_mday == tm->tm_mday &&
- t.tm_hour == tm->tm_hour &&
- t.tm_min == tm->tm_min &&
- t.tm_sec == tm->tm_sec;
- if (!good)
+ int cmp = CMP(t.tm_year, tm->tm_year) ?:
+ CMP(t.tm_mon, tm->tm_mon) ?:
+ CMP(t.tm_mday, tm->tm_mday) ?:
+ CMP(t.tm_hour, tm->tm_hour) ?:
+ CMP(t.tm_min, tm->tm_min) ?:
+ CMP(t.tm_sec, tm->tm_sec);
+
+ if (cmp < 0)
+ return -EDEADLK; /* Refuse to go backward */
+ if (cmp > 0)
*tm = t;
- return good;
+ return cmp == 0;
}
static bool matches_weekday(int weekdays_bits, const struct tm *tm, bool utc) {
return (weekdays_bits & (1 << k));
}
+/* A safety valve: if we get stuck in the calculation, return an error.
+ * C.f. https://bugzilla.redhat.com/show_bug.cgi?id=1941335. */
+#define MAX_CALENDAR_ITERATIONS 1000
+
static int find_next(const CalendarSpec *spec, struct tm *tm, usec_t *usec) {
struct tm c;
int tm_usec;
c = *tm;
tm_usec = *usec;
- for (;;) {
+ for (unsigned iteration = 0; iteration < MAX_CALENDAR_ITERATIONS; iteration++) {
/* Normalize the current date */
(void) mktime_or_timegm(&c, spec->utc);
c.tm_isdst = spec->dst;
*usec = tm_usec;
return 0;
}
+
+ /* It seems we entered an infinite loop. Let's gracefully return an error instead of hanging or
+ * aborting. This code is also exercised when timers.target is brought up during early boot, so
+ * aborting here is problematic and hard to diagnose for users. */
+ _cleanup_free_ char *s = NULL;
+ (void) calendar_spec_to_string(spec, &s);
+ return log_warning_errno(SYNTHETIC_ERRNO(EDEADLK),
+ "Infinite loop in calendar calculation: %s", strna(s));
}
static int calendar_spec_next_usec_impl(const CalendarSpec *spec, usec_t usec, usec_t *ret_next) {
const void *table,
ConfigParseFlags flags,
void *userdata,
- usec_t *ret_mtime) {
+ usec_t *latest_mtime) {
_cleanup_free_ char *section = NULL, *continuation = NULL;
_cleanup_fclose_ FILE *ours = NULL;
assert(filename);
assert(lookup);
+ /* latest_mtime is an input-output parameter: it will be updated if the mtime of the file we're
+ * looking at is later than the current *latest_mtime value. */
+
if (!f) {
f = ours = fopen(filename, "re");
if (!f) {
}
}
- if (ret_mtime)
- *ret_mtime = mtime;
+ if (latest_mtime)
+ *latest_mtime = MAX(*latest_mtime, mtime);
return 1;
}
/* Then read all the drop-ins. */
STRV_FOREACH(fn, files) {
- usec_t t;
-
- r = config_parse(NULL, *fn, NULL, sections, lookup, table, flags, userdata, &t);
+ r = config_parse(NULL, *fn, NULL, sections, lookup, table, flags, userdata, &mtime);
if (r < 0)
return r;
- mtime = MAX(mtime, t); /* Find the newest */
}
if (ret_mtime)
const void *table,
ConfigParseFlags flags,
void *userdata,
- usec_t *ret_mtime); /* possibly NULL */
+ usec_t *latest_mtime); /* input/output, possibly NULL */
int config_parse_many_nulstr(
const char *conf_file, /* possibly NULL */
if (r == 0) {
/* Child */
execl("/sbin/fsck", "/sbin/fsck", "-aT", node, NULL);
+ log_open();
log_debug_errno(errno, "Failed to execl() fsck: %m");
_exit(FSCK_OPERATIONAL_ERROR);
}
}
if (directory) {
- if (!FLAGS_SET(flags, DISSECT_IMAGE_READ_ONLY)) {
- /* Automatically create missing mount points, if necessary. */
- r = mkdir_p_root(where, directory, uid_shift, (gid_t) uid_shift, 0755);
- if (r < 0)
- return r;
- }
+ /* Automatically create missing mount points inside the image, if necessary. */
+ r = mkdir_p_root(where, directory, uid_shift, (gid_t) uid_shift, 0755);
+ if (r < 0 && r != -EROFS)
+ return r;
r = chase_symlinks(directory, where, CHASE_PREFIX_ROOT, &chased, NULL);
if (r < 0)
return r;
p = chased;
- } else
+ } else {
+ /* Create top-level mount if missing – but only if this is asked for. This won't modify the
+ * image (as the branch above does) but the host hierarchy, and the created directory might
+ * survive our mount in the host hierarchy hence. */
+ if (FLAGS_SET(flags, DISSECT_IMAGE_MKDIR)) {
+ r = mkdir_p(where, 0755);
+ if (r < 0)
+ return r;
+ }
+
p = where;
+ }
/* If requested, turn on discard support. */
if (fstype_can_discard(fstype) &&
if (!strextend_with_separator(&options, ",", m->mount_options))
return -ENOMEM;
- if (FLAGS_SET(flags, DISSECT_IMAGE_MKDIR)) {
- r = mkdir_p(p, 0755);
- if (r < 0)
- return r;
- }
-
r = mount_nofollow_verbose(LOG_DEBUG, node, p, fstype, MS_NODEV|(rw ? 0 : MS_RDONLY), options);
if (r < 0)
return r;
return r;
}
- /* Mask DISSECT_IMAGE_MKDIR for all subdirs: the idea is that only the top-level mount point is
- * created if needed, but the image itself not modified. */
- flags &= ~DISSECT_IMAGE_MKDIR;
-
if ((flags & DISSECT_IMAGE_MOUNT_NON_ROOT_ONLY) == 0) {
/* For us mounting root always means mounting /usr as well */
r = mount_partition(m->partitions + PARTITION_USR, where, "/usr", uid_shift, flags);
free(p->name);
}
+ free(d->decrypted);
free(d);
#endif
return NULL;
[META_HOSTNAME] = "/etc/hostname\0",
[META_MACHINE_ID] = "/etc/machine-id\0",
[META_MACHINE_INFO] = "/etc/machine-info\0",
- [META_OS_RELEASE] = ("/etc/os-release\0"
- "/usr/lib/os-release\0"),
+ [META_OS_RELEASE] = "/etc/os-release\0"
+ "/usr/lib/os-release\0",
[META_EXTENSION_RELEASE] = NULL,
};
/* As per the os-release spec, if the image is an extension it will have a file
* named after the image name in extension-release.d/ */
- if (m->image_name)
- paths[META_EXTENSION_RELEASE] = strjoina("/usr/lib/extension-release.d/extension-release.", m->image_name);
- else
+ if (m->image_name) {
+ char *ext;
+
+ ext = strjoina("/usr/lib/extension-release.d/extension-release.", m->image_name, "0");
+ ext[strlen(ext) - 1] = '\0'; /* Extra \0 for NULSTR_FOREACH using placeholder from above */
+ paths[META_EXTENSION_RELEASE] = ext;
+ } else
log_debug("No image name available, will skip extension-release metadata");
for (; n_meta_initialized < _META_MAX; n_meta_initialized ++) {
continue;
}
- r = copy_bytes(fd, fds[2*k+1], (uint64_t) -1, 0);
+ r = copy_bytes(fd, fds[2*k+1], UINT64_MAX, 0);
if (r < 0) {
(void) write(error_pipe[1], &r, sizeof(r));
_exit(EXIT_FAILURE);
DISSECT_IMAGE_FSCK = 1 << 11, /* File system check the partition before mounting (no effect when combined with DISSECT_IMAGE_READ_ONLY) */
DISSECT_IMAGE_NO_PARTITION_TABLE = 1 << 12, /* Only recognize single file system images */
DISSECT_IMAGE_VERITY_SHARE = 1 << 13, /* When activating a verity device, reuse existing one if already open */
- DISSECT_IMAGE_MKDIR = 1 << 14, /* Make directory to mount right before mounting, if missing */
+ DISSECT_IMAGE_MKDIR = 1 << 14, /* Make top-level directory to mount right before mounting, if missing */
} DissectImageFlags;
struct DissectedImage {
#endif
bool efi_loader_entry_name_valid(const char *s) {
- if (isempty(s))
- return false;
- if (strlen(s) > FILENAME_MAX) /* Make sure entry names fit in filenames */
+ if (!filename_is_valid(s)) /* Make sure entry names fit in filenames */
return false;
return in_charset(s, ALPHANUMERICAL "+-_.");
if (r < 0)
return r;
- r = fw_nftables_init_family(nfnl, AF_INET6);
- if (r < 0)
- log_debug_errno(r, "Failed to init ipv6 NAT: %m");
+ if (socket_ipv6_is_supported()) {
+ r = fw_nftables_init_family(nfnl, AF_INET6);
+ if (r < 0)
+ log_debug_errno(r, "Failed to init ipv6 NAT: %m");
+ }
ctx->nfnl = TAKE_PTR(nfnl);
return 0;
return 0;
}
-/* When someone runs 'nft flush ruleset' in the same net namespace
- * this will also tear down the systemd nat table.
- *
- * Unlike iptables -t nat -F (which will remove all rules added by the
- * systemd iptables backend, iptables has builtin chains that cannot be
- * deleted -- the next add operation will 'just work'.
- *
- * In the nftables case, everything gets removed. The next add operation
- * will yield -ENOENT.
- *
- * If we see -ENOENT on add, replay the initial table setup.
- * If that works, re-do the add operation.
- *
- * Note that this doesn't protect against external sabotage such as a
- * 'while true; nft flush ruleset;done'. There is nothing that could be
- * done about that short of extending the kernel to allow tables to be
- * owned by stystemd-networkd and making them non-deleteable except by
- * the 'owning process'.
- */
-static int fw_nftables_recreate_table(sd_netlink *nfnl, int af, sd_netlink_message **old, size_t size) {
- int r = fw_nftables_init_family(nfnl, af);
-
- if (r != 0)
- return r;
-
- while (size > 0) {
- size_t i = --size;
-
- old[i] = sd_netlink_message_unref(old[i]);
- }
-
- return 0;
-}
-
static int nft_message_add_setelem_ip6range(
sd_netlink_message *m,
const union in_addr_union *source,
#define NFT_MASQ_MSGS 3
-int fw_nftables_add_masquerade(
+static int fw_nftables_add_masquerade_internal(
FirewallContext *ctx,
bool add,
int af,
const union in_addr_union *source,
unsigned int source_prefixlen) {
+
sd_netlink_message *transaction[NFT_MASQ_MSGS] = {};
- bool retry = true;
size_t tsize;
int r;
if (af == AF_INET6 && source_prefixlen < 8)
return -EINVAL;
-again:
+
r = sd_nfnl_message_batch_begin(ctx->nfnl, &transaction[0]);
if (r < 0)
return r;
r = sd_nfnl_nft_message_new_setelems_begin(ctx->nfnl, &transaction[tsize], af, NFT_SYSTEMD_TABLE_NAME, NFT_SYSTEMD_MASQ_SET_NAME);
else
r = sd_nfnl_nft_message_del_setelems_begin(ctx->nfnl, &transaction[tsize], af, NFT_SYSTEMD_TABLE_NAME, NFT_SYSTEMD_MASQ_SET_NAME);
-
if (r < 0)
goto out_unref;
r = nft_message_add_setelem_iprange(transaction[tsize], source, source_prefixlen);
else
r = nft_message_add_setelem_ip6range(transaction[tsize], source, source_prefixlen);
-
if (r < 0)
goto out_unref;
r = sd_nfnl_message_batch_end(ctx->nfnl, &transaction[tsize]);
if (r < 0)
return r;
+
++tsize;
r = nfnl_netlink_sendv(ctx->nfnl, transaction, tsize);
- if (retry && r == -ENOENT) {
- int tmp = fw_nftables_recreate_table(ctx->nfnl, af, transaction, tsize);
- if (tmp == 0) {
- retry = false;
- goto again;
- }
- }
-
out_unref:
while (tsize > 0)
sd_netlink_message_unref(transaction[--tsize]);
return r < 0 ? r : 0;
}
+int fw_nftables_add_masquerade(
+ FirewallContext *ctx,
+ bool add,
+ int af,
+ const union in_addr_union *source,
+ unsigned int source_prefixlen) {
+
+ int r;
+
+ if (!socket_ipv6_is_supported() && af == AF_INET6)
+ return -EOPNOTSUPP;
+
+ r = fw_nftables_add_masquerade_internal(ctx, add, af, source, source_prefixlen);
+ if (r != -ENOENT)
+ return r;
+
+ /* When someone runs 'nft flush ruleset' in the same net namespace this will also tear down the
+ * systemd nat table.
+ *
+ * Unlike iptables -t nat -F (which will remove all rules added by the systemd iptables
+ * backend, iptables has builtin chains that cannot be deleted -- the next add operation will
+ * 'just work'.
+ *
+ * In the nftables case, everything gets removed. The next add operation will yield -ENOENT.
+ *
+ * If we see -ENOENT on add, replay the initial table setup. If that works, re-do the add
+ * operation.
+ *
+ * Note that this doesn't protect against external sabotage such as a
+ * 'while true; nft flush ruleset; done'. There is nothing that could be done about that short
+ * of extending the kernel to allow tables to be owned by stystemd-networkd and making them
+ * non-deleteable except by the 'owning process'. */
+
+ r = fw_nftables_init_family(ctx->nfnl, af);
+ if (r < 0)
+ return r;
+
+ return fw_nftables_add_masquerade_internal(ctx, add, af, source, source_prefixlen);
+}
+
#define NFT_DNAT_MSGS 4
-int fw_nftables_add_local_dnat(
+static int fw_nftables_add_local_dnat_internal(
FirewallContext *ctx,
bool add,
int af,
const union in_addr_union *remote,
uint16_t remote_port,
const union in_addr_union *previous_remote) {
- uint32_t data[5], key[2], dlen;
+
sd_netlink_message *transaction[NFT_DNAT_MSGS] = {};
- bool retry = true;
+ static bool ipv6_supported = true;
+ uint32_t data[5], key[2], dlen;
size_t tsize;
int r;
assert(add || !previous_remote);
+ if (!ipv6_supported && af == AF_INET6)
+ return -EOPNOTSUPP;
+
if (!IN_SET(protocol, IPPROTO_TCP, IPPROTO_UDP))
return -EPROTONOSUPPORT;
if (local_port <= 0)
return -EINVAL;
-again:
key[0] = protocol;
key[1] = htobe16(local_port);
assert(tsize < NFT_DNAT_MSGS);
if (add)
- nft_add_element(ctx->nfnl, &transaction[tsize], af, NFT_SYSTEMD_DNAT_MAP_NAME, key, sizeof(key), data, dlen);
+ r = nft_add_element(ctx->nfnl, &transaction[tsize], af, NFT_SYSTEMD_DNAT_MAP_NAME, key, sizeof(key), data, dlen);
else
- nft_del_element(ctx->nfnl, &transaction[tsize], af, NFT_SYSTEMD_DNAT_MAP_NAME, key, sizeof(key), data, dlen);
+ r = nft_del_element(ctx->nfnl, &transaction[tsize], af, NFT_SYSTEMD_DNAT_MAP_NAME, key, sizeof(key), data, dlen);
+ if (r < 0)
+ goto out_unref;
tsize++;
assert(tsize < NFT_DNAT_MSGS);
tsize++;
assert(tsize <= NFT_DNAT_MSGS);
- r = nfnl_netlink_sendv(ctx->nfnl, transaction, tsize);
-
- if (retry && r == -ENOENT) {
- int tmp = fw_nftables_recreate_table(ctx->nfnl, af, transaction, tsize);
- if (tmp == 0) {
- /* table created anew; previous address already gone */
- previous_remote = NULL;
- retry = false;
- goto again;
- }
+ r = nfnl_netlink_sendv(ctx->nfnl, transaction, tsize);
+ if (r == -EOVERFLOW && af == AF_INET6) {
+ /* The current implementation of DNAT in systemd requires kernel's
+ * fdb9c405e35bdc6e305b9b4e20ebc141ed14fc81 (v5.8), and the older kernel returns
+ * -EOVERFLOW. Let's treat the error as -EOPNOTSUPP. */
+ log_debug_errno(r, "The current implementation of IPv6 DNAT in systemd requires kernel 5.8 or newer, ignoring: %m");
+ ipv6_supported = false;
+ r = -EOPNOTSUPP;
}
out_unref:
while (tsize > 0)
sd_netlink_message_unref(transaction[--tsize]);
+
return r < 0 ? r : 0;
}
+
+int fw_nftables_add_local_dnat(
+ FirewallContext *ctx,
+ bool add,
+ int af,
+ int protocol,
+ uint16_t local_port,
+ const union in_addr_union *remote,
+ uint16_t remote_port,
+ const union in_addr_union *previous_remote) {
+
+ int r;
+
+ if (!socket_ipv6_is_supported() && af == AF_INET6)
+ return -EOPNOTSUPP;
+
+ r = fw_nftables_add_local_dnat_internal(ctx, add, af, protocol, local_port, remote, remote_port, previous_remote);
+ if (r != -ENOENT)
+ return r;
+
+ /* See comment in fw_nftables_add_masquerade(). */
+ r = fw_nftables_init_family(ctx->nfnl, af);
+ if (r < 0)
+ return r;
+
+ /* table created anew; previous address already gone */
+ return fw_nftables_add_local_dnat_internal(ctx, add, af, protocol, local_port, remote, remote_port, NULL);
+}
#include <stdbool.h>
#include <stdint.h>
-#include "in-addr-util.h"
#include "sd-netlink.h"
-enum FirewallBackend {
+#include "in-addr-util.h"
+
+typedef enum FirewallBackend {
FW_BACKEND_NONE,
#if HAVE_LIBIPTC
FW_BACKEND_IPTABLES,
#endif
FW_BACKEND_NFTABLES,
-};
+ _FW_BACKEND_MAX,
+ _FW_BACKEND_INVALID = -EINVAL,
+} FirewallBackend;
struct FirewallContext {
- enum FirewallBackend firewall_backend;
+ FirewallBackend backend;
sd_netlink *nfnl;
};
+const char *firewall_backend_to_string(FirewallBackend b) _const_;
+
int fw_nftables_init(FirewallContext *ctx);
void fw_nftables_exit(FirewallContext *ctx);
#include "alloc-util.h"
#include "firewall-util.h"
#include "firewall-util-private.h"
+#include "log.h"
+#include "string-table.h"
-static enum FirewallBackend firewall_backend_probe(FirewallContext *ctx) {
- if (fw_nftables_init(ctx) == 0)
- return FW_BACKEND_NFTABLES;
+static const char * const firewall_backend_table[_FW_BACKEND_MAX] = {
+ [FW_BACKEND_NONE] = "none",
#if HAVE_LIBIPTC
- return FW_BACKEND_IPTABLES;
+ [FW_BACKEND_IPTABLES] = "iptables",
+#endif
+ [FW_BACKEND_NFTABLES] = "nftables",
+};
+
+DEFINE_STRING_TABLE_LOOKUP_TO_STRING(firewall_backend, FirewallBackend);
+
+static void firewall_backend_probe(FirewallContext *ctx) {
+ assert(ctx);
+
+ if (ctx->backend != _FW_BACKEND_INVALID)
+ return;
+
+ if (fw_nftables_init(ctx) >= 0)
+ ctx->backend = FW_BACKEND_NFTABLES;
+ else
+#if HAVE_LIBIPTC
+ ctx->backend = FW_BACKEND_IPTABLES;
#else
- return FW_BACKEND_NONE;
+ ctx->backend = FW_BACKEND_NONE;
#endif
+
+ if (ctx->backend != FW_BACKEND_NONE)
+ log_debug("Using %s as firewall backend.", firewall_backend_to_string(ctx->backend));
+ else
+ log_debug("No firewall backend found.");
}
int fw_ctx_new(FirewallContext **ret) {
_cleanup_free_ FirewallContext *ctx = NULL;
- ctx = new0(FirewallContext, 1);
+ ctx = new(FirewallContext, 1);
if (!ctx)
return -ENOMEM;
- /* could probe here. However, this means that we will load
- * iptable_nat or nf_tables, both will enable connection tracking.
- *
- * Alternative would be to probe here but only call
- * fw_ctx_new when nspawn/networkd know they will call
- * fw_add_masquerade/local_dnat later anyway.
- */
+ *ctx = (FirewallContext) {
+ .backend = _FW_BACKEND_INVALID,
+ };
+
+ firewall_backend_probe(ctx);
+
*ret = TAKE_PTR(ctx);
return 0;
}
if (!ctx)
return NULL;
- if (ctx->firewall_backend == FW_BACKEND_NFTABLES)
- fw_nftables_exit(ctx);
+ fw_nftables_exit(ctx);
return mfree(ctx);
}
int fw_add_masquerade(
- FirewallContext **fw_ctx,
+ FirewallContext **ctx,
bool add,
int af,
const union in_addr_union *source,
unsigned source_prefixlen) {
- FirewallContext *ctx;
+
int r;
- if (!*fw_ctx) {
- r = fw_ctx_new(fw_ctx);
+ assert(ctx);
+
+ if (!*ctx) {
+ r = fw_ctx_new(ctx);
if (r < 0)
return r;
}
- ctx = *fw_ctx;
- if (ctx->firewall_backend == FW_BACKEND_NONE)
- ctx->firewall_backend = firewall_backend_probe(ctx);
-
- switch (ctx->firewall_backend) {
- case FW_BACKEND_NONE:
- return -EOPNOTSUPP;
+ switch ((*ctx)->backend) {
#if HAVE_LIBIPTC
case FW_BACKEND_IPTABLES:
return fw_iptables_add_masquerade(add, af, source, source_prefixlen);
#endif
case FW_BACKEND_NFTABLES:
- return fw_nftables_add_masquerade(ctx, add, af, source, source_prefixlen);
+ return fw_nftables_add_masquerade(*ctx, add, af, source, source_prefixlen);
+ default:
+ return -EOPNOTSUPP;
}
-
- return -EOPNOTSUPP;
}
int fw_add_local_dnat(
- FirewallContext **fw_ctx,
+ FirewallContext **ctx,
bool add,
int af,
int protocol,
const union in_addr_union *remote,
uint16_t remote_port,
const union in_addr_union *previous_remote) {
- FirewallContext *ctx;
- if (!*fw_ctx) {
- int ret = fw_ctx_new(fw_ctx);
- if (ret < 0)
- return ret;
- }
+ int r;
- ctx = *fw_ctx;
- if (ctx->firewall_backend == FW_BACKEND_NONE)
- ctx->firewall_backend = firewall_backend_probe(ctx);
+ assert(ctx);
- switch (ctx->firewall_backend) {
- case FW_BACKEND_NONE:
- return -EOPNOTSUPP;
- case FW_BACKEND_NFTABLES:
- return fw_nftables_add_local_dnat(ctx, add, af, protocol, local_port, remote, remote_port, previous_remote);
+ if (!*ctx) {
+ r = fw_ctx_new(ctx);
+ if (r < 0)
+ return r;
+ }
+
+ switch ((*ctx)->backend) {
#if HAVE_LIBIPTC
case FW_BACKEND_IPTABLES:
return fw_iptables_add_local_dnat(add, af, protocol, local_port, remote, remote_port, previous_remote);
#endif
+ case FW_BACKEND_NFTABLES:
+ return fw_nftables_add_local_dnat(*ctx, add, af, protocol, local_port, remote, remote_port, previous_remote);
+ default:
+ return -EOPNOTSUPP;
}
-
- return -EOPNOTSUPP;
}
typedef struct FirewallContext FirewallContext;
int fw_ctx_new(FirewallContext **ret);
-FirewallContext *fw_ctx_free(FirewallContext *fw_ctx);
+FirewallContext *fw_ctx_free(FirewallContext *ctx);
DEFINE_TRIVIAL_CLEANUP_FUNC(FirewallContext *, fw_ctx_free);
int fw_add_masquerade(
- FirewallContext **fw_ctx,
+ FirewallContext **ctx,
bool add,
int af,
const union in_addr_union *source,
unsigned source_prefixlen);
int fw_add_local_dnat(
- FirewallContext **fw_ctx,
+ FirewallContext **ctx,
bool add,
int af,
int protocol,
}
static TableCell* TABLE_INDEX_TO_CELL(size_t index) {
- assert(index != (size_t) -1);
+ assert(index != SIZE_MAX);
return SIZE_TO_PTR(index + 1);
}
size_t n_cells;
bool header; /* Whether to show the header row? */
- size_t width; /* If == 0 format this as wide as necessary. If (size_t) -1 format this to console
+ size_t width; /* If == 0 format this as wide as necessary. If SIZE_MAX format this to console
* width or less wide, but not wider. Otherwise the width to format this table in. */
- size_t cell_height_max; /* Maximum number of lines per cell. (If there are more, ellipsis is shown. If (size_t) -1 then no limit is set, the default. == 0 is not allowed.) */
+ size_t cell_height_max; /* Maximum number of lines per cell. (If there are more, ellipsis is shown. If SIZE_MAX then no limit is set, the default. == 0 is not allowed.) */
TableData **data;
size_t n_allocated;
*t = (struct Table) {
.n_columns = n_columns,
.header = true,
- .width = (size_t) -1,
- .cell_height_max = (size_t) -1,
+ .width = SIZE_MAX,
+ .cell_height_max = SIZE_MAX,
};
return TAKE_PTR(t);
p = NULL;
/* If formatting parameters are left unspecified, copy from the previous row */
- if (minimum_width == (size_t) -1)
+ if (minimum_width == SIZE_MAX)
minimum_width = p ? p->minimum_width : 1;
- if (weight == (unsigned) -1)
+ if (weight == UINT_MAX)
weight = p ? p->weight : DEFAULT_WEIGHT;
- if (align_percent == (unsigned) -1)
+ if (align_percent == UINT_MAX)
align_percent = p ? p->align_percent : 0;
- if (ellipsize_percent == (unsigned) -1)
+ if (ellipsize_percent == UINT_MAX)
ellipsize_percent = p ? p->ellipsize_percent : 100;
assert(align_percent <= 100);
assert(t);
assert(cell);
- if (minimum_width == (size_t) -1)
+ if (minimum_width == SIZE_MAX)
minimum_width = 1;
r = table_dedup_cell(t, cell);
assert(t);
assert(cell);
- if (weight == (unsigned) -1)
+ if (weight == UINT_MAX)
weight = DEFAULT_WEIGHT;
r = table_dedup_cell(t, cell);
assert(t);
assert(cell);
- if (percent == (unsigned) -1)
+ if (percent == UINT_MAX)
percent = 0;
assert(percent <= 100);
assert(t);
assert(cell);
- if (percent == (unsigned) -1)
+ if (percent == UINT_MAX)
percent = 100;
assert(percent <= 100);
void table_set_cell_height_max(Table *t, size_t height) {
assert(t);
- assert(height >= 1 || height == (size_t) -1);
+ assert(height >= 1 || height == SIZE_MAX);
t->cell_height_max = height;
}
return free_and_strdup(&t->empty_string, empty);
}
-int table_set_display_all(Table *t) {
+static int table_set_display_all(Table *t) {
+ size_t *d;
+
assert(t);
- size_t allocated = t->n_display_map;
+ /* Initialize the display map to the identity */
- if (!GREEDY_REALLOC(t->display_map, allocated, MAX(t->n_columns, allocated)))
+ d = reallocarray(t->display_map, t->n_columns, sizeof(size_t));
+ if (!d)
return -ENOMEM;
for (size_t i = 0; i < t->n_columns; i++)
- t->display_map[i] = i;
+ d[i] = i;
+ t->display_map = d;
t->n_display_map = t->n_columns;
return 0;
}
-int table_set_display(Table *t, size_t first_column, ...) {
+int table_set_display_internal(Table *t, size_t first_column, ...) {
size_t allocated, column;
va_list ap;
t->display_map[t->n_display_map++] = column;
column = va_arg(ap, size_t);
- if (column == (size_t) -1)
+ if (column == SIZE_MAX)
break;
}
return 0;
}
-int table_set_sort(Table *t, size_t first_column, ...) {
+int table_set_sort_internal(Table *t, size_t first_column, ...) {
size_t allocated, column;
va_list ap;
t->sort_map[t->n_sort_map++] = column;
column = va_arg(ap, size_t);
- if (column == (size_t) -1)
+ if (column == SIZE_MAX)
break;
}
va_end(ap);
}
static char* format_strv_width(char **strv, size_t column_width) {
+ _cleanup_free_ char *buf = NULL; /* buf must be freed after f */
_cleanup_fclose_ FILE *f = NULL;
size_t sz = 0;
- _cleanup_free_ char *buf = NULL;
f = open_memstream_unlocked(&buf, &sz);
if (!f)
k = utf8_console_width(s);
s = NULL;
}
- if (k == (size_t) -1)
+ if (k == SIZE_MAX)
return -EINVAL;
if (k > max_width)
max_width = k;
if (!t)
return -ENOMEM;
- if (table->cell_height_max != (size_t) -1) {
+ if (table->cell_height_max != SIZE_MAX) {
r = string_truncate_lines(t, table->cell_height_max, &truncated);
if (r < 0)
return r;
if (r < 0)
return r;
- if (d->maximum_width != (size_t) -1 && width > d->maximum_width)
+ if (d->maximum_width != SIZE_MAX && width > d->maximum_width)
width = d->maximum_width;
if (width < d->minimum_width)
for (size_t j = 0; j < display_columns; j++) {
minimum_width[j] = 1;
- maximum_width[j] = (size_t) -1;
+ maximum_width[j] = SIZE_MAX;
}
for (unsigned pass = 0; pass < 2; pass++) {
/* First pass: determine column sizes */
for (size_t j = 0; j < display_columns; j++)
- requested_width[j] = (size_t) -1;
+ requested_width[j] = SIZE_MAX;
bool any_soft = false;
}
/* Determine the biggest width that any cell in this column would like to have */
- if (requested_width[j] == (size_t) -1 ||
+ if (requested_width[j] == SIZE_MAX ||
requested_width[j] < req_width)
requested_width[j] = req_width;
minimum_width[j] = d->minimum_width;
/* Determine the maximum width any cell in this column needs */
- if (d->maximum_width != (size_t) -1 &&
- (maximum_width[j] == (size_t) -1 ||
+ if (d->maximum_width != SIZE_MAX &&
+ (maximum_width[j] == SIZE_MAX ||
maximum_width[j] > d->maximum_width))
maximum_width[j] = d->maximum_width;
table_minimum_width += minimum_width[j];
- if (maximum_width[j] == (size_t) -1)
- table_maximum_width = (size_t) -1;
+ if (maximum_width[j] == SIZE_MAX)
+ table_maximum_width = SIZE_MAX;
else
table_maximum_width += maximum_width[j];
}
/* Calculate effective table width */
- if (t->width != 0 && t->width != (size_t) -1)
+ if (t->width != 0 && t->width != SIZE_MAX)
table_effective_width = t->width;
else if (t->width == 0 ||
((pass > 0 || !any_soft) && (pager_have() || !isatty(STDOUT_FILENO))))
else
table_effective_width = MIN(table_requested_width, columns());
- if (table_maximum_width != (size_t) -1 && table_effective_width > table_maximum_width)
+ if (table_maximum_width != SIZE_MAX && table_effective_width > table_maximum_width)
table_effective_width = table_maximum_width;
if (table_effective_width < table_minimum_width)
else
width[j] = requested_width[j] + (extra * column_weight[j]) / weight_sum;
- if (maximum_width[j] != (size_t) -1 && width[j] > maximum_width[j])
+ if (maximum_width[j] != SIZE_MAX && width[j] > maximum_width[j])
width[j] = maximum_width[j];
if (width[j] < minimum_width[j])
extra = table_effective_width - table_minimum_width;
for (size_t j = 0; j < display_columns; j++)
- width[j] = (size_t) -1;
+ width[j] = SIZE_MAX;
for (;;) {
bool restart = false;
size_t delta, w;
/* Did this column already get something assigned? If so, let's skip to the next */
- if (width[j] != (size_t) -1)
+ if (width[j] != SIZE_MAX)
continue;
if (weight_sum == 0)
return r;
if (r > 0) {
/* There are more lines to come */
- if ((t->cell_height_max == (size_t) -1 || n_subline + 1 < t->cell_height_max))
+ if ((t->cell_height_max == SIZE_MAX || n_subline + 1 < t->cell_height_max))
more_sublines = true; /* There are more lines to come */
else
lines_truncated = true;
}
int table_format(Table *t, char **ret) {
+ _cleanup_free_ char *buf = NULL;
_cleanup_fclose_ FILE *f = NULL;
- char *buf = NULL;
size_t sz = 0;
int r;
f = safe_fclose(f);
- *ret = buf;
+ *ret = TAKE_PTR(buf);
return 0;
}
case TABLE_SIZE:
case TABLE_BPS:
- if (d->size == (uint64_t) -1)
+ if (d->size == UINT64_MAX)
return json_variant_new_null(ret);
return json_variant_new_unsigned(ret, d->size);
int table_add_cell_full(Table *t, TableCell **ret_cell, TableDataType type, const void *data, size_t minimum_width, size_t maximum_width, unsigned weight, unsigned align_percent, unsigned ellipsize_percent);
static inline int table_add_cell(Table *t, TableCell **ret_cell, TableDataType type, const void *data) {
- return table_add_cell_full(t, ret_cell, type, data, (size_t) -1, (size_t) -1, (unsigned) -1, (unsigned) -1, (unsigned) -1);
+ return table_add_cell_full(t, ret_cell, type, data, SIZE_MAX, SIZE_MAX, UINT_MAX, UINT_MAX, UINT_MAX);
}
int table_add_cell_stringf(Table *t, TableCell **ret_cell, const char *format, ...) _printf_(3, 4);
void table_set_width(Table *t, size_t width);
void table_set_cell_height_max(Table *t, size_t height);
int table_set_empty_string(Table *t, const char *empty);
-int table_set_display_all(Table *t);
-int table_set_display(Table *t, size_t first_column, ...);
-int table_set_sort(Table *t, size_t first_column, ...);
+int table_set_display_internal(Table *t, size_t first_column, ...);
+#define table_set_display(...) table_set_display_internal(__VA_ARGS__, SIZE_MAX)
+int table_set_sort_internal(Table *t, size_t first_column, ...);
+#define table_set_sort(...) table_set_sort_internal(__VA_ARGS__, SIZE_MAX)
int table_set_reverse(Table *t, size_t column, bool b);
int table_hide_column_from_display(Table *t, size_t column);
return false;
}
-int fstab_filter_options(const char *opts, const char *names,
- const char **ret_namefound, char **ret_value, char **ret_filtered) {
+int fstab_filter_options(
+ const char *opts,
+ const char *names,
+ const char **ret_namefound,
+ char **ret_value,
+ char ***ret_values,
+ char **ret_filtered) {
+
const char *name, *namefound = NULL, *x;
- _cleanup_strv_free_ char **stor = NULL;
- _cleanup_free_ char *v = NULL, **strv = NULL;
+ _cleanup_strv_free_ char **stor = NULL, **values = NULL;
+ _cleanup_free_ char *value = NULL, **filtered = NULL;
int r;
assert(names && *names);
+ assert(!(ret_value && ret_values));
if (!opts)
goto answer;
- /* If !ret_value and !ret_filtered, this function is not allowed to fail. */
+ /* Finds any options matching 'names', and returns:
+ * - the last matching option name in ret_namefound,
+ * - the last matching value in ret_value,
+ * - any matching values in ret_values,
+ * - the rest of the option string in ret_filtered.
+ *
+ * If !ret_value and !ret_values and !ret_filtered, this function is not allowed to fail.
+ *
+ * Returns negative on error, true if any matching options were found, false otherwise. */
+
+ if (ret_filtered || ret_value || ret_values) {
+ /* For backwards compatibility, we need to pass-through escape characters.
+ * The only ones we "consume" are the ones used as "\," or "\\". */
+ r = strv_split_full(&stor, opts, ",", EXTRACT_UNESCAPE_SEPARATORS | EXTRACT_UNESCAPE_RELAX);
+ if (r < 0)
+ return r;
+
+ filtered = memdup(stor, sizeof(char*) * (strv_length(stor) + 1));
+ if (!filtered)
+ return -ENOMEM;
+
+ char **t = filtered;
+ for (char **s = t; *s; s++) {
+ NULSTR_FOREACH(name, names) {
+ x = startswith(*s, name);
+ if (!x)
+ continue;
+ /* Match name, but when ret_values, only when followed by assignment. */
+ if (*x == '=' || (!ret_values && *x == '\0'))
+ goto found;
+ }
- if (!ret_filtered) {
+ *t = *s;
+ t++;
+ continue;
+ found:
+ /* Keep the last occurrence found */
+ namefound = name;
+
+ if (ret_value || ret_values) {
+ assert(IN_SET(*x, '=', '\0'));
+
+ if (ret_value) {
+ r = free_and_strdup(&value, *x == '=' ? x + 1 : NULL);
+ if (r < 0)
+ return r;
+ } else if (*x) {
+ r = strv_extend(&values, x + 1);
+ if (r < 0)
+ return r;
+ }
+ }
+ }
+ *t = NULL;
+ } else
for (const char *word = opts;;) {
const char *end = word;
- /* Look for an *non-escaped* comma separator. Only commas can be escaped, so "\," is
- * the only valid escape sequence, so we can do a very simple test here. */
+ /* Look for a *non-escaped* comma separator. Only commas and backslashes can be
+ * escaped, so "\," and "\\" are the only valid escape sequences, and we can do a
+ * very simple test here. */
for (;;) {
- size_t n = strcspn(end, ",");
+ end += strcspn(end, ",\\");
- end += n;
- if (n > 0 && end[-1] == '\\')
- end++;
- else
+ if (IN_SET(*end, ',', '\0'))
break;
+ assert(*end == '\\');
+ end ++; /* Skip the backslash */
+ if (*end != '\0')
+ end ++; /* Skip the escaped char, but watch out for a trailing comma */
}
NULSTR_FOREACH(name, names) {
x = word + strlen(name);
if (IN_SET(*x, '\0', '=', ',')) {
namefound = name;
- if (ret_value) {
- bool eq = *x == '=';
- assert(eq || IN_SET(*x, ',', '\0'));
-
- r = free_and_strndup(&v,
- eq ? x + 1 : NULL,
- eq ? end - x - 1 : 0);
- if (r < 0)
- return r;
- }
-
break;
}
}
else
break;
}
- } else {
- r = strv_split_full(&stor, opts, ",", EXTRACT_DONT_COALESCE_SEPARATORS | EXTRACT_UNESCAPE_SEPARATORS);
- if (r < 0)
- return r;
-
- strv = memdup(stor, sizeof(char*) * (strv_length(stor) + 1));
- if (!strv)
- return -ENOMEM;
-
- char **t = strv;
- for (char **s = strv; *s; s++) {
- NULSTR_FOREACH(name, names) {
- x = startswith(*s, name);
- if (x && IN_SET(*x, '\0', '='))
- goto found;
- }
-
- *t = *s;
- t++;
- continue;
- found:
- /* Keep the last occurrence found */
- namefound = name;
- if (ret_value) {
- assert(IN_SET(*x, '=', '\0'));
- r = free_and_strdup(&v, *x == '=' ? x + 1 : NULL);
- if (r < 0)
- return r;
- }
- }
- *t = NULL;
- }
answer:
if (ret_namefound)
if (ret_filtered) {
char *f;
- f = strv_join_full(strv, ",", NULL, true);
+ f = strv_join_full(filtered, ",", NULL, true);
if (!f)
return -ENOMEM;
*ret_filtered = f;
}
if (ret_value)
- *ret_value = TAKE_PTR(v);
+ *ret_value = TAKE_PTR(value);
+ if (ret_values)
+ *ret_values = TAKE_PTR(values);
return !!namefound;
}
-int fstab_extract_values(const char *opts, const char *name, char ***values) {
- _cleanup_strv_free_ char **optsv = NULL, **res = NULL;
- char **s;
-
- assert(opts);
- assert(name);
- assert(values);
-
- optsv = strv_split(opts, ",");
- if (!optsv)
- return -ENOMEM;
-
- STRV_FOREACH(s, optsv) {
- char *arg;
- int r;
-
- arg = startswith(*s, name);
- if (!arg || *arg != '=')
- continue;
- r = strv_extend(&res, arg + 1);
- if (r < 0)
- return r;
- }
-
- *values = TAKE_PTR(res);
-
- return !!*values;
-}
-
int fstab_find_pri(const char *options, int *ret) {
_cleanup_free_ char *opt = NULL;
int r, pri;
assert(ret);
- r = fstab_filter_options(options, "pri\0", NULL, &opt, NULL);
+ r = fstab_filter_options(options, "pri\0", NULL, &opt, NULL, NULL);
if (r < 0)
return r;
if (r == 0 || !opt)
int fstab_is_mount_point(const char *mount);
int fstab_has_fstype(const char *fstype);
-int fstab_filter_options(const char *opts, const char *names, const char **namefound, char **value, char **filtered);
-
-int fstab_extract_values(const char *opts, const char *name, char ***values);
+int fstab_filter_options(
+ const char *opts,
+ const char *names,
+ const char **ret_namefound,
+ char **ret_value,
+ char ***ret_values,
+ char **ret_filtered);
static inline bool fstab_test_option(const char *opts, const char *names) {
- return !!fstab_filter_options(opts, names, NULL, NULL, NULL);
+ return !!fstab_filter_options(opts, names, NULL, NULL, NULL, NULL);
}
int fstab_find_pri(const char *options, int *ret);
/* If first name given is last, return 1.
* If second name given is last or neither is found, return 0. */
- assert_se(fstab_filter_options(opts, yes_no, &opt, NULL, NULL) >= 0);
+ assert_se(fstab_filter_options(opts, yes_no, &opt, NULL, NULL, NULL) >= 0);
return opt == yes_no;
}
r = fstab_filter_options(opts, "comment=systemd.device-timeout\0"
"x-systemd.device-timeout\0",
- NULL, &timeout, filtered);
- if (r <= 0)
- return r;
+ NULL, &timeout, NULL, filtered);
+ if (r < 0) {
+ log_warning_errno(r, "Failed to parse fstab options, ignoring: %m");
+ return 0;
+ }
+ if (r == 0)
+ return 0;
r = parse_sec_fix_0(timeout, &u);
if (r < 0) {
#include "gpt.h"
#include "string-util.h"
+#include "utf8.h"
const GptPartitionType gpt_partition_type_table[] = {
{ GPT_ROOT_X86, "root-x86" },
return sd_id128_from_string(s, ret);
}
+
+int gpt_partition_label_valid(const char *s) {
+ _cleanup_free_ char16_t *recoded = NULL;
+
+ recoded = utf8_to_utf16(s, strlen(s));
+ if (!recoded)
+ return -ENOMEM;
+
+ return char16_strlen(recoded) <= 36;
+}
} GptPartitionType;
extern const GptPartitionType gpt_partition_type_table[];
+
+int gpt_partition_label_valid(const char *s);
return false;
}
-static int find_symlinks_fd(
+static int find_symlinks_in_directory(
+ DIR *dir,
+ const char *dir_path,
const char *root_dir,
const UnitFileInstallInfo *i,
bool match_aliases,
bool ignore_same_name,
- int fd,
- const char *path,
const char *config_path,
bool *same_name_link) {
- _cleanup_closedir_ DIR *d = NULL;
struct dirent *de;
int r = 0;
- assert(i);
- assert(fd >= 0);
- assert(path);
- assert(config_path);
- assert(same_name_link);
-
- d = fdopendir(fd);
- if (!d) {
- safe_close(fd);
- return -errno;
- }
-
- FOREACH_DIRENT(de, d, return -errno) {
-
- dirent_ensure_type(d, de);
-
- if (de->d_type == DT_DIR) {
- _cleanup_free_ char *p = NULL;
- int nfd, q;
-
- nfd = openat(fd, de->d_name, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|O_NOFOLLOW);
- if (nfd < 0) {
- if (errno == ENOENT)
- continue;
+ FOREACH_DIRENT(de, dir, return -errno) {
+ _cleanup_free_ char *dest = NULL;
+ bool found_path = false, found_dest, b = false;
+ int q;
- if (r == 0)
- r = -errno;
- continue;
- }
+ dirent_ensure_type(dir, de);
- p = path_make_absolute(de->d_name, path);
- if (!p) {
- safe_close(nfd);
- return -ENOMEM;
- }
+ if (de->d_type != DT_LNK)
+ continue;
- /* This will close nfd, regardless whether it succeeds or not */
- q = find_symlinks_fd(root_dir, i, match_aliases, ignore_same_name, nfd,
- p, config_path, same_name_link);
- if (q > 0)
- return 1;
+ /* Acquire symlink destination */
+ q = readlinkat_malloc(dirfd(dir), de->d_name, &dest);
+ if (q == -ENOENT)
+ continue;
+ if (q < 0) {
if (r == 0)
r = q;
+ continue;
+ }
- } else if (de->d_type == DT_LNK) {
- _cleanup_free_ char *p = NULL, *dest = NULL;
- bool found_path = false, found_dest, b = false;
- int q;
+ /* Make absolute */
+ if (!path_is_absolute(dest)) {
+ char *x;
- /* Acquire symlink name */
- p = path_make_absolute(de->d_name, path);
- if (!p)
+ x = path_join(dir_path, dest);
+ if (!x)
return -ENOMEM;
- /* Acquire symlink destination */
- q = readlink_malloc(p, &dest);
- if (q == -ENOENT)
- continue;
- if (q < 0) {
- if (r == 0)
- r = q;
- continue;
- }
+ free_and_replace(dest, x);
+ }
- /* Make absolute */
- if (!path_is_absolute(dest)) {
- char *x;
+ assert(unit_name_is_valid(i->name, UNIT_NAME_ANY));
+ if (!ignore_same_name)
+ /* Check if the symlink itself matches what we are looking for.
+ *
+ * If ignore_same_name is specified, we are in one of the directories which
+ * have lower priority than the unit file, and even if a file or symlink with
+ * this name was found, we should ignore it. */
+ found_path = streq(de->d_name, i->name);
- x = path_join(root_dir, dest);
- if (!x)
- return -ENOMEM;
+ /* Check if what the symlink points to matches what we are looking for */
+ found_dest = streq(basename(dest), i->name);
- free_and_replace(dest, x);
- }
+ if (found_path && found_dest) {
+ _cleanup_free_ char *p = NULL, *t = NULL;
- assert(unit_name_is_valid(i->name, UNIT_NAME_ANY));
- if (!ignore_same_name)
- /* Check if the symlink itself matches what we are looking for.
- *
- * If ignore_same_name is specified, we are in one of the directories which
- * have lower priority than the unit file, and even if a file or symlink with
- * this name was found, we should ignore it. */
- found_path = streq(de->d_name, i->name);
-
- /* Check if what the symlink points to matches what we are looking for */
- found_dest = streq(basename(dest), i->name);
-
- if (found_path && found_dest) {
- _cleanup_free_ char *t = NULL;
-
- /* Filter out same name links in the main
- * config path */
- t = path_make_absolute(i->name, config_path);
- if (!t)
- return -ENOMEM;
+ /* Filter out same name links in the main
+ * config path */
+ p = path_make_absolute(de->d_name, dir_path);
+ t = path_make_absolute(i->name, config_path);
- b = path_equal(t, p);
- }
+ if (!p || !t)
+ return -ENOMEM;
- if (b)
- *same_name_link = true;
- else if (found_path || found_dest) {
- if (!match_aliases)
- return 1;
-
- /* Check if symlink name is in the set of names used by [Install] */
- q = is_symlink_with_known_name(i, de->d_name);
- if (q < 0)
- return q;
- if (q > 0)
- return 1;
- }
+ b = path_equal(p, t);
+ }
+
+ if (b)
+ *same_name_link = true;
+ else if (found_path || found_dest) {
+ if (!match_aliases)
+ return 1;
+
+ /* Check if symlink name is in the set of names used by [Install] */
+ q = is_symlink_with_known_name(i, de->d_name);
+ if (q < 0)
+ return q;
+ if (q > 0)
+ return 1;
}
}
const char *config_path,
bool *same_name_link) {
- int fd;
+ _cleanup_closedir_ DIR *config_dir = NULL;
+ struct dirent *de;
+ int r = 0;
assert(i);
assert(config_path);
assert(same_name_link);
- fd = open(config_path, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC);
- if (fd < 0) {
+ config_dir = opendir(config_path);
+ if (!config_dir) {
if (IN_SET(errno, ENOENT, ENOTDIR, EACCES))
return 0;
return -errno;
}
- /* This takes possession of fd and closes it */
- return find_symlinks_fd(root_dir, i, match_name, ignore_same_name, fd,
- config_path, config_path, same_name_link);
+ FOREACH_DIRENT(de, config_dir, return -errno) {
+ const char *suffix;
+ _cleanup_free_ const char *path = NULL;
+ _cleanup_closedir_ DIR *d = NULL;
+
+ dirent_ensure_type(config_dir, de);
+
+ if (de->d_type != DT_DIR)
+ continue;
+
+ suffix = strrchr(de->d_name, '.');
+ if (!STRPTR_IN_SET(suffix, ".wants", ".requires"))
+ continue;
+
+ path = path_join(config_path, de->d_name);
+ if (!path)
+ return -ENOMEM;
+
+ d = opendir(path);
+ if (!d) {
+ log_error_errno(errno, "Failed to open directory '%s' while scanning for symlinks, ignoring: %m", path);
+ continue;
+ }
+
+ r = find_symlinks_in_directory(d, path, root_dir, i, match_name, ignore_same_name, config_path, same_name_link);
+ if (r > 0)
+ return 1;
+ else if (r < 0)
+ log_debug_errno(r, "Failed to lookup for symlinks in '%s': %m", path);
+ }
+
+ /* We didn't find any suitable symlinks in .wants or .requires directories, let's look for linked unit files in this directory. */
+ rewinddir(config_dir);
+ return find_symlinks_in_directory(config_dir, config_path, root_dir, i, match_name, ignore_same_name, config_path, same_name_link);
}
static int find_symlinks_in_scope(
const char *path,
const char *root_dir,
SearchFlags flags) {
+
_cleanup_free_ char *resolved = NULL;
- struct stat st;
int r;
r = unit_file_load(c, info, path, root_dir, flags);
* so let's see if the path is a (possibly dangling) symlink to /dev/null. */
info->type = UNIT_FILE_TYPE_MASKED;
- else if (r > 0 &&
- stat(resolved, &st) >= 0 &&
- null_or_empty(&st))
+ else if (r > 0 && null_or_empty_path(resolved) > 0)
info->type = UNIT_FILE_TYPE_MASKED;
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#pragma once
+#include <stdbool.h>
+
typedef enum UnitFilePresetMode UnitFilePresetMode;
typedef enum UnitFileChangeType UnitFileChangeType;
typedef enum UnitFileFlags UnitFileFlags;
typedef struct UnitFileList UnitFileList;
typedef struct UnitFileInstallInfo UnitFileInstallInfo;
-#include <stdbool.h>
-
#include "hashmap.h"
#include "macro.h"
#include "path-lookup.h"
assert_return(ret, -EINVAL);
if (!s) {
- assert_return(IN_SET(n, 0, (size_t) -1), -EINVAL);
+ assert_return(IN_SET(n, 0, SIZE_MAX), -EINVAL);
return json_variant_new_null(ret);
}
- if (n == (size_t) -1) /* determine length automatically */
+ if (n == SIZE_MAX) /* determine length automatically */
n = strlen(s);
else if (memchr(s, 0, n)) /* don't allow embedded NUL, as we can't express that in JSON */
return -EINVAL;
continue;
}
- len = utf8_encoded_valid_unichar(c, (size_t) -1);
+ len = utf8_encoded_valid_unichar(c, SIZE_MAX);
if (len < 0)
return len;
size_t n_elements, n_elements_allocated;
unsigned line_before;
unsigned column_before;
- size_t n_suppress; /* When building: if > 0, suppress this many subsequent elements. If == (size_t) -1, suppress all subsequent elements */
+ size_t n_suppress; /* When building: if > 0, suppress this many subsequent elements. If == SIZE_MAX, suppress all subsequent elements */
} JsonStack;
static void json_stack_release(JsonStack *s) {
stack[n_stack++] = (JsonStack) {
.expect = EXPECT_ARRAY_ELEMENT,
- .n_suppress = current->n_suppress != 0 ? (size_t) -1 : 0, /* if we shall suppress the
+ .n_suppress = current->n_suppress != 0 ? SIZE_MAX : 0, /* if we shall suppress the
* new array, then we should
* also suppress all array
* members */
stack[n_stack++] = (JsonStack) {
.expect = EXPECT_OBJECT_KEY,
- .n_suppress = current->n_suppress != 0 ? (size_t) -1 : 0, /* if we shall suppress the
+ .n_suppress = current->n_suppress != 0 ? SIZE_MAX : 0, /* if we shall suppress the
* new object, then we should
* also suppress all object
* members */
n_subtract = 1; /* we generated one item */
- if (!b && current->n_suppress != (size_t) -1)
+ if (!b && current->n_suppress != SIZE_MAX)
current->n_suppress += 2; /* Suppress this one and the next item */
current->expect = EXPECT_OBJECT_VALUE;
}
/* If we are supposed to suppress items, let's subtract how many items where generated from that
- * counter. Except if the counter is (size_t) -1, i.e. we shall suppress an infinite number of elements
+ * counter. Except if the counter is SIZE_MAX, i.e. we shall suppress an infinite number of elements
* on this stack level */
- if (current->n_suppress != (size_t) -1) {
+ if (current->n_suppress != SIZE_MAX) {
if (current->n_suppress <= n_subtract) /* Saturated */
current->n_suppress = 0;
else
assert_cc(sizeof(gid_t) == sizeof(uint32_t));
DISABLE_WARNING_TYPE_LIMITS;
- assert_cc(((uid_t) -1 < (uid_t) 0) == ((gid_t) -1 < (gid_t) 0));
+ assert_cc((UID_INVALID < (uid_t) 0) == (GID_INVALID < (gid_t) 0));
REENABLE_WARNING;
if (json_variant_is_null(variant)) {
if (!json_variant_is_string(v))
return -EINVAL;
- return unbase64mem(json_variant_string(v), (size_t) -1, ret, ret_size);
+ return unbase64mem(json_variant_string(v), SIZE_MAX, ret, ret_size);
}
int json_variant_unhex(JsonVariant *v, void **ret, size_t *ret_size) {
if (!json_variant_is_string(v))
return -EINVAL;
- return unhexmem(json_variant_string(v), (size_t) -1, ret, ret_size);
+ return unhexmem(json_variant_string(v), SIZE_MAX, ret, ret_size);
}
static const char* const json_variant_type_table[_JSON_VARIANT_TYPE_MAX] = {
int json_variant_new_id128(JsonVariant **ret, sd_id128_t id);
static inline int json_variant_new_string(JsonVariant **ret, const char *s) {
- return json_variant_new_stringn(ret, s, (size_t) -1);
+ return json_variant_new_stringn(ret, s, SIZE_MAX);
}
JsonVariant *json_variant_ref(JsonVariant *v);
--- /dev/null
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include <ftw.h>
+
+#include "errno-util.h"
+#include "kbd-util.h"
+#include "log.h"
+#include "nulstr-util.h"
+#include "path-util.h"
+#include "set.h"
+#include "string-util.h"
+#include "strv.h"
+#include "utf8.h"
+
+static thread_local const char *keymap_name = NULL;
+static thread_local Set *keymaps = NULL;
+
+static int nftw_cb(
+ const char *fpath,
+ const struct stat *sb,
+ int tflag,
+ struct FTW *ftwbuf) {
+
+ _cleanup_free_ char *p = NULL;
+ int r;
+
+ /* If keymap_name is non-null, return true if keymap keymap_name is found.
+ * Otherwise, add all keymaps to keymaps. */
+
+ if (tflag != FTW_F)
+ return 0;
+
+ fpath = basename(fpath);
+
+ const char *e = endswith(fpath, ".map") ?: endswith(fpath, ".map.gz");
+ if (!e)
+ return 0;
+
+ p = strndup(fpath, e - fpath);
+ if (!p) {
+ errno = ENOMEM;
+ return -1;
+ }
+
+ if (keymap_name)
+ return streq(p, keymap_name);
+
+ if (!keymap_is_valid(p))
+ return 0;
+
+ r = set_consume(keymaps, TAKE_PTR(p));
+ if (r < 0 && r != -EEXIST) {
+ errno = -r;
+ return -1;
+ }
+
+ return 0;
+}
+
+int get_keymaps(char ***ret) {
+ keymaps = set_new(&string_hash_ops);
+ if (!keymaps)
+ return -ENOMEM;
+
+ const char *dir;
+ NULSTR_FOREACH(dir, KBD_KEYMAP_DIRS)
+ if (nftw(dir, nftw_cb, 20, FTW_PHYS) < 0) {
+ if (errno == ENOENT)
+ continue;
+ if (ERRNO_IS_RESOURCE(errno)) {
+ keymaps = set_free_free(keymaps);
+ return log_warning_errno(errno, "Failed to read keymap list from %s: %m", dir);
+ }
+ log_debug_errno(errno, "Failed to read keymap list from %s, ignoring: %m", dir);
+ }
+
+ _cleanup_strv_free_ char **l = set_get_strv(keymaps);
+ if (!l) {
+ keymaps = set_free_free(keymaps);
+ return -ENOMEM;
+ }
+
+ keymaps = set_free(keymaps);
+
+ if (strv_isempty(l))
+ return -ENOENT;
+
+ strv_sort(l);
+
+ *ret = TAKE_PTR(l);
+
+ return 0;
+}
+
+bool keymap_is_valid(const char *name) {
+ if (isempty(name))
+ return false;
+
+ if (strlen(name) >= 128)
+ return false;
+
+ if (!utf8_is_valid(name))
+ return false;
+
+ if (!filename_is_valid(name))
+ return false;
+
+ if (!string_is_safe(name))
+ return false;
+
+ return true;
+}
+
+int keymap_exists(const char *name) {
+ int r = 0;
+
+ if (!keymap_is_valid(name))
+ return -EINVAL;
+
+ keymap_name = name;
+
+ const char *dir;
+ NULSTR_FOREACH(dir, KBD_KEYMAP_DIRS) {
+ r = nftw(dir, nftw_cb, 20, FTW_PHYS);
+ if (r > 0)
+ break;
+ if (r < 0 && errno != ENOENT)
+ log_debug_errno(errno, "Failed to read keymap list from %s, ignoring: %m", dir);
+ }
+
+ keymap_name = NULL;
+
+ return r > 0;
+}
int get_keymaps(char ***l);
bool keymap_is_valid(const char *name);
+int keymap_exists(const char *name);
union in_addr_union gateway;
uint16_t type;
unsigned char dst_len, src_len, table;
- uint32_t ifi, metric = 0;
+ uint32_t ifi = 0, metric = 0;
size_t rta_len;
int family;
RouteVia via;
assert(mode >= 0);
assert(mode < _OUTPUT_MODE_MAX);
- if (how_many == (unsigned) -1)
+ if (how_many == UINT_MAX)
need_seek = true;
else {
/* Seek to end */
bool noaccess = journal_access_blocked(j);
if (line == 0 && noaccess)
- fprintf(f, "Warning: some journal files were not opened due to insufficient permissions.");
+ fprintf(f, "Warning: some journal files were not opened due to insufficient permissions.\n");
else if (!noaccess)
fprintf(f, "Notice: journal has been rotated since unit was started, output may be incomplete.\n");
else
json-internal.h
json.c
json.h
+ kbd-util.c
+ kbd-util.h
killall.c
killall.h
libcrypt-util.c
specifier.h
switch-root.c
switch-root.h
- sysctl-util.c
- sysctl-util.h
tmpfile-util-label.c
tmpfile-util-label.h
tomoyo-util.c
return 0;
}
+
+const char *namespace_single_flag_to_string(unsigned long flag) {
+ for (unsigned i = 0; namespace_flag_map[i].name; i++)
+ if (namespace_flag_map[i].flag == flag)
+ return namespace_flag_map[i].name;
+
+ return NULL;
+}
CLONE_NEWUSER| \
CLONE_NEWUTS))
-#define NAMESPACE_FLAGS_INITIAL ((unsigned long) -1)
+#define NAMESPACE_FLAGS_INITIAL ULONG_MAX
int namespace_flags_from_string(const char *name, unsigned long *ret);
int namespace_flags_to_string(unsigned long flags, char **ret);
+const char *namespace_single_flag_to_string(unsigned long flag);
struct namespace_flag_map {
unsigned long flag;
_noreturn_ static void pager_fallback(void) {
int r;
- r = copy_bytes(STDIN_FILENO, STDOUT_FILENO, (uint64_t) -1, 0);
+ r = copy_bytes(STDIN_FILENO, STDOUT_FILENO, UINT64_MAX, 0);
if (r < 0) {
log_error_errno(r, "Internal pager failed: %m");
_exit(EXIT_FAILURE);
assert(f);
- if (width == (unsigned) -1 && height == (unsigned) -1)
+ if (width == UINT_MAX && height == UINT_MAX)
return 0; /* noop */
- if (width != (unsigned) -1 &&
+ if (width != UINT_MAX &&
(width == 0 || width > USHRT_MAX))
return -ERANGE;
- if (height != (unsigned) -1 &&
+ if (height != UINT_MAX &&
(height == 0 || height > USHRT_MAX))
return -ERANGE;
- if (width == (unsigned) -1 || height == (unsigned) -1) {
+ if (width == UINT_MAX || height == UINT_MAX) {
if (ioctl(f->master, TIOCGWINSZ, &ws) < 0)
return -errno;
- if (width != (unsigned) -1)
+ if (width != UINT_MAX)
ws.ws_col = width;
- if (height != (unsigned) -1)
+ if (height != UINT_MAX)
ws.ws_row = height;
} else
ws = (struct winsize) {
return 0;
}
-int seccomp_load_syscall_filter_set_raw(uint32_t default_action, Hashmap* set, uint32_t action, bool log_missing) {
+int seccomp_load_syscall_filter_set_raw(uint32_t default_action, Hashmap* filter, uint32_t action, bool log_missing) {
uint32_t arch;
int r;
- /* Similar to seccomp_load_syscall_filter_set(), but takes a raw Set* of syscalls, instead of a
- * SyscallFilterSet* table. */
+ /* Similar to seccomp_load_syscall_filter_set(), but takes a raw Hashmap* of syscalls, instead
+ * of a SyscallFilterSet* table. */
- if (hashmap_isempty(set) && default_action == SCMP_ACT_ALLOW)
+ if (hashmap_isempty(filter) && default_action == SCMP_ACT_ALLOW)
return 0;
SECCOMP_FOREACH_LOCAL_ARCH(arch) {
if (r < 0)
return r;
- HASHMAP_FOREACH_KEY(val, syscall_id, set) {
+ HASHMAP_FOREACH_KEY(val, syscall_id, filter) {
uint32_t a = action;
int id = PTR_TO_INT(syscall_id) - 1;
int error = PTR_TO_INT(val);
else if (action == SCMP_ACT_LOG)
a = SCMP_ACT_LOG;
#endif
- else if (action != SCMP_ACT_ALLOW && error >= 0)
+ else if (error >= 0)
a = SCMP_ACT_ERRNO(error);
r = seccomp_rule_add_exact(seccomp, a, id, 0);
if (r < 0) {
- /* If the system call is not known on this architecture, then that's fine, let's ignore it */
+ /* If the system call is not known on this architecture, then that's
+ * fine, let's ignore it */
_cleanup_free_ char *n = NULL;
bool ignore;
if (ERRNO_IS_SECCOMP_FATAL(r))
return r;
if (r < 0)
- log_debug_errno(r, "Failed to install filter set for architecture %s, skipping: %m", seccomp_arch_to_string(arch));
+ log_debug_errno(r, "Failed to install systemc call filter for architecture %s, skipping: %m",
+ seccomp_arch_to_string(arch));
}
return 0;
assert(name);
assert(filter);
+ if (!FLAGS_SET(flags, SECCOMP_PARSE_INVERT) && errno_num >= 0)
+ return -EINVAL;
+
if (name[0] == '@') {
const SyscallFilterSet *set;
const char *i;
set = syscall_filter_set_find(name);
if (!set) {
- if (!(flags & SECCOMP_PARSE_PERMISSIVE))
+ if (!FLAGS_SET(flags, SECCOMP_PARSE_PERMISSIVE))
return -EINVAL;
- log_syntax(unit, flags & SECCOMP_PARSE_LOG ? LOG_WARNING : LOG_DEBUG, filename, line, 0,
+ log_syntax(unit, FLAGS_SET(flags, SECCOMP_PARSE_LOG) ? LOG_WARNING : LOG_DEBUG, filename, line, 0,
"Unknown system call group, ignoring: %s", name);
return 0;
}
id = seccomp_syscall_resolve_name(name);
if (id == __NR_SCMP_ERROR) {
- if (!(flags & SECCOMP_PARSE_PERMISSIVE))
+ if (!FLAGS_SET(flags, SECCOMP_PARSE_PERMISSIVE))
return -EINVAL;
- log_syntax(unit, flags & SECCOMP_PARSE_LOG ? LOG_WARNING : LOG_DEBUG, filename, line, 0,
+ log_syntax(unit, FLAGS_SET(flags, SECCOMP_PARSE_LOG) ? LOG_WARNING : LOG_DEBUG, filename, line, 0,
"Failed to parse system call, ignoring: %s", name);
return 0;
}
- /* If we previously wanted to forbid a syscall and now
- * we want to allow it, then remove it from the list. */
- if (!(flags & SECCOMP_PARSE_INVERT) == !!(flags & SECCOMP_PARSE_ALLOW_LIST)) {
+ /* If we previously wanted to forbid a syscall and now we want to allow it, then remove
+ * it from the list. The entries in allow-list with non-negative error value will be
+ * handled with SCMP_ACT_ERRNO() instead of the default action. */
+ if (!FLAGS_SET(flags, SECCOMP_PARSE_INVERT) == FLAGS_SET(flags, SECCOMP_PARSE_ALLOW_LIST) ||
+ (FLAGS_SET(flags, SECCOMP_PARSE_INVERT | SECCOMP_PARSE_ALLOW_LIST) && errno_num >= 0)) {
r = hashmap_put(filter, INT_TO_PTR(id + 1), INT_TO_PTR(errno_num));
if (r < 0)
switch (r) {
case -ENOMEM:
- return flags & SECCOMP_PARSE_LOG ? log_oom() : -ENOMEM;
+ return FLAGS_SET(flags, SECCOMP_PARSE_LOG) ? log_oom() : -ENOMEM;
case -EEXIST:
assert_se(hashmap_update(filter, INT_TO_PTR(id + 1), INT_TO_PTR(errno_num)) == 0);
break;
}
/* accept valid utf8 */
- len = utf8_encoded_valid_unichar(str + i, (size_t) -1);
+ len = utf8_encoded_valid_unichar(str + i, SIZE_MAX);
if (len > 1) {
i += len;
continue;
uintmax_t k;
if (json_variant_is_null(variant)) {
- *m = (mode_t) -1;
+ *m = MODE_INVALID;
return 0;
}
uintmax_t k;
if (json_variant_is_null(variant)) {
- *m = (mode_t) -1;
+ *m = MODE_INVALID;
return 0;
}
if (!json_variant_is_string(variant))
return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not a string.", strna(name));
- r = unbase64mem(json_variant_string(variant), (size_t) -1, &b, &l);
+ r = unbase64mem(json_variant_string(variant), SIZE_MAX, &b, &l);
if (r < 0)
return json_log(variant, flags, r, "Failed to decode encrypted PKCS#11 key: %m");
if (!json_variant_is_string(variant))
return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not a string.", strna(name));
- r = unbase64mem(json_variant_string(variant), (size_t) -1, &b, &l);
+ r = unbase64mem(json_variant_string(variant), SIZE_MAX, &b, &l);
if (r < 0)
return json_log(variant, flags, r, "Failed to decode FIDO2 credential ID: %m");
if (!array)
return log_oom();
- r = unbase64mem(json_variant_string(e), (size_t) -1, &b, &l);
+ r = unbase64mem(json_variant_string(e), SIZE_MAX, &b, &l);
if (r < 0)
return json_log(variant, flags, r, "Failed to decode FIDO2 credential ID: %m");
if (!json_variant_is_string(variant))
return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not a string.", strna(name));
- r = unbase64mem(json_variant_string(variant), (size_t) -1, &b, &l);
+ r = unbase64mem(json_variant_string(variant), SIZE_MAX, &b, &l);
if (r < 0)
return json_log(variant, flags, r, "Failed to decode FIDO2 salt: %m");
mode_t user_record_access_mode(UserRecord *h) {
assert(h);
- return h->access_mode != (mode_t) -1 ? h->access_mode : 0700;
+ return h->access_mode != MODE_INVALID ? h->access_mode : 0700;
}
const char* user_record_home_directory(UserRecord *h) {
varlink_set_state(v, VARLINK_DISCONNECTED);
- /* Let's take a reference first, since varlink_detach_server() might drop the final (dangling) ref
- * which would destroy us before we can call varlink_clear() */
+ /* Let's take a reference first, since varlink_detach_server() might drop the final ref from the
+ * disconnect callback, which would invalidate the pointer we are holding before we can call
+ * varlink_clear(). */
varlink_ref(v);
varlink_detach_server(v);
varlink_clear(v);
if (!v)
return NULL;
- (void) varlink_close(v);
+ /* A reference is given to us to be destroyed. But when calling varlink_close(), a callback might
+ * also drop a reference. We allow this, and will hold a temporary reference to the object to make
+ * sure that the object still exists when control returns to us. If there's just one reference
+ * remaining after varlink_close(), even though there were at least two right before, we'll handle
+ * that gracefully instead of crashing.
+ *
+ * In other words, this call drops the donated reference, but if the internal call to varlink_close()
+ * dropped a reference to, we don't drop the reference afain. This allows the caller to say:
+ * global_object->varlink = varlink_close_unref(global_object->varlink);
+ * even though there is some callback which has access to global_object and may drop the reference
+ * stored in global_object->varlink. Without this step, the same code would have to be written as:
+ * Varlink *t = TAKE_PTR(global_object->varlink);
+ * varlink_close_unref(t);
+ */
+ /* n_ref >= 1 */
+ varlink_ref(v); /* n_ref >= 2 */
+ varlink_close(v); /* n_ref >= 1 */
+ if (v->n_ref > 1)
+ v->n_ref--; /* n_ref >= 1 */
return varlink_unref(v);
}
Varlink* varlink_flush_close_unref(Varlink *v) {
- if (!v)
- return NULL;
+ if (v)
+ varlink_flush(v);
- (void) varlink_flush(v);
- (void) varlink_close(v);
- return varlink_unref(v);
+ return varlink_close_unref(v);
}
static int varlink_enqueue_json(Varlink *v, JsonVariant *m) {
#include <stdbool.h>
-#define VERB_ANY ((unsigned) -1)
+#define VERB_ANY (UINT_MAX)
typedef enum VerbFlags {
VERB_DEFAULT = 1 << 0, /* The verb to run if no verb is specified */
/* There are things we cannot get rid of. Loop one more time
* with LOG_ERR to inform the user. Note that we don't need
* to do this if there is a initrd to switch to, because that
- * one is likely to get rid of the remounting mounts. If not,
+ * one is likely to get rid of the remaining mounts. If not,
* it will log about them. */
umount_log_level = LOG_ERR;
continue;
#include <errno.h>
#include <getopt.h>
-#include <poll.h>
#include <stddef.h>
#include <string.h>
#include <unistd.h>
#include "bus-internal.h"
#include "bus-util.h"
#include "errno-util.h"
+#include "io-util.h"
#include "log.h"
#include "main-func.h"
#include "util.h"
for (;;) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
int events_a, events_b, fd;
- uint64_t timeout_a, timeout_b, t;
- struct timespec _ts, *ts;
+ usec_t timeout_a, timeout_b, t;
+
+ assert_cc(sizeof(usec_t) == sizeof(uint64_t));
r = sd_bus_process(a, &m);
if (r < 0)
if (r < 0)
return log_error_errno(r, "Failed to get timeout: %m");
- t = timeout_a;
- if (t == (uint64_t) -1 || (timeout_b != (uint64_t) -1 && timeout_b < timeout_a))
- t = timeout_b;
-
- if (t == (uint64_t) -1)
- ts = NULL;
- else {
- usec_t nw;
-
- nw = now(CLOCK_MONOTONIC);
- if (t > nw)
- t -= nw;
- else
- t = 0;
-
- ts = timespec_store(&_ts, t);
- }
+ t = usec_sub_unsigned(MIN(timeout_a, timeout_b), now(CLOCK_MONOTONIC));
struct pollfd p[3] = {
{ .fd = fd, .events = events_a },
{ .fd = STDOUT_FILENO, .events = events_b & POLLOUT },
};
- r = ppoll(p, ELEMENTSOF(p), ts, NULL);
+ r = ppoll_usec(p, ELEMENTSOF(p), t);
if (r < 0)
- return log_error_errno(errno, "ppoll() failed: %m");
- if (p[0].revents & POLLNVAL ||
- p[1].revents & POLLNVAL ||
- p[2].revents & POLLNVAL)
- return log_error_errno(SYNTHETIC_ERRNO(EBADF), "Invalid file descriptor to poll on?");
+ return log_error_errno(r, "ppoll() failed: %m");
}
return 0;
ret = r;
}
- (void) table_set_sort(t, (size_t) 0, (size_t) -1);
+ (void) table_set_sort(t, (size_t) 0);
r = table_print_with_pager(t, arg_json_format_flags, arg_pager_flags, arg_legend);
if (r < 0)
return table_log_add_error(r);
}
- (void) table_set_sort(t, (size_t) 0, (size_t) -1);
+ (void) table_set_sort(t, (size_t) 0);
return table_print_with_pager(t, arg_json_format_flags, arg_pager_flags, arg_legend);
}
_cleanup_free_ char *new_contents = NULL;
_cleanup_fclose_ FILE *f = NULL;
char **path;
- size_t size;
r = mac_selinux_create_file_prepare(new_path, S_IFREG);
if (r < 0)
if (r < 0)
return log_error_errno(errno, "Failed to change mode of \"%s\": %m", t);
- r = read_full_file(new_path, &new_contents, &size);
+ r = read_full_file(new_path, &new_contents, NULL);
if (r < 0 && r != -ENOENT)
return log_error_errno(r, "Failed to read \"%s\": %m", new_path);
if (path_equal(*path, new_path))
continue;
- r = read_full_file(*path, &contents, &size);
+ r = read_full_file(*path, &contents, NULL);
if (r < 0)
return log_error_errno(r, "Failed to read \"%s\": %m", *path);
fprintf(f, "\n\n### %s", *path);
if (!isempty(contents)) {
- contents = strreplace(strstrip(contents), "\n", "\n# ");
- if (!contents)
+ _cleanup_free_ char *commented_contents = NULL;
+
+ commented_contents = strreplace(strstrip(contents), "\n", "\n# ");
+ if (!commented_contents)
return log_oom();
- fprintf(f, "\n# %s", contents);
+ fprintf(f, "\n# %s", commented_contents);
}
}
int r;
/* Trim out the lines between the two markers */
- r = read_full_file(path, &contents, &size);
+ r = read_full_file(path, &contents, NULL);
if (r < 0)
return log_error_errno(r, "Failed to read temporary file \"%s\": %m", path);
+ size = strlen(contents);
+
contents_start = strstr(contents, EDIT_MARKER_START);
if (contents_start)
contents_start += strlen(EDIT_MARKER_START);
if (!arg_show_types) {
/* Hide the second (TYPE) column */
- r = table_set_display(table, (size_t) 0, (size_t) 2, (size_t) 3, (size_t) -1);
+ r = table_set_display(table, (size_t) 0, (size_t) 2, (size_t) 3);
if (r < 0)
return log_error_errno(r, "Failed to set columns to display: %m");
}
if (i->status_errno > 0)
printf(" Error: %i (%s)\n", i->status_errno, strerror_safe(i->status_errno));
- if (i->ip_ingress_bytes != (uint64_t) -1 && i->ip_egress_bytes != (uint64_t) -1) {
+ if (i->ip_ingress_bytes != UINT64_MAX && i->ip_egress_bytes != UINT64_MAX) {
char buf_in[FORMAT_BYTES_MAX], buf_out[FORMAT_BYTES_MAX];
printf(" IP: %s in, %s out\n",
format_bytes(buf_out, sizeof(buf_out), i->io_write_bytes));
}
- if (i->tasks_current != (uint64_t) -1) {
+ if (i->tasks_current != UINT64_MAX) {
printf(" Tasks: %" PRIu64, i->tasks_current);
- if (i->tasks_max != (uint64_t) -1)
+ if (i->tasks_max != UINT64_MAX)
printf(" (limit: %" PRIu64 ")\n", i->tasks_max);
else
printf("\n");
}
- if (i->memory_current != (uint64_t) -1) {
+ if (i->memory_current != UINT64_MAX) {
char buf[FORMAT_BYTES_MAX];
printf(" Memory: %s", format_bytes(buf, sizeof(buf), i->memory_current));
printf("\n");
}
- if (i->cpu_usage_nsec != (uint64_t) -1) {
+ if (i->cpu_usage_nsec != UINT64_MAX) {
char buf[FORMAT_TIMESPAN_MAX];
printf(" CPU: %s\n", format_timespan(buf, sizeof(buf), i->cpu_usage_nsec / NSEC_PER_USEC, USEC_PER_MSEC));
}
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_set_free_ Set *found_properties = NULL;
_cleanup_(unit_status_info_free) UnitStatusInfo info = {
- .memory_current = (uint64_t) -1,
+ .memory_current = UINT64_MAX,
.memory_high = CGROUP_LIMIT_MAX,
.memory_max = CGROUP_LIMIT_MAX,
.memory_swap_max = CGROUP_LIMIT_MAX,
- .memory_limit = (uint64_t) -1,
- .cpu_usage_nsec = (uint64_t) -1,
- .tasks_current = (uint64_t) -1,
- .tasks_max = (uint64_t) -1,
- .ip_ingress_bytes = (uint64_t) -1,
- .ip_egress_bytes = (uint64_t) -1,
+ .memory_limit = UINT64_MAX,
+ .cpu_usage_nsec = UINT64_MAX,
+ .tasks_current = UINT64_MAX,
+ .tasks_max = UINT64_MAX,
+ .ip_ingress_bytes = UINT64_MAX,
+ .ip_egress_bytes = UINT64_MAX,
.io_read_bytes = UINT64_MAX,
.io_write_bytes = UINT64_MAX,
};
int sd_dhcp_client_set_ifindex(
sd_dhcp_client *client,
int interface_index);
+int sd_dhcp_client_set_ifname(
+ sd_dhcp_client *client,
+ const char *interface_name);
+const char *sd_dhcp_client_get_ifname(sd_dhcp_client *client);
int sd_dhcp_client_set_mac(
sd_dhcp_client *client,
const uint8_t *addr,
int sd_dhcp_server_new(sd_dhcp_server **ret, int ifindex);
+int sd_dhcp_server_set_ifname(sd_dhcp_server *server, const char *ifname);
+const char *sd_dhcp_server_get_ifname(sd_dhcp_server *server);
+
sd_dhcp_server *sd_dhcp_server_ref(sd_dhcp_server *server);
sd_dhcp_server *sd_dhcp_server_unref(sd_dhcp_server *server);
int sd_dhcp6_client_set_ifindex(
sd_dhcp6_client *client,
int interface_index);
+int sd_dhcp6_client_set_ifname(
+ sd_dhcp6_client *client,
+ const char *interface_name);
+const char * sd_dhcp6_client_get_ifname(sd_dhcp6_client *client);
int sd_dhcp6_client_set_local_address(
sd_dhcp6_client *client,
const struct in6_addr *local_address);
int sd_ipv4acd_set_mac(sd_ipv4acd *acd, const struct ether_addr *addr);
int sd_ipv4acd_set_ifindex(sd_ipv4acd *acd, int interface_index);
int sd_ipv4acd_get_ifindex(sd_ipv4acd *acd);
+int sd_ipv4acd_set_ifname(sd_ipv4acd *acd, const char *interface_name);
const char *sd_ipv4acd_get_ifname(sd_ipv4acd *acd);
int sd_ipv4acd_set_address(sd_ipv4acd *acd, const struct in_addr *address);
int sd_ipv4acd_is_running(sd_ipv4acd *acd);
int sd_ipv4ll_set_mac(sd_ipv4ll *ll, const struct ether_addr *addr);
int sd_ipv4ll_set_ifindex(sd_ipv4ll *ll, int interface_index);
int sd_ipv4ll_get_ifindex(sd_ipv4ll *ll);
+int sd_ipv4ll_set_ifname(sd_ipv4ll *ll, const char *interface_name);
const char *sd_ipv4ll_get_ifname(sd_ipv4ll *ll);
int sd_ipv4ll_set_address(sd_ipv4ll *ll, const struct in_addr *address);
int sd_ipv4ll_set_address_seed(sd_ipv4ll *ll, uint64_t seed);
SD_LLDP_SYSTEM_CAPABILITIES_TPMR = 1 << 10,
};
-#define SD_LLDP_SYSTEM_CAPABILITIES_ALL ((uint16_t) -1)
+#define SD_LLDP_SYSTEM_CAPABILITIES_ALL UINT16_MAX
#define SD_LLDP_SYSTEM_CAPABILITIES_ALL_ROUTERS \
((uint16_t) \
int sd_lldp_set_callback(sd_lldp *lldp, sd_lldp_callback_t cb, void *userdata);
int sd_lldp_set_ifindex(sd_lldp *lldp, int ifindex);
+int sd_lldp_set_ifname(sd_lldp *lldp, const char *ifname);
+const char *sd_lldp_get_ifname(sd_lldp *lldp);
/* Controls how much and what to store in the neighbors database */
int sd_lldp_set_neighbors_max(sd_lldp *lldp, uint64_t n);
int sd_ndisc_set_callback(sd_ndisc *nd, sd_ndisc_callback_t cb, void *userdata);
int sd_ndisc_set_ifindex(sd_ndisc *nd, int interface_index);
+int sd_ndisc_set_ifname(sd_ndisc *nd, const char *interface_name);
+const char *sd_ndisc_get_ifname(sd_ndisc *nd);
int sd_ndisc_set_mac(sd_ndisc *nd, const struct ether_addr *mac_addr);
int sd_ndisc_get_mtu(sd_ndisc *nd, uint32_t *ret);
int sd_radv_is_running(sd_radv *ra);
int sd_radv_set_ifindex(sd_radv *ra, int interface_index);
+int sd_radv_set_ifname(sd_radv *ra, const char *interface_name);
+const char *sd_radv_get_ifname(sd_radv *ra);
int sd_radv_set_mac(sd_radv *ra, const struct ether_addr *mac_addr);
int sd_radv_set_mtu(sd_radv *ra, uint32_t mtu);
int sd_radv_set_hop_limit(sd_radv *ra, uint8_t hop_limit);
* POLLOUT, ...) to check for. */
int sd_resolve_get_events(sd_resolve *resolve);
-/* Return the poll() timeout to pass. Returns (uint64_t) -1 as
+/* Return the poll() timeout to pass. Returns UINT64_MAX as
* timeout if no timeout is needed. */
int sd_resolve_get_timeout(sd_resolve *resolve, uint64_t *timeout_usec);
if (r < 0)
return r;
- r = copy_bytes(src, fileno(dst), (uint64_t) -1, COPY_REFLINK);
+ r = copy_bytes(src, fileno(dst), UINT64_MAX, COPY_REFLINK);
if (r < 0)
return r;
original = fopen(passwd_path, "re");
if (original) {
- r = sync_rights(fileno(original), fileno(passwd));
+ r = copy_rights(fileno(original), fileno(passwd));
if (r < 0)
return r;
original = fopen(shadow_path, "re");
if (original) {
- r = sync_rights(fileno(original), fileno(shadow));
+ r = copy_rights(fileno(original), fileno(shadow));
if (r < 0)
return r;
.sp_warn = -1,
.sp_inact = -1,
.sp_expire = -1,
- .sp_flag = (unsigned long) -1, /* this appears to be what everybody does ... */
+ .sp_flag = ULONG_MAX, /* this appears to be what everybody does ... */
};
r = putspent_sane(&n, shadow);
original = fopen(group_path, "re");
if (original) {
- r = sync_rights(fileno(original), fileno(group));
+ r = copy_rights(fileno(original), fileno(group));
if (r < 0)
return r;
if (original) {
struct sgrp *sg;
- r = sync_rights(fileno(original), fileno(gshadow));
+ r = copy_rights(fileno(original), fileno(gshadow));
if (r < 0)
return r;
[['src/test/test-parse-argument.c']],
- [['src/test/test-parse-util.c'],
- [],
- [libseccomp]],
+ [['src/test/test-parse-util.c']],
[['src/test/test-sysctl-util.c']],
int main(int argc, const char *argv[]) {
_cleanup_bitmap_free_ Bitmap *b = NULL, *b2 = NULL;
- unsigned n = (unsigned) -1, i = 0;
+ unsigned n = UINT_MAX, i = 0;
b = bitmap_new();
assert_se(b);
else if (i == 1)
i = 256;
else if (i == 256)
- i = (unsigned) -1;
+ i = UINT_MAX;
}
- assert_se(i == (unsigned) -1);
+ assert_se(i == UINT_MAX);
i = 0;
else if (i == 1)
i = 256;
else if (i == 256)
- i = (unsigned) -1;
+ i = UINT_MAX;
}
- assert_se(i == (unsigned) -1);
+ assert_se(i == UINT_MAX);
b2 = bitmap_copy(b);
assert_se(b2);
bitmap_free(b2);
b2 = NULL;
- assert_se(bitmap_set(b, (unsigned) -1) == -ERANGE);
+ assert_se(bitmap_set(b, UINT_MAX) == -ERANGE);
bitmap_free(b);
b = NULL;
#include "alloc-util.h"
#include "calendarspec.h"
+#include "env-util.h"
#include "errno-util.h"
#include "string-util.h"
-#include "util.h"
-static void test_one(const char *input, const char *output) {
+static void _test_one(int line, const char *input, const char *output) {
CalendarSpec *c;
_cleanup_free_ char *p = NULL, *q = NULL;
usec_t u;
assert_se(calendar_spec_from_string(input, &c) >= 0);
assert_se(calendar_spec_to_string(c, &p) >= 0);
- printf("\"%s\" → \"%s\"\n", input, p);
+ log_info("line %d: \"%s\" → \"%s\"", line, input, p);
assert_se(streq(p, output));
u = now(CLOCK_REALTIME);
r = calendar_spec_next_usec(c, u, &u);
- printf("Next: %s\n", r < 0 ? strerror_safe(r) : format_timestamp(buf, sizeof(buf), u));
+ log_info("Next: %s", r < 0 ? strerror_safe(r) : format_timestamp(buf, sizeof buf, u));
calendar_spec_free(c);
assert_se(calendar_spec_from_string(p, &c) >= 0);
assert_se(streq(q, p));
}
+#define test_one(input, output) _test_one(__LINE__, input, output)
-static void test_next(const char *input, const char *new_tz, usec_t after, usec_t expect) {
+static void _test_next(int line, const char *input, const char *new_tz, usec_t after, usec_t expect) {
CalendarSpec *c;
usec_t u;
char *old_tz;
if (old_tz)
old_tz = strdupa(old_tz);
- if (new_tz) {
- char *colon_tz;
+ if (!isempty(new_tz))
+ new_tz = strjoina(":", new_tz);
- colon_tz = strjoina(":", new_tz);
- assert_se(setenv("TZ", colon_tz, 1) >= 0);
- } else
- assert_se(unsetenv("TZ") >= 0);
+ assert_se(set_unset_env("TZ", new_tz, true) == 0);
tzset();
assert_se(calendar_spec_from_string(input, &c) >= 0);
- printf("\"%s\"\n", input);
+ log_info("line %d: \"%s\" new_tz=%s", line, input, strnull(new_tz));
u = after;
r = calendar_spec_next_usec(c, after, &u);
- printf("At: %s\n", r < 0 ? strerror_safe(r) : format_timestamp_style(buf, sizeof buf, u, TIMESTAMP_US));
- if (expect != (usec_t)-1)
+ log_info("At: %s", r < 0 ? strerror_safe(r) : format_timestamp_style(buf, sizeof buf, u, TIMESTAMP_US));
+ if (expect != USEC_INFINITY)
assert_se(r >= 0 && u == expect);
else
assert(r == -ENOENT);
calendar_spec_free(c);
- if (old_tz)
- assert_se(setenv("TZ", old_tz, 1) >= 0);
- else
- assert_se(unsetenv("TZ") >= 0);
+ assert_se(set_unset_env("TZ", old_tz, true) == 0);
tzset();
}
+#define test_next(input, new_tz, after, expect) _test_next(__LINE__, input,new_tz,after,expect)
static void test_timestamp(void) {
char buf[FORMAT_TIMESTAMP_MAX];
x = now(CLOCK_REALTIME);
- assert_se(format_timestamp_style(buf, sizeof(buf), x, TIMESTAMP_US));
- printf("%s\n", buf);
+ assert_se(format_timestamp_style(buf, sizeof buf, x, TIMESTAMP_US));
+ log_info("%s", buf);
assert_se(calendar_spec_from_string(buf, &c) >= 0);
assert_se(calendar_spec_to_string(c, &t) >= 0);
calendar_spec_free(c);
- printf("%s\n", t);
+ log_info("%s", t);
assert_se(parse_timestamp(t, &y) >= 0);
assert_se(y == x);
n = now(CLOCK_REALTIME);
assert_se((r = calendar_spec_next_usec(c, n, &u)) >= 0);
- printf("Now: %s (%"PRIu64")\n", format_timestamp_style(buf, sizeof buf, n, TIMESTAMP_US), n);
- printf("Next hourly: %s (%"PRIu64")\n", r < 0 ? strerror_safe(r) : format_timestamp_style(buf, sizeof buf, u, TIMESTAMP_US), u);
+ log_info("Now: %s (%"PRIu64")", format_timestamp_style(buf, sizeof buf, n, TIMESTAMP_US), n);
+ log_info("Next hourly: %s (%"PRIu64")", r < 0 ? strerror_safe(r) : format_timestamp_style(buf, sizeof buf, u, TIMESTAMP_US), u);
assert_se((r = calendar_spec_next_usec(c, u, &w)) >= 0);
- printf("Next hourly: %s (%"PRIu64")\n", r < 0 ? strerror_safe(r) : format_timestamp_style(zaf, sizeof zaf, w, TIMESTAMP_US), w);
+ log_info("Next hourly: %s (%"PRIu64")", r < 0 ? strerror_safe(r) : format_timestamp_style(zaf, sizeof zaf, w, TIMESTAMP_US), w);
assert_se(n < u);
assert_se(u <= n + USEC_PER_HOUR);
test_next("2017-08-06 9..17/2:00 UTC", "", 1502029800000000, 1502031600000000);
test_next("2016-12-* 3..21/6:00 UTC", "", 1482613200000001, 1482634800000000);
test_next("2017-09-24 03:30:00 Pacific/Auckland", "", 12345, 1506177000000000);
- // Due to daylight saving time - 2017-09-24 02:30:00 does not exist
+ /* Due to daylight saving time - 2017-09-24 02:30:00 does not exist */
test_next("2017-09-24 02:30:00 Pacific/Auckland", "", 12345, -1);
test_next("2017-04-02 02:30:00 Pacific/Auckland", "", 12345, 1491053400000000);
- // Confirm that even though it's a time change here (backward) 02:30 happens only once
+ /* Confirm that even though it's a time change here (backward) 02:30 happens only once */
test_next("2017-04-02 02:30:00 Pacific/Auckland", "", 1491053400000000, -1);
test_next("2017-04-02 03:30:00 Pacific/Auckland", "", 12345, 1491060600000000);
- // Confirm that timezones in the Spec work regardless of current timezone
+ /* Confirm that timezones in the Spec work regardless of current timezone */
test_next("2017-09-09 20:42:00 Pacific/Auckland", "", 12345, 1504946520000000);
test_next("2017-09-09 20:42:00 Pacific/Auckland", "EET", 12345, 1504946520000000);
+ /* Check that we don't start looping if mktime() moves us backwards */
+ test_next("Sun *-*-* 01:00:00 Europe/Dublin", "", 1616412478000000, 1617494400000000);
+ test_next("Sun *-*-* 01:00:00 Europe/Dublin", "IST", 1616412478000000, 1617494400000000);
assert_se(calendar_spec_from_string("test", &c) < 0);
assert_se(calendar_spec_from_string(" utc", &c) < 0);
assert_se(pipe2(pipefd, O_CLOEXEC) == 0);
- r = copy_bytes(infd, pipefd[1], (uint64_t) -1, 0);
+ r = copy_bytes(infd, pipefd[1], UINT64_MAX, 0);
assert_se(r == 0);
r = read(pipefd[0], buf, sizeof(buf));
assert_se(fd3 >= 0);
r = copy_bytes(fd, fd2, max_bytes, try_reflink ? COPY_REFLINK : 0);
- if (max_bytes == (uint64_t) -1)
+ if (max_bytes == UINT64_MAX)
assert_se(r == 0);
else
assert_se(IN_SET(r, 0, 1));
assert_se(fstat(fd2, &buf2) == 0);
assert_se((uint64_t) buf2.st_size == MIN((uint64_t) buf.st_size, max_bytes));
- if (max_bytes < (uint64_t) -1)
+ if (max_bytes < UINT64_MAX)
/* Make sure the file is now higher than max_bytes */
assert_se(ftruncate(fd2, max_bytes + 1) == 0);
assert_se(lseek(fd2, 0, SEEK_SET) == 0);
r = copy_bytes(fd2, fd3, max_bytes, try_reflink ? COPY_REFLINK : 0);
- if (max_bytes == (uint64_t) -1)
+ if (max_bytes == UINT64_MAX)
assert_se(r == 0);
else
/* We cannot distinguish between the input being exactly max_bytes
assert_se(fstat(fd3, &buf3) == 0);
- if (max_bytes == (uint64_t) -1)
+ if (max_bytes == UINT64_MAX)
assert_se(buf3.st_size == buf2.st_size);
else
assert_se((uint64_t) buf3.st_size == max_bytes);
assert_se(mkdtemp_malloc(NULL, &p) >= 0);
assert_se(f = path_join(p, "version"));
- assert_se(copy_file("/proc/version", f, 0, (mode_t) -1, 0, 0, 0) >= 0);
+ assert_se(copy_file("/proc/version", f, 0, MODE_INVALID, 0, 0, 0) >= 0);
assert_se(read_one_line_file("/proc/version", &a) >= 0);
assert_se(read_one_line_file(f, &b) >= 0);
assert_se(streq(a, b));
- assert_se(strlen(a) > 0);
+ assert_se(!isempty(a));
}
int main(int argc, char *argv[]) {
test_copy_file_fd();
test_copy_tree();
test_copy_bytes();
- test_copy_bytes_regular_file(argv[0], false, (uint64_t) -1);
- test_copy_bytes_regular_file(argv[0], true, (uint64_t) -1);
+ test_copy_bytes_regular_file(argv[0], false, UINT64_MAX);
+ test_copy_bytes_regular_file(argv[0], true, UINT64_MAX);
test_copy_bytes_regular_file(argv[0], false, 1000); /* smaller than copy buffer size */
test_copy_bytes_regular_file(argv[0], true, 1000);
test_copy_bytes_regular_file(argv[0], false, 32000); /* larger than copy buffer size */
assert_se(expect_encoded_as("s/ash/ng", "s\\x2fash\\x2fng"));
assert_se(expect_encoded_as("/", "\\x2f"));
assert_se(expect_encoded_as("!", "\\x21"));
+ assert_se(expect_encoded_as("QEMU ", "QEMU\\x20\\x20\\x20\\x20"));
}
int main(int argc, char *argv[]) {
test(m, "exec-systemcallfilter-with-errno-name.service", errno_from_name("EILSEQ"), CLD_EXITED);
test(m, "exec-systemcallfilter-with-errno-number.service", 255, CLD_EXITED);
test(m, "exec-systemcallfilter-with-errno-multi.service", errno_from_name("EILSEQ"), CLD_EXITED);
+ test(m, "exec-systemcallfilter-with-errno-in-allow-list.service", errno_from_name("EILSEQ"), CLD_EXITED);
test(m, "exec-systemcallfilter-override-error-action.service", SIGSYS, CLD_KILLED);
test(m, "exec-systemcallfilter-override-error-action2.service", errno_from_name("EILSEQ"), CLD_EXITED);
#endif
assert_se(isempty(p));
p = original = "fooo\\";
- assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE_RELAX) > 0);
+ assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNESCAPE_RELAX) > 0);
assert_se(streq(t, "fooo\\"));
free(t);
assert_se(isempty(p));
p = original = "fooo\\";
- assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE_RELAX|EXTRACT_RELAX) > 0);
+ assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNESCAPE_RELAX|EXTRACT_RELAX) > 0);
assert_se(streq(t, "fooo\\"));
free(t);
assert_se(isempty(p));
p = original = "fooo\\";
- assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX) > 0);
+ assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_RELAX) > 0);
assert_se(streq(t, "fooo\\"));
free(t);
assert_se(isempty(p));
assert_se(isempty(p));
p = original = "\"foo\\";
- assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE_RELAX) == -EINVAL);
+ assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_UNESCAPE_RELAX) == -EINVAL);
assert_se(p == original + 5);
p = original = "\"foo\\";
- assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE_RELAX|EXTRACT_RELAX) > 0);
+ assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_UNESCAPE_RELAX|EXTRACT_RELAX) > 0);
assert_se(streq(t, "foo\\"));
free(t);
assert_se(isempty(p));
p = original = "\"foo\\";
- assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX|EXTRACT_RELAX) > 0);
+ assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNQUOTE|EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_RELAX|EXTRACT_RELAX) > 0);
assert_se(streq(t, "foo\\"));
free(t);
assert_se(isempty(p));
assert_se(p == original + 10);
p = original = "fooo\\ bar quux";
- assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE_RELAX) > 0);
+ assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNESCAPE_RELAX) > 0);
assert_se(streq(t, "fooo bar"));
free(t);
assert_se(p == original + 10);
p = original = "fooo\\ bar quux";
- assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE_RELAX|EXTRACT_RELAX) > 0);
+ assert_se(extract_first_word(&p, &t, NULL, EXTRACT_UNESCAPE_RELAX|EXTRACT_RELAX) > 0);
assert_se(streq(t, "fooo bar"));
free(t);
assert_se(p == original + 10);
assert_se(p == original + 5);
p = original = "fooo\\ bar quux";
- assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX) > 0);
+ assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_RELAX) > 0);
assert_se(streq(t, "fooo\\ bar"));
free(t);
assert_se(p == original + 10);
assert_se(p == original + 1);
p = original = "\\w+@\\K[\\d.]+";
- assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX) > 0);
+ assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_RELAX) > 0);
assert_se(streq(t, "\\w+@\\K[\\d.]+"));
free(t);
assert_se(isempty(p));
p = original = "\\w+\\b";
- assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX) > 0);
+ assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_RELAX) > 0);
assert_se(streq(t, "\\w+\b"));
free(t);
assert_se(isempty(p));
free(t);
assert_se(p == NULL);
+ p = "\\:";
+ assert_se(extract_first_word(&p, &t, ":", EXTRACT_UNESCAPE_SEPARATORS) == 1);
+ assert_se(streq(t, ":"));
+ free(t);
+ assert_se(p == NULL);
+
+ p = "a\\:b";
+ assert_se(extract_first_word(&p, &t, ":", EXTRACT_UNESCAPE_SEPARATORS) == 1);
+ assert_se(streq(t, "a:b"));
+ free(t);
+ assert_se(p == NULL);
+
+ p = "a\\ b:c";
+ assert_se(extract_first_word(&p, &t, WHITESPACE ":", EXTRACT_UNESCAPE_SEPARATORS) == 1);
+ assert_se(streq(t, "a b"));
+ free(t);
+ assert_se(extract_first_word(&p, &t, WHITESPACE ":", EXTRACT_UNESCAPE_SEPARATORS) == 1);
+ assert_se(streq(t, "c"));
+ free(t);
+ assert_se(p == NULL);
+
+ p = "a\\ b:c\\x";
+ assert_se(extract_first_word(&p, &t, ":", EXTRACT_UNESCAPE_SEPARATORS) == -EINVAL);
+
+ p = "a\\\\ b:c\\\\x";
+ assert_se(extract_first_word(&p, &t, ":", EXTRACT_UNESCAPE_SEPARATORS) == 1);
+ assert_se(streq(t, "a\\ b"));
+ free(t);
+ assert_se(extract_first_word(&p, &t, ":", EXTRACT_UNESCAPE_SEPARATORS) == 1);
+ assert_se(streq(t, "c\\x"));
+ free(t);
+ assert_se(p == NULL);
+
p = "\\:";
assert_se(extract_first_word(&p, &t, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS) == 1);
assert_se(streq(t, ":"));
free(t);
assert_se(p == NULL);
+ p = "a\\ b:c\\x";
+ assert_se(extract_first_word(&p, &t, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS) == -EINVAL);
+
+ p = "a\\\\ b:c\\\\x";
+ assert_se(extract_first_word(&p, &t, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS) == 1);
+ assert_se(streq(t, "a\\ b"));
+ free(t);
+ assert_se(extract_first_word(&p, &t, ":", EXTRACT_CUNESCAPE|EXTRACT_UNESCAPE_SEPARATORS) == 1);
+ assert_se(streq(t, "c\\x"));
+ free(t);
+ assert_se(p == NULL);
+
p = "\\:";
assert_se(extract_first_word(&p, &t, ":", EXTRACT_CUNESCAPE) == -EINVAL);
#include "ctype.h"
#include "env-file.h"
#include "env-util.h"
+#include "errno-util.h"
#include "fd-util.h"
#include "fileio.h"
#include "fs-util.h"
static void test_read_line_one_file(FILE *f) {
_cleanup_free_ char *line = NULL;
- assert_se(read_line(f, (size_t) -1, &line) == 15 && streq(line, "Some test data"));
+ assert_se(read_line(f, SIZE_MAX, &line) == 15 && streq(line, "Some test data"));
line = mfree(line);
- assert_se(read_line(f, (size_t) -1, &line) > 0 && streq(line, "루Non-ascii chars: ąę„”"));
+ assert_se(read_line(f, SIZE_MAX, &line) > 0 && streq(line, "루Non-ascii chars: ąę„”"));
line = mfree(line);
- assert_se(read_line(f, (size_t) -1, &line) == 13 && streq(line, "terminators"));
+ assert_se(read_line(f, SIZE_MAX, &line) == 13 && streq(line, "terminators"));
line = mfree(line);
- assert_se(read_line(f, (size_t) -1, &line) == 15 && streq(line, "and even more"));
+ assert_se(read_line(f, SIZE_MAX, &line) == 15 && streq(line, "and even more"));
line = mfree(line);
- assert_se(read_line(f, (size_t) -1, &line) == 25 && streq(line, "now the same with a NUL"));
+ assert_se(read_line(f, SIZE_MAX, &line) == 25 && streq(line, "now the same with a NUL"));
line = mfree(line);
- assert_se(read_line(f, (size_t) -1, &line) == 10 && streq(line, "and more"));
+ assert_se(read_line(f, SIZE_MAX, &line) == 10 && streq(line, "and more"));
line = mfree(line);
- assert_se(read_line(f, (size_t) -1, &line) == 16 && streq(line, "and even more"));
+ assert_se(read_line(f, SIZE_MAX, &line) == 16 && streq(line, "and even more"));
line = mfree(line);
- assert_se(read_line(f, (size_t) -1, &line) == 20 && streq(line, "and yet even more"));
+ assert_se(read_line(f, SIZE_MAX, &line) == 20 && streq(line, "and yet even more"));
line = mfree(line);
assert_se(read_line(f, 1024, &line) == 30 && streq(line, "With newlines, and a NUL byte"));
assert_se(read_line(f, 1024, &line) == 14 && streq(line, "an empty line"));
line = mfree(line);
- assert_se(read_line(f, (size_t) -1, NULL) == 16);
+ assert_se(read_line(f, SIZE_MAX, NULL) == 16);
assert_se(read_line(f, 16, &line) == -ENOBUFS);
line = mfree(line);
assert_se(f = fmemopen_unlocked((void*) eof_endings[i].string, eof_endings[i].length, "r"));
- r = read_line(f, (size_t) -1, &s);
+ r = read_line(f, SIZE_MAX, &s);
assert_se((size_t) r == eof_endings[i].length);
assert_se(streq_ptr(s, "foo"));
- assert_se(read_line(f, (size_t) -1, NULL) == 0); /* Ensure we hit EOF */
+ assert_se(read_line(f, SIZE_MAX, NULL) == 0); /* Ensure we hit EOF */
}
}
rbuf = mfree(rbuf);
}
+static void test_read_full_virtual_file(void) {
+ const char *filename;
+ int r;
+
+ FOREACH_STRING(filename,
+ "/proc/1/cmdline",
+ "/etc/nsswitch.conf",
+ "/sys/kernel/uevent_seqnum") {
+
+ _cleanup_free_ char *buf = NULL;
+ size_t size = 0;
+
+ r = read_full_virtual_file(filename, &buf, &size);
+ log_info_errno(r, "read_full_virtual_file(\"%s\"): %m (%zu bytes)", filename, size);
+ assert_se(r == 0 || ERRNO_IS_PRIVILEGE(r) || r == -ENOENT);
+ }
+}
+
int main(int argc, char *argv[]) {
test_setup_logging(LOG_DEBUG);
test_read_nul_string();
test_read_full_file_socket();
test_read_full_file_offset_size();
+ test_read_full_virtual_file();
return 0;
}
/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#include <unistd.h>
+
#include "firewall-util.h"
+#include "firewall-util-private.h"
#include "log.h"
#include "random-util.h"
+#include "socket-util.h"
#include "tests.h"
-#define MAKE_IN_ADDR_UNION(a,b,c,d) (union in_addr_union) { .in.s_addr = htobe32((uint32_t) (a) << 24 | (uint32_t) (b) << 16 | (uint32_t) (c) << 8 | (uint32_t) (d))}
-#define MAKE_IN6_ADDR_UNION(str, u) assert_se(in_addr_from_string(AF_INET6, str, u) >= 0)
-
-static void test_v6(FirewallContext **ctx) {
- union in_addr_union u = {}, u2 = {};
+static void test_v6(FirewallContext *ctx) {
+ union in_addr_union u1, u2, u3;
uint8_t prefixlen;
int r;
- MAKE_IN6_ADDR_UNION("dead::beef", &u);
-
- r = fw_add_masquerade(ctx, true, AF_INET6, &u, 128);
- if (r < 0)
- log_error_errno(r, "Failed to modify ipv6 firewall: %m");
+ assert_se(ctx);
- r = fw_add_masquerade(ctx, false, AF_INET6, &u, 128);
- if (r < 0)
- log_error_errno(r, "Failed to modify ipv6 firewall: %m");
+ log_info("/* %s(backend=%s) */", __func__, firewall_backend_to_string(ctx->backend));
- r = fw_add_masquerade(ctx, true, AF_INET6, &u, 64);
- if (r < 0)
- log_error_errno(r, "Failed to modify ipv6 firewall: %m");
+ if (!socket_ipv6_is_supported())
+ return log_info("IPv6 is not supported by kernel, skipping tests.");
- r = fw_add_masquerade(ctx, false, AF_INET6, &u, 64);
- if (r < 0)
- log_error_errno(r, "Failed to modify ipv6 firewall: %m");
+ assert_se(in_addr_from_string(AF_INET6, "dead::beef", &u1) >= 0);
+ assert_se(in_addr_from_string(AF_INET6, "1c3::c01d", &u2) >= 0);
- r = fw_add_local_dnat(ctx, true, AF_INET6, IPPROTO_TCP, 4711, &u, 815, NULL);
- if (r < 0)
- log_error_errno(r, "Failed to modify firewall: %m");
+ prefixlen = random_u64_range(128 + 1 - 8) + 8;
+ pseudo_random_bytes(&u3, sizeof(u3));
- MAKE_IN6_ADDR_UNION("1c3::c01d", &u2);
- r = fw_add_local_dnat(ctx, true, AF_INET6, IPPROTO_TCP, 4711, &u2, 815, &u);
- if (r < 0)
- log_error_errno(r, "Failed to modify firewall: %m");
+ assert_se(fw_add_masquerade(&ctx, true, AF_INET6, &u1, 128) >= 0);
+ assert_se(fw_add_masquerade(&ctx, false, AF_INET6, &u1, 128) >= 0);
+ assert_se(fw_add_masquerade(&ctx, true, AF_INET6, &u1, 64) >= 0);
+ assert_se(fw_add_masquerade(&ctx, false, AF_INET6, &u1, 64) >= 0);
+ assert_se(fw_add_masquerade(&ctx, true, AF_INET6, &u3, prefixlen) >= 0);
+ assert_se(fw_add_masquerade(&ctx, false, AF_INET6, &u3, prefixlen) >= 0);
- r = fw_add_local_dnat(ctx, false, AF_INET6, IPPROTO_TCP, 4711, &u2, 815, NULL);
- if (r < 0)
- log_error_errno(r, "Failed to modify firewall: %m");
+ r = fw_add_local_dnat(&ctx, true, AF_INET6, IPPROTO_TCP, 4711, &u1, 815, NULL);
+ if (r == -EOPNOTSUPP) {
+ log_info("IPv6 DNAT seems not supported, skipping the following tests.");
+ return;
+ }
+ assert_se(r >= 0);
- prefixlen = random_u32() % (128 + 1 - 8);
- prefixlen += 8;
- pseudo_random_bytes(&u, sizeof(u));
+ assert_se(fw_add_local_dnat(&ctx, true, AF_INET6, IPPROTO_TCP, 4711, &u2, 815, &u1) >= 0);
+ assert_se(fw_add_local_dnat(&ctx, false, AF_INET6, IPPROTO_TCP, 4711, &u2, 815, NULL) >= 0);
- r = fw_add_masquerade(ctx, true, AF_INET6, &u, prefixlen);
- if (r < 0)
- log_error_errno(r, "Failed to modify ipv6 firewall: %m");
+}
- r = fw_add_masquerade(ctx, false, AF_INET6, &u, prefixlen);
- if (r < 0)
- log_error_errno(r, "Failed to modify ipv6 firewall: %m");
+static union in_addr_union *parse_addr(const char *str, union in_addr_union *u) {
+ assert(str);
+ assert(u);
+ assert_se(in_addr_from_string(AF_INET, str, u) >= 0);
+ return u;
}
-int main(int argc, char *argv[]) {
- _cleanup_(fw_ctx_freep) FirewallContext *ctx;
+static bool test_v4(FirewallContext *ctx) {
+ union in_addr_union u, v;
int r;
- test_setup_logging(LOG_DEBUG);
- uint8_t prefixlen = 32;
- r = fw_ctx_new(&ctx);
- if (r < 0)
- return log_error_errno(r, "Failed to init firewall: %m");
+ assert_se(ctx);
- r = fw_add_masquerade(&ctx, true, AF_INET, NULL, 0);
- if (r == 0)
- log_error("Expected failure: NULL source");
+ log_info("/* %s(backend=%s) */", __func__, firewall_backend_to_string(ctx->backend));
- r = fw_add_masquerade(&ctx, true, AF_INET, &MAKE_IN_ADDR_UNION(10,1,2,0), 0);
- if (r == 0)
- log_error("Expected failure: 0 prefixlen");
+ assert_se(fw_add_masquerade(&ctx, true, AF_INET, NULL, 0) == -EINVAL);
+ assert_se(fw_add_masquerade(&ctx, true, AF_INET, parse_addr("10.1.2.0", &u), 0) == -EINVAL);
- r = fw_add_masquerade(&ctx, true, AF_INET, &MAKE_IN_ADDR_UNION(10,1,2,3), prefixlen);
- if (r < 0)
- log_error_errno(r, "Failed to modify firewall: %m");
+ r = fw_add_masquerade(&ctx, true, AF_INET, parse_addr("10.1.2.3", &u), 32);
+ if (r < 0) {
+ bool ignore = IN_SET(r, -EPERM, -EOPNOTSUPP, -ENOPROTOOPT);
- prefixlen = 28;
- r = fw_add_masquerade(&ctx, true, AF_INET, &MAKE_IN_ADDR_UNION(10,0,2,0), prefixlen);
- if (r < 0)
- log_error_errno(r, "Failed to modify firewall: %m");
+ log_full_errno(ignore ? LOG_DEBUG : LOG_ERR, r,
+ "Failed to add IPv4 masquerade%s: %m",
+ ignore ? ", skipping following tests" : "");
- r = fw_add_masquerade(&ctx, false, AF_INET, &MAKE_IN_ADDR_UNION(10,0,2,0), prefixlen);
- if (r < 0)
- log_error_errno(r, "Failed to modify firewall: %m");
+ if (ignore)
+ return false;
+ }
+ assert(r >= 0);
- r = fw_add_masquerade(&ctx, false, AF_INET, &MAKE_IN_ADDR_UNION(10,1,2,3), 32);
- if (r < 0)
- log_error_errno(r, "Failed to modify firewall: %m");
+ assert_se(fw_add_masquerade(&ctx, true, AF_INET, parse_addr("10.0.2.0", &u), 28) >= 0);
+ assert_se(fw_add_masquerade(&ctx, false, AF_INET, parse_addr("10.0.2.0", &u), 28) >= 0);
+ assert_se(fw_add_masquerade(&ctx, false, AF_INET, parse_addr("10.1.2.3", &u), 32) >= 0);
+ assert_se(fw_add_local_dnat(&ctx, true, AF_INET, IPPROTO_TCP, 4711, parse_addr("1.2.3.4", &u), 815, NULL) >= 0);
+ assert_se(fw_add_local_dnat(&ctx, true, AF_INET, IPPROTO_TCP, 4711, parse_addr("1.2.3.4", &u), 815, NULL) >= 0);
+ assert_se(fw_add_local_dnat(&ctx, true, AF_INET, IPPROTO_TCP, 4711, parse_addr("1.2.3.5", &u), 815, parse_addr("1.2.3.4", &v)) >= 0);
+ assert_se(fw_add_local_dnat(&ctx, false, AF_INET, IPPROTO_TCP, 4711, parse_addr("1.2.3.5", &u), 815, NULL) >= 0);
+
+ return true;
+}
+
+int main(int argc, char *argv[]) {
+ _cleanup_(fw_ctx_freep) FirewallContext *ctx = NULL;
+
+ test_setup_logging(LOG_DEBUG);
- r = fw_add_local_dnat(&ctx, true, AF_INET, IPPROTO_TCP, 4711, &MAKE_IN_ADDR_UNION(1, 2, 3, 4), 815, NULL);
- if (r < 0)
- log_error_errno(r, "Failed to modify firewall: %m");
+ if (getuid() != 0)
+ return log_tests_skipped("not root");
- r = fw_add_local_dnat(&ctx, true, AF_INET, IPPROTO_TCP, 4711, &MAKE_IN_ADDR_UNION(1, 2, 3, 4), 815, NULL);
- if (r < 0)
- log_error_errno(r, "Failed to modify firewall: %m");
+ assert_se(fw_ctx_new(&ctx) >= 0);
+ assert_se(ctx);
- r = fw_add_local_dnat(&ctx, true, AF_INET, IPPROTO_TCP, 4711, &MAKE_IN_ADDR_UNION(1, 2, 3, 5), 815, &MAKE_IN_ADDR_UNION(1, 2, 3, 4));
- if (r < 0)
- log_error_errno(r, "Failed to modify firewall: %m");
+ if (ctx->backend == FW_BACKEND_NONE)
+ return EXIT_TEST_SKIP;
- r = fw_add_local_dnat(&ctx, false, AF_INET, IPPROTO_TCP, 4711, &MAKE_IN_ADDR_UNION(1, 2, 3, 5), 815, NULL);
- if (r < 0)
- log_error_errno(r, "Failed to modify firewall: %m");
+ if (test_v4(ctx) && ctx->backend == FW_BACKEND_NFTABLES)
+ test_v6(ctx);
- test_v6(&ctx);
+#if HAVE_LIBIPTC
+ if (ctx->backend != FW_BACKEND_IPTABLES) {
+ ctx->backend = FW_BACKEND_IPTABLES;
+ test_v4(ctx);
+ }
+#endif
return 0;
}
"lines \n"));
formatted = mfree(formatted);
- table_set_cell_height_max(table, (size_t) -1);
+ table_set_cell_height_max(table, SIZE_MAX);
assert_se(table_format(table, &formatted) >= 0);
fputs(formatted, stdout);
assert_se(streq(formatted,
" line…\n"));
formatted = mfree(formatted);
- table_set_cell_height_max(table, (size_t) -1);
+ table_set_cell_height_max(table, SIZE_MAX);
assert_se(table_format(table, &formatted) >= 0);
fputs(formatted, stdout);
assert_se(streq(formatted,
"lines \n"));
formatted = mfree(formatted);
- table_set_cell_height_max(table, (size_t) -1);
+ table_set_cell_height_max(table, SIZE_MAX);
assert_se(table_format(table, &formatted) >= 0);
fputs(formatted, stdout);
assert_se(streq(formatted,
" line…\n"));
formatted = mfree(formatted);
- table_set_cell_height_max(table, (size_t) -1);
+ table_set_cell_height_max(table, SIZE_MAX);
assert_se(table_format(table, &formatted) >= 0);
fputs(formatted, stdout);
assert_se(streq(formatted,
"three different lines two lines\n"));
formatted = mfree(formatted);
- table_set_cell_height_max(table, (size_t) -1);
+ table_set_cell_height_max(table, SIZE_MAX);
assert_se(table_format(table, &formatted) >= 0);
fputs(formatted, stdout);
assert_se(streq(formatted,
" ___7___ ___8___\n"));
formatted = mfree(formatted);
- table_set_cell_height_max(table, (size_t) -1);
+ table_set_cell_height_max(table, SIZE_MAX);
assert_se(table_format(table, &formatted) >= 0);
fputs(formatted, stdout);
assert_se(streq(formatted,
formatted = mfree(formatted);
- table_set_width(t, (size_t) -1);
- assert_se(table_set_sort(t, (size_t) 0, (size_t) 2, (size_t) -1) >= 0);
+ table_set_width(t, SIZE_MAX);
+ assert_se(table_set_sort(t, (size_t) 0, (size_t) 2, SIZE_MAX) >= 0);
assert_se(table_format(t, &formatted) >= 0);
printf("%s\n", formatted);
formatted = mfree(formatted);
- assert_se(table_set_display(t, (size_t) 2, (size_t) 0, (size_t) 2, (size_t) 0, (size_t) 0, (size_t) -1) >= 0);
+ assert_se(table_set_display(t, (size_t) 2, (size_t) 0, (size_t) 2, (size_t) 0, (size_t) 0, SIZE_MAX) >= 0);
assert_se(table_format(t, &formatted) >= 0);
printf("%s\n", formatted);
assert_se(access(q, F_OK) < 0 && errno == ENOENT);
/* Check that a manual copy is detected */
- assert_se(copy_file(p, q, 0, (mode_t) -1, 0, 0, COPY_REFLINK) >= 0);
+ assert_se(copy_file(p, q, 0, MODE_INVALID, 0, 0, COPY_REFLINK) >= 0);
assert_se(conservative_renameat(AT_FDCWD, q, AT_FDCWD, p) == 0);
assert_se(access(q, F_OK) < 0 && errno == ENOENT);
#include "fstab-util.h"
#include "log.h"
#include "string-util.h"
+#include "strv.h"
/*
-int fstab_filter_options(const char *opts, const char *names,
- const char **namefound, char **value, char **filtered);
+int fstab_filter_options(
+ const char *opts,
+ const char *names,
+ const char **ret_namefound,
+ const char **ret_value,
+ const char **ret_values,
+ char **ret_filtered);
*/
static void do_fstab_filter_options(const char *opts,
const char *remove,
int r_expected,
+ int r_values_expected,
const char *name_expected,
const char *value_expected,
+ const char *values_expected,
const char *filtered_expected) {
int r;
const char *name;
- _cleanup_free_ char *value = NULL, *filtered = NULL;
+ _cleanup_free_ char *value = NULL, *filtered = NULL, *joined = NULL;
+ _cleanup_strv_free_ char **values = NULL;
- r = fstab_filter_options(opts, remove, &name, &value, &filtered);
- log_info("\"%s\" → %d, \"%s\", \"%s\", \"%s\", expected %d, \"%s\", \"%s\", \"%s\"",
- opts, r, name, value, filtered,
+ /* test mode which returns the last value */
+
+ r = fstab_filter_options(opts, remove, &name, &value, NULL, &filtered);
+ log_info("1: \"%s\" → %d, \"%s\", \"%s\", \"%s\", expected %d, \"%s\", \"%s\", \"%s\"",
+ opts, r, strnull(name), value, filtered,
r_expected, name_expected, value_expected, filtered_expected ?: opts);
assert_se(r == r_expected);
assert_se(streq_ptr(name, name_expected));
assert_se(streq_ptr(value, value_expected));
assert_se(streq_ptr(filtered, filtered_expected ?: opts));
+ /* test mode which returns all the values */
+
+ r = fstab_filter_options(opts, remove, &name, NULL, &values, NULL);
+ assert_se(joined = strv_join(values, ":"));
+ log_info("2: \"%s\" → %d, \"%s\", \"%s\", expected %d, \"%s\", \"%s\"",
+ opts, r, strnull(name), joined,
+ r_values_expected, name_expected, values_expected);
+ assert_se(r == r_values_expected);
+ assert_se(streq_ptr(name, r_values_expected > 0 ? name_expected : NULL));
+ assert_se(streq_ptr(joined, values_expected));
+
/* also test the malloc-less mode */
- r = fstab_filter_options(opts, remove, &name, NULL, NULL);
- log_info("\"%s\" → %d, \"%s\", expected %d, \"%s\"\n-",
- opts, r, name,
+ r = fstab_filter_options(opts, remove, &name, NULL, NULL, NULL);
+ log_info("3: \"%s\" → %d, \"%s\", expected %d, \"%s\"\n-",
+ opts, r, strnull(name),
r_expected, name_expected);
assert_se(r == r_expected);
assert_se(streq_ptr(name, name_expected));
}
static void test_fstab_filter_options(void) {
- do_fstab_filter_options("opt=0", "opt\0x-opt\0", 1, "opt", "0", "");
- do_fstab_filter_options("opt=0", "x-opt\0opt\0", 1, "opt", "0", "");
- do_fstab_filter_options("opt", "opt\0x-opt\0", 1, "opt", NULL, "");
- do_fstab_filter_options("opt", "x-opt\0opt\0", 1, "opt", NULL, "");
- do_fstab_filter_options("x-opt", "x-opt\0opt\0", 1, "x-opt", NULL, "");
-
- do_fstab_filter_options("opt=0,other", "opt\0x-opt\0", 1, "opt", "0", "other");
- do_fstab_filter_options("opt=0,other", "x-opt\0opt\0", 1, "opt", "0", "other");
- do_fstab_filter_options("opt,other", "opt\0x-opt\0", 1, "opt", NULL, "other");
- do_fstab_filter_options("opt,other", "x-opt\0opt\0", 1, "opt", NULL, "other");
- do_fstab_filter_options("x-opt,other", "opt\0x-opt\0", 1, "x-opt", NULL, "other");
-
- do_fstab_filter_options("opt=0\\,1,other", "opt\0x-opt\0", 1, "opt", "0,1", "other");
- do_fstab_filter_options("opt=0,other,x-opt\\,foobar", "x-opt\0opt\0", 1, "opt", "0", "other,x-opt\\,foobar");
- do_fstab_filter_options("opt,other,x-opt\\,part", "opt\0x-opt\0", 1, "opt", NULL, "other,x-opt\\,part");
- do_fstab_filter_options("opt,other,part\\,x-opt", "x-opt\0opt\0", 1, "opt", NULL, "other,part\\,x-opt");
- do_fstab_filter_options("opt,other\\,\\,\\,opt,x-part", "opt\0x-opt\0", 1, "opt", NULL, "other\\,\\,\\,opt,x-part");
-
- do_fstab_filter_options("opto=0,other", "opt\0x-opt\0", 0, NULL, NULL, NULL);
- do_fstab_filter_options("opto,other", "opt\0x-opt\0", 0, NULL, NULL, NULL);
- do_fstab_filter_options("x-opto,other", "opt\0x-opt\0", 0, NULL, NULL, NULL);
-
- do_fstab_filter_options("first,opt=0", "opt\0x-opt\0", 1, "opt", "0", "first");
- do_fstab_filter_options("first=1,opt=0", "opt\0x-opt\0", 1, "opt", "0", "first=1");
- do_fstab_filter_options("first,opt=", "opt\0x-opt\0", 1, "opt", "", "first");
- do_fstab_filter_options("first=1,opt", "opt\0x-opt\0", 1, "opt", NULL, "first=1");
- do_fstab_filter_options("first=1,x-opt", "opt\0x-opt\0", 1, "x-opt", NULL, "first=1");
-
- do_fstab_filter_options("first,opt=0,last=1", "opt\0x-opt\0", 1, "opt", "0", "first,last=1");
- do_fstab_filter_options("first=1,opt=0,last=2", "x-opt\0opt\0", 1, "opt", "0", "first=1,last=2");
- do_fstab_filter_options("first,opt,last", "opt\0", 1, "opt", NULL, "first,last");
- do_fstab_filter_options("first=1,opt,last", "x-opt\0opt\0", 1, "opt", NULL, "first=1,last");
- do_fstab_filter_options("first=,opt,last", "opt\0noopt\0", 1, "opt", NULL, "first=,last");
+ do_fstab_filter_options("opt=0", "opt\0x-opt\0", 1, 1, "opt", "0", "0", "");
+ do_fstab_filter_options("opt=0", "x-opt\0opt\0", 1, 1, "opt", "0", "0", "");
+ do_fstab_filter_options("opt", "opt\0x-opt\0", 1, 0, "opt", NULL, "", "");
+ do_fstab_filter_options("opt", "x-opt\0opt\0", 1, 0, "opt", NULL, "", "");
+ do_fstab_filter_options("x-opt", "x-opt\0opt\0", 1, 0, "x-opt", NULL, "", "");
+
+ do_fstab_filter_options("opt=0,other", "opt\0x-opt\0", 1, 1, "opt", "0", "0", "other");
+ do_fstab_filter_options("opt=0,other", "x-opt\0opt\0", 1, 1, "opt", "0", "0", "other");
+ do_fstab_filter_options("opt,other", "opt\0x-opt\0", 1, 0, "opt", NULL, "", "other");
+ do_fstab_filter_options("opt,other", "x-opt\0opt\0", 1, 0, "opt", NULL, "", "other");
+ do_fstab_filter_options("x-opt,other", "opt\0x-opt\0", 1, 0, "x-opt", NULL, "", "other");
+
+ do_fstab_filter_options("opt=0\\,1,other", "opt\0x-opt\0", 1, 1, "opt", "0,1", "0,1", "other");
+ do_fstab_filter_options("opt=0,other,x-opt\\,foobar", "x-opt\0opt\0", 1, 1, "opt", "0", "0", "other,x-opt\\,foobar");
+ do_fstab_filter_options("opt,other,x-opt\\,part", "opt\0x-opt\0", 1, 0, "opt", NULL, "", "other,x-opt\\,part");
+ do_fstab_filter_options("opt,other,part\\,x-opt", "x-opt\0opt\0", 1, 0, "opt", NULL, "", "other,part\\,x-opt");
+ do_fstab_filter_options("opt,other\\,\\,\\,opt,x-part", "opt\0x-opt\0", 1, 0, "opt", NULL, "", "other\\,\\,\\,opt,x-part");
+
+ do_fstab_filter_options("opto=0,other", "opt\0x-opt\0", 0, 0, NULL, NULL, "", NULL);
+ do_fstab_filter_options("opto,other", "opt\0x-opt\0", 0, 0, NULL, NULL, "", NULL);
+ do_fstab_filter_options("x-opto,other", "opt\0x-opt\0", 0, 0, NULL, NULL, "", NULL);
+
+ do_fstab_filter_options("first,opt=0", "opt\0x-opt\0", 1, 1, "opt", "0", "0", "first");
+ do_fstab_filter_options("first=1,opt=0", "opt\0x-opt\0", 1, 1, "opt", "0", "0", "first=1");
+ do_fstab_filter_options("first,opt=", "opt\0x-opt\0", 1, 1, "opt", "", "", "first");
+ do_fstab_filter_options("first=1,opt", "opt\0x-opt\0", 1, 0, "opt", NULL, "", "first=1");
+ do_fstab_filter_options("first=1,x-opt", "opt\0x-opt\0", 1, 0, "x-opt", NULL, "", "first=1");
+
+ do_fstab_filter_options("first,opt=0,last=1", "opt\0x-opt\0", 1, 1, "opt", "0", "0", "first,last=1");
+ do_fstab_filter_options("first=1,opt=0,last=2", "x-opt\0opt\0", 1, 1, "opt", "0", "0", "first=1,last=2");
+ do_fstab_filter_options("first,opt,last", "opt\0", 1, 0, "opt", NULL, "", "first,last");
+ do_fstab_filter_options("first=1,opt,last", "x-opt\0opt\0", 1, 0, "opt", NULL, "", "first=1,last");
+ do_fstab_filter_options("first=,opt,last", "opt\0noopt\0", 1, 0, "opt", NULL, "", "first=,last");
/* check repeated options */
- do_fstab_filter_options("first,opt=0,noopt=1,last=1", "opt\0noopt\0", 1, "noopt", "1", "first,last=1");
- do_fstab_filter_options("first=1,opt=0,last=2,opt=1", "opt\0", 1, "opt", "1", "first=1,last=2");
- do_fstab_filter_options("x-opt=0,x-opt=1", "opt\0x-opt\0", 1, "x-opt", "1", "");
- do_fstab_filter_options("opt=0,x-opt=1", "opt\0x-opt\0", 1, "x-opt", "1", "");
+ do_fstab_filter_options("first,opt=0,noopt=1,last=1", "opt\0noopt\0", 1, 1, "noopt", "1", "0:1", "first,last=1");
+ do_fstab_filter_options("first=1,opt=0,last=2,opt=1", "opt\0", 1, 1, "opt", "1", "0:1", "first=1,last=2");
+ do_fstab_filter_options("x-opt=0,x-opt=1", "opt\0x-opt\0", 1, 1, "x-opt", "1", "0:1", "");
+ do_fstab_filter_options("opt=0,x-opt=1", "opt\0x-opt\0", 1, 1, "x-opt", "1", "0:1", "");
+ do_fstab_filter_options("opt=0,opt=1,opt=,opt=,opt=2", "opt\0noopt\0", 1, 1, "opt", "2", "0:1:::2", "");
/* check that semicolons are not misinterpreted */
- do_fstab_filter_options("opt=0;", "opt\0", 1, "opt", "0;", "");
- do_fstab_filter_options("opt;=0", "x-opt\0opt\0noopt\0x-noopt\0", 0, NULL, NULL, NULL);
- do_fstab_filter_options("opt;", "opt\0x-opt\0", 0, NULL, NULL, NULL);
+ do_fstab_filter_options("opt=0;", "opt\0", 1, 1, "opt", "0;", "0;", "");
+ do_fstab_filter_options("opt;=0", "x-opt\0opt\0noopt\0x-noopt\0", 0, 0, NULL, NULL, "", NULL);
+ do_fstab_filter_options("opt;", "opt\0x-opt\0", 0, 0, NULL, NULL, "", NULL);
/* check that spaces are not misinterpreted */
- do_fstab_filter_options("opt=0 ", "opt\0", 1, "opt", "0 ", "");
- do_fstab_filter_options("opt =0", "x-opt\0opt\0noopt\0x-noopt\0", 0, NULL, NULL, NULL);
- do_fstab_filter_options(" opt ", "opt\0x-opt\0", 0, NULL, NULL, NULL);
+ do_fstab_filter_options("opt=0 ", "opt\0", 1, 1, "opt", "0 ", "0 ", "");
+ do_fstab_filter_options("opt =0", "x-opt\0opt\0noopt\0x-noopt\0", 0, 0, NULL, NULL, "", NULL);
+ do_fstab_filter_options(" opt ", "opt\0x-opt\0", 0, 0, NULL, NULL, "", NULL);
+
+ /* check function with NULL args */
+ do_fstab_filter_options(NULL, "opt\0", 0, 0, NULL, NULL, "", "");
+ do_fstab_filter_options("", "opt\0", 0, 0, NULL, NULL, "", "");
+
+ /* unnecessary comma separators */
+ do_fstab_filter_options("opt=x,,,,", "opt\0", 1, 1, "opt", "x", "x", "");
+ do_fstab_filter_options(",,,opt=x,,,,", "opt\0", 1, 1, "opt", "x", "x", "");
- /* check function will NULL args */
- do_fstab_filter_options(NULL, "opt\0", 0, NULL, NULL, "");
- do_fstab_filter_options("", "opt\0", 0, NULL, NULL, "");
+ /* escaped characters */
+ do_fstab_filter_options("opt1=\\\\,opt2=\\xff", "opt1\0", 1, 1, "opt1", "\\", "\\", "opt2=\\xff");
+ do_fstab_filter_options("opt1=\\\\,opt2=\\xff", "opt2\0", 1, 1, "opt2", "\\xff", "\\xff", "opt1=\\");
}
static void test_fstab_find_pri(void) {
if (retval == 0) {
char *answer;
- if (l == (size_t) -1)
+ if (l == SIZE_MAX)
l = strlen(s);
assert_se(hex = hexmem(mem, len));
test_unhexmem_one(NULL, 0, 0);
test_unhexmem_one("", 0, 0);
- test_unhexmem_one("", (size_t) -1, 0);
- test_unhexmem_one(" \n \t\r \t\t \n\n\n", (size_t) -1, 0);
+ test_unhexmem_one("", SIZE_MAX, 0);
+ test_unhexmem_one(" \n \t\r \t\t \n\n\n", SIZE_MAX, 0);
test_unhexmem_one(hex_invalid, strlen(hex_invalid), -EINVAL);
test_unhexmem_one(hex_invalid, (size_t) - 1, -EINVAL);
test_unhexmem_one(hex, strlen(hex) - 1, -EPIPE);
test_unhexmem_one(hex, strlen(hex), 0);
- test_unhexmem_one(hex, (size_t) -1, 0);
+ test_unhexmem_one(hex, SIZE_MAX, 0);
test_unhexmem_one(hex_space, strlen(hex_space), 0);
- test_unhexmem_one(hex_space, (size_t) -1, 0);
+ test_unhexmem_one(hex_space, SIZE_MAX, 0);
}
/* https://tools.ietf.org/html/rfc4648#section-10 */
_cleanup_free_ void *mem = NULL;
size_t len;
- assert_se(unbase32hexmem(hex, (size_t) -1, padding, &mem, &len) == retval);
+ assert_se(unbase32hexmem(hex, SIZE_MAX, padding, &mem, &len) == retval);
if (retval == 0) {
char *str;
_cleanup_free_ void *buffer = NULL;
size_t size = 0;
- assert_se(unbase64mem(input, (size_t) -1, &buffer, &size) == ret);
+ assert_se(unbase64mem(input, SIZE_MAX, &buffer, &size) == ret);
if (ret >= 0) {
assert_se(size == strlen(output));
}
}
-static void test_netns(void) {
+static void test_shareable_ns(unsigned long nsflag) {
_cleanup_close_pair_ int s[2] = { -1, -1 };
pid_t pid1, pid2, pid3;
int r, n = 0;
assert_se(pid1 >= 0);
if (pid1 == 0) {
- r = setup_netns(s);
+ r = setup_shareable_ns(s, nsflag);
assert_se(r >= 0);
_exit(r);
}
assert_se(pid2 >= 0);
if (pid2 == 0) {
- r = setup_netns(s);
+ r = setup_shareable_ns(s, nsflag);
assert_se(r >= 0);
exit(r);
}
assert_se(pid3 >= 0);
if (pid3 == 0) {
- r = setup_netns(s);
+ r = setup_shareable_ns(s, nsflag);
assert_se(r >= 0);
exit(r);
}
assert_se(n == 1);
}
+static void test_netns(void) {
+ test_shareable_ns(CLONE_NEWNET);
+}
+
+static void test_ipcns(void) {
+ test_shareable_ns(CLONE_NEWIPC);
+}
+
static void test_protect_kernel_logs(void) {
int r;
pid_t pid;
test_tmpdir("sys-devices-pci0000:00-0000:00:1a.0-usb3-3\\x2d1-3\\x2d1:1.0-bluetooth-hci0.device", z, zz);
test_netns();
+ test_ipcns();
test_protect_kernel_logs();
return EXIT_SUCCESS;
#include "log.h"
#include "parse-util.h"
#include "string-util.h"
-#if HAVE_SECCOMP
-#include "seccomp-util.h"
-#endif
static void test_parse_boolean(void) {
assert_se(parse_boolean("1") == 1);
assert_se(parse_errno("EINVALaaa") == -EINVAL);
}
-static void test_parse_syscall_and_errno(void) {
-#if HAVE_SECCOMP
- _cleanup_free_ char *n = NULL;
- int e;
-
- assert_se(parse_syscall_and_errno("uname:EILSEQ", &n, &e) >= 0);
- assert_se(streq(n, "uname"));
- assert_se(e == errno_from_name("EILSEQ") && e >= 0);
- n = mfree(n);
-
- assert_se(parse_syscall_and_errno("uname:EINVAL", &n, &e) >= 0);
- assert_se(streq(n, "uname"));
- assert_se(e == errno_from_name("EINVAL") && e >= 0);
- n = mfree(n);
-
- assert_se(parse_syscall_and_errno("@sync:4095", &n, &e) >= 0);
- assert_se(streq(n, "@sync"));
- assert_se(e == 4095);
- n = mfree(n);
-
- /* If errno is omitted, then e is set to -1 */
- assert_se(parse_syscall_and_errno("mount", &n, &e) >= 0);
- assert_se(streq(n, "mount"));
- assert_se(e == -1);
- n = mfree(n);
-
- /* parse_syscall_and_errno() does not check the syscall name is valid or not. */
- assert_se(parse_syscall_and_errno("hoge:255", &n, &e) >= 0);
- assert_se(streq(n, "hoge"));
- assert_se(e == 255);
- n = mfree(n);
-
- assert_se(parse_syscall_and_errno("hoge:kill", &n, &e) >= 0);
- assert_se(streq(n, "hoge"));
- assert_se(e == SECCOMP_ERROR_NUMBER_KILL);
- n = mfree(n);
-
- /* The function checks the syscall name is empty or not. */
- assert_se(parse_syscall_and_errno("", &n, &e) == -EINVAL);
- assert_se(parse_syscall_and_errno(":255", &n, &e) == -EINVAL);
-
- /* errno must be a valid errno name or number between 0 and ERRNO_MAX == 4095, or "kill" */
- assert_se(parse_syscall_and_errno("hoge:4096", &n, &e) == -ERANGE);
- assert_se(parse_syscall_and_errno("hoge:-3", &n, &e) == -ERANGE);
- assert_se(parse_syscall_and_errno("hoge:12.3", &n, &e) == -EINVAL);
- assert_se(parse_syscall_and_errno("hoge:123junk", &n, &e) == -EINVAL);
- assert_se(parse_syscall_and_errno("hoge:junk123", &n, &e) == -EINVAL);
- assert_se(parse_syscall_and_errno("hoge:255:EILSEQ", &n, &e) == -EINVAL);
- assert_se(parse_syscall_and_errno("hoge:-EINVAL", &n, &e) == -EINVAL);
- assert_se(parse_syscall_and_errno("hoge:EINVALaaa", &n, &e) == -EINVAL);
- assert_se(parse_syscall_and_errno("hoge:", &n, &e) == -EINVAL);
-#endif
-}
-
static void test_parse_mtu(void) {
uint32_t mtu = 0;
test_parse_nice();
test_parse_dev();
test_parse_errno();
- test_parse_syscall_and_errno();
test_parse_mtu();
test_parse_loadavg_fixed_point();
int main(int argc, char **argv) {
test_setup_logging(LOG_DEBUG);
+ log_info("PATH_MAX=%zu\n"
+ "FILENAME_MAX=%zu\n"
+ "NAME_MAX=%zu",
+ (size_t) PATH_MAX,
+ (size_t) FILENAME_MAX,
+ (size_t) NAME_MAX);
+
+ assert_cc(FILENAME_MAX == PATH_MAX);
+
test_print_paths();
test_path();
test_path_equal_root();
assert_se(prioq_peek(q) == NULL);
assert_se(prioq_peek_by_index(q, 0) == NULL);
assert_se(prioq_peek_by_index(q, 1) == NULL);
- assert_se(prioq_peek_by_index(q, (unsigned) -1) == NULL);
+ assert_se(prioq_peek_by_index(q, UINT_MAX) == NULL);
for (i = 0; i < SET_SIZE; i++) {
assert_se(t = new0(struct test, 1));
return;
}
+ /* Set RLIMIT_STACK to infinity to test we don't try to allocate unncessarily large values to read
+ * the cmdline. */
+ if (setrlimit(RLIMIT_STACK, &RLIMIT_MAKE_CONST(RLIM_INFINITY)) < 0)
+ log_warning("Testing without RLIMIT_STACK=infinity");
+
assert_se(unlink(path) >= 0);
assert_se(prctl(PR_SET_NAME, "testa") >= 0);
/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#include <math.h>
+
#include "hexdecoct.h"
-#include "random-util.h"
#include "log.h"
+#include "memory-util.h"
+#include "random-util.h"
+#include "terminal-util.h"
#include "tests.h"
static void test_genuine_random_bytes(RandomFlags flags) {
uint8_t buf[16] = {};
- unsigned i;
log_info("/* %s */", __func__);
- for (i = 1; i < sizeof buf; i++) {
+ for (size_t i = 1; i < sizeof buf; i++) {
assert_se(genuine_random_bytes(buf, i, flags) == 0);
if (i + 1 < sizeof buf)
assert_se(buf[i] == 0);
static void test_pseudo_random_bytes(void) {
uint8_t buf[16] = {};
- unsigned i;
log_info("/* %s */", __func__);
- for (i = 1; i < sizeof buf; i++) {
+ for (size_t i = 1; i < sizeof buf; i++) {
pseudo_random_bytes(buf, i);
if (i + 1 < sizeof buf)
assert_se(buf[i] == 0);
}
static void test_rdrand(void) {
- int r, i;
+ int r;
+
+ log_info("/* %s */", __func__);
- for (i = 0; i < 10; i++) {
+ for (unsigned i = 0; i < 10; i++) {
unsigned long x = 0;
r = rdrand(&x);
}
}
+#define TOTAL 100000
+
+static void test_random_u64_range_one(unsigned mod) {
+ log_info("/* %s(%u) */", __func__, mod);
+
+ unsigned max = 0, count[mod];
+ zero(count);
+
+ for (unsigned i = 0; i < TOTAL; i++) {
+ uint64_t x;
+
+ x = random_u64_range(mod);
+
+ log_trace("%05u: %"PRIu64, i, x);
+ count[x]++;
+ max = MAX(max, count[x]);
+ }
+
+ /* Print histogram: vertical axis — value, horizontal axis — count.
+ *
+ * The expected value is always TOTAL/mod, because the distribution should be flat. The expected
+ * variance is TOTAL×p×(1-p), where p==1/mod, and standard deviation the root of the variance.
+ * Assert that the deviation from the expected value is less than 6 standard deviations.
+ */
+ unsigned scale = 2 * max / (columns() < 20 ? 80 : columns() - 20);
+ double exp = (double) TOTAL / mod;
+
+ for (size_t i = 0; i < mod; i++) {
+ double dev = (count[i] - exp) / sqrt(exp * (mod > 1 ? mod - 1 : 1) / mod);
+ log_debug("%02zu: %5u (%+.3f)%*s",
+ i, count[i], dev,
+ count[i] / scale, "x");
+
+ assert_se(fabs(dev) < 6); /* 6 sigma is excessive, but this check should be enough to
+ * identify catastrophic failure while minimizing false
+ * positives. */
+ }
+}
+
+static void test_random_u64_range(void) {
+ for (unsigned mod = 1; mod < 29; mod++)
+ test_random_u64_range_one(mod);
+}
+
int main(int argc, char **argv) {
test_setup_logging(LOG_DEBUG);
test_genuine_random_bytes(RANDOM_ALLOW_INSECURE);
test_pseudo_random_bytes();
-
test_rdrand();
+ test_random_u64_range();
return 0;
}
# define SECCOMP_RESTRICT_ADDRESS_FAMILIES_BROKEN 0
#endif
+static void test_parse_syscall_and_errno(void) {
+ _cleanup_free_ char *n = NULL;
+ int e;
+
+ assert_se(parse_syscall_and_errno("uname:EILSEQ", &n, &e) >= 0);
+ assert_se(streq(n, "uname"));
+ assert_se(e == errno_from_name("EILSEQ") && e >= 0);
+ n = mfree(n);
+
+ assert_se(parse_syscall_and_errno("uname:EINVAL", &n, &e) >= 0);
+ assert_se(streq(n, "uname"));
+ assert_se(e == errno_from_name("EINVAL") && e >= 0);
+ n = mfree(n);
+
+ assert_se(parse_syscall_and_errno("@sync:4095", &n, &e) >= 0);
+ assert_se(streq(n, "@sync"));
+ assert_se(e == 4095);
+ n = mfree(n);
+
+ /* If errno is omitted, then e is set to -1 */
+ assert_se(parse_syscall_and_errno("mount", &n, &e) >= 0);
+ assert_se(streq(n, "mount"));
+ assert_se(e == -1);
+ n = mfree(n);
+
+ /* parse_syscall_and_errno() does not check the syscall name is valid or not. */
+ assert_se(parse_syscall_and_errno("hoge:255", &n, &e) >= 0);
+ assert_se(streq(n, "hoge"));
+ assert_se(e == 255);
+ n = mfree(n);
+
+ /* 0 is also a valid errno. */
+ assert_se(parse_syscall_and_errno("hoge:0", &n, &e) >= 0);
+ assert_se(streq(n, "hoge"));
+ assert_se(e == 0);
+ n = mfree(n);
+
+ assert_se(parse_syscall_and_errno("hoge:kill", &n, &e) >= 0);
+ assert_se(streq(n, "hoge"));
+ assert_se(e == SECCOMP_ERROR_NUMBER_KILL);
+ n = mfree(n);
+
+ /* The function checks the syscall name is empty or not. */
+ assert_se(parse_syscall_and_errno("", &n, &e) == -EINVAL);
+ assert_se(parse_syscall_and_errno(":255", &n, &e) == -EINVAL);
+
+ /* errno must be a valid errno name or number between 0 and ERRNO_MAX == 4095, or "kill" */
+ assert_se(parse_syscall_and_errno("hoge:4096", &n, &e) == -ERANGE);
+ assert_se(parse_syscall_and_errno("hoge:-3", &n, &e) == -ERANGE);
+ assert_se(parse_syscall_and_errno("hoge:12.3", &n, &e) == -EINVAL);
+ assert_se(parse_syscall_and_errno("hoge:123junk", &n, &e) == -EINVAL);
+ assert_se(parse_syscall_and_errno("hoge:junk123", &n, &e) == -EINVAL);
+ assert_se(parse_syscall_and_errno("hoge:255:EILSEQ", &n, &e) == -EINVAL);
+ assert_se(parse_syscall_and_errno("hoge:-EINVAL", &n, &e) == -EINVAL);
+ assert_se(parse_syscall_and_errno("hoge:EINVALaaa", &n, &e) == -EINVAL);
+ assert_se(parse_syscall_and_errno("hoge:", &n, &e) == -EINVAL);
+}
+
static void test_seccomp_arch_to_string(void) {
uint32_t a, b;
const char *name;
int main(int argc, char *argv[]) {
test_setup_logging(LOG_DEBUG);
+ test_parse_syscall_and_errno();
test_seccomp_arch_to_string();
test_architecture_table();
test_syscall_filter_set_find();
test_socket_address_parse_one("[::1]:1234%lo", 0, AF_INET6, NULL);
test_socket_address_parse_one("[::1]:0%lo", -EINVAL, 0, NULL);
test_socket_address_parse_one("[::1]%lo", -EINVAL, 0, NULL);
- test_socket_address_parse_one("[::1]:1234%lo%lo", -ENODEV, 0, NULL);
+ test_socket_address_parse_one("[::1]:1234%lo%lo", -EINVAL, 0, NULL);
test_socket_address_parse_one("[::1]:1234%xxxxasdf", -ENODEV, 0, NULL);
test_socket_address_parse_one("192.168.1.254:8888", 0, AF_INET, NULL);
test_socket_address_parse_one("/foo/bar", 0, AF_UNIX, NULL);
assert_se(flush_accept(listen_seqpacket) >= 0);
}
+static void test_ipv6_enabled(void) {
+ log_info("IPv6 supported: %s", yes_no(socket_ipv6_is_supported()));
+ log_info("IPv6 enabled: %s", yes_no(socket_ipv6_is_enabled()));
+}
+
int main(int argc, char *argv[]) {
test_setup_logging(LOG_DEBUG);
test_send_nodata_nofd();
test_send_emptydata();
test_flush_accept();
+ test_ipv6_enabled();
return 0;
}
#include <fcntl.h>
#include <linux/magic.h>
+#include <sched.h>
#include <unistd.h>
#include "alloc-util.h"
assert_se(path_is_temporary_fs("/i-dont-exist") == -ENOENT);
}
-static void test_fd_is_network_ns(void) {
+static void test_fd_is_ns(void) {
_cleanup_close_ int fd = -1;
- assert_se(fd_is_network_ns(STDIN_FILENO) == 0);
- assert_se(fd_is_network_ns(STDERR_FILENO) == 0);
- assert_se(fd_is_network_ns(STDOUT_FILENO) == 0);
+ assert_se(fd_is_ns(STDIN_FILENO, CLONE_NEWNET) == 0);
+ assert_se(fd_is_ns(STDERR_FILENO, CLONE_NEWNET) == 0);
+ assert_se(fd_is_ns(STDOUT_FILENO, CLONE_NEWNET) == 0);
assert_se((fd = open("/proc/self/ns/mnt", O_CLOEXEC|O_RDONLY)) >= 0);
- assert_se(IN_SET(fd_is_network_ns(fd), 0, -EUCLEAN));
+ assert_se(IN_SET(fd_is_ns(fd, CLONE_NEWNET), 0, -EUCLEAN));
+ fd = safe_close(fd);
+
+ assert_se((fd = open("/proc/self/ns/ipc", O_CLOEXEC|O_RDONLY)) >= 0);
+ assert_se(IN_SET(fd_is_ns(fd, CLONE_NEWIPC), 1, -EUCLEAN));
fd = safe_close(fd);
assert_se((fd = open("/proc/self/ns/net", O_CLOEXEC|O_RDONLY)) >= 0);
- assert_se(IN_SET(fd_is_network_ns(fd), 1, -EUCLEAN));
+ assert_se(IN_SET(fd_is_ns(fd, CLONE_NEWNET), 1, -EUCLEAN));
}
static void test_device_major_minor_valid(void) {
test_is_symlink();
test_path_is_fs_type();
test_path_is_temporary_fs();
- test_fd_is_network_ns();
+ test_fd_is_ns();
test_device_major_minor_valid();
test_device_path_make_canonical();
actual = strjoina("foo", NULL, "bar");
assert_se(streq(actual, "foo"));
+
+ actual = strjoina("/sys/fs/cgroup/", "dn", "/a/b/c", "/cgroup.procs");
+ assert_se(streq(actual, "/sys/fs/cgroup/dn/a/b/c/cgroup.procs"));
+
+ actual = strjoina("/sys/fs/cgroup/", "dn", NULL, NULL);
+ assert_se(streq(actual, "/sys/fs/cgroup/dn"));
}
static void test_strjoin(void) {
NULL,
};
+static const char* const input_table_unescape[] = {
+ "ID_VENDOR=QEMU",
+ "ID_VENDOR_ENC=QEMUx20x20x20x20",
+ "ID_MODEL_ENC=QEMUx20HARDDISKx20x20x20",
+ NULL,
+};
+
+static const char* const input_table_retain_escape[] = {
+ "ID_VENDOR=QEMU",
+ "ID_VENDOR_ENC=QEMU\\x20\\x20\\x20\\x20",
+ "ID_MODEL_ENC=QEMU\\x20HARDDISK\\x20\\x20\\x20",
+ NULL,
+};
+
static void test_strv_find(void) {
log_info("/* %s */", __func__);
l = strv_free_erase(l);
assert_se(strv_split_full(&l, " 'one' \" two\t three \"' four five", NULL,
- EXTRACT_UNQUOTE | EXTRACT_RELAX | EXTRACT_CUNESCAPE_RELAX) == 2);
+ EXTRACT_UNQUOTE | EXTRACT_RELAX | EXTRACT_UNESCAPE_RELAX) == 2);
assert_se(strv_equal(l, (char**) input_table_quoted_joined));
l = strv_free_erase(l);
- assert_se(strv_split_full(&l, "\\", NULL, EXTRACT_UNQUOTE | EXTRACT_RELAX | EXTRACT_CUNESCAPE_RELAX) == 1);
+ assert_se(strv_split_full(&l, "\\", NULL, EXTRACT_UNQUOTE | EXTRACT_RELAX | EXTRACT_UNESCAPE_RELAX) == 1);
assert_se(strv_equal(l, STRV_MAKE("\\")));
}
assert_se(streq(*s, input_table_multiple[i++]));
}
+static void test_strv_split_newlines_full(void) {
+ const char str[] =
+ "ID_VENDOR=QEMU\n"
+ "ID_VENDOR_ENC=QEMU\\x20\\x20\\x20\\x20\n"
+ "ID_MODEL_ENC=QEMU\\x20HARDDISK\\x20\\x20\\x20\n"
+ "\n\n\n";
+ _cleanup_strv_free_ char **l = NULL;
+
+ log_info("/* %s */", __func__);
+
+ assert_se(strv_split_newlines_full(&l, str, 0) == 3);
+ assert_se(strv_equal(l, (char**) input_table_unescape));
+
+ l = strv_free(l);
+
+ assert_se(strv_split_newlines_full(&l, str, EXTRACT_RETAIN_ESCAPE) == 3);
+ assert_se(strv_equal(l, (char**) input_table_retain_escape));
+}
+
static void test_strv_split_nulstr(void) {
_cleanup_strv_free_ char **l = NULL;
const char nulstr[] = "str0\0str1\0str2\0str3\0";
test_strv_split_full();
test_strv_split_colon_pairs();
test_strv_split_newlines();
+ test_strv_split_newlines_full();
test_strv_split_nulstr();
test_strv_parse_nulstr();
test_strv_overlap();
assert_se(utf8_encoded_valid_unichar("\302\256", 1) == -EINVAL); /* truncated */
assert_se(utf8_encoded_valid_unichar("\302\256", 2) == 2);
assert_se(utf8_encoded_valid_unichar("\302\256", 3) == 2);
- assert_se(utf8_encoded_valid_unichar("\302\256", (size_t) -1) == 2);
+ assert_se(utf8_encoded_valid_unichar("\302\256", SIZE_MAX) == 2);
assert_se(utf8_encoded_valid_unichar("a", 1) == 1);
assert_se(utf8_encoded_valid_unichar("a", 2) == 1);
assert_se(utf8_encoded_valid_unichar("\341\204", 1) == -EINVAL); /* truncated, potentially valid */
assert_se(utf8_n_codepoints("串") == 1);
assert_se(utf8_n_codepoints("") == 0);
assert_se(utf8_n_codepoints("…👊🔪💐…") == 5);
- assert_se(utf8_n_codepoints("\xF1") == (size_t) -1);
+ assert_se(utf8_n_codepoints("\xF1") == SIZE_MAX);
}
static void test_utf8_console_width(void) {
assert_se(utf8_console_width("串") == 2);
assert_se(utf8_console_width("") == 0);
assert_se(utf8_console_width("…👊🔪💐…") == 8);
- assert_se(utf8_console_width("\xF1") == (size_t) -1);
+ assert_se(utf8_console_width("\xF1") == SIZE_MAX);
}
static void test_utf8_to_utf16(void) {
break;
word = strstrip(line);
- if (isempty(word) || startswith("#", word))
+ if (isempty(word) || startswith(word, "#"))
continue;
r = context_add_ntp_service(c, word, *f);
return ts->tv_sec + (1.0e-9 * ts->tv_nsec);
}
+static uint32_t graceful_add_offset_1900_1970(time_t t) {
+ /* Adds OFFSET_1900_1970 to t and returns it as 32bit value. This is handles overflows
+ * gracefully in a deterministic and well-defined way by cutting off the top bits. */
+ uint64_t a = (uint64_t) t + OFFSET_1900_1970;
+ return (uint32_t) (a & UINT64_C(0xFFFFFFFF));
+}
+
static int manager_timeout(sd_event_source *source, usec_t usec, void *userdata) {
_cleanup_free_ char *pretty = NULL;
Manager *m = userdata;
*/
assert_se(clock_gettime(clock_boottime_or_monotonic(), &m->trans_time_mon) >= 0);
assert_se(clock_gettime(CLOCK_REALTIME, &m->trans_time) >= 0);
- ntpmsg.trans_time.sec = htobe32(m->trans_time.tv_sec + OFFSET_1900_1970);
+ ntpmsg.trans_time.sec = htobe32(graceful_add_offset_1900_1970(m->trans_time.tv_sec));
ntpmsg.trans_time.frac = htobe32(m->trans_time.tv_nsec);
server_address_pretty(m->current_server_address, &pretty);
m->missed_replies = 0;
/* check our "time cookie" (we just stored nanoseconds in the fraction field) */
- if (be32toh(ntpmsg.origin_time.sec) != m->trans_time.tv_sec + OFFSET_1900_1970 ||
+ if (be32toh(ntpmsg.origin_time.sec) != graceful_add_offset_1900_1970(m->trans_time.tv_sec) ||
be32toh(ntpmsg.origin_time.frac) != (unsigned long) m->trans_time.tv_nsec) {
log_debug("Invalid reply; not our transmit time. Ignoring.");
return 0;
#include <errno.h>
#include <fcntl.h>
#include <getopt.h>
-#include <poll.h>
#include <stdbool.h>
#include <stddef.h>
#include <sys/prctl.h>
}
for (;;) {
- int timeout = -1;
+ usec_t timeout = USEC_INFINITY;
r = process_password_files();
if (r < 0) {
if (!watch)
break;
- if (poll(pollfd, _FD_MAX, timeout) < 0) {
- if (errno == EINTR)
- continue;
-
- return -errno;
- }
-
- if (pollfd[FD_SIGNAL].revents & POLLNVAL ||
- pollfd[FD_INOTIFY].revents & POLLNVAL)
- return -EBADF;
+ r = ppoll_usec(pollfd, _FD_MAX, timeout);
+ if (r == -EINTR)
+ continue;
+ if (r < 0)
+ return r;
if (pollfd[FD_INOTIFY].revents != 0)
(void) flush_fd(notify);
int link_load_one(link_config_ctx *ctx, const char *filename) {
_cleanup_(link_config_freep) link_config *link = NULL;
- _cleanup_fclose_ FILE *file = NULL;
_cleanup_free_ char *name = NULL;
+ const char *dropin_dirname;
size_t i;
int r;
assert(ctx);
assert(filename);
- file = fopen(filename, "re");
- if (!file)
- return errno == ENOENT ? 0 : -errno;
-
- if (null_or_empty_fd(fileno(file))) {
+ r = null_or_empty_path(filename);
+ if (r == -ENOENT)
+ return 0;
+ if (r < 0)
+ return r;
+ if (r > 0) {
log_debug("Skipping empty file: %s", filename);
return 0;
}
for (i = 0; i < ELEMENTSOF(link->features); i++)
link->features[i] = -1;
- r = config_parse(NULL, filename, file,
- "Match\0Link\0",
- config_item_perf_lookup, link_config_gperf_lookup,
- CONFIG_PARSE_WARN, link,
- NULL);
+ dropin_dirname = strjoina(basename(filename), ".d");
+ r = config_parse_many(
+ STRV_MAKE_CONST(filename),
+ (const char* const*) CONF_PATHS_STRV("systemd/network"),
+ dropin_dirname,
+ "Match\0Link\0",
+ config_item_perf_lookup, link_config_gperf_lookup,
+ CONFIG_PARSE_WARN, link, NULL);
if (r < 0)
return r;
static int link_config_generate_new_name(const link_config_ctx *ctx, const link_config *config, sd_device *device, const char **ret_name) {
unsigned name_type = NET_NAME_UNKNOWN;
- const char *new_name = NULL;
- NamePolicy policy;
int r;
assert(ctx);
if (ctx->enable_name_policy && config->name_policy)
for (NamePolicy *p = config->name_policy; *p != _NAMEPOLICY_INVALID; p++) {
- policy = *p;
+ const char *new_name = NULL;
+ NamePolicy policy = *p;
switch (policy) {
case NAMEPOLICY_KERNEL:
default:
assert_not_reached("invalid policy");
}
- if (ifname_valid(new_name))
- break;
+ if (ifname_valid(new_name)) {
+ log_device_debug(device, "Policy *%s* yields \"%s\".", name_policy_to_string(policy), new_name);
+ *ret_name = new_name;
+ return 0;
+ }
}
- if (new_name) {
- log_device_debug(device, "Policy *%s* yields \"%s\".", name_policy_to_string(policy), new_name);
- *ret_name = new_name;
- return 0;
- }
-
if (config->name) {
log_device_debug(device, "Policies didn't yield a name, using specified Name=%s.", config->name);
*ret_name = config->name;
_cleanup_strv_free_ char **v = NULL;
char **q;
- v = strv_split_newlines(p);
- if (!v)
- log_oom_debug();
+ r = strv_split_newlines_full(&v, p, EXTRACT_RETAIN_ESCAPE);
+ if (r < 0)
+ log_device_debug(spawn->device,
+ "Failed to split output from '%s'(%s), ignoring: %m",
+ spawn->cmd, fd == spawn->fd_stdout ? "out" : "err");
STRV_FOREACH(q, v)
log_device_debug(spawn->device, "'%s'(%s) '%s'", spawn->cmd,
if (r < 0)
return log_device_debug_errno(dev, r, "Failed to update database under /run/udev/data/: %m");
+ device_set_is_initialized(dev);
+
/* Yes, we run update_devnode() twice, because in the first invocation, that is before update of udev database,
* it could happen that two contenders are replacing each other's symlink. Hence we run it again to make sure
* symlinks point to devices that claim them with the highest priority. */
if (r < 0)
return r;
- device_set_is_initialized(dev);
-
return 0;
}
return token->op == OP_NOMATCH;
}
- lines = strv_split_newlines(result);
- if (!lines)
- return log_oom();
+ r = strv_split_newlines_full(&lines, result, EXTRACT_RETAIN_ESCAPE);
+ if (r < 0)
+ log_rule_warning_errno(dev, rules, r,
+ "Failed to extract lines from result of command \"%s\", ignoring: %m", buf);
STRV_FOREACH(line, lines) {
char *key, *value;
(void) table_set_align_percent(table, table_get_cell(table, 0, 2), 100);
(void) table_set_align_percent(table, table_get_cell(table, 0, 3), 100);
(void) table_set_empty_string(table, "-");
- (void) table_set_sort(table, (size_t) 7, (size_t) 2, (size_t) -1);
- (void) table_set_display(table, (size_t) 0, (size_t) 1, (size_t) 2, (size_t) 3, (size_t) 4, (size_t) 5, (size_t) 6, (size_t) -1);
+ (void) table_set_sort(table, (size_t) 7, (size_t) 2);
+ (void) table_set_display(table, (size_t) 0, (size_t) 1, (size_t) 2, (size_t) 3, (size_t) 4, (size_t) 5, (size_t) 6);
}
if (argc > 1) {
(void) table_set_align_percent(table, table_get_cell(table, 0, 2), 100);
(void) table_set_empty_string(table, "-");
- (void) table_set_sort(table, (size_t) 3, (size_t) 2, (size_t) -1);
- (void) table_set_display(table, (size_t) 0, (size_t) 1, (size_t) 2, (size_t) 3, (size_t) -1);
+ (void) table_set_sort(table, (size_t) 3, (size_t) 2);
+ (void) table_set_display(table, (size_t) 0, (size_t) 1, (size_t) 2, (size_t) 3);
}
if (argc > 1) {
if (!table)
return log_oom();
- (void) table_set_sort(table, (size_t) 0, (size_t) 1, (size_t) -1);
+ (void) table_set_sort(table, (size_t) 0, (size_t) 1);
}
if (argc > 1) {
if (!t)
return log_oom();
- (void) table_set_sort(t, (size_t) 0, (size_t) -1);
+ (void) table_set_sort(t, (size_t) 0);
FOREACH_DIRENT(de, d, return -errno) {
_cleanup_free_ char *j = NULL, *no = NULL;
if (r < 0)
return log_error_errno(r, "Failed to generate unit name: %m");
- options_escaped = specifier_escape(arg_options ?: "");
+ options_escaped = specifier_escape(strempty(arg_options));
if (!options_escaped)
return log_oom();
fprintf(f,
"\n[Service]\n"
"Type=exec\n"
+ "ExitType=cgroup\n"
"ExecStart=:%s\n"
"Restart=no\n"
"TimeoutSec=5s\n"
--- /dev/null
+Files in this directory contain configuration for systemd-sysctl.service, a
+service to configure sysctl kernel parameters.
+
+See man:sysctl.d(5) for explanation of the configuration file format, and
+man:sysctl(8) and man:systemd-sysctl.service(8) for a description of when and
+how this configuration is applied.
+
+Use 'systemd-analyze cat-config sysctl.d' to display the effective config.
# SPDX-License-Identifier: LGPL-2.1-or-later
install_data(
+ 'README',
'50-default.conf',
install_dir : sysctldir)
--- /dev/null
+Files in this directory contain configuration for systemd-sysusers, a program
+to allocate system users and groups.
+
+See man:sysusers.d(5) for explanation of the configuration file format, and
+man:systemd-sysusers(8) for a description of when and how this configuration is
+applied.
+
+Use 'systemd-analyze cat-config sysusers.d' to display the effective config.
g kvm - - -
g lp - - -
g render - - -
+g sgx - - -
g tape - - -
g video - - -
# SPDX-License-Identifier: LGPL-2.1-or-later
+if enable_sysusers
+ install_data('README', install_dir : sysusersdir)
+endif
+
in_files = ['basic.conf']
foreach file : in_files
+++ /dev/null
-#!/usr/bin/env bash
-set -e
-TEST_DESCRIPTION="UDEV SYSTEMD_WANTS property"
-TEST_NO_NSPAWN=1
-
-. $TEST_BASE_DIR/test-functions
-QEMU_TIMEOUT=300
-
-do_test "$@" 17
#!/usr/bin/env bash
set -e
-TEST_DESCRIPTION="UDEV ID_RENAMING property"
-IMAGE_NAME="udev-id-renaming"
+TEST_DESCRIPTION="UDEV"
+IMAGE_NAME="udev"
TEST_NO_NSPAWN=1
. $TEST_BASE_DIR/test-functions
-QEMU_TIMEOUT=300
+QEMU_TIMEOUT=500
test_append_files() {
(
)
}
-do_test "$@" 29
+do_test "$@" 17
TEST_NO_QEMU=1
. $TEST_BASE_DIR/test-functions
+test_append_files() {
+ if [[ "$IS_BUILT_WITH_ASAN" == "yes" ]]; then
+ if [[ -z "$initdir" ]]; then
+ echo >&2 "\$initdir is not defined, can't continue"
+ exit 1
+ fi
+
+ sed -i "s/systemd//g" "$initdir/etc/nsswitch.conf"
+ fi
+}
+
do_test "$@" 22
)
}
-do_test "$@" 58
+do_test "$@" 29
TEST_DESCRIPTION="test adding new BindPaths while unit is already running"
. $TEST_BASE_DIR/test-functions
-do_test "$@" 57
+do_test "$@" 49
+++ /dev/null
-#!/usr/bin/env bash
-set -e
-
-TEST_DESCRIPTION="test udev's event-timeout and timeout-signal options"
-TEST_NO_NSPAWN=1
-. $TEST_BASE_DIR/test-functions
-
-do_test "$@" 49
return $ret
}
-do_test "$@" 56
+do_test "$@" 55
+++ /dev/null
-#!/usr/bin/env bash
-set -e
-TEST_DESCRIPTION="UDEV tags management"
-TEST_NO_NSPAWN=1
-
-. $TEST_BASE_DIR/test-functions
-
-do_test "$@" 55
--- /dev/null
+#!/usr/bin/env bash
+set -e
+TEST_DESCRIPTION="test ExitType=cgroup"
+. $TEST_BASE_DIR/test-functions
+
+do_test "$@" 56
+++ /dev/null
-../TEST-01-BASIC/Makefile
\ No newline at end of file
+++ /dev/null
-../TEST-01-BASIC/Makefile
\ No newline at end of file
--- /dev/null
+type='signal',sender='org.freedesktop.DBus',path='/org/freedesktop/DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged',arg0=':1.134'
--- /dev/null
+arg2='wal\'do',sender='foo',type='signal',interface='bar.x',
+arg2='wal\'do2',sender='foo',type='signal',interface='bar.x',
+arg3='test',sender='foo',type='signal',interface='bar.x',
+arg3='test',sender='foo',type='method_call',interface='bar.x',
+
+interface='quux.x'
+interface='bar.x'
+member='waldo',path='/foo/bar'
+path='/foo/bar'
+path_namespace='/foo'
+path_namespace='/foo/quux'
+arg1='two'
+member='waldo',arg2path='/prefix/'
+member=waldo,path='/foo/bar',arg3namespace='prefix'
+arg4has='pi'
+arg4has='pa'
+arg4has='po'
+arg4='pi'
ExecStop=
ExecStopPost=
ExecStopPre=
+ExitType=
FailureAction=
FileDescriptorName=
FileDescriptorStoreMax=
IPAccounting=
IPAddressAllow=
IPAddressDeny=
+IPCNamespacePath=
IPTOS=
IPTTL=
IgnoreOnIsolate=
MessageQueueMaxMessages=
MessageQueueMessageSize=
MountAPIVFS=
+NetworkNamespacePath=
NoDelay=
NoExecPaths=
NoNewPrivileges=
Port=
PowerKeyIgnoreInhibited=
Private=
+PrivateIPC=
PrivateDevices=
PrivateNetwork=
PrivateTmp=
--- /dev/null
+[Unit]
+Description=Test for SystemCallFilter with errno name (for issue #18916)
+
+[Service]
+ExecStart=/usr/bin/python3 -c 'import os\ntry: os.uname()\nexcept Exception as e: exit(e.errno)'
+Type=oneshot
+SystemCallFilter=@system-service
+SystemCallFilter=~uname:EILSEQ
+SystemCallErrorNumber=EACCES
SKIP_INITRD="${SKIP_INITRD:-yes}"
PATH_TO_INIT=$ROOTLIBDIR/systemd-under-asan
QEMU_MEM="2048M"
- QEMU_SMP=4
+ QEMU_SMP="${QEMU_SMP:-4}"
# We need to correctly distinguish between gcc's and clang's ASan DSOs.
- if ldd $SYSTEMD | grep -q libasan.so; then
+ if ASAN_RT_NAME="$(ldd "$SYSTEMD" | awk '/libasan.so/ {x=$1; exit} END {print x; exit x==""}')"; then
ASAN_COMPILER=gcc
- elif ldd $SYSTEMD | grep -q libclang_rt.asan; then
+ ASAN_RT_PATH="$(readlink -f "$(${CC:-gcc} --print-file-name "$ASAN_RT_NAME")")"
+ elif ASAN_RT_NAME="$(ldd "$SYSTEMD" | awk '/libclang_rt.asan/ {x=$1; exit} END {print x; exit x==""}')"; then
ASAN_COMPILER=clang
+ ASAN_RT_PATH="$(readlink -f "$(${CC:-clang} --print-file-name "$ASAN_RT_NAME")")"
# As clang's ASan DSO is usually in a non-standard path, let's check if
# the environment is set accordingly. If not, warn the user and exit.
# user should encounter (and fix) the same issue when running the unit
# tests (meson test)
if ldd "$SYSTEMD" | grep -q "libclang_rt.asan.*not found"; then
- _asan_rt_name="$(ldd $SYSTEMD | awk '/libclang_rt.asan/ {print $1; exit}')"
- _asan_rt_path="$(find /usr/lib* /usr/local/lib* -type f -name "$_asan_rt_name" 2>/dev/null | sed 1q)"
- echo >&2 "clang's ASan DSO ($_asan_rt_name) is not present in the runtime library path"
- echo >&2 "Consider setting LD_LIBRARY_PATH=${_asan_rt_path%/*}"
+ echo >&2 "clang's ASan DSO ($ASAN_RT_NAME) is not present in the runtime library path"
+ echo >&2 "Consider setting LD_LIBRARY_PATH=${ASAN_RT_PATH%/*}"
exit 1
fi
else
echo >&2 "gcc does this by default, for clang compile with -shared-libasan"
exit 1
fi
+
+ echo "Detected ASan RT '$ASAN_RT_NAME' located at '$ASAN_RT_PATH'"
fi
function find_qemu_bin() {
mkdir -p $initdir/usr/lib/systemd/system $initdir/usr/lib/extension-release.d $initdir/etc $initdir/var/tmp $initdir/opt
setup_basic_dirs
install_basic_tools
+ if [[ -v ASAN_RT_PATH ]]; then
+ # If we're compiled with ASan, install the ASan RT (and its dependencies)
+ # into the verity images to get rid of the annoying errors about
+ # missing $LD_PRELOAD libraries.
+ inst_libs "$ASAN_RT_PATH"
+ inst_library "$ASAN_RT_PATH"
+ fi
cp $os_release $initdir/usr/lib/os-release
ln -s ../usr/lib/os-release $initdir/etc/os-release
touch $initdir/etc/machine-id $initdir/etc/resolv.conf
local _asan_rt_pattern
ddebug "Create $_asan_wrapper"
- case "$ASAN_COMPILER" in
- gcc)
- _asan_rt_pattern="*libasan*"
- ;;
- clang)
- _asan_rt_pattern="libclang_rt.asan-*"
- # Install llvm-symbolizer to generate useful reports
- # See: https://clang.llvm.org/docs/AddressSanitizer.html#symbolizing-the-reports
- dracut_install "llvm-symbolizer"
- ;;
- *)
- dfail "Unsupported compiler: $ASAN_COMPILER"
- exit 1
- esac
+ [[ -z "$ASAN_RT_PATH" ]] && dfatal "ASAN_RT_PATH is empty, but it shouldn't be"
+
+ # clang: install llvm-symbolizer to generate useful reports
+ # See: https://clang.llvm.org/docs/AddressSanitizer.html#symbolizing-the-reports
+ [[ "$ASAN_COMPILER" == "clang" ]] && dracut_install "llvm-symbolizer"
cat >$_asan_wrapper <<EOF
#!/usr/bin/env bash
set -x
+echo "ASan RT: $ASAN_RT_PATH"
+if [[ ! -e "$ASAN_RT_PATH" ]]; then
+ echo >&2 "Couldn't find ASan RT at '$ASAN_RT_PATH', can't continue"
+ exit 1
+fi
+
DEFAULT_ASAN_OPTIONS=${ASAN_OPTIONS:-strict_string_checks=1:detect_stack_use_after_return=1:check_initialization_order=1:strict_init_order=1}
DEFAULT_UBSAN_OPTIONS=${UBSAN_OPTIONS:-print_stacktrace=1:print_summary=1:halt_on_error=1}
DEFAULT_ENVIRONMENT="ASAN_OPTIONS=\$DEFAULT_ASAN_OPTIONS UBSAN_OPTIONS=\$DEFAULT_UBSAN_OPTIONS"
mount -t sysfs sysfs /sys
mount -o remount,rw /
-PATH_TO_ASAN=\$(find / -name '$_asan_rt_pattern' | sed 1q)
-if [[ "\$PATH_TO_ASAN" ]]; then
- # A lot of services (most notably dbus) won't start without preloading libasan
- # See https://github.com/systemd/systemd/issues/5004
- DEFAULT_ENVIRONMENT="\$DEFAULT_ENVIRONMENT LD_PRELOAD=\$PATH_TO_ASAN"
+# A lot of services (most notably dbus) won't start without preloading libasan
+# See https://github.com/systemd/systemd/issues/5004
+DEFAULT_ENVIRONMENT="\$DEFAULT_ENVIRONMENT LD_PRELOAD=$ASAN_RT_PATH"
+
+if [[ "$ASAN_COMPILER" == "clang" ]]; then
# Let's add the ASan DSO's path to the dynamic linker's cache. This is pretty
# unnecessary for gcc & libasan, however, for clang this is crucial, as its
# runtime ASan DSO is in a non-standard (library) path.
- echo \${PATH_TO_ASAN%/*} > /etc/ld.so.conf.d/asan-path-override.conf
+ echo "${ASAN_RT_PATH%/*}" > /etc/ld.so.conf.d/asan-path-override.conf
ldconfig
fi
echo DefaultEnvironment=\$DEFAULT_ENVIRONMENT >>/etc/systemd/system.conf
mkdir -p /etc/systemd/system/systemd-journal-flush.service.d
printf "[Service]\nTimeoutSec=180s\n" >/etc/systemd/system/systemd-journal-flush.service.d/timeout.conf
+# D-Bus has troubles during system shutdown causing it to fail. Although it's
+# harmless, it causes unnecessary noise in the logs, so let's disable LSan's
+# at_exit check just for the dbus.service
+mkdir -p /etc/systemd/system/dbus.service.d
+printf "[Service]\nEnvironment=ASAN_OPTIONS=leak_check_at_exit=false\n" >/etc/systemd/system/dbus.service.d/disable-lsan.conf
+
+# Some utilities run via IMPORT/RUN/PROGRAM udev directives fail because
+# they're uninstrumented (like dmsetup). Let's add a simple rule which sets
+# LD_PRELOAD to the ASan RT library to fix this.
+mkdir -p /etc/udev/rules.d
+cat > /etc/udev/rules.d/00-set-LD_PRELOAD.rules << INNER_EOF
+SUBSYSTEM=="block", ENV{LD_PRELOAD}="$ASAN_RT_PATH"
+INNER_EOF
+chmod 0644 /etc/udev/rules.d/00-set-LD_PRELOAD.rules
+
# The 'mount' utility doesn't behave well under libasan, causing unexpected
# fails during boot and subsequent test results check:
# bash-5.0# mount -o remount,rw -v /
inst_any /usr/share/zoneinfo/Asia/Vladivostok
inst_any /usr/share/zoneinfo/Australia/Sydney
inst_any /usr/share/zoneinfo/Europe/Berlin
+ inst_any /usr/share/zoneinfo/Europe/Dublin
inst_any /usr/share/zoneinfo/Europe/Kiev
inst_any /usr/share/zoneinfo/Pacific/Auckland
inst_any /usr/share/zoneinfo/Pacific/Honolulu
check_ok test15-a Names test15-a.service
check_ok test15-a Names test15-b.service
- check_ko test15-a Names test15-b@
+ check_ko test15-a Names test15-a@ # test15-a@.scope is the symlink target.
+ # Make sure it is completely ignored.
rm /test15-a@.scope
clear_services test15-a test15-b
--- /dev/null
+#!/usr/bin/env bash
+set -ex
+set -o pipefail
+
+mkdir -p /run/udev/rules.d/
+
+rm -f /run/udev/rules.d/50-testsuite.rules
+udevadm control --reload
+udevadm trigger /dev/sda
+
+while : ; do
+ (
+ udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=foobar.service
+ udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=waldo.service
+ systemctl show -p WantedBy foobar.service | grep -q -v sda
+ systemctl show -p WantedBy waldo.service | grep -q -v sda
+ ) && break
+
+ sleep .5
+done
+
+cat > /run/udev/rules.d/50-testsuite.rules <<EOF
+ACTION!="remove", SUBSYSTEM=="block", KERNEL=="sda", ENV{SYSTEMD_WANTS}="foobar.service"
+EOF
+udevadm control --reload
+udevadm trigger /dev/sda
+
+while : ; do
+ (
+ udevadm info /dev/sda | grep -q SYSTEMD_WANTS=foobar.service
+ udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=waldo.service
+ systemctl show -p WantedBy foobar.service | grep -q sda
+ systemctl show -p WantedBy waldo.service | grep -q -v sda
+ ) && break
+
+ sleep .5
+done
+
+cat > /run/udev/rules.d/50-testsuite.rules <<EOF
+ACTION!="remove", SUBSYSTEM=="block", KERNEL=="sda", ENV{SYSTEMD_WANTS}="waldo.service"
+EOF
+udevadm control --reload
+udevadm trigger /dev/sda
+
+while : ; do
+ (
+ udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=foobar.service
+ udevadm info /dev/sda | grep -q SYSTEMD_WANTS=waldo.service
+ systemctl show -p WantedBy foobar.service | grep -q -v sda
+ systemctl show -p WantedBy waldo.service | grep -q sda
+ ) && break
+
+ sleep .5
+done
+
+rm /run/udev/rules.d/50-testsuite.rules
+
+udevadm control --reload
+udevadm trigger /dev/sda
+
+while : ; do
+ (
+ udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=foobar.service
+ udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=waldo.service
+ systemctl show -p WantedBy foobar.service | grep -q -v sda
+ systemctl show -p WantedBy waldo.service | grep -q -v sda
+ ) && break
+
+ sleep .5
+done
+
+exit 0
--- /dev/null
+#!/usr/bin/env bash
+set -ex
+set -o pipefail
+
+mkdir -p /run/udev/rules.d/
+
+cat > /run/udev/rules.d/50-testsuite.rules <<EOF
+ACTION=="remove", GOTO="lo_end"
+
+SUBSYSTEM=="net", KERNEL=="lo", TAG+="systemd", ENV{SYSTEMD_ALIAS}+="/sys/subsystem/net/devices/lo"
+
+ACTION!="change", GOTO="lo_end"
+
+SUBSYSTEM=="net", KERNEL=="lo", ENV{ID_RENAMING}="1"
+
+LABEL="lo_end"
+EOF
+
+udevadm control --log-priority=debug --reload --timeout=600
+udevadm trigger --action=add --settle /sys/devices/virtual/net/lo
+udevadm info /sys/devices/virtual/net/lo
+sleep 1
+STATE=$(systemctl show --property=ActiveState --value sys-devices-virtual-net-lo.device)
+[[ $STATE == "active" ]] || exit 1
+
+udevadm trigger --action=change --settle /sys/devices/virtual/net/lo
+udevadm info /sys/devices/virtual/net/lo
+sleep 1
+STATE=$(systemctl show --property=ActiveState --value sys-devices-virtual-net-lo.device)
+[[ $STATE == "inactive" ]] || exit 1
+
+udevadm trigger --action=move --settle /sys/devices/virtual/net/lo
+udevadm info /sys/devices/virtual/net/lo
+sleep 1
+STATE=$(systemctl show --property=ActiveState --value sys-devices-virtual-net-lo.device)
+[[ $STATE == "active" ]] || exit 1
+
+rm -f /run/udev/rules.d/50-testsuite.rules
+udevadm control --reload --timeout=600
+
+# test for issue #16967
+
+ip link add hoge type dummy
+udevadm info --wait-for-initialization=10s /sys/devices/virtual/net/hoge
+sleep 1
+if ! systemctl status sys-devices-virtual-net-hoge.device; then exit 1; fi
+if ! systemctl status sys-subsystem-net-devices-hoge.device; then exit 1; fi
+
+ip link set hoge name foobar
+udevadm info --wait-for-initialization=10s /sys/devices/virtual/net/foobar
+sleep 1
+if systemctl status sys-devices-virtual-net-hoge.device; then exit 1; fi
+if systemctl status sys-subsystem-net-devices-hoge.device; then exit 1; fi
+if ! systemctl status sys-devices-virtual-net-foobar.device; then exit 1; fi
+if ! systemctl status sys-subsystem-net-devices-foobar.device; then exit 1; fi
+
+exit 0
--- /dev/null
+#!/usr/bin/env bash
+
+set -ex
+
+test_rule="/run/udev/rules.d/49-test.rules"
+
+setup() {
+ mkdir -p "${test_rule%/*}"
+ cp -f /etc/udev/udev.conf /etc/udev/udev.conf.bckp
+ echo 'KERNEL=="lo", SUBSYSTEM=="net", PROGRAM=="/bin/sleep 60"' > "${test_rule}"
+ echo "event_timeout=30" >> /etc/udev/udev.conf
+ echo "timeout_signal=SIGABRT" >> /etc/udev/udev.conf
+
+ systemctl restart systemd-udevd.service
+}
+
+teardown() {
+ set +e
+
+ mv -f /etc/udev/udev.conf.bckp /etc/udev/udev.conf
+ rm -f "$test_rule"
+ systemctl restart systemd-udevd.service
+}
+
+run_test() {
+ since="$(date +%T)"
+
+ echo add > /sys/class/net/lo/uevent
+
+ for n in {1..20}; do
+ sleep 5
+ if coredumpctl --since "$since" --no-legend --no-pager | grep /bin/udevadm ; then
+ return 0
+ fi
+ done
+
+ return 1
+}
+
+trap teardown EXIT
+
+setup
+run_test
+
+exit 0
--- /dev/null
+#!/bin/bash
+set -ex
+set -o pipefail
+
+mkdir -p /run/udev/rules.d/
+
+! test -f /run/udev/tags/added/c1:3 &&
+ ! test -f /run/udev/tags/changed/c1:3 &&
+ udevadm info /dev/null | grep -q -v 'E: TAGS=.*:added:.*' &&
+ udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:added:.*' &&
+ udevadm info /dev/null | grep -q -v 'E: TAGS=.*:changed:.*' &&
+ udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:changed:.*'
+
+cat > /run/udev/rules.d/50-testsuite.rules <<EOF
+ACTION=="add", SUBSYSTEM=="mem", KERNEL=="null", TAG+="added"
+ACTION=="change", SUBSYSTEM=="mem", KERNEL=="null", TAG+="changed"
+EOF
+
+udevadm control --reload
+udevadm trigger -c add /dev/null
+
+while : ; do
+ test -f /run/udev/tags/added/c1:3 &&
+ ! test -f /run/udev/tags/changed/c1:3 &&
+ udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*' &&
+ udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:added:.*' &&
+ udevadm info /dev/null | grep -q -v 'E: TAGS=.*:changed:.*' &&
+ udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:changed:.*' &&
+ break
+
+ sleep .5
+done
+
+udevadm control --reload
+udevadm trigger -c change /dev/null
+
+while : ; do
+ test -f /run/udev/tags/added/c1:3 &&
+ test -f /run/udev/tags/changed/c1:3 &&
+ udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*' &&
+ udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:added:.*' &&
+ udevadm info /dev/null | grep -q 'E: TAGS=.*:changed:.*' &&
+ udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:changed:.*' &&
+ break
+
+ sleep .5
+done
+
+udevadm control --reload
+udevadm trigger -c add /dev/null
+
+while : ; do
+ test -f /run/udev/tags/added/c1:3 &&
+ test -f /run/udev/tags/changed/c1:3 &&
+ udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*' &&
+ udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:added:.*' &&
+ udevadm info /dev/null | grep -q 'E: TAGS=.*:changed:.*' &&
+ udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:changed:.*' &&
+ break
+
+ sleep .5
+done
+
+exit 0
--- /dev/null
+#!/bin/bash
+set -ex
+set -o pipefail
+
+mkdir -p /run/udev/rules.d/
+
+cat > /run/udev/rules.d/50-testsuite.rules <<EOF
+SUBSYSTEM=="mem", KERNEL=="null", OPTIONS="log_level=debug"
+ACTION=="add", SUBSYSTEM=="mem", KERNEL=="null", IMPORT{program}="/bin/echo -e HOGE=aa\\\\x20\\\\x20\\\\x20bb\nFOO=\\\\x20aaa\\\\x20\n\n\n"
+EOF
+
+udevadm control --reload
+udevadm trigger -c add /dev/null
+
+while : ; do
+ test -f /run/udev/data/c1:3 &&
+ udevadm info /dev/null | grep -q 'E: HOGE=aa\\x20\\x20\\x20bb' &&
+ udevadm info /dev/null | grep -q 'E: FOO=\\x20aaa\\x20' &&
+ break
+
+ sleep .5
+done
+
+exit 0
[Unit]
-Description=TEST-17-UDEV-WANTS
+Description=TEST-17-UDEV
[Service]
ExecStartPre=rm -f /failed /testok
#!/usr/bin/env bash
-set -ex
-set -o pipefail
-mkdir -p /run/udev/rules.d/
+set -x
+set -e
-rm -f /run/udev/rules.d/50-testsuite.rules
-udevadm control --reload
-udevadm trigger /dev/sda
+>/failed
-while : ; do
- (
- udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=foobar.service
- udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=waldo.service
- systemctl show -p WantedBy foobar.service | grep -q -v sda
- systemctl show -p WantedBy waldo.service | grep -q -v sda
- ) && break
-
- sleep .5
-done
-
-cat > /run/udev/rules.d/50-testsuite.rules <<EOF
-ACTION!="remove", SUBSYSTEM=="block", KERNEL=="sda", ENV{SYSTEMD_WANTS}="foobar.service"
-EOF
-udevadm control --reload
-udevadm trigger /dev/sda
-
-while : ; do
- (
- udevadm info /dev/sda | grep -q SYSTEMD_WANTS=foobar.service
- udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=waldo.service
- systemctl show -p WantedBy foobar.service | grep -q sda
- systemctl show -p WantedBy waldo.service | grep -q -v sda
- ) && break
-
- sleep .5
+for t in ${0%.sh}.*.sh; do
+ echo "Running $t"; ./$t
done
-cat > /run/udev/rules.d/50-testsuite.rules <<EOF
-ACTION!="remove", SUBSYSTEM=="block", KERNEL=="sda", ENV{SYSTEMD_WANTS}="waldo.service"
-EOF
-udevadm control --reload
-udevadm trigger /dev/sda
-
-while : ; do
- (
- udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=foobar.service
- udevadm info /dev/sda | grep -q SYSTEMD_WANTS=waldo.service
- systemctl show -p WantedBy foobar.service | grep -q -v sda
- systemctl show -p WantedBy waldo.service | grep -q sda
- ) && break
-
- sleep .5
-done
-
-rm /run/udev/rules.d/50-testsuite.rules
-
-udevadm control --reload
-udevadm trigger /dev/sda
-
-while : ; do
- (
- udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=foobar.service
- udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=waldo.service
- systemctl show -p WantedBy foobar.service | grep -q -v sda
- systemctl show -p WantedBy waldo.service | grep -q -v sda
- ) && break
-
- sleep .5
-done
-
-echo OK >/testok
-
-exit 0
+touch /testok
+rm /failed
[Unit]
-Description=TEST-29-UDEV-ID_RENAMING
+Description=TEST-29-PORTABLE
[Service]
ExecStartPre=rm -f /failed /testok
#!/usr/bin/env bash
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# ex: ts=8 sw=4 sts=4 et filetype=sh
set -ex
set -o pipefail
-mkdir -p /run/udev/rules.d/
+export SYSTEMD_LOG_LEVEL=debug
-cat > /run/udev/rules.d/50-testsuite.rules <<EOF
-ACTION=="remove", GOTO="lo_end"
+portablectl attach --now --runtime /usr/share/minimal_0.raw app0
-SUBSYSTEM=="net", KERNEL=="lo", TAG+="systemd", ENV{SYSTEMD_ALIAS}+="/sys/subsystem/net/devices/lo"
+systemctl is-active app0.service
+systemctl is-active app0-foo.service
+set +o pipefail
+set +e
+systemctl is-active app0-bar.service && exit 1
+set -e
+set -o pipefail
+
+portablectl reattach --now --runtime /usr/share/minimal_1.raw app0
+
+systemctl is-active app0.service
+systemctl is-active app0-bar.service
+set +o pipefail
+set +e
+systemctl is-active app0-foo.service && exit 1
+set -e
+set -o pipefail
-ACTION!="change", GOTO="lo_end"
+portablectl list | grep -q -F "minimal_1"
-SUBSYSTEM=="net", KERNEL=="lo", ENV{ID_RENAMING}="1"
+portablectl detach --now --runtime /usr/share/minimal_1.raw app0
-LABEL="lo_end"
-EOF
+portablectl list | grep -q -F "No images."
-udevadm control --log-priority=debug --reload --timeout=600
-udevadm trigger --action=add --settle /sys/devices/virtual/net/lo
-udevadm info /sys/devices/virtual/net/lo
-sleep 1
-STATE=$(systemctl show --property=ActiveState --value sys-devices-virtual-net-lo.device)
-[[ $STATE == "active" ]] || exit 1
+# portablectl also works with directory paths rather than images
-udevadm trigger --action=change --settle /sys/devices/virtual/net/lo
-udevadm info /sys/devices/virtual/net/lo
-sleep 1
-STATE=$(systemctl show --property=ActiveState --value sys-devices-virtual-net-lo.device)
-[[ $STATE == "inactive" ]] || exit 1
+unsquashfs -dest /tmp/minimal_0 /usr/share/minimal_0.raw
+unsquashfs -dest /tmp/minimal_1 /usr/share/minimal_1.raw
-udevadm trigger --action=move --settle /sys/devices/virtual/net/lo
-udevadm info /sys/devices/virtual/net/lo
-sleep 1
-STATE=$(systemctl show --property=ActiveState --value sys-devices-virtual-net-lo.device)
-[[ $STATE == "active" ]] || exit 1
+portablectl attach --copy=symlink --now --runtime /tmp/minimal_0 app0
-rm -f /run/udev/rules.d/50-testsuite.rules
-udevadm control --reload --timeout=600
+systemctl is-active app0.service
+systemctl is-active app0-foo.service
+set +o pipefail
+set +e
+systemctl is-active app0-bar.service && exit 1
+set -e
+set -o pipefail
+
+portablectl reattach --now --enable --runtime /tmp/minimal_1 app0
+
+systemctl is-active app0.service
+systemctl is-active app0-bar.service
+set +o pipefail
+set +e
+systemctl is-active app0-foo.service && exit 1
+set -e
+set -o pipefail
-# test for issue #16967
+portablectl list | grep -q -F "minimal_1"
-ip link add hoge type dummy
-udevadm info --wait-for-initialization=10s /sys/devices/virtual/net/hoge
-sleep 1
-if ! systemctl status sys-devices-virtual-net-hoge.device; then exit 1; fi
-if ! systemctl status sys-subsystem-net-devices-hoge.device; then exit 1; fi
+portablectl detach --now --enable --runtime /tmp/minimal_1 app0
-ip link set hoge name foobar
-udevadm info --wait-for-initialization=10s /sys/devices/virtual/net/foobar
-sleep 1
-if systemctl status sys-devices-virtual-net-hoge.device; then exit 1; fi
-if systemctl status sys-subsystem-net-devices-hoge.device; then exit 1; fi
-if ! systemctl status sys-devices-virtual-net-foobar.device; then exit 1; fi
-if ! systemctl status sys-subsystem-net-devices-foobar.device; then exit 1; fi
+portablectl list | grep -q -F "No images."
echo OK > /testok
RemainAfterExit=yes
MountAPIVFS=yes
PrivateTmp=yes
-BindPaths=/run/testservice-57-fixed:/tmp/testfile_fixed
+BindPaths=/run/testservice-49-fixed:/tmp/testfile_fixed
InaccessiblePaths=/run/inaccessible
ExecStartPre=grep -q -F MARKER_FIXED /tmp/testfile_fixed
ExecStart=/bin/sh -c 'systemd-notify --ready; while ! grep -q -F MARKER_RUNTIME /tmp/testfile_runtime; do sleep 0.1; done; test ! -f /run/inaccessible/testfile_fixed'
[Unit]
-Description=TEST-49-UDEV-EVENT-TIMEOUT
+Description=TEST-49-RUNTIME-BIND-PATHS
[Service]
+ExecStartPre=rm -f /failed /testok
ExecStart=/usr/lib/systemd/tests/testdata/units/%N.sh
Type=oneshot
#!/usr/bin/env bash
-
set -ex
-test_rule="/run/udev/rules.d/49-test.rules"
+echo "MARKER_FIXED" > /run/testservice-49-fixed
+mkdir -p /run/inaccessible
-setup() {
- mkdir -p "${test_rule%/*}"
- cp -f /etc/udev/udev.conf /etc/udev/udev.conf.bckp
- echo 'KERNEL=="lo", SUBSYSTEM=="net", PROGRAM=="/bin/sleep 60"' > "${test_rule}"
- echo "event_timeout=30" >> /etc/udev/udev.conf
- echo "timeout_signal=SIGABRT" >> /etc/udev/udev.conf
+systemctl start testsuite-49-namespaced.service
- systemctl restart systemd-udevd.service
-}
+# Ensure that inaccessible paths aren't bypassed by the runtime setup
+set +e
+systemctl bind --mkdir testsuite-49-namespaced.service /run/testservice-49-fixed /run/inaccessible/testfile_fixed && exit 1
+set -e
-teardown() {
- set +e
+echo "MARKER_RUNTIME" > /run/testservice-49-runtime
- mv -f /etc/udev/udev.conf.bckp /etc/udev/udev.conf
- rm -f "$test_rule"
- systemctl restart systemd-udevd.service
-}
+systemctl bind --mkdir testsuite-49-namespaced.service /run/testservice-49-runtime /tmp/testfile_runtime
-run_test() {
- since="$(date +%T)"
+while systemctl show -P SubState testsuite-49-namespaced.service | grep -q running
+do
+ sleep 0.1
+done
- echo add > /sys/class/net/lo/uevent
+systemctl is-active testsuite-49-namespaced.service
- for n in {1..20}; do
- sleep 5
- if coredumpctl --since "$since" --no-legend --no-pager | grep /bin/udevadm ; then
- return 0
- fi
- done
+# Now test that systemctl bind fails when attempted on a non-namespaced unit
+systemctl start testsuite-49-non-namespaced.service
- return 1
-}
+set +e
+systemctl bind --mkdir testsuite-49-non-namespaced.service /run/testservice-49-runtime /tmp/testfile_runtime && exit 1
+set -e
-trap teardown EXIT
+while systemctl show -P SubState testsuite-49-non-namespaced.service | grep -q running
+do
+ sleep 0.1
+done
-setup
-run_test
+set +e
+systemctl is-active testsuite-49-non-namespaced.service && exit 1
+set -e
echo OK > /testok
TemporaryFileSystem=/run
RootImage=${image}.raw
ExtensionImages=/usr/share/app0.raw /usr/share/app1.raw:nosuid
+# Relevant only for sanitizer runs
+UnsetEnvironment=LD_PRELOAD
ExecStart=/bin/bash -c '/opt/script0.sh | grep ID'
ExecStart=/bin/bash -c '/opt/script1.sh | grep ID'
Type=oneshot
# A VERY small memory.high will cause the script (trying to use a lot of memory)
# to throttle and be put under heavy pressure.
MemoryHigh=1M
-Slice=testsuite-56-workload.slice
-ExecStart=/usr/lib/systemd/tests/testdata/units/testsuite-56-slowgrowth.sh
+Slice=testsuite-55-workload.slice
+ExecStart=/usr/lib/systemd/tests/testdata/units/testsuite-55-slowgrowth.sh
Description=No memory pressure
[Service]
-Slice=testsuite-56-workload.slice
+Slice=testsuite-55-workload.slice
ExecStart=sleep infinity
--- /dev/null
+[Unit]
+Description=Create some memory pressure
+
+[Service]
+MemoryHigh=2M
+Slice=testsuite-55-workload.slice
+ExecStart=/usr/lib/systemd/tests/testdata/units/testsuite-55-slowgrowth.sh
[Unit]
-Description=TESTSUITE-55-UDEV-TAGS
+Description=TESTSUITE-55-OOMD
[Service]
-ExecStartPre=rm -f /failed /testok
+ExecStartPre=rm -f /failed /skipped /testok
ExecStart=/usr/lib/systemd/tests/testdata/units/%N.sh
Type=oneshot
-#!/bin/bash
+#!/usr/bin/env bash
set -ex
set -o pipefail
-mkdir -p /run/udev/rules.d/
-
-! test -f /run/udev/tags/added/c1:3 &&
- ! test -f /run/udev/tags/changed/c1:3 &&
- udevadm info /dev/null | grep -q -v 'E: TAGS=.*:added:.*' &&
- udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:added:.*' &&
- udevadm info /dev/null | grep -q -v 'E: TAGS=.*:changed:.*' &&
- udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:changed:.*'
-
-cat > /run/udev/rules.d/50-testsuite.rules <<EOF
-ACTION=="add", SUBSYSTEM=="mem", KERNEL=="null", TAG+="added"
-ACTION=="change", SUBSYSTEM=="mem", KERNEL=="null", TAG+="changed"
-EOF
-
-udevadm control --reload
-udevadm trigger -c add /dev/null
-
-while : ; do
- test -f /run/udev/tags/added/c1:3 &&
- ! test -f /run/udev/tags/changed/c1:3 &&
- udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*' &&
- udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:added:.*' &&
- udevadm info /dev/null | grep -q -v 'E: TAGS=.*:changed:.*' &&
- udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:changed:.*' &&
- break
+systemd-analyze log-level debug
+systemd-analyze log-target console
- sleep .5
-done
+# Loose checks to ensure the environment has the necessary features for systemd-oomd
+[[ -e /proc/pressure ]] || echo "no PSI" >> /skipped
+cgroup_type=$(stat -fc %T /sys/fs/cgroup/)
+if [[ "$cgroup_type" != *"cgroup2"* ]] && [[ "$cgroup_type" != *"0x63677270"* ]]; then
+ echo "no cgroup2" >> /skipped
+fi
+if [ ! -f /usr/lib/systemd/systemd-oomd ] && [ ! -f /lib/systemd/systemd-oomd ]; then
+ echo "no oomd" >> /skipped
+fi
+[[ -e /skipped ]] && exit 0 || true
-udevadm control --reload
-udevadm trigger -c change /dev/null
+rm -rf /etc/systemd/system/testsuite-55-testbloat.service.d
-while : ; do
- test -f /run/udev/tags/added/c1:3 &&
- test -f /run/udev/tags/changed/c1:3 &&
- udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*' &&
- udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:added:.*' &&
- udevadm info /dev/null | grep -q 'E: TAGS=.*:changed:.*' &&
- udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:changed:.*' &&
- break
+echo "DefaultMemoryPressureDurationSec=5s" >> /etc/systemd/oomd.conf
- sleep .5
-done
+systemctl start testsuite-55-testchill.service
+systemctl start testsuite-55-testbloat.service
-udevadm control --reload
-udevadm trigger -c add /dev/null
+# Verify systemd-oomd is monitoring the expected units
+oomctl | grep "/testsuite-55-workload.slice"
+oomctl | grep "1.00%"
+oomctl | grep "Default Memory Pressure Duration: 5s"
-while : ; do
- test -f /run/udev/tags/added/c1:3 &&
- test -f /run/udev/tags/changed/c1:3 &&
- udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*' &&
- udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:added:.*' &&
- udevadm info /dev/null | grep -q 'E: TAGS=.*:changed:.*' &&
- udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:changed:.*' &&
+# systemd-oomd watches for elevated pressure for 5 seconds before acting.
+# It can take time to build up pressure so either wait 2 minutes or for the service to fail.
+timeout=$(date -ud "2 minutes" +%s)
+while [[ $(date -u +%s) -le $timeout ]]; do
+ if ! systemctl status testsuite-55-testbloat.service; then
break
-
- sleep .5
+ fi
+ sleep 5
done
+# testbloat should be killed and testchill should be fine
+if systemctl status testsuite-55-testbloat.service; then exit 42; fi
+if ! systemctl status testsuite-55-testchill.service; then exit 24; fi
+
+# only run this portion of the test if we can set xattrs
+if setfattr -n user.xattr_test -v 1 /sys/fs/cgroup/; then
+ sleep 120 # wait for systemd-oomd kill cool down and elevated memory pressure to come down
+
+ mkdir -p /etc/systemd/system/testsuite-55-testbloat.service.d/
+ echo "[Service]" > /etc/systemd/system/testsuite-55-testbloat.service.d/override.conf
+ echo "ManagedOOMPreference=avoid" >> /etc/systemd/system/testsuite-55-testbloat.service.d/override.conf
+
+ systemctl daemon-reload
+ systemctl start testsuite-55-testchill.service
+ systemctl start testsuite-55-testmunch.service
+ systemctl start testsuite-55-testbloat.service
+
+ timeout=$(date -ud "2 minutes" +%s)
+ while [[ $(date -u +%s) -le $timeout ]]; do
+ if ! systemctl status testsuite-55-testmunch.service; then
+ break
+ fi
+ sleep 5
+ done
+
+ # testmunch should be killed since testbloat had the avoid xattr on it
+ if ! systemctl status testsuite-55-testbloat.service; then exit 25; fi
+ if systemctl status testsuite-55-testmunch.service; then exit 43; fi
+ if ! systemctl status testsuite-55-testchill.service; then exit 24; fi
+fi
+
+systemd-analyze log-level info
+
echo OK > /testok
exit 0
+++ /dev/null
-[Unit]
-Description=Create some memory pressure
-
-[Service]
-MemoryHigh=2M
-Slice=testsuite-56-workload.slice
-ExecStart=/usr/lib/systemd/tests/testdata/units/testsuite-56-slowgrowth.sh
[Unit]
-Description=TESTSUITE-56-OOMD
+Description=TEST-56-EXIT-TYPE
[Service]
-ExecStartPre=rm -f /failed /skipped /testok
ExecStart=/usr/lib/systemd/tests/testdata/units/%N.sh
Type=oneshot
#!/usr/bin/env bash
set -ex
-set -o pipefail
systemd-analyze log-level debug
-systemd-analyze log-target console
-
-# Loose checks to ensure the environment has the necessary features for systemd-oomd
-[[ -e /proc/pressure ]] || echo "no PSI" >> /skipped
-cgroup_type=$(stat -fc %T /sys/fs/cgroup/)
-if [[ "$cgroup_type" != *"cgroup2"* ]] && [[ "$cgroup_type" != *"0x63677270"* ]]; then
- echo "no cgroup2" >> /skipped
-fi
-if [ ! -f /usr/lib/systemd/systemd-oomd ] && [ ! -f /lib/systemd/systemd-oomd ]; then
- echo "no oomd" >> /skipped
-fi
-[[ -e /skipped ]] && exit 0 || true
-
-rm -rf /etc/systemd/system/testsuite-56-testbloat.service.d
-
-echo "DefaultMemoryPressureDurationSec=5s" >> /etc/systemd/oomd.conf
-
-systemctl start testsuite-56-testchill.service
-systemctl start testsuite-56-testbloat.service
-
-# Verify systemd-oomd is monitoring the expected units
-oomctl | grep "/testsuite-56-workload.slice"
-oomctl | grep "1.00%"
-oomctl | grep "Default Memory Pressure Duration: 5s"
-
-# systemd-oomd watches for elevated pressure for 5 seconds before acting.
-# It can take time to build up pressure so either wait 2 minutes or for the service to fail.
-timeout=$(date -ud "2 minutes" +%s)
-while [[ $(date -u +%s) -le $timeout ]]; do
- if ! systemctl status testsuite-56-testbloat.service; then
- break
- fi
- sleep 5
-done
-
-# testbloat should be killed and testchill should be fine
-if systemctl status testsuite-56-testbloat.service; then exit 42; fi
-if ! systemctl status testsuite-56-testchill.service; then exit 24; fi
-
-# only run this portion of the test if we can set xattrs
-if setfattr -n user.xattr_test -v 1 /sys/fs/cgroup/; then
- sleep 120 # wait for systemd-oomd kill cool down and elevated memory pressure to come down
-
- mkdir -p /etc/systemd/system/testsuite-56-testbloat.service.d/
- echo "[Service]" > /etc/systemd/system/testsuite-56-testbloat.service.d/override.conf
- echo "ManagedOOMPreference=avoid" >> /etc/systemd/system/testsuite-56-testbloat.service.d/override.conf
-
- systemctl daemon-reload
- systemctl start testsuite-56-testchill.service
- systemctl start testsuite-56-testmunch.service
- systemctl start testsuite-56-testbloat.service
-
- timeout=$(date -ud "2 minutes" +%s)
- while [[ $(date -u +%s) -le $timeout ]]; do
- if ! systemctl status testsuite-56-testmunch.service; then
- break
- fi
- sleep 5
- done
-
- # testmunch should be killed since testbloat had the avoid xattr on it
- if ! systemctl status testsuite-56-testbloat.service; then exit 25; fi
- if systemctl status testsuite-56-testmunch.service; then exit 43; fi
- if ! systemctl status testsuite-56-testchill.service; then exit 24; fi
-fi
+
+# Multiple level process tree, parent process stays up
+cat >/tmp/test56-exit-cgroup.sh <<EOF
+#!/usr/bin/env bash
+set -eux
+
+# process tree: systemd -> sleep
+sleep infinity &
+disown
+
+# process tree: systemd -> bash -> bash -> sleep
+((sleep infinity); true) &
+
+# process tree: systemd -> bash -> sleep
+sleep infinity
+EOF
+chmod +x /tmp/test56-exit-cgroup.sh
+
+# service should be stopped cleanly
+(sleep 1; systemctl stop one) &
+systemd-run --wait --unit=one -p ExitType=cgroup /tmp/test56-exit-cgroup.sh
+
+# same thing with a truthy exec condition
+(sleep 1; systemctl stop two) &
+systemd-run --wait --unit=two -p ExitType=cgroup -p ExecCondition=true /tmp/test56-exit-cgroup.sh
+
+# false exec condition: systemd-run should exit immediately with status code: 1
+! systemd-run --wait --unit=three -p ExitType=cgroup -p ExecCondition=false /tmp/test56-exit-cgroup.sh
+
+# service should exit uncleanly
+(sleep 1; systemctl kill --signal 9 four) &
+! systemd-run --wait --unit=four -p ExitType=cgroup /tmp/test56-exit-cgroup.sh
+
+
+# Multiple level process tree, parent process exits quickly
+cat >/tmp/test56-exit-cgroup-parentless.sh <<EOF
+#!/usr/bin/env bash
+set -eux
+
+# process tree: systemd -> sleep
+sleep infinity &
+
+# process tree: systemd -> bash -> sleep
+((sleep infinity); true) &
+EOF
+chmod +x /tmp/test56-exit-cgroup-parentless.sh
+
+# service should be stopped cleanly
+(sleep 1; systemctl stop five) &
+systemd-run --wait --unit=five -p ExitType=cgroup /tmp/test56-exit-cgroup-parentless.sh
+
+# service should exit uncleanly
+(sleep 1; systemctl kill --signal 9 six) &
+! systemd-run --wait --unit=six -p ExitType=cgroup /tmp/test56-exit-cgroup-parentless.sh
+
+
+# Multiple level process tree, parent process exits uncleanly but last process exits cleanly
+cat >/tmp/test56-exit-cgroup-clean.sh <<EOF
+#!/usr/bin/env bash
+set -eux
+
+# process tree: systemd -> bash -> sleep
+(sleep 1; true) &
+
+exit 255
+EOF
+chmod +x /tmp/test56-exit-cgroup-clean.sh
+
+# service should exit cleanly and be garbage-collected
+systemd-run --wait --unit=seven -p ExitType=cgroup /tmp/test56-exit-cgroup-clean.sh
+
+
+# Multiple level process tree, parent process exits cleanly but last process exits uncleanly
+cat >/tmp/test56-exit-cgroup-unclean.sh <<EOF
+#!/usr/bin/env bash
+set -eux
+
+# process tree: systemd -> bash -> sleep
+(sleep 1; exit 255) &
+EOF
+chmod +x /tmp/test56-exit-cgroup-unclean.sh
+
+# service should exit uncleanly after 1 second
+! systemd-run --wait --unit=eight -p ExitType=cgroup /tmp/test56-exit-cgroup-unclean.sh
systemd-analyze log-level info
+++ /dev/null
-[Unit]
-Description=TEST-57-RUNTIME-BIND-PATHS
-
-[Service]
-ExecStartPre=rm -f /failed /testok
-ExecStart=/usr/lib/systemd/tests/testdata/units/%N.sh
-Type=oneshot
+++ /dev/null
-#!/usr/bin/env bash
-set -ex
-
-echo "MARKER_FIXED" > /run/testservice-57-fixed
-mkdir -p /run/inaccessible
-
-systemctl start testsuite-57-namespaced.service
-
-# Ensure that inaccessible paths aren't bypassed by the runtime setup
-set +e
-systemctl bind --mkdir testsuite-57-namespaced.service /run/testservice-57-fixed /run/inaccessible/testfile_fixed && exit 1
-set -e
-
-echo "MARKER_RUNTIME" > /run/testservice-57-runtime
-
-systemctl bind --mkdir testsuite-57-namespaced.service /run/testservice-57-runtime /tmp/testfile_runtime
-
-while systemctl show -P SubState testsuite-57-namespaced.service | grep -q running
-do
- sleep 0.1
-done
-
-systemctl is-active testsuite-57-namespaced.service
-
-# Now test that systemctl bind fails when attempted on a non-namespaced unit
-systemctl start testsuite-57-non-namespaced.service
-
-set +e
-systemctl bind --mkdir testsuite-57-non-namespaced.service /run/testservice-57-runtime /tmp/testfile_runtime && exit 1
-set -e
-
-while systemctl show -P SubState testsuite-57-non-namespaced.service | grep -q running
-do
- sleep 0.1
-done
-
-set +e
-systemctl is-active testsuite-57-non-namespaced.service && exit 1
-set -e
-
-echo OK > /testok
-
-exit 0
+++ /dev/null
-[Unit]
-Description=TEST-58-PORTABLE
-
-[Service]
-ExecStartPre=rm -f /failed /testok
-ExecStart=/usr/lib/systemd/tests/testdata/units/%N.sh
-Type=oneshot
+++ /dev/null
-#!/usr/bin/env bash
-# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
-# ex: ts=8 sw=4 sts=4 et filetype=sh
-set -ex
-set -o pipefail
-
-export SYSTEMD_LOG_LEVEL=debug
-
-portablectl attach --now --runtime /usr/share/minimal_0.raw app0
-
-systemctl is-active app0.service
-systemctl is-active app0-foo.service
-set +o pipefail
-set +e
-systemctl is-active app0-bar.service && exit 1
-set -e
-set -o pipefail
-
-portablectl reattach --now --runtime /usr/share/minimal_1.raw app0
-
-systemctl is-active app0.service
-systemctl is-active app0-bar.service
-set +o pipefail
-set +e
-systemctl is-active app0-foo.service && exit 1
-set -e
-set -o pipefail
-
-portablectl list | grep -q -F "minimal_1"
-
-portablectl detach --now --runtime /usr/share/minimal_1.raw app0
-
-portablectl list | grep -q -F "No images."
-
-# portablectl also works with directory paths rather than images
-
-unsquashfs -dest /tmp/minimal_0 /usr/share/minimal_0.raw
-unsquashfs -dest /tmp/minimal_1 /usr/share/minimal_1.raw
-
-portablectl attach --copy=symlink --now --runtime /tmp/minimal_0 app0
-
-systemctl is-active app0.service
-systemctl is-active app0-foo.service
-set +o pipefail
-set +e
-systemctl is-active app0-bar.service && exit 1
-set -e
-set -o pipefail
-
-portablectl reattach --now --enable --runtime /tmp/minimal_1 app0
-
-systemctl is-active app0.service
-systemctl is-active app0-bar.service
-set +o pipefail
-set +e
-systemctl is-active app0-foo.service && exit 1
-set -e
-set -o pipefail
-
-portablectl list | grep -q -F "minimal_1"
-
-portablectl detach --now --enable --runtime /tmp/minimal_1 app0
-
-portablectl list | grep -q -F "No images."
-
-echo OK > /testok
-
-exit 0
--- /dev/null
+Files in this directory contain configuration for systemd-tmpfiles, a program
+to create, delete, and clean up volatile and temporary files and directories.
+
+See man:tmpfiles.d(5) for explanation of the configuration file format, and
+man:systemd-tmpfiles(8) for a description of when and how this configuration is
+applied.
+
+Use 'systemd-analyze cat-config tmpfiles.d' to display the effective config.
enable_tmpfiles = conf.get('ENABLE_TMPFILES') == 1
-tmpfiles = [['home.conf', ''],
- ['journal-nocow.conf', ''],
- ['systemd-nologin.conf', 'HAVE_PAM'],
- ['systemd-nspawn.conf', 'ENABLE_MACHINED'],
- ['systemd-tmp.conf', ''],
- ['portables.conf', 'ENABLE_PORTABLED'],
- ['systemd-pstore.conf', 'ENABLE_PSTORE'],
- ['tmp.conf', ''],
- ['x11.conf', ''],
- ['legacy.conf', 'HAVE_SYSV_COMPAT'],
- ]
-
-foreach pair : tmpfiles
+files = [['README', ''],
+ ['home.conf', ''],
+ ['journal-nocow.conf', ''],
+ ['systemd-nologin.conf', 'HAVE_PAM'],
+ ['systemd-nspawn.conf', 'ENABLE_MACHINED'],
+ ['systemd-tmp.conf', ''],
+ ['portables.conf', 'ENABLE_PORTABLED'],
+ ['systemd-pstore.conf', 'ENABLE_PSTORE'],
+ ['tmp.conf', ''],
+ ['x11.conf', ''],
+ ['legacy.conf', 'HAVE_SYSV_COMPAT'],
+ ]
+
+foreach pair : files
if not enable_tmpfiles
# do nothing
elif pair[1] == '' or conf.get(pair[1]) == 1
-#!/usr/bin/env python2
+#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2017 The Chromium OS Authors. All rights reserved.
is not.
"""
-from __future__ import print_function
-
# List of USB devices (vendorid:productid) for which it is safe to enable
# autosuspend.
USB_IDS = []
# SPDX-License-Identifier: LGPL-2.1-or-later
set -eu
-git shortlog -s `git describe --abbrev=0 --match 'v[0-9][0-9][0-9]'`.. | \
- awk '{ $1=""; print $0 "," }' | \
+tag="$(git describe --abbrev=0 --match 'v[0-9][0-9][0-9]')"
+git log --pretty=tformat:%aN --author=noreply@weblate.org --invert-grep -s "${tag}.." | \
+ sed 's/ / /g; s/--/-/g; s/.*/ \0,/' |
sort -u
ProtectKernelModules=yes
ProtectKernelTunables=yes
ProtectSystem=strict
-ReadWritePaths=/etc
+ReadWritePaths=/etc@SERVICE_LOCALEGEN_WRITABLE@
RestrictAddressFamilies=AF_UNIX
RestrictNamespaces=yes
RestrictRealtime=yes