]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
Merge pull request #6300 from keszybz/refuse-to-load-some-units
authorLennart Poettering <lennart@poettering.net>
Wed, 12 Jul 2017 07:28:20 +0000 (09:28 +0200)
committerGitHub <noreply@github.com>
Wed, 12 Jul 2017 07:28:20 +0000 (09:28 +0200)
Refuse to load some units

44 files changed:
NEWS
TODO
configure.ac
hwdb/20-OUI.hwdb
hwdb/20-acpi-vendor.hwdb
hwdb/20-pci-vendor-model.hwdb
hwdb/60-evdev.hwdb
man/systemd-fstab-generator.xml
man/systemd.exec.xml
man/systemd.mount.xml
man/sysusers.d.xml
meson.build
src/basic/log.c
src/basic/log.h
src/basic/random-util.c
src/basic/strv.c
src/basic/time-util.c
src/boot/bootctl.c
src/core/unit.c
src/delta/delta.c
src/fstab-generator/fstab-generator.c
src/journal/journal-file.c
src/journal/journal-file.h
src/journal/journal-verify.c
src/journal/journalctl.c
src/journal/mmap-cache.c
src/journal/mmap-cache.h
src/journal/test-mmap-cache.c
src/libsystemd/sd-login/sd-login.c
src/mount/mount-tool.c
src/network/networkd-ipv4ll.c
src/resolve/resolved-bus.c
src/resolve/resolved-dns-question.c
src/resolve/resolved-manager.c
src/shared/dns-domain.c
src/shared/logs-show.c
src/systemctl/systemctl.c
src/test/test-date.c
src/test/test-dns-domain.c
test/test-functions
units/console-getty.service.m4.in
units/container-getty@.service.m4.in
units/getty@.service.m4
units/serial-getty@.service.m4

diff --git a/NEWS b/NEWS
index 150e4d68f14bf63278262f418a26e568b257bb4b..d56b7a6f274a0f5388964fe4e58e36f0db719be9 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -55,8 +55,9 @@ CHANGES WITH 234:
           option.
 
         * systemd-resolved may now optionally use libidn2 instead of the libidn
-          for processing internationalized domain names. The old version
-          remains supported, as it has a much smaller footprint.
+          for processing internationalized domain names. Support for libidn2
+          should be considered experimental and should not be enabled by
+          default yet.
 
         * "machinectl pull-tar" and related call may now do verification of
           downloaded images using SUSE-style .sha256 checksum files in addition
@@ -97,34 +98,37 @@ CHANGES WITH 234:
           is empty, all plugins should not put anything in BOOT_DIR_ABS.
 
         Contributions from: Adrian Heine né Lang, Aggelos Avgerinos, Alexander
-        Kurtz, Alexandros Frantzis, Alexey Brodkin, Amir Pakdel, Amir Yalon,
-        Anchor Cat, Anthony Parsons, Bastien Nocera, Benjamin Gilbert, Charles
-        Plessy, Chris Chiu, Chris Lamb, Christian Brauner, Daniel Drake,
+        Kurtz, Alexandros Frantzis, Alexey Brodkin, Alex Lu, Amir Pakdel, Amir
+        Yalon, Anchor Cat, Anthony Parsons, Bastien Nocera, Benjamin Gilbert,
+        Benjamin Robin, Boucman, Charles Plessy, Chris Chiu, Chris Lamb,
+        Christian Brauner, Christian Hesse, Colin Walters, Daniel Drake,
         Danielle Church, Daniel Molkentin, Daniel Rusek, Daniel Wang, Davide
         Cavalca, David Herrmann, David Michael, Dax Kelson, Dimitri John
         Ledkov, Djalal Harouni, Dušan Kazik, Elias Probst, Evgeny Vereshchagin,
         Federico Di Pierro, Felipe Sateler, Felix Zhang, Franck Bui, Gary
-        Tierney, George McCollister, Hans de Goede, hecke, Hendrik Westerberg,
-        Hristo Venev, Ian Wienand, Insun Pyo, Ivan Shapovalov, James Cowgill,
-        James Hemsing, Janne Heß, Jan Synacek, Jason Reeder, João Paulo Rechi
-        Vita, John Paul Adrian Glaubitz, Jörg Thalheim, Josef Andersson, Josef
-        Gajdusek, Julian Mehne, Kai Krakow, Krzysztof Jackiewicz, Lars
-        Karlitski, Lennart Poettering, Lluís Gili, Lucas Werkmeister, Lukáš
-        Nykrýn, Łukasz Stelmach, Mantas Mikulėnas, Marcin Bachry, Marcus
-        Cooper, Mark Stosberg, Martin Pitt, Matija Skala, Matt Clarkson,
-        Matthias Greiner, Matthijs van Duin, Max Resch, Michael Biebl, Michal
-        Koutný, Michal Sekletar, Michal Suchanek, Nate Clark, Nathaniel
-        R. Lewis, Neil Brown, Pascal S. de Kloe, Pat Riehecky, Patrik Flykt,
-        Paul Kocialkowski, Peter Hutterer, Philip Withnall, Piotr Szydełko,
-        Rafael Fontenelle, Ray Strode, Richard Maw, Roelf Wichertjes, Ronny
-        Chevalier, Sarang S. Dalal, Sjoerd Simons, slodki, Stefan Schweter,
-        Susant Sahani, Ted Wood, Thomas Blume, Thomas Haller, Thomas
+        Tierney, George McCollister, Giedrius Statkevičius, Hans de Goede,
+        hecke, Hendrik Westerberg, Hristo Venev, Ian Wienand, Insun Pyo, Ivan
+        Shapovalov, James Cowgill, James Hemsing, Janne Heß, Jan Synacek, Jason
+        Reeder, João Paulo Rechi Vita, John Paul Adrian Glaubitz, Jörg
+        Thalheim, Josef Andersson, Josef Gajdusek, Julian Mehne, Kai Krakow,
+        Krzysztof Jackiewicz, Lars Karlitski, Lennart Poettering, Lluís Gili,
+        Lucas Werkmeister, Lukáš Nykrýn, Łukasz Stelmach, Mantas Mikulėnas,
+        Marcin Bachry, Marcus Cooper, Mark Stosberg, Martin Pitt, Matija Skala,
+        Matt Clarkson, Matthew Garrett, Matthias Greiner, Matthijs van Duin,
+        Max Resch, Michael Biebl, Michal Koutný, Michal Sekletar, Michal
+        Soltys, Michal Suchanek, Mike Gilbert, Nate Clark, Nathaniel R. Lewis,
+        Neil Brown, Nikolai Kondrashov, Pascal S. de Kloe, Pat Riehecky, Patrik
+        Flykt, Paul Kocialkowski, Peter Hutterer, Philip Withnall, Piotr
+        Szydełko, Rafael Fontenelle, Ray Strode, Richard Maw, Roelf Wichertjes,
+        Ronny Chevalier, Sarang S. Dalal, Sjoerd Simons, slodki, Stefan
+        Schweter, Susant Sahani, Ted Wood, Thomas Blume, Thomas Haller, Thomas
         H. P. Andersen, Timothée Ravier, Tobias Jungel, Tobias Stoeckmann, Tom
         Gundersen, Tom Yan, Torstein Husebø, Umut Tezduyar Lindskog,
-        userwithuid, Waldemar Brodkorb, WaLyong Cho, Yusuke Nojima, Yu
-        Watanabe, Zbigniew Jędrzejewski-Szmek
+        userwithuid, Vito Caputo, Waldemar Brodkorb, WaLyong Cho, Yu, Li-Yu,
+        Yusuke Nojima, Yu Watanabe, Zbigniew Jędrzejewski-Szmek, Дамјан
+        Георгиевски
 
-        — Berlin, 2017-06-XX
+        — Berlin, 2017-07-12
 
 CHANGES WITH 233:
 
diff --git a/TODO b/TODO
index bc46e33e4781db6bbe494afa4e5433e59e75605d..61efa5e9f3468bf3c0660cf3ee92a4e3ebfe986f 100644 (file)
--- a/TODO
+++ b/TODO
@@ -24,6 +24,10 @@ Janitorial Clean-ups:
 
 Features:
 
+* Add AddUser= setting to unit files, similar to DynamicUser=1 which however
+  creates a static, persistent user rather than a dynamic, transient user. We
+  can leverage code from sysusers.d for this.
+
 * add some optional flag to ReadWritePaths= and friends, that has the effect
   that we create the dir in question when the service is started. Example:
 
index 754615ebb8fb3d91a859f8a5f2ba7b35b4009bb4..c7537aafc0c92e42c72e83652e9542c2974ddd87 100644 (file)
@@ -1019,35 +1019,35 @@ AM_CONDITIONAL(HAVE_LIBCURL, [test "$have_libcurl" = "yes"])
 AM_CONDITIONAL(HAVE_REMOTE, [test "$have_microhttpd" = "yes" -o "$have_libcurl" = "yes"])
 
 # ------------------------------------------------------------------------------
-have_libidn2=no
-AC_ARG_ENABLE(libidn2, AS_HELP_STRING([--disable-libidn2], [disable optional LIBIDN2 support]))
-if test "x$enable_libidn2" != "xno"; then
-        PKG_CHECK_MODULES(LIBIDN2, [libidn2 >= 2.0.0],
-               [AC_DEFINE(HAVE_LIBIDN2, 1, [Define if libidn2 is available])
-                have_libidn2=yes
-                M4_DEFINES="$M4_DEFINES -DHAVE_LIBIDN2"],
-               [have_libidn2=no])
-        if test "x$have_libidn2" = "xno" -a "x$enable_libidn2" = "xyes"; then
-                AC_MSG_ERROR([*** libidn2 support requested but libraries not found])
+have_libidn=no
+AC_ARG_ENABLE(libidn, AS_HELP_STRING([--disable-libidn], [disable optional LIBIDN support]))
+if test "x$enable_libidn" != "xno"; then
+        PKG_CHECK_MODULES(LIBIDN, [libidn],
+               [AC_DEFINE(HAVE_LIBIDN, 1, [Define if libidn is available])
+                have_libidn=yes
+                M4_DEFINES="$M4_DEFINES -DHAVE_LIBIDN"],
+               [have_libidn=no])
+        if test "x$have_libidn" = "xno" -a "x$enable_libidn" = "xyes"; then
+                AC_MSG_ERROR([*** libidn support requested but libraries not found])
         fi
 fi
-AM_CONDITIONAL(HAVE_LIBIDN2, [test "$have_libidn2" = "yes"])
+AM_CONDITIONAL(HAVE_LIBIDN, [test "$have_libidn" = "yes"])
 
-have_libidn=no
-AC_ARG_ENABLE(libidn, AS_HELP_STRING([--disable-libidn], [disable optional LIBIDN support]))
-if test "$have_libidn2" != "yes"; then
-        if test "x$enable_libidn" != "xno"; then
-                PKG_CHECK_MODULES(LIBIDN, [libidn],
-                       [AC_DEFINE(HAVE_LIBIDN, 1, [Define if libidn is available])
-                        have_libidn=yes
-                        M4_DEFINES="$M4_DEFINES -DHAVE_LIBIDN"],
-                       [have_libidn=no])
-                if test "x$have_libidn" = "xno" -a "x$enable_libidn" = "xyes"; then
-                        AC_MSG_ERROR([*** libidn support requested but libraries not found])
+have_libidn2=no
+AC_ARG_ENABLE(libidn2, AS_HELP_STRING([--disable-libidn2], [disable optional LIBIDN2 support]))
+if test "$have_libidn" != "yes"; then
+        if test "x$enable_libidn2" != "xno"; then
+                PKG_CHECK_MODULES(LIBIDN2, [libidn2 >= 2.0.0],
+                       [AC_DEFINE(HAVE_LIBIDN2, 1, [Define if libidn2 is available])
+                        have_libidn2=yes
+                        M4_DEFINES="$M4_DEFINES -DHAVE_LIBIDN2"],
+                       [have_libidn2=no])
+                if test "x$have_libidn2" = "xno" -a "x$enable_libidn2" = "xyes"; then
+                        AC_MSG_ERROR([*** libidn2 support requested but libraries not found])
                 fi
         fi
 fi
-AM_CONDITIONAL(HAVE_LIBIDN, [test "$have_libidn" = "yes"])
+AM_CONDITIONAL(HAVE_LIBIDN2, [test "$have_libidn2" = "yes"])
 
 # ------------------------------------------------------------------------------
 have_idn=no
index e73841e106fc5d84226b3c4f2d9b7b3caddf61a5..5c1bb7fe207f6562ff9ee9605571dcf20023eab3 100644 (file)
@@ -1094,21 +1094,21 @@ OUI:70B3D58EC*
 OUI:70B3D5CF5*
  ID_OUI_FROM_DATABASE=Petring Energietechnik GmbH
 
+OUI:70B3D5269*
+ ID_OUI_FROM_DATABASE=Gilbarco Veeder-Root  ‎
+
 OUI:70B3D5FF7*
  ID_OUI_FROM_DATABASE=Cybercom AB
 
 OUI:70B3D5DCC*
  ID_OUI_FROM_DATABASE=Eutron SPA
 
-OUI:70B3D5269*
- ID_OUI_FROM_DATABASE=Gilbarco Veeder-Root  ‎
+OUI:70B3D515C*
+ ID_OUI_FROM_DATABASE=Woods Hole Oceanographic Institution
 
 OUI:70B3D5173*
  ID_OUI_FROM_DATABASE=National TeleConsultants LLC
 
-OUI:70B3D515C*
- ID_OUI_FROM_DATABASE=Woods Hole Oceanographic Institution
-
 OUI:70B3D5CAE*
  ID_OUI_FROM_DATABASE=THEMA
 
@@ -1124,12 +1124,12 @@ OUI:70B3D585A*
 OUI:70B3D5FAF*
  ID_OUI_FROM_DATABASE=Radig Hard & Software
 
-OUI:70B3D57A2*
- ID_OUI_FROM_DATABASE=Alpha ESS Co., Ltd.
-
 OUI:70B3D50BC*
  ID_OUI_FROM_DATABASE=Practical Software Studio LLC
 
+OUI:70B3D57A2*
+ ID_OUI_FROM_DATABASE=Alpha ESS Co., Ltd.
+
 OUI:70B3D5724*
  ID_OUI_FROM_DATABASE=Quan International Co., Ltd.
 
@@ -1196,21 +1196,21 @@ OUI:70B3D5495*
 OUI:70B3D5AD2*
  ID_OUI_FROM_DATABASE=Wart-Elektronik
 
-OUI:70B3D5276*
- ID_OUI_FROM_DATABASE=TELL Software Hungaria Kft.
-
 OUI:70B3D52B4*
  ID_OUI_FROM_DATABASE=Foerster-Technik GmbH
 
+OUI:70B3D5276*
+ ID_OUI_FROM_DATABASE=TELL Software Hungaria Kft.
+
 OUI:70B3D528C*
  ID_OUI_FROM_DATABASE=Step Technica Co., Ltd.
 
-OUI:70B3D5E50*
- ID_OUI_FROM_DATABASE=Advanced Vision Technology Ltd
-
 OUI:70B3D57E0*
  ID_OUI_FROM_DATABASE=Sanko-sha,inc.
 
+OUI:70B3D5E50*
+ ID_OUI_FROM_DATABASE=Advanced Vision Technology Ltd
+
 OUI:70B3D58C1*
  ID_OUI_FROM_DATABASE=Rievtech Electronic Co.,Ltd
 
@@ -1247,18 +1247,18 @@ OUI:70B3D5A48*
 OUI:70B3D546C*
  ID_OUI_FROM_DATABASE=SHANGHAI CHENZHU INSTRUMENT CO., LTD.
 
-OUI:70B3D5FAD*
- ID_OUI_FROM_DATABASE=ARC Technology Solutions, LLC
-
 OUI:70B3D580B*
  ID_OUI_FROM_DATABASE=Fischer Block, Inc.
 
-OUI:70B3D5E6C*
- ID_OUI_FROM_DATABASE=Fusar Technologies inc
+OUI:70B3D5FAD*
+ ID_OUI_FROM_DATABASE=ARC Technology Solutions, LLC
 
 OUI:70B3D5AB8*
  ID_OUI_FROM_DATABASE=HORIBA ABX SAS
 
+OUI:70B3D5E6C*
+ ID_OUI_FROM_DATABASE=Fusar Technologies inc
+
 OUI:70B3D52B0*
  ID_OUI_FROM_DATABASE=Beijing Zhongyi Yue Tai Technology Co., Ltd
 
@@ -1316,27 +1316,39 @@ OUI:70B3D5591*
 OUI:70B3D5133*
  ID_OUI_FROM_DATABASE=Vidisys GmbH
 
+OUI:70B3D5720*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:70B3D51E6*
+ ID_OUI_FROM_DATABASE=Sanmina Israel
+
 OUI:70B3D5809*
  ID_OUI_FROM_DATABASE=Tecnint HTE SRL
 
 OUI:70B3D52AB*
  ID_OUI_FROM_DATABASE=NASA Johnson Space Center
 
-OUI:70B3D5720*
- ID_OUI_FROM_DATABASE=Private
-
 OUI:70B3D5254*
  ID_OUI_FROM_DATABASE=Spectrum Brands
 
-OUI:70B3D51E6*
- ID_OUI_FROM_DATABASE=Sanmina Israel
-
 OUI:70B3D57C9*
  ID_OUI_FROM_DATABASE=Council Rock
 
 OUI:70B3D553A*
  ID_OUI_FROM_DATABASE=Pano0ramic Power
 
+OUI:70B3D5E18*
+ ID_OUI_FROM_DATABASE=Plasmapp Co.,Ltd.
+
+OUI:70B3D5D44*
+ ID_OUI_FROM_DATABASE=ic-automation GmbH
+
+OUI:70B3D59D7*
+ ID_OUI_FROM_DATABASE=KM OptoElektronik GmbH
+
+OUI:70B3D561B*
+ ID_OUI_FROM_DATABASE=Nubewell Networks Pvt Ltd
+
 OUI:70B3D5D60*
  ID_OUI_FROM_DATABASE=Flintab AB
 
@@ -2399,12 +2411,12 @@ OUI:70B3D521D*
 OUI:70B3D5E9C*
  ID_OUI_FROM_DATABASE=ATG UV Technology
 
-OUI:70B3D539E*
- ID_OUI_FROM_DATABASE=Lanmark Controls Inc.
-
 OUI:70B3D5267*
  ID_OUI_FROM_DATABASE=Zehntner Testing Instruments
 
+OUI:70B3D539E*
+ ID_OUI_FROM_DATABASE=Lanmark Controls Inc.
+
 OUI:70B3D5C2E*
  ID_OUI_FROM_DATABASE=Triax A/S
 
@@ -2447,12 +2459,12 @@ OUI:70B3D5DFD*
 OUI:70B3D5B30*
  ID_OUI_FROM_DATABASE=Systolé Hardware B.V.
 
-OUI:70B3D53BF*
- ID_OUI_FROM_DATABASE=Star Electronics GmbH & Co. KG
-
 OUI:70B3D5745*
  ID_OUI_FROM_DATABASE=TMSI LLC
 
+OUI:70B3D53BF*
+ ID_OUI_FROM_DATABASE=Star Electronics GmbH & Co. KG
+
 OUI:70B3D5D1C*
  ID_OUI_FROM_DATABASE=Specialised Imaging Limited
 
@@ -2465,12 +2477,12 @@ OUI:70B3D5ADF*
 OUI:70B3D522C*
  ID_OUI_FROM_DATABASE=Hiquel Elektronik- und Anlagenbau GmbH
 
-OUI:70B3D5DCE*
- ID_OUI_FROM_DATABASE=Stahl GmbH
-
 OUI:70B3D52A2*
  ID_OUI_FROM_DATABASE=Visualware, Inc.
 
+OUI:70B3D5DCE*
+ ID_OUI_FROM_DATABASE=Stahl GmbH
+
 OUI:70B3D5D08*
  ID_OUI_FROM_DATABASE=Veeco Instruments
 
@@ -2501,15 +2513,15 @@ OUI:70B3D542D*
 OUI:70B3D5332*
  ID_OUI_FROM_DATABASE=InnoSenT
 
-OUI:70B3D5DEE*
- ID_OUI_FROM_DATABASE=CRDE
-
 OUI:70B3D5A47*
  ID_OUI_FROM_DATABASE=KANOA INC
 
 OUI:70B3D5F45*
  ID_OUI_FROM_DATABASE=Norbit ODM AS
 
+OUI:70B3D5DEE*
+ ID_OUI_FROM_DATABASE=CRDE
+
 OUI:70B3D5E59*
  ID_OUI_FROM_DATABASE=Fracarro srl
 
@@ -2534,12 +2546,12 @@ OUI:70B3D5C17*
 OUI:70B3D5108*
  ID_OUI_FROM_DATABASE=TEX COMPUTER SRL
 
-OUI:70B3D5007*
- ID_OUI_FROM_DATABASE=SENSONEO
-
 OUI:70B3D54E7*
  ID_OUI_FROM_DATABASE=Digital Domain
 
+OUI:70B3D5007*
+ ID_OUI_FROM_DATABASE=SENSONEO
+
 OUI:70B3D5D10*
  ID_OUI_FROM_DATABASE=Contec DTx
 
@@ -2576,12 +2588,12 @@ OUI:70B3D5FDB*
 OUI:70B3D5791*
  ID_OUI_FROM_DATABASE=Romteck Australia
 
-OUI:70B3D5D20*
- ID_OUI_FROM_DATABASE=Rheonics GmbH
-
 OUI:70B3D569F*
  ID_OUI_FROM_DATABASE=T+A elektroakustik GmbH & Co.KG
 
+OUI:70B3D5D20*
+ ID_OUI_FROM_DATABASE=Rheonics GmbH
+
 OUI:70B3D55FB*
  ID_OUI_FROM_DATABASE=TELEPLATFORMS
 
@@ -2621,9 +2633,6 @@ OUI:70B3D530D*
 OUI:70B3D5842*
  ID_OUI_FROM_DATABASE=PLUTO Solution co.,ltd.
 
-OUI:70B3D5580*
- ID_OUI_FROM_DATABASE=Private
-
 OUI:70B3D5EB9*
  ID_OUI_FROM_DATABASE=Thiel Audio Products Company, LLC
 
@@ -2636,6 +2645,48 @@ OUI:70B3D5548*
 OUI:70B3D5284*
  ID_OUI_FROM_DATABASE=Globalcom Engineering SPA
 
+OUI:70B3D5A4E*
+ ID_OUI_FROM_DATABASE=Array Technologies Inc.
+
+OUI:70B3D5580*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:70B3D52F2*
+ ID_OUI_FROM_DATABASE=Health Care Originals, Inc.
+
+OUI:70B3D5B98*
+ ID_OUI_FROM_DATABASE=GSF Corporation Pte Ltd
+
+OUI:70B3D5BA9*
+ ID_OUI_FROM_DATABASE=Alma
+
+OUI:70B3D50DE*
+ ID_OUI_FROM_DATABASE=Grossenbacher Systeme AG
+
+OUI:70B3D54B8*
+ ID_OUI_FROM_DATABASE=International Roll-Call Corporation
+
+OUI:70B3D5991*
+ ID_OUI_FROM_DATABASE=Javasparrow Inc.
+
+OUI:70B3D5894*
+ ID_OUI_FROM_DATABASE=UnI Systech Co.,Ltd
+
+OUI:70B3D516B*
+ ID_OUI_FROM_DATABASE=IOT Engineering
+
+OUI:70B3D53AA*
+ ID_OUI_FROM_DATABASE=RCATSONE
+
+OUI:70B3D5432*
+ ID_OUI_FROM_DATABASE=DEUTA-WERKE GmbH
+
+OUI:70B3D5086*
+ ID_OUI_FROM_DATABASE=Husty M.Styczen J.Hupert Sp.J.
+
+OUI:70B3D5E17*
+ ID_OUI_FROM_DATABASE=Private
+
 OUI:70B3D5494*
  ID_OUI_FROM_DATABASE=Schildknecht AG
 
@@ -3680,15 +3731,15 @@ OUI:70B3D516F*
 OUI:70B3D59C0*
  ID_OUI_FROM_DATABASE=Schneider Displaytechnik GmbH
 
-OUI:70B3D5149*
- ID_OUI_FROM_DATABASE=eleven-x
-
 OUI:70B3D5E98*
  ID_OUI_FROM_DATABASE=JSC Kaluga Astral
 
 OUI:70B3D5443*
  ID_OUI_FROM_DATABASE=Slot3 GmbH
 
+OUI:70B3D5149*
+ ID_OUI_FROM_DATABASE=eleven-x
+
 OUI:70B3D5952*
  ID_OUI_FROM_DATABASE=REQUEA
 
@@ -3701,12 +3752,12 @@ OUI:70B3D5C5C*
 OUI:70B3D5F3B*
  ID_OUI_FROM_DATABASE=Epdm Pty Ltd
 
-OUI:70B3D59F6*
- ID_OUI_FROM_DATABASE=Edgeware AB
-
 OUI:70B3D536F*
  ID_OUI_FROM_DATABASE=BuddyGuard GmbH
 
+OUI:70B3D59F6*
+ ID_OUI_FROM_DATABASE=Edgeware AB
+
 OUI:70B3D5222*
  ID_OUI_FROM_DATABASE=Marioff Corporation Oy
 
@@ -3788,12 +3839,12 @@ OUI:70B3D5365*
 OUI:70B3D5805*
  ID_OUI_FROM_DATABASE=Eurotronik Kranj d.o.o.
 
-OUI:70B3D50B4*
- ID_OUI_FROM_DATABASE=AVER
-
 OUI:70B3D5BF6*
  ID_OUI_FROM_DATABASE=comtac AG
 
+OUI:70B3D50B4*
+ ID_OUI_FROM_DATABASE=AVER
+
 OUI:70B3D51B6*
  ID_OUI_FROM_DATABASE=DACOM West GmbH
 
@@ -3812,12 +3863,12 @@ OUI:70B3D5AEF*
 OUI:70B3D5D92*
  ID_OUI_FROM_DATABASE=Zamir Recognition Systems Ltd.
 
-OUI:70B3D5CC9*
- ID_OUI_FROM_DATABASE=Rapiscan Systems
-
 OUI:70B3D5DA4*
  ID_OUI_FROM_DATABASE=CRDE
 
+OUI:70B3D5CC9*
+ ID_OUI_FROM_DATABASE=Rapiscan Systems
+
 OUI:70B3D52D0*
  ID_OUI_FROM_DATABASE=ijin co.,ltd.
 
@@ -3917,6 +3968,24 @@ OUI:70B3D5557*
 OUI:70B3D568C*
  ID_OUI_FROM_DATABASE=ND METER
 
+OUI:70B3D5727*
+ ID_OUI_FROM_DATABASE=LP Technologies Inc.
+
+OUI:70B3D549B*
+ ID_OUI_FROM_DATABASE=Algodue Elettronica Srl
+
+OUI:70B3D57F9*
+ ID_OUI_FROM_DATABASE=CSS Inc.
+
+OUI:70B3D592B*
+ ID_OUI_FROM_DATABASE=ENTEC Electric & Electronic Co., LTD.
+
+OUI:70B3D5B13*
+ ID_OUI_FROM_DATABASE=Omwave
+
+OUI:70B3D5EA7*
+ ID_OUI_FROM_DATABASE=S.I.C.E.S. srl
+
 OUI:70B3D566B*
  ID_OUI_FROM_DATABASE=Innitive B.V.
 
@@ -4937,12 +5006,12 @@ OUI:70B3D590B*
 OUI:70B3D5C4B*
  ID_OUI_FROM_DATABASE=ANKER-EAST
 
-OUI:70B3D568E*
- ID_OUI_FROM_DATABASE=CEA Technologies Pty Ltd
-
 OUI:70B3D5542*
  ID_OUI_FROM_DATABASE=RTDS Technologies Inc.
 
+OUI:70B3D568E*
+ ID_OUI_FROM_DATABASE=CEA Technologies Pty Ltd
+
 OUI:70B3D51E4*
  ID_OUI_FROM_DATABASE=Tecnologix s.r.l.
 
@@ -4967,15 +5036,15 @@ OUI:70B3D5FBF*
 OUI:70B3D5825*
  ID_OUI_FROM_DATABASE=TATTILE SRL
 
-OUI:70B3D5D37*
- ID_OUI_FROM_DATABASE=Sicon srl
-
 OUI:70B3D5039*
  ID_OUI_FROM_DATABASE=DoWoo Digitech
 
 OUI:70B3D527E*
  ID_OUI_FROM_DATABASE=Mettler Toledo Hi Speed
 
+OUI:70B3D5D37*
+ ID_OUI_FROM_DATABASE=Sicon srl
+
 OUI:70B3D5F83*
  ID_OUI_FROM_DATABASE=Tata Communications Ltd.
 
@@ -4988,33 +5057,33 @@ OUI:70B3D50D9*
 OUI:70B3D537C*
  ID_OUI_FROM_DATABASE=Merus Power Dynamics Ltd.
 
-OUI:70B3D5EF8*
- ID_OUI_FROM_DATABASE=DKS Dienstl.ges. f. Komm.anl. d. Stadt- u. Reg.verk. mbH
-
 OUI:70B3D54CF*
  ID_OUI_FROM_DATABASE=GREEN HOUSE CO., LTD.
 
+OUI:70B3D5EF8*
+ ID_OUI_FROM_DATABASE=DKS Dienstl.ges. f. Komm.anl. d. Stadt- u. Reg.verk. mbH
+
 OUI:70B3D5D58*
  ID_OUI_FROM_DATABASE=Idyllic Engineering Pte Ltd
 
 OUI:70B3D5954*
  ID_OUI_FROM_DATABASE=Dot System S.r.l.
 
-OUI:70B3D5D40*
- ID_OUI_FROM_DATABASE=CRDE
-
 OUI:70B3D5880*
  ID_OUI_FROM_DATABASE=Skopei B.V.
 
+OUI:70B3D5D40*
+ ID_OUI_FROM_DATABASE=CRDE
+
 OUI:70B3D551C*
  ID_OUI_FROM_DATABASE=ATX Networks Corp
 
-OUI:70B3D5FBD*
- ID_OUI_FROM_DATABASE=MB connect line GmbH Fernwartungssysteme
-
 OUI:70B3D5511*
  ID_OUI_FROM_DATABASE=Next Sight srl
 
+OUI:70B3D5FBD*
+ ID_OUI_FROM_DATABASE=MB connect line GmbH Fernwartungssysteme
+
 OUI:70B3D5FA7*
  ID_OUI_FROM_DATABASE=Nordson Corporation
 
@@ -5033,12 +5102,12 @@ OUI:70B3D5902*
 OUI:70B3D5AD1*
  ID_OUI_FROM_DATABASE=Sensile Technologies SA
 
-OUI:70B3D5397*
- ID_OUI_FROM_DATABASE=Guangxi Hunter Information Industry Co.,Ltd
-
 OUI:70B3D5637*
  ID_OUI_FROM_DATABASE=INEO-SENSE
 
+OUI:70B3D5397*
+ ID_OUI_FROM_DATABASE=Guangxi Hunter Information Industry Co.,Ltd
+
 OUI:70B3D5378*
  ID_OUI_FROM_DATABASE=synchrotron SOLEIL
 
@@ -5078,15 +5147,15 @@ OUI:70B3D5FF1*
 OUI:70B3D5002*
  ID_OUI_FROM_DATABASE=Gogo BA
 
-OUI:70B3D5138*
- ID_OUI_FROM_DATABASE=SMITEC S.p.A.
-
 OUI:70B3D50B0*
  ID_OUI_FROM_DATABASE=Raven Systems Design, Inc
 
 OUI:70B3D5596*
  ID_OUI_FROM_DATABASE=Mencom Corporation
 
+OUI:70B3D5138*
+ ID_OUI_FROM_DATABASE=SMITEC S.p.A.
+
 OUI:70B3D517A*
  ID_OUI_FROM_DATABASE=Gencoa Ltd
 
@@ -5108,24 +5177,24 @@ OUI:70B3D5211*
 OUI:70B3D560A*
  ID_OUI_FROM_DATABASE=TATA POWER SED
 
-OUI:70B3D5479*
- ID_OUI_FROM_DATABASE=LINEAGE POWER PVT LTD.,
-
 OUI:70B3D5129*
  ID_OUI_FROM_DATABASE=OOO Microlink-Svyaz
 
+OUI:70B3D5479*
+ ID_OUI_FROM_DATABASE=LINEAGE POWER PVT LTD.,
+
 OUI:70B3D564C*
  ID_OUI_FROM_DATABASE=ACEMIS FRANCE
 
 OUI:70B3D5763*
  ID_OUI_FROM_DATABASE=A Trap, USA
 
-OUI:70B3D547F*
- ID_OUI_FROM_DATABASE=ASE GmbH
-
 OUI:70B3D5175*
  ID_OUI_FROM_DATABASE=Akribis Systems
 
+OUI:70B3D547F*
+ ID_OUI_FROM_DATABASE=ASE GmbH
+
 OUI:70B3D5DC9*
  ID_OUI_FROM_DATABASE=Sensoterra BV
 
@@ -5201,6 +5270,15 @@ OUI:70B3D507F*
 OUI:70B3D56E8*
  ID_OUI_FROM_DATABASE=Blu Wireless Technology Ltd
 
+OUI:70B3D5CD3*
+ ID_OUI_FROM_DATABASE=Controlrad
+
+OUI:70B3D54E5*
+ ID_OUI_FROM_DATABASE=viZaar industrial imaging AG
+
+OUI:70B3D5DE6*
+ ID_OUI_FROM_DATABASE=MB connect line GmbH Fernwartungssysteme
+
 OUI:70B3D58AB*
  ID_OUI_FROM_DATABASE=EMAC, Inc.
 
@@ -6212,12 +6290,12 @@ OUI:70B3D520D*
 OUI:70B3D5D55*
  ID_OUI_FROM_DATABASE=WM Design s.r.o
 
-OUI:70B3D5523*
- ID_OUI_FROM_DATABASE=Tibit Communications
-
 OUI:70B3D5E67*
  ID_OUI_FROM_DATABASE=APPLIED PROCESSING
 
+OUI:70B3D5523*
+ ID_OUI_FROM_DATABASE=Tibit Communications
+
 OUI:70B3D5241*
  ID_OUI_FROM_DATABASE=Bolide Technology Group, Inc.
 
@@ -6248,15 +6326,15 @@ OUI:70B3D5A05*
 OUI:70B3D5AA6*
  ID_OUI_FROM_DATABASE=Proximus
 
+OUI:70B3D51D4*
+ ID_OUI_FROM_DATABASE=Brinkmann Audio GmbH
+
 OUI:70B3D55E5*
  ID_OUI_FROM_DATABASE=HAIYANG OLIX CO.,LTD.
 
 OUI:70B3D5E2C*
  ID_OUI_FROM_DATABASE=Fourth Frontier Technologies Private Limited
 
-OUI:70B3D51D4*
- ID_OUI_FROM_DATABASE=Brinkmann Audio GmbH
-
 OUI:70B3D55CA*
  ID_OUI_FROM_DATABASE=ACD Elekronik GmbH
 
@@ -6290,12 +6368,12 @@ OUI:70B3D5EC8*
 OUI:70B3D53F0*
  ID_OUI_FROM_DATABASE=Intervala
 
-OUI:70B3D5B1A*
- ID_OUI_FROM_DATABASE=Aaronia AG
-
 OUI:70B3D5BD1*
  ID_OUI_FROM_DATABASE=CableLabs
 
+OUI:70B3D5B1A*
+ ID_OUI_FROM_DATABASE=Aaronia AG
+
 OUI:70B3D5F0D*
  ID_OUI_FROM_DATABASE=MeQ Inc.
 
@@ -6386,12 +6464,12 @@ OUI:70B3D5E22*
 OUI:70B3D5408*
  ID_OUI_FROM_DATABASE=Comrod AS
 
-OUI:70B3D5D4D*
- ID_OUI_FROM_DATABASE=The Morey Corporation
-
 OUI:70B3D5945*
  ID_OUI_FROM_DATABASE=Symboticware Incorporated
 
+OUI:70B3D5D4D*
+ ID_OUI_FROM_DATABASE=The Morey Corporation
+
 OUI:70B3D5192*
  ID_OUI_FROM_DATABASE=ASPT, INC.
 
@@ -6440,12 +6518,12 @@ OUI:70B3D5D43*
 OUI:70B3D5A35*
  ID_OUI_FROM_DATABASE=Sicon srl
 
-OUI:70B3D5279*
- ID_OUI_FROM_DATABASE=Private
-
 OUI:70B3D5359*
  ID_OUI_FROM_DATABASE=Boutronic
 
+OUI:70B3D5279*
+ ID_OUI_FROM_DATABASE=Private
+
 OUI:001BC50B2*
  ID_OUI_FROM_DATABASE=SKODA ELECTRIC a.s.
 
@@ -6464,6 +6542,12 @@ OUI:70B3D55B8*
 OUI:70B3D5203*
  ID_OUI_FROM_DATABASE=WOOJIN Inc
 
+OUI:70B3D5845*
+ ID_OUI_FROM_DATABASE=Harborside Technology
+
+OUI:70B3D52F4*
+ ID_OUI_FROM_DATABASE=Radixon s.r.o.
+
 OUI:1C8776D*
  ID_OUI_FROM_DATABASE=Qivivo
 
@@ -7424,6 +7508,18 @@ OUI:CC22375*
 OUI:CC22378*
  ID_OUI_FROM_DATABASE=Safilo S.p.A.
 
+OUI:741AE00*
+ ID_OUI_FROM_DATABASE=Huano International Technology Limited
+
+OUI:741AE07*
+ ID_OUI_FROM_DATABASE=BÄR Bahnsicherung AG
+
+OUI:741AE01*
+ ID_OUI_FROM_DATABASE=Socionext Inc.
+
+OUI:741AE0A*
+ ID_OUI_FROM_DATABASE=SAIERCOM CORPORATION
+
 OUI:1C8776C*
  ID_OUI_FROM_DATABASE=Strone Technology
 
@@ -8351,6 +8447,21 @@ OUI:CC22372*
 OUI:04714B2*
  ID_OUI_FROM_DATABASE=Shenzhen WayOS Technology Crop., Ltd.
 
+OUI:741AE04*
+ ID_OUI_FROM_DATABASE=Revl Inc.
+
+OUI:741AE09*
+ ID_OUI_FROM_DATABASE=Private
+
+OUI:741AE0B*
+ ID_OUI_FROM_DATABASE=SHEN ZHEN YINGJIACHUANG ELECTRONICS TECHNOLOGY CO.,LTD.
+
+OUI:741AE05*
+ ID_OUI_FROM_DATABASE=FUJIAN TAILI COMMUNICATION TECHNOLOGY CO.,LTD
+
+OUI:741AE0C*
+ ID_OUI_FROM_DATABASE=bistos.co.ltd
+
 OUI:1C87765*
  ID_OUI_FROM_DATABASE=Zhuhai MYZR Technology Co.,Ltd
 
@@ -9137,12 +9248,12 @@ OUI:1CA0D3B*
 OUI:1CA0D3D*
  ID_OUI_FROM_DATABASE=ERATO (HK) Corporation Limited
 
-OUI:1CA0D3A*
- ID_OUI_FROM_DATABASE=DSM Messtechnik GmbH
-
 OUI:1CA0D38*
  ID_OUI_FROM_DATABASE=Desarrollos y Soluciones Guinea I+D S.L.
 
+OUI:1CA0D3A*
+ ID_OUI_FROM_DATABASE=DSM Messtechnik GmbH
+
 OUI:A411638*
  ID_OUI_FROM_DATABASE=Dspread Technology (Beijing) Inc.
 
@@ -9152,12 +9263,12 @@ OUI:A411639*
 OUI:A41163A*
  ID_OUI_FROM_DATABASE=ISE GmbH
 
-OUI:A411635*
- ID_OUI_FROM_DATABASE=Carbon, Inc.
-
 OUI:4CE1731*
  ID_OUI_FROM_DATABASE=Nexoforge Inc.
 
+OUI:A411635*
+ ID_OUI_FROM_DATABASE=Carbon, Inc.
+
 OUI:144FD70*
  ID_OUI_FROM_DATABASE=annapurnalabs
 
@@ -9239,12 +9350,12 @@ OUI:F88A3C4*
 OUI:F88A3C0*
  ID_OUI_FROM_DATABASE=ART SPA
 
-OUI:F88A3CA*
- ID_OUI_FROM_DATABASE=Protos GmbH
-
 OUI:F88A3CE*
  ID_OUI_FROM_DATABASE=Avateq Corp.
 
+OUI:F88A3CA*
+ ID_OUI_FROM_DATABASE=Protos GmbH
+
 OUI:7CBACC0*
  ID_OUI_FROM_DATABASE=TGT Limited
 
@@ -9263,10 +9374,10 @@ OUI:BC3400F*
 OUI:28F537D*
  ID_OUI_FROM_DATABASE=Skyrockettoys LLC
 
-OUI:80E4DAF*
+OUI:7419F8F*
  ID_OUI_FROM_DATABASE=Private
 
-OUI:7419F8F*
+OUI:80E4DAF*
  ID_OUI_FROM_DATABASE=Private
 
 OUI:28F5373*
@@ -9329,6 +9440,12 @@ OUI:CC22371*
 OUI:CC2237B*
  ID_OUI_FROM_DATABASE=Tolomatic, Inc.
 
+OUI:AC1DDF6*
+ ID_OUI_FROM_DATABASE=Shenzheng SenseTime Technology Co. Ltd
+
+OUI:741AE02*
+ ID_OUI_FROM_DATABASE=NURA HOLDINGS PTY LTD
+
 OUI:1C8776B*
  ID_OUI_FROM_DATABASE=Hekatron Vertriebs GmbH
 
@@ -10319,9 +10436,6 @@ OUI:34008A6*
 OUI:34298FD*
  ID_OUI_FROM_DATABASE=Keystone Electronic Solutions
 
-OUI:34298FB*
- ID_OUI_FROM_DATABASE=Schnick-Schnack-Systems GmbH
-
 OUI:34298F7*
  ID_OUI_FROM_DATABASE=Dongguan Kingtron Electronics Tech Co., Ltd
 
@@ -10358,6 +10472,18 @@ OUI:38B8EB7*
 OUI:CC22377*
  ID_OUI_FROM_DATABASE=Shanghai Doit IOT Technology Co.,Ltd.
 
+OUI:34298FB*
+ ID_OUI_FROM_DATABASE=Schnick-Schnack-Systems GmbH
+
+OUI:741AE0D*
+ ID_OUI_FROM_DATABASE=Voltaware Services Limited
+
+OUI:741AE0E*
+ ID_OUI_FROM_DATABASE=ITS Partner (O.B.S) S.L.
+
+OUI:AC1DDF5*
+ ID_OUI_FROM_DATABASE=Shenzhen Ouzheng Electronic Tech Co,.Ltd
+
 OUI:1C87740*
  ID_OUI_FROM_DATABASE=Philips Personal Health Solutions
 
@@ -11147,12 +11273,12 @@ OUI:8C147D8*
 OUI:A0C5F28*
  ID_OUI_FROM_DATABASE=CoolR Group Inc
 
-OUI:A0C5F21*
- ID_OUI_FROM_DATABASE=KNS Group LLC (YADRO Company)
-
 OUI:A0C5F2A*
  ID_OUI_FROM_DATABASE=Serious Integrated, Inc.
 
+OUI:A0C5F21*
+ ID_OUI_FROM_DATABASE=KNS Group LLC (YADRO Company)
+
 OUI:4C65A81*
  ID_OUI_FROM_DATABASE=Beijing Bluehalo Internet Inc.
 
@@ -11168,27 +11294,27 @@ OUI:4C65A85*
 OUI:4C65A8B*
  ID_OUI_FROM_DATABASE=ZMIN Technologies
 
-OUI:F88A3C3*
- ID_OUI_FROM_DATABASE=Shenzhen Shengyuan Tech Ltd.
-
-OUI:4C65A8E*
- ID_OUI_FROM_DATABASE=High Infinity Germany
-
 OUI:F88A3CC*
  ID_OUI_FROM_DATABASE=EXCETOP TECHNOLOGY (BEIJING) CO., LTD.
 
+OUI:F88A3C3*
+ ID_OUI_FROM_DATABASE=Shenzhen Shengyuan Tech Ltd.
+
 OUI:F88A3C6*
  ID_OUI_FROM_DATABASE=Beijing Zhong Chuang Communication Technology Ltd.
 
+OUI:4C65A8E*
+ ID_OUI_FROM_DATABASE=High Infinity Germany
+
 OUI:F88A3C2*
  ID_OUI_FROM_DATABASE=KLATU Networks Inc
 
-OUI:F88A3CB*
- ID_OUI_FROM_DATABASE=FARA AS
-
 OUI:F88A3CD*
  ID_OUI_FROM_DATABASE=THK Co.,LTD.
 
+OUI:F88A3CB*
+ ID_OUI_FROM_DATABASE=FARA AS
+
 OUI:7CBACC7*
  ID_OUI_FROM_DATABASE=Virgin Orbit
 
@@ -11198,21 +11324,21 @@ OUI:7CBACC1*
 OUI:807B85F*
  ID_OUI_FROM_DATABASE=Private
 
+OUI:549A11F*
+ ID_OUI_FROM_DATABASE=Private
+
 OUI:141FBAF*
  ID_OUI_FROM_DATABASE=Private
 
 OUI:B437D1F*
  ID_OUI_FROM_DATABASE=Private
 
-OUI:549A11F*
- ID_OUI_FROM_DATABASE=Private
+OUI:7CBACC8*
+ ID_OUI_FROM_DATABASE=Collinear Networks Inc.
 
 OUI:7CBACC6*
  ID_OUI_FROM_DATABASE=Fossil Power Systems Inc
 
-OUI:7CBACC8*
- ID_OUI_FROM_DATABASE=Collinear Networks Inc.
-
 OUI:78D8004*
  ID_OUI_FROM_DATABASE=CS Instruments GmbH
 
@@ -11243,21 +11369,21 @@ OUI:986D359*
 OUI:34008A3*
  ID_OUI_FROM_DATABASE=Globex 99 LTD
 
-OUI:34008A1*
- ID_OUI_FROM_DATABASE=ZQAM Communications
-
 OUI:34008AD*
  ID_OUI_FROM_DATABASE=ChengDu HuiZhong Cloud Information Technology Co., Ltd.
 
+OUI:34008A1*
+ ID_OUI_FROM_DATABASE=ZQAM Communications
+
 OUI:34008A5*
  ID_OUI_FROM_DATABASE=Federal Aviation Administration
 
-OUI:34008AE*
- ID_OUI_FROM_DATABASE=SHENZHEN WXL ELECTRONICS CO., LTD.
-
 OUI:34298F2*
  ID_OUI_FROM_DATABASE=Shenzhen Advance River System Technology Co., Ltd
 
+OUI:34008AE*
+ ID_OUI_FROM_DATABASE=SHENZHEN WXL ELECTRONICS CO., LTD.
+
 OUI:34298F9*
  ID_OUI_FROM_DATABASE=Wiesheu GmbH
 
@@ -11300,6 +11426,18 @@ OUI:CC22379*
 OUI:CC22373*
  ID_OUI_FROM_DATABASE=XConnect Professional Services
 
+OUI:CC2237E*
+ ID_OUI_FROM_DATABASE=MANUFACTURAS Y TRANSFORMADOS AB, S.L.
+
+OUI:741AE08*
+ ID_OUI_FROM_DATABASE=Broadcast Wireless Systems Ltd
+
+OUI:741AE06*
+ ID_OUI_FROM_DATABASE=Blocks Wearables Inc.
+
+OUI:741AE03*
+ ID_OUI_FROM_DATABASE=Philips Personal Health Solutions
+
 OUI:E043DB*
  ID_OUI_FROM_DATABASE=Shenzhen ViewAt Technology Co.,Ltd.
 
@@ -25427,18 +25565,42 @@ OUI:C449BB*
 OUI:B430C0*
  ID_OUI_FROM_DATABASE=York Instruments Ltd
 
-OUI:F0BD2E*
- ID_OUI_FROM_DATABASE=H+S Polatis Ltd
-
 OUI:C468D0*
  ID_OUI_FROM_DATABASE=VTech Telecommunications Ltd.
 
 OUI:48D6D5*
  ID_OUI_FROM_DATABASE=Google, Inc.
 
+OUI:F0BD2E*
+ ID_OUI_FROM_DATABASE=H+S Polatis Ltd
+
 OUI:842C80*
  ID_OUI_FROM_DATABASE=Sichuan Changhong Electric Ltd.
 
+OUI:182D98*
+ ID_OUI_FROM_DATABASE=Jinwoo Industrial system
+
+OUI:0C1C20*
+ ID_OUI_FROM_DATABASE=Kakao Corp
+
+OUI:40498A*
+ ID_OUI_FROM_DATABASE=Synapticon GmbH
+
+OUI:D80831*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:24F27F*
+ ID_OUI_FROM_DATABASE=Hewlett Packard Enterprise
+
+OUI:00B69F*
+ ID_OUI_FROM_DATABASE=Latch
+
+OUI:A88200*
+ ID_OUI_FROM_DATABASE=Hisense Electric Co.,Ltd
+
+OUI:F449EF*
+ ID_OUI_FROM_DATABASE=EMSTONE
+
 OUI:0C6F9C*
  ID_OUI_FROM_DATABASE=Shaw Communications Inc.
 
@@ -29087,9 +29249,6 @@ OUI:E8757F*
 OUI:C83EA7*
  ID_OUI_FROM_DATABASE=KUNBUS GmbH
 
-OUI:A8D3C8*
- ID_OUI_FROM_DATABASE=Wachendorff Elektronik  GmbH & Co. KG
-
 OUI:E0CF2D*
  ID_OUI_FROM_DATABASE=Gemintek Corporation
 
@@ -33434,9 +33593,6 @@ OUI:000903*
 OUI:0008FE*
  ID_OUI_FROM_DATABASE=UNIK C&C Co.,Ltd.
 
-OUI:0008FA*
- ID_OUI_FROM_DATABASE=Karl E.Brinkmann GmbH
-
 OUI:0008EE*
  ID_OUI_FROM_DATABASE=Logic Product Development
 
@@ -39551,6 +39707,51 @@ OUI:583879*
 OUI:94282E*
  ID_OUI_FROM_DATABASE=New H3C Technologies Co., Ltd
 
+OUI:887598*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:D0B128*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:FCEEE6*
+ ID_OUI_FROM_DATABASE=FORMIKE ELECTRONIC CO., LTD
+
+OUI:D843ED*
+ ID_OUI_FROM_DATABASE=Suzuken
+
+OUI:2C431A*
+ ID_OUI_FROM_DATABASE=Shenzhen YOUHUA Technology Co., Ltd
+
+OUI:A8D3C8*
+ ID_OUI_FROM_DATABASE=Topcon Electronics GmbH & Co. KG
+
+OUI:389F5A*
+ ID_OUI_FROM_DATABASE=C-Kur TV Inc.
+
+OUI:24B209*
+ ID_OUI_FROM_DATABASE=Avaya Inc
+
+OUI:24E124*
+ ID_OUI_FROM_DATABASE=Xiamen Ursaconn Technology Co. , Ltd.
+
+OUI:DC68EB*
+ ID_OUI_FROM_DATABASE=Nintendo Co.,Ltd
+
+OUI:9441C1*
+ ID_OUI_FROM_DATABASE=Mini-Cam Limited
+
+OUI:E8D819*
+ ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
+
+OUI:0008FA*
+ ID_OUI_FROM_DATABASE=KEB Automation KG
+
+OUI:18396E*
+ ID_OUI_FROM_DATABASE=SUNSEA TELECOMMUNICATIONS CO.,LTD.
+
+OUI:E8DF70*
+ ID_OUI_FROM_DATABASE=AVM Audiovisuelles Marketing und Computersysteme GmbH
+
 OUI:5846E1*
  ID_OUI_FROM_DATABASE=Baxter International Inc
 
@@ -42008,9 +42209,6 @@ OUI:7093F8*
 OUI:305D38*
  ID_OUI_FROM_DATABASE=Beissbarth
 
-OUI:FCD6BD*
- ID_OUI_FROM_DATABASE=Robert Bosch GmbH
-
 OUI:044A50*
  ID_OUI_FROM_DATABASE=Ramaxel Technology (Shenzhen) limited company
 
@@ -53429,6 +53627,42 @@ OUI:5CA176*
 OUI:C8E7F0*
  ID_OUI_FROM_DATABASE=Juniper Networks
 
+OUI:087808*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:D03169*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:BC5451*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:24F5A2*
+ ID_OUI_FROM_DATABASE=Belkin International Inc.
+
+OUI:782D7E*
+ ID_OUI_FROM_DATABASE=TRENDnet, Inc.
+
+OUI:BCC31B*
+ ID_OUI_FROM_DATABASE=Kygo Life AS
+
+OUI:FCD6BD*
+ ID_OUI_FROM_DATABASE=Robert Bosch GmbH
+
+OUI:48BA4E*
+ ID_OUI_FROM_DATABASE=Hewlett Packard
+
+OUI:FC65DE*
+ ID_OUI_FROM_DATABASE=Amazon Technologies Inc.
+
+OUI:B06EBF*
+ ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC.
+
+OUI:28AD3E*
+ ID_OUI_FROM_DATABASE=Shenzhen TONG BO WEI Technology CO.,LTD
+
+OUI:F092B4*
+ ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+
 OUI:D86CE9*
  ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
@@ -66011,9 +66245,6 @@ OUI:AC587B*
 OUI:30E171*
  ID_OUI_FROM_DATABASE=Hewlett Packard
 
-OUI:D490E0*
- ID_OUI_FROM_DATABASE=Wachendorff Automation GmbH & Co KG
-
 OUI:8C3C4A*
  ID_OUI_FROM_DATABASE=NAKAYO Inc
 
@@ -67544,6 +67775,27 @@ OUI:746EE4*
 OUI:F44C70*
  ID_OUI_FROM_DATABASE=Skyworth Digital Technology(Shenzhen) Co.,Ltd
 
+OUI:98C5DB*
+ ID_OUI_FROM_DATABASE=Ericsson AB
+
+OUI:043A0D*
+ ID_OUI_FROM_DATABASE=SM Optics S.r.l.
+
+OUI:9CE063*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:9C9C40*
+ ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO., LTD
+
+OUI:D490E0*
+ ID_OUI_FROM_DATABASE=Topcon Electronics GmbH & Co. KG
+
+OUI:E8361D*
+ ID_OUI_FROM_DATABASE=Sense Labs, Inc.
+
+OUI:EC7D11*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
+
 OUI:2C3996*
  ID_OUI_FROM_DATABASE=Sagemcom Broadband SAS
 
@@ -81725,11 +81977,59 @@ OUI:78617C*
 OUI:00A096*
  ID_OUI_FROM_DATABASE=MITSUMI ELECTRIC CO.,LTD.
 
+OUI:A07099*
+ ID_OUI_FROM_DATABASE=Beijing Huacan Electronics Co., Ltd
+
 OUI:B0935B*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
 OUI:20F19E*
  ID_OUI_FROM_DATABASE=ARRIS Group, Inc.
 
-OUI:A07099*
- ID_OUI_FROM_DATABASE=Beijing Huacan Electronics Co., Ltd
+OUI:389D92*
+ ID_OUI_FROM_DATABASE=Seiko Epson Corporation
+
+OUI:74860B*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:C0174D*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:A407B6*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:149F3C*
+ ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd
+
+OUI:149FB6*
+ ID_OUI_FROM_DATABASE=GUANGDONG GENIUS TECHNOLOGY CO.,LTD.
+
+OUI:7C1C4E*
+ ID_OUI_FROM_DATABASE=LG Innotek
+
+OUI:70708B*
+ ID_OUI_FROM_DATABASE=Cisco Systems, Inc
+
+OUI:BC903A*
+ ID_OUI_FROM_DATABASE=Robert Bosch GmbH
+
+OUI:603D26*
+ ID_OUI_FROM_DATABASE=Technicolor CH USA Inc.
+
+OUI:3820A8*
+ ID_OUI_FROM_DATABASE=ColorTokens, Inc.
+
+OUI:705896*
+ ID_OUI_FROM_DATABASE=InShow Technology
+
+OUI:D05995*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+
+OUI:54DF24*
+ ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Technologies Co.,LTD
+
+OUI:78870D*
+ ID_OUI_FROM_DATABASE=Unifiedgateways India Private Limited
+
+OUI:3CA616*
+ ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd.
index 1efd30e9457f90c25c7f11a6c9040f2061e4d027..64634478e6b6855068dd6916e7afdc88c4d2eef8 100644 (file)
@@ -960,6 +960,9 @@ acpi:BBH*:
 acpi:BBL*:
  ID_VENDOR_FROM_DATABASE=Brain Boxes Limited
 
+acpi:BBX*:
+ ID_VENDOR_FROM_DATABASE=Black Box Corporation
+
 acpi:BCC*:
  ID_VENDOR_FROM_DATABASE=Beaver Computer Corporaton
 
@@ -1335,6 +1338,9 @@ acpi:CHO*:
 acpi:CHP*:
  ID_VENDOR_FROM_DATABASE=CH Products
 
+acpi:CHR*:
+ ID_VENDOR_FROM_DATABASE=christmann informationstechnik + medien GmbH & Co. KG
+
 acpi:CHS*:
  ID_VENDOR_FROM_DATABASE=Agentur Chairos
 
@@ -2730,6 +2736,9 @@ acpi:GFN*:
 acpi:GGL*:
  ID_VENDOR_FROM_DATABASE=Google Inc.
 
+acpi:GGT*:
+ ID_VENDOR_FROM_DATABASE=G2TOUCH KOREA
+
 acpi:GIC*:
  ID_VENDOR_FROM_DATABASE=General Inst. Corporation
 
@@ -3108,6 +3117,9 @@ acpi:HYC*:
 acpi:HYD*:
  ID_VENDOR_FROM_DATABASE=Hydis Technologies.Co.,LTD
 
+acpi:HYL*:
+ ID_VENDOR_FROM_DATABASE=Shanghai Chai Ming Huang Info&Tech Co, Ltd
+
 acpi:HYO*:
  ID_VENDOR_FROM_DATABASE=HYC CO., LTD.
 
@@ -4539,6 +4551,9 @@ acpi:MVM*:
 acpi:MVN*:
  ID_VENDOR_FROM_DATABASE=Meta Company
 
+acpi:MVR*:
+ ID_VENDOR_FROM_DATABASE=MediCapture, Inc.
+
 acpi:MVS*:
  ID_VENDOR_FROM_DATABASE=Microvision
 
@@ -5229,6 +5244,9 @@ acpi:PMD*:
 acpi:PMM*:
  ID_VENDOR_FROM_DATABASE=Point Multimedia System
 
+acpi:PMS*:
+ ID_VENDOR_FROM_DATABASE=Pabian Embedded Systems
+
 acpi:PMT*:
  ID_VENDOR_FROM_DATABASE=Promate Electronic Co., Ltd.
 
@@ -5247,6 +5265,9 @@ acpi:PNR*:
 acpi:PNS*:
  ID_VENDOR_FROM_DATABASE=PanaScope
 
+acpi:PNT*:
+ ID_VENDOR_FROM_DATABASE=HOYA Corporation PENTAX Lifecare Division
+
 acpi:PNX*:
  ID_VENDOR_FROM_DATABASE=Phoenix Technologies, Ltd.
 
@@ -6423,6 +6444,9 @@ acpi:TCD*:
 acpi:TCE*:
  ID_VENDOR_FROM_DATABASE=Century Corporation
 
+acpi:TCF*:
+ ID_VENDOR_FROM_DATABASE=Televic Conference
+
 acpi:TCH*:
  ID_VENDOR_FROM_DATABASE=Interaction Systems, Inc
 
@@ -6498,6 +6522,9 @@ acpi:TEK*:
 acpi:TEL*:
  ID_VENDOR_FROM_DATABASE=Promotion and Display Technology Ltd.
 
+acpi:TEN*:
+ ID_VENDOR_FROM_DATABASE=Tencent
+
 acpi:TER*:
  ID_VENDOR_FROM_DATABASE=TerraTec Electronic GmbH
 
@@ -6579,6 +6606,9 @@ acpi:TLK*:
 acpi:TLL*:
  ID_VENDOR_FROM_DATABASE=Thinklogical
 
+acpi:TLN*:
+ ID_VENDOR_FROM_DATABASE=Techlogix Networx
+
 acpi:TLS*:
  ID_VENDOR_FROM_DATABASE=Teleste Educational OY
 
@@ -6705,6 +6735,9 @@ acpi:TRM*:
 acpi:TRN*:
  ID_VENDOR_FROM_DATABASE=Datacommunicatie Tron B.V.
 
+acpi:TRP*:
+ ID_VENDOR_FROM_DATABASE=TRAPEZE GROUP
+
 acpi:TRS*:
  ID_VENDOR_FROM_DATABASE=Torus Systems Ltd
 
index 4edd43a86bd28641f4fe2ba40d6c7764dc2a8aa4..482853dbca5c22ca57d2b8af7db62aad49e99def 100644 (file)
@@ -6299,9 +6299,6 @@ pci:v00001002d00006798sv00001787sd00002317*
 pci:v00001002d00006798sv00001787sd00003000*
  ID_MODEL_FROM_DATABASE=Tahiti XT [Radeon HD 7970/8970 OEM / R9 280X] (Tahiti XT2 [Radeon HD 7970 GHz Edition])
 
-pci:v00001002d00006799*
- ID_MODEL_FROM_DATABASE=New Zealand [Radeon HD 7900 Series]
-
 pci:v00001002d0000679A*
  ID_MODEL_FROM_DATABASE=Tahiti PRO [Radeon HD 7950/8950 OEM / R9 280]
 
@@ -6318,19 +6315,19 @@ pci:v00001002d0000679Asv0000174Bsd0000A003*
  ID_MODEL_FROM_DATABASE=Tahiti PRO [Radeon HD 7950/8950 OEM / R9 280] (Radeon R9 280)
 
 pci:v00001002d0000679B*
- ID_MODEL_FROM_DATABASE=Malta [Radeon HD 7990]
+ ID_MODEL_FROM_DATABASE=Malta [Radeon HD 7990/8990 OEM]
 
 pci:v00001002d0000679Bsv00001002sd00000B28*
- ID_MODEL_FROM_DATABASE=Malta [Radeon HD 7990] (Radeon HD 8990 OEM)
+ ID_MODEL_FROM_DATABASE=Malta [Radeon HD 7990/8990 OEM] (Radeon HD 8990 OEM)
 
 pci:v00001002d0000679Bsv00001002sd00000B2A*
- ID_MODEL_FROM_DATABASE=Malta [Radeon HD 7990] (Radeon HD 7990)
+ ID_MODEL_FROM_DATABASE=Malta [Radeon HD 7990/8990 OEM] (Radeon HD 7990)
 
 pci:v00001002d0000679Bsv00001462sd00008036*
- ID_MODEL_FROM_DATABASE=Malta [Radeon HD 7990] (Radeon HD 8990 OEM)
+ ID_MODEL_FROM_DATABASE=Malta [Radeon HD 7990/8990 OEM] (Radeon HD 8990 OEM)
 
 pci:v00001002d0000679Bsv0000148Csd00008990*
- ID_MODEL_FROM_DATABASE=Malta [Radeon HD 7990] (Radeon HD 8990 OEM)
+ ID_MODEL_FROM_DATABASE=Malta [Radeon HD 7990/8990 OEM] (Radeon HD 8990 OEM)
 
 pci:v00001002d0000679E*
  ID_MODEL_FROM_DATABASE=Tahiti LE [Radeon HD 7870 XT]
@@ -6522,55 +6519,64 @@ pci:v00001002d000067CF*
  ID_MODEL_FROM_DATABASE=Ellesmere [Polaris10]
 
 pci:v00001002d000067DF*
- ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/580]
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580]
 
 pci:v00001002d000067DFsv00001002sd00000B37*
- ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/580] (Radeon RX 480)
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 480)
 
 pci:v00001002d000067DFsv00001043sd000004A8*
- ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/580] (Radeon RX 480)
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 480)
 
 pci:v00001002d000067DFsv00001043sd000004B0*
- ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/580] (Radeon RX 470)
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 470)
 
 pci:v00001002d000067DFsv00001043sd000004FB*
- ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/580] (Radeon RX 480)
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 480)
 
 pci:v00001002d000067DFsv00001043sd000004FD*
- ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/580] (Radeon RX 480 8GB)
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 480 8GB)
+
+pci:v00001002d000067DFsv00001458sd000022F0*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 570)
 
 pci:v00001002d000067DFsv00001462sd00003411*
- ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/580] (Radeon RX 470)
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 470)
 
 pci:v00001002d000067DFsv00001462sd00003413*
- ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/580] (Radeon RX 480)
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 480)
 
 pci:v00001002d000067DFsv0000148Csd00002372*
- ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/580] (Radeon RX 480)
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 480)
 
 pci:v00001002d000067DFsv0000148Csd00002373*
- ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/580] (Radeon RX 470)
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 470)
 
 pci:v00001002d000067DFsv00001682sd00009470*
- ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/580] (Radeon RX 470)
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 470)
 
 pci:v00001002d000067DFsv00001682sd00009480*
- ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/580] (Radeon RX 480)
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 480)
+
+pci:v00001002d000067DFsv00001682sd00009588*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 580 XTR)
 
 pci:v00001002d000067DFsv0000174Bsd0000E347*
- ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/580] (Radeon RX 470/480)
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 470/480)
 
 pci:v00001002d000067DFsv0000174Bsd0000E349*
- ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/580] (Radeon RX 470)
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 470)
 
 pci:v00001002d000067DFsv00001787sd0000A470*
- ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/580] (Radeon RX 470)
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 470)
 
 pci:v00001002d000067DFsv00001787sd0000A480*
- ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/580] (Radeon RX 480)
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 480)
 
 pci:v00001002d000067DFsv00001DA2sd0000E353*
- ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/580] (Sapphire Radeon RX 580 Pulse 8GB)
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Sapphire Radeon RX 580 Pulse 8GB)
+
+pci:v00001002d000067DFsv00001DA2sd0000E366*
+ ID_MODEL_FROM_DATABASE=Ellesmere [Radeon RX 470/480/570/580] (Radeon RX 570)
 
 pci:v00001002d000067E0*
  ID_MODEL_FROM_DATABASE=Baffin [Polaris11]
@@ -7181,6 +7187,9 @@ pci:v00001002d00006842*
 pci:v00001002d00006843*
  ID_MODEL_FROM_DATABASE=Thames [Radeon HD 7670M]
 
+pci:v00001002d00006863*
+ ID_MODEL_FROM_DATABASE=Vega 10 [Radeon Vega Frontier Edition]
+
 pci:v00001002d0000687F*
  ID_MODEL_FROM_DATABASE=Vega [Radeon RX Vega]
 
@@ -13337,6 +13346,12 @@ pci:v0000102Bd00000533sv0000103Csd00003381*
 pci:v0000102Bd00000534*
  ID_MODEL_FROM_DATABASE=G200eR2
 
+pci:v0000102Bd00000538*
+ ID_MODEL_FROM_DATABASE=G200eH
+
+pci:v0000102Bd00000538sv00001590sd000000E4*
+ ID_MODEL_FROM_DATABASE=G200eH (iLO5 VGA)
+
 pci:v0000102Bd00000540*
  ID_MODEL_FROM_DATABASE=M91XX
 
@@ -14867,6 +14882,12 @@ pci:v0000103Cd00001302*
 pci:v0000103Cd00001303*
  ID_MODEL_FROM_DATABASE=RMP-3 (Remote Management Processor)
 
+pci:v0000103Cd000022F6*
+ ID_MODEL_FROM_DATABASE=iLO5 Virtual USB Controller
+
+pci:v0000103Cd000022F6sv00001590sd000000E4*
+ ID_MODEL_FROM_DATABASE=iLO5 Virtual USB Controller (iLO5 Standard Virtual USB Controller)
+
 pci:v0000103Cd00002910*
  ID_MODEL_FROM_DATABASE=E2910A PCIBus Exerciser
 
@@ -17852,6 +17873,9 @@ pci:v00001077d00001656sv00001077sd0000E4F6*
 pci:v00001077d00001656sv00001077sd0000E4F7*
  ID_MODEL_FROM_DATABASE=FastLinQ QL45000 Series 25GbE Controller (FastLinQ QL45212H 25GbE Adapter)
 
+pci:v00001077d00001656sv00001590sd00000223*
+ ID_MODEL_FROM_DATABASE=FastLinQ QL45000 Series 25GbE Controller (Synergy 6810C 25/50Gb Ethernet Adapter)
+
 pci:v00001077d0000165C*
  ID_MODEL_FROM_DATABASE=FastLinQ QL45000 Series 40GbE Controller (FCoE)
 
@@ -18011,12 +18035,24 @@ pci:v00001077d00002432sv0000103Csd00007040*
 pci:v00001077d00002532*
  ID_MODEL_FROM_DATABASE=ISP2532-based 8Gb Fibre Channel to PCI Express HBA
 
+pci:v00001077d00002532sv00001014sd0000041E*
+ ID_MODEL_FROM_DATABASE=ISP2532-based 8Gb Fibre Channel to PCI Express HBA (FC EN0Y/EN12 PCIe2 LP 8 Gb 4-port Fibre Channel Adapter for POWER)
+
 pci:v00001077d00002532sv0000103Csd00003262*
  ID_MODEL_FROM_DATABASE=ISP2532-based 8Gb Fibre Channel to PCI Express HBA (StorageWorks 81Q)
 
 pci:v00001077d00002532sv0000103Csd00003263*
  ID_MODEL_FROM_DATABASE=ISP2532-based 8Gb Fibre Channel to PCI Express HBA (StorageWorks 82Q)
 
+pci:v00001077d00002532sv00001077sd0000015C*
+ ID_MODEL_FROM_DATABASE=ISP2532-based 8Gb Fibre Channel to PCI Express HBA (QLE2560 PCI Express to 8Gb FC Single Channel)
+
+pci:v00001077d00002532sv00001077sd0000015D*
+ ID_MODEL_FROM_DATABASE=ISP2532-based 8Gb Fibre Channel to PCI Express HBA (QLE2562 PCI Express to 8Gb FC Dual Channel)
+
+pci:v00001077d00002532sv00001077sd0000015E*
+ ID_MODEL_FROM_DATABASE=ISP2532-based 8Gb Fibre Channel to PCI Express HBA (QLE2564 PCI Express to 8Gb FC Quad Channel)
+
 pci:v00001077d00002532sv00001077sd00000167*
  ID_MODEL_FROM_DATABASE=ISP2532-based 8Gb Fibre Channel to PCI Express HBA (QME2572 Dual Port FC8 HBA Mezzanine)
 
@@ -18059,6 +18095,9 @@ pci:v00001077d00008000*
 pci:v00001077d00008001*
  ID_MODEL_FROM_DATABASE=10GbE Converged Network Adapter (FCoE)
 
+pci:v00001077d00008001sv00001014sd000003AF*
+ ID_MODEL_FROM_DATABASE=10GbE Converged Network Adapter (FCoE) (FC 5708/5270 10 Gb FCoE PCIe Dual Port Adapter for POWER)
+
 pci:v00001077d00008020*
  ID_MODEL_FROM_DATABASE=cLOM8214 1/10GbE Controller
 
@@ -31574,6 +31613,9 @@ pci:v000010DEd0000137A*
 pci:v000010DEd0000137Asv000017AAsd0000505A*
  ID_MODEL_FROM_DATABASE=GM108GLM [Quadro K620M / Quadro M500M] (Quadro M500M)
 
+pci:v000010DEd0000137B*
+ ID_MODEL_FROM_DATABASE=GM108GLM [Quadro M520 Mobile]
+
 pci:v000010DEd0000137D*
  ID_MODEL_FROM_DATABASE=GM108M [GeForce 940A]
 
@@ -31709,6 +31751,9 @@ pci:v000010DEd000013D9*
 pci:v000010DEd000013DA*
  ID_MODEL_FROM_DATABASE=GM204M [GeForce GTX 980]
 
+pci:v000010DEd000013E7*
+ ID_MODEL_FROM_DATABASE=GM204 [GeForce GTX 980 Engineering Sample]
+
 pci:v000010DEd000013F0*
  ID_MODEL_FROM_DATABASE=GM204GL [Quadro M5000]
 
@@ -31785,7 +31830,7 @@ pci:v000010DEd00001619*
  ID_MODEL_FROM_DATABASE=GM204M [GeForce GTX 965M]
 
 pci:v000010DEd0000161A*
- ID_MODEL_FROM_DATABASE=GM204M [GeForce GTX 980]
+ ID_MODEL_FROM_DATABASE=GM204M [GeForce GTX 980 Mobile]
 
 pci:v000010DEd00001667*
  ID_MODEL_FROM_DATABASE=GM204M [GeForce GTX 965M]
@@ -32492,6 +32537,9 @@ pci:v000010ECd00005250*
 pci:v000010ECd0000525A*
  ID_MODEL_FROM_DATABASE=RTS525A PCI Express Card Reader
 
+pci:v000010ECd0000525Asv000017AAsd0000224F*
+ ID_MODEL_FROM_DATABASE=RTS525A PCI Express Card Reader (ThinkPad X1 Carbon 5th Gen)
+
 pci:v000010ECd00005286*
  ID_MODEL_FROM_DATABASE=RTS5286 PCI Express Card Reader
 
@@ -43899,7 +43947,7 @@ pci:v000012D8*
  ID_VENDOR_FROM_DATABASE=Pericom Semiconductor
 
 pci:v000012D8d000001A7*
- ID_MODEL_FROM_DATABASE=PI7C21P100 PCI to PCI Bridge
+ ID_MODEL_FROM_DATABASE=7C21P100 2-port PCI-X to PCI-X Bridge
 
 pci:v000012D8d0000400A*
  ID_MODEL_FROM_DATABASE=PI7C9X442SL PCI Express Bridge Port
@@ -44816,6 +44864,12 @@ pci:v00001344d00005161*
 pci:v00001344d00005163*
  ID_MODEL_FROM_DATABASE=RealSSD P425m
 
+pci:v00001344d00005180*
+ ID_MODEL_FROM_DATABASE=9100 PRO NVMe SSD
+
+pci:v00001344d00005181*
+ ID_MODEL_FROM_DATABASE=9100 MAX NVMe SSD
+
 pci:v00001345*
  ID_VENDOR_FROM_DATABASE=Arescom Inc
 
@@ -48587,6 +48641,15 @@ pci:v00001425d00006080*
 pci:v00001425d00006081*
  ID_MODEL_FROM_DATABASE=T62100-6081 Unified Wire Ethernet Controller
 
+pci:v00001425d00006082*
+ ID_MODEL_FROM_DATABASE=T6225-6082 Unified Wire Ethernet Controller
+
+pci:v00001425d00006083*
+ ID_MODEL_FROM_DATABASE=T62100-6083 Unified Wire Ethernet Controller
+
+pci:v00001425d00006084*
+ ID_MODEL_FROM_DATABASE=T64100-6084 Unified Wire Ethernet Controller
+
 pci:v00001425d00006401*
  ID_MODEL_FROM_DATABASE=T6225-CR Unified Wire Ethernet Controller
 
@@ -48632,6 +48695,15 @@ pci:v00001425d00006480*
 pci:v00001425d00006481*
  ID_MODEL_FROM_DATABASE=T62100-6081 Unified Wire Ethernet Controller
 
+pci:v00001425d00006482*
+ ID_MODEL_FROM_DATABASE=T6225-6082 Unified Wire Ethernet Controller
+
+pci:v00001425d00006483*
+ ID_MODEL_FROM_DATABASE=T62100-6083 Unified Wire Ethernet Controller
+
+pci:v00001425d00006484*
+ ID_MODEL_FROM_DATABASE=T64100-6084 Unified Wire Ethernet Controller
+
 pci:v00001425d00006501*
  ID_MODEL_FROM_DATABASE=T6225-CR Unified Wire Storage Controller
 
@@ -48677,6 +48749,15 @@ pci:v00001425d00006580*
 pci:v00001425d00006581*
  ID_MODEL_FROM_DATABASE=T62100-6081 Unified Wire Storage Controller
 
+pci:v00001425d00006582*
+ ID_MODEL_FROM_DATABASE=T6225-6082 Unified Wire Storage Controller
+
+pci:v00001425d00006583*
+ ID_MODEL_FROM_DATABASE=T62100-6083 Unified Wire Storage Controller
+
+pci:v00001425d00006584*
+ ID_MODEL_FROM_DATABASE=T64100-6084 Unified Wire Storage Controller
+
 pci:v00001425d00006601*
  ID_MODEL_FROM_DATABASE=T6225-CR Unified Wire Storage Controller
 
@@ -48722,6 +48803,15 @@ pci:v00001425d00006680*
 pci:v00001425d00006681*
  ID_MODEL_FROM_DATABASE=T62100-6081 Unified Wire Storage Controller
 
+pci:v00001425d00006682*
+ ID_MODEL_FROM_DATABASE=T6225-6082 Unified Wire Storage Controller
+
+pci:v00001425d00006683*
+ ID_MODEL_FROM_DATABASE=T62100-6083 Unified Wire Storage Controller
+
+pci:v00001425d00006684*
+ ID_MODEL_FROM_DATABASE=T64100-6084 Unified Wire Storage Controller
+
 pci:v00001425d00006801*
  ID_MODEL_FROM_DATABASE=T6225-CR Unified Wire Ethernet Controller [VF]
 
@@ -48767,6 +48857,15 @@ pci:v00001425d00006880*
 pci:v00001425d00006881*
  ID_MODEL_FROM_DATABASE=T62100-6081 Unified Wire Ethernet Controller [VF]
 
+pci:v00001425d00006882*
+ ID_MODEL_FROM_DATABASE=T6225-6082 Unified Wire Ethernet Controller [VF]
+
+pci:v00001425d00006883*
+ ID_MODEL_FROM_DATABASE=T62100-6083 Unified Wire Ethernet Controller [VF]
+
+pci:v00001425d00006884*
+ ID_MODEL_FROM_DATABASE=T64100-6084 Unified Wire Ethernet Controller [VF]
+
 pci:v00001425d0000A000*
  ID_MODEL_FROM_DATABASE=PE10K Unified Wire Ethernet Controller
 
@@ -53885,6 +53984,9 @@ pci:v000015B3d00001003sv000015B3sd00000025*
 pci:v000015B3d00001003sv000015B3sd00000026*
  ID_MODEL_FROM_DATABASE=MT27500 Family [ConnectX-3] (ConnectX-3 IB FDR Dual Port Mezzanine Card)
 
+pci:v000015B3d00001003sv000015B3sd00000028*
+ ID_MODEL_FROM_DATABASE=MT27500 Family [ConnectX-3] (ConnectX-3 VPI Dual QSFP+ Port QDR Infiniband 40Gb/s or 10Gb Ethernet)
+
 pci:v000015B3d00001003sv000015B3sd00000059*
  ID_MODEL_FROM_DATABASE=MT27500 Family [ConnectX-3] (ConnectX-3 VPI IB FDR/40 GbE Single Port QSFP+ Mezzanine Card)
 
@@ -54107,6 +54209,9 @@ pci:v000015B3d00006732*
 pci:v000015B3d0000673C*
  ID_MODEL_FROM_DATABASE=MT26428 [ConnectX VPI PCIe 2.0 5GT/s - IB QDR / 10GigE]
 
+pci:v000015B3d0000673Csv00001014sd00000487*
+ ID_MODEL_FROM_DATABASE=MT26428 [ConnectX VPI PCIe 2.0 5GT/s - IB QDR / 10GigE] (GX++ 1-port 4X IB QDR Adapter for Power 795)
+
 pci:v000015B3d0000673Csv0000103Csd00001782*
  ID_MODEL_FROM_DATABASE=MT26428 [ConnectX VPI PCIe 2.0 5GT/s - IB QDR / 10GigE] (4X QDR InfiniBand Mezzanine HCA for c-Class BladeSystem)
 
@@ -54131,6 +54236,9 @@ pci:v000015B3d00006750sv00001014sd00000461*
 pci:v000015B3d00006750sv000015B3sd00000018*
  ID_MODEL_FROM_DATABASE=MT26448 [ConnectX EN 10GigE, PCIe 2.0 5GT/s] (HP 10 GbE PCI-e G2 Dual-Port NIC (rev C1))
 
+pci:v000015B3d00006750sv000015B3sd00006572*
+ ID_MODEL_FROM_DATABASE=MT26448 [ConnectX EN 10GigE, PCIe 2.0 5GT/s] (IBM Flex System EN4132 2-port 10Gb RoCE Adapter)
+
 pci:v000015B3d0000675A*
  ID_MODEL_FROM_DATABASE=MT25408 [ConnectX EN 10GigE 10GBaseT, PCIe Gen2 5GT/s]
 
@@ -59361,7 +59469,13 @@ pci:v000019A2d00000702*
  ID_MODEL_FROM_DATABASE=OneConnect 10Gb iSCSI Initiator
 
 pci:v000019A2d00000704*
- ID_MODEL_FROM_DATABASE=OneConnect 10Gb FCoE Initiator
+ ID_MODEL_FROM_DATABASE=OneConnect OCe10100/OCe10102 Series 10 GbE CNA
+
+pci:v000019A2d00000704sv000010DFsd0000E602*
+ ID_MODEL_FROM_DATABASE=OneConnect OCe10100/OCe10102 Series 10 GbE CNA (OneConnect OCe10100 10Gb CNA)
+
+pci:v000019A2d00000704sv000010DFsd0000E630*
+ ID_MODEL_FROM_DATABASE=OneConnect OCe10100/OCe10102 Series 10 GbE CNA (OneConnect OCe10102-FM-E / OCe10102-FX-E for EMC VNX Symmetrix)
 
 pci:v000019A2d00000710*
  ID_MODEL_FROM_DATABASE=OneConnect 10Gb NIC (be3)
@@ -59372,6 +59486,12 @@ pci:v000019A2d00000710sv00001014sd000003D0*
 pci:v000019A2d00000710sv00001014sd000003D1*
  ID_MODEL_FROM_DATABASE=OneConnect 10Gb NIC (be3) (PCIe2 2-port 10GbE SFP+ Copper Adapter for POWER)
 
+pci:v000019A2d00000710sv00001014sd00000409*
+ ID_MODEL_FROM_DATABASE=OneConnect 10Gb NIC (be3) (Integrated Multifunction Card with Dual 10GbE SR Optical + Dual 1GbE for Power 750/760)
+
+pci:v000019A2d00000710sv00001014sd0000040A*
+ ID_MODEL_FROM_DATABASE=OneConnect 10Gb NIC (be3) (Integrated Multifunction Card with Dual 10GbE SR Copper + Dual 1GbE for Power 750/760)
+
 pci:v000019A2d00000710sv0000103Csd00003315*
  ID_MODEL_FROM_DATABASE=OneConnect 10Gb NIC (be3) (NC553i 10Gb 2-port FlexFabric Converged Network Adapter)
 
@@ -59387,6 +59507,9 @@ pci:v000019A2d00000710sv0000103Csd00003345*
 pci:v000019A2d00000710sv0000103Csd0000337B*
  ID_MODEL_FROM_DATABASE=OneConnect 10Gb NIC (be3) (NC554FLB 10Gb 2-port FlexFabric Converged Network Adapter)
 
+pci:v000019A2d00000710sv000010DFsd0000E733*
+ ID_MODEL_FROM_DATABASE=OneConnect 10Gb NIC (be3) (Flex System EN4054 4-port 10Gb Ethernet Mezzanine Adapter)
+
 pci:v000019A2d00000712*
  ID_MODEL_FROM_DATABASE=OneConnect 10Gb iSCSI Initiator (be3)
 
@@ -61049,6 +61172,9 @@ pci:v00001FC9d00004026*
 pci:v00001FC9d00004027*
  ID_MODEL_FROM_DATABASE=TN9710P 10GBase-T/NBASE-T Ethernet Adapter
 
+pci:v00001FC9d00004027sv00001154sd00000368*
+ ID_MODEL_FROM_DATABASE=TN9710P 10GBase-T/NBASE-T Ethernet Adapter (LGY-PCIE-MG)
+
 pci:v00001FC9d00004027sv00001432sd00008104*
  ID_MODEL_FROM_DATABASE=TN9710P 10GBase-T/NBASE-T Ethernet Adapter (10 Gigabit Ethernet PCI Express Adapter)
 
@@ -67841,6 +67967,9 @@ pci:v00008086d0000152A*
 pci:v00008086d0000152E*
  ID_MODEL_FROM_DATABASE=82599 Virtual Function
 
+pci:v00008086d0000152F*
+ ID_MODEL_FROM_DATABASE=I350 Virtual Function
+
 pci:v00008086d00001530*
  ID_MODEL_FROM_DATABASE=X540 Virtual Function
 
@@ -68495,6 +68624,9 @@ pci:v00008086d000015D2*
 pci:v00008086d000015D3*
  ID_MODEL_FROM_DATABASE=JHL6540 Thunderbolt 3 Bridge (C step) [Alpine Ridge 4C 2016]
 
+pci:v00008086d000015D4*
+ ID_MODEL_FROM_DATABASE=JHL6540 Thunderbolt 3 USB Controller (C step) [Alpine Ridge 4C 2016]
+
 pci:v00008086d000015D5*
  ID_MODEL_FROM_DATABASE=Ethernet SDI Adapter FM10420-25GbE-DA2
 
@@ -68510,12 +68642,27 @@ pci:v00008086d000015D7*
 pci:v00008086d000015D8*
  ID_MODEL_FROM_DATABASE=Ethernet Connection (4) I219-V
 
+pci:v00008086d000015D8sv000017AAsd0000224F*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection (4) I219-V (ThinkPad X1 Carbon 5th Gen)
+
 pci:v00008086d000015D9*
  ID_MODEL_FROM_DATABASE=JHL6340 Thunderbolt 3 NHI (C step) [Alpine Ridge 2C 2016]
 
 pci:v00008086d000015DA*
  ID_MODEL_FROM_DATABASE=JHL6340 Thunderbolt 3 Bridge (C step) [Alpine Ridge 2C 2016]
 
+pci:v00008086d000015DF*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection (8) I219-LM
+
+pci:v00008086d000015E0*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection (8) I219-V
+
+pci:v00008086d000015E1*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection (9) I219-LM
+
+pci:v00008086d000015E2*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection (9) I219-V
+
 pci:v00008086d000015E3*
  ID_MODEL_FROM_DATABASE=Ethernet Connection (5) I219-LM
 
@@ -68690,6 +68837,9 @@ pci:v00008086d00001910*
 pci:v00008086d00001911*
  ID_MODEL_FROM_DATABASE=Skylake Gaussian Mixture Model
 
+pci:v00008086d00001911sv000017AAsd0000224F*
+ ID_MODEL_FROM_DATABASE=Skylake Gaussian Mixture Model (ThinkPad X1 Carbon 5th Gen)
+
 pci:v00008086d00001912*
  ID_MODEL_FROM_DATABASE=HD Graphics 530
 
@@ -72404,6 +72554,9 @@ pci:v00008086d000024FD*
 pci:v00008086d000024FDsv00008086sd00000010*
  ID_MODEL_FROM_DATABASE=Wireless 8265 / 8275 (Dual Band Wireless-AC 8265)
 
+pci:v00008086d000024FDsv00008086sd00001130*
+ ID_MODEL_FROM_DATABASE=Wireless 8265 / 8275 (Dual Band Wireless-AC 8265)
+
 pci:v00008086d00002500*
  ID_MODEL_FROM_DATABASE=82820 820 (Camino) Chipset Host Bridge (MCH)
 
@@ -80474,6 +80627,12 @@ pci:v00008086d00005845sv00001AF4sd00001100*
 pci:v00008086d00005902*
  ID_MODEL_FROM_DATABASE=HD Graphics 610
 
+pci:v00008086d00005904*
+ ID_MODEL_FROM_DATABASE=Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
+
+pci:v00008086d00005904sv000017AAsd0000224F*
+ ID_MODEL_FROM_DATABASE=Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers (ThinkPad X1 Carbon 5th Gen)
+
 pci:v00008086d0000590F*
  ID_MODEL_FROM_DATABASE=Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
 
@@ -80483,6 +80642,12 @@ pci:v00008086d00005910*
 pci:v00008086d00005912*
  ID_MODEL_FROM_DATABASE=HD Graphics 630
 
+pci:v00008086d00005916*
+ ID_MODEL_FROM_DATABASE=HD Graphics 620
+
+pci:v00008086d00005916sv000017AAsd0000224F*
+ ID_MODEL_FROM_DATABASE=HD Graphics 620 (ThinkPad X1 Carbon 5th Gen)
+
 pci:v00008086d00005A84*
  ID_MODEL_FROM_DATABASE=Celeron N3350/Pentium N4200/Atom E3900 Series Integrated Graphics Controller
 
@@ -82511,6 +82676,12 @@ pci:v00008086d00009D03sv00001028sd000006F3*
 pci:v00008086d00009D03sv000017AAsd0000382A*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP SATA Controller [AHCI mode] (B51-80 Laptop)
 
+pci:v00008086d00009D10*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP PCI Express Root Port #1
+
+pci:v00008086d00009D12*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP PCI Express Root Port #3
+
 pci:v00008086d00009D14*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP PCI Express Root Port #5
 
@@ -82541,6 +82712,9 @@ pci:v00008086d00009D21*
 pci:v00008086d00009D21sv00001028sd000006F3*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP PMC (Latitude 3570)
 
+pci:v00008086d00009D21sv000017AAsd0000224F*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP PMC (ThinkPad X1 Carbon 5th Gen)
+
 pci:v00008086d00009D21sv000017AAsd0000382A*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP PMC (B51-80 Laptop)
 
@@ -82550,6 +82724,9 @@ pci:v00008086d00009D23*
 pci:v00008086d00009D23sv00001028sd000006F3*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP SMBus (Latitude 3570)
 
+pci:v00008086d00009D23sv000017AAsd0000224F*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP SMBus (ThinkPad X1 Carbon 5th Gen)
+
 pci:v00008086d00009D23sv000017AAsd0000382A*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP SMBus (B51-80 Laptop)
 
@@ -82583,6 +82760,9 @@ pci:v00008086d00009D31*
 pci:v00008086d00009D31sv00001028sd000006F3*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP Thermal subsystem (Latitude 3570)
 
+pci:v00008086d00009D31sv000017AAsd0000224F*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP Thermal subsystem (ThinkPad X1 Carbon 5th Gen)
+
 pci:v00008086d00009D31sv000017AAsd0000382A*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP Thermal subsystem (B51-80 Laptop)
 
@@ -82592,6 +82772,9 @@ pci:v00008086d00009D3A*
 pci:v00008086d00009D3Asv00001028sd000006F3*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP CSME HECI #1 (Latitude 3570)
 
+pci:v00008086d00009D3Asv000017AAsd0000224F*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP CSME HECI #1 (ThinkPad X1 Carbon 5th Gen)
+
 pci:v00008086d00009D3Asv000017AAsd0000382A*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP CSME HECI #1 (B51-80 Laptop)
 
@@ -82607,6 +82790,12 @@ pci:v00008086d00009D48*
 pci:v00008086d00009D48sv00001028sd000006F3*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP LPC Controller (Latitude 3570)
 
+pci:v00008086d00009D58*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP LPC Controller
+
+pci:v00008086d00009D58sv000017AAsd0000224F*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP LPC Controller (ThinkPad X1 Carbon 5th Gen)
+
 pci:v00008086d00009D60*
  ID_MODEL_FROM_DATABASE=Sunrise Point-LP Serial IO I2C Controller #0
 
@@ -84332,6 +84521,48 @@ pci:v00009005d0000028Dsv00009005sd00000553*
 pci:v00009005d0000028Dsv00009005sd00000554*
  ID_MODEL_FROM_DATABASE=Series 8 12G SAS/PCIe 3 (Series 8 - ASR-8885 - 8 internal 8 external 12G SAS Port/PCIe 3.0)
 
+pci:v00009005d0000028F*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3
+
+pci:v00009005d0000028Fsv0000103Csd00000600*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3 (Smart Array P408i-p SR Gen10)
+
+pci:v00009005d0000028Fsv0000103Csd00000601*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3 (Smart Array P408e-p SR Gen10)
+
+pci:v00009005d0000028Fsv0000103Csd00000602*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3 (Smart Array P408i-a SR Gen10)
+
+pci:v00009005d0000028Fsv0000103Csd00000603*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3 (Smart Array P408i-c SR Gen10)
+
+pci:v00009005d0000028Fsv0000103Csd00000650*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3 (Smart Array E208i-p SR Gen10)
+
+pci:v00009005d0000028Fsv0000103Csd00000651*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3 (Smart Array E208e-p SR Gen10)
+
+pci:v00009005d0000028Fsv0000103Csd00000652*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3 (Smart Array E208i-c SR Gen10)
+
+pci:v00009005d0000028Fsv0000103Csd00000654*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3 (Smart Array E208i-a SR Gen10)
+
+pci:v00009005d0000028Fsv0000103Csd00000655*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3 (Smart Array P408e-m SR Gen10)
+
+pci:v00009005d0000028Fsv0000103Csd00000700*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3 (Smart Array P204i-c SR Gen10)
+
+pci:v00009005d0000028Fsv0000103Csd00000701*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3 (Smart Array P204i-b SR Gen10)
+
+pci:v00009005d0000028Fsv0000103Csd00001100*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3 (Smart Array P816i-a SR Gen10)
+
+pci:v00009005d0000028Fsv0000103Csd00001101*
+ ID_MODEL_FROM_DATABASE=Smart Storage PQI 12G SAS/PCIe 3 (Smart Array P416ie-m SR G10)
+
 pci:v00009005d00000410*
  ID_MODEL_FROM_DATABASE=AIC-9410W SAS (Razor HBA RAID)
 
index b6a452c782a3f5baa5db9317e18d9b0ea5e85863..4f01d88c350357c356f955137f2c6a8cb77917ed 100644 (file)
@@ -291,6 +291,20 @@ evdev:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO*:pvrThinkPadX1Carbon4th*
  EVDEV_ABS_35=1262:5679:44
  EVDEV_ABS_36=1101:4824:65
 
+# Lenovo Thinkpad Carbon X1 5th gen.
+evdev:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO*:pvrThinkPadX1Carbon5th*
+ EVDEV_ABS_00=::44
+ EVDEV_ABS_01=::65
+ EVDEV_ABS_35=::44
+ EVDEV_ABS_36=::65
+
+# Lenovo Thinkpad Carbon X1 5th gen. (rmi4)
+evdev:name:Synaptics TM3289-002:dmi:*svnLENOVO*:pvrThinkPadX1Carbon5th*
+ EVDEV_ABS_00=::19
+ EVDEV_ABS_01=::19
+ EVDEV_ABS_35=::19
+ EVDEV_ABS_36=::19
+
 # Lenovo T460
 evdev:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO*:pn*ThinkPad*T460*
  EVDEV_ABS_00=1266:5677:44
index 50d24d67f06edeae038a5d99469e1956d2cb5a45..b898d719f2213365748353da53cb52475cd4e8a5 100644 (file)
     for more information about special <filename>/etc/fstab</filename>
     mount options this generator understands.</para>
 
+    <para>One special topic is handling of symbolic links.  Historical init
+    implementations supported symlinks in <filename>/etc/fstab</filename>.
+    Because mount units will refuse mounts where the target is a symbolic link,
+    this generator will resolve any symlinks as far as possible when processing
+    <filename>/etc/fstab</filename> in order to enhance backwards compatibility.
+    If a symlink target does not exist at the time that this generator runs, it
+    is assumed that the symlink target is the final target of the mount.</para>
+
     <para><filename>systemd-fstab-generator</filename> implements
     <citerefentry><refentrytitle>systemd.generator</refentrytitle><manvolnum>7</manvolnum></citerefentry>.</para>
   </refsect1>
index bd259708f5d4c2e9a357ea5d0ad5c2819bde1353..d28de2d0f24026f63927284f3e53d320b24ffe1a 100644 (file)
         <term><varname>Group=</varname></term>
 
         <listitem><para>Set the UNIX user or group that the processes are executed as, respectively. Takes a single
-        user or group name, or numeric ID as argument. For system services (services run by the system service manager,
+        user or group name, or numeric ID as argument. For system services (services run by the system service manager,
         i.e. managed by PID 1) and for user services of the root user (services managed by root's instance of
         <command>systemd --user</command>), the default is <literal>root</literal>, but <varname>User=</varname> may be
         used to specify a different user. For user services of any other user, switching user identity is not
         permitted, hence the only valid setting is the same user the user's service manager is running as. If no group
         is set, the default group of the user is used. This setting does not affect commands whose command line is
-        prefixed with <literal>+</literal>.</para></listitem>
+        prefixed with <literal>+</literal>.</para>
+
+        <para>Note that restrictions on the user/group name syntax are enforced: the specified name must consist only
+        of the characters a-z, A-Z, 0-9, <literal>_</literal> and <literal>-</literal>, except for the first character
+        which must be one of a-z, A-Z or <literal>_</literal> (i.e. numbers and <literal>-</literal> are not permitted
+        as first character). The user/group name must have at least one character, and at most 31. These restrictions
+        are enforced in order to avoid ambiguities and to ensure user/group names and unit files remain portable among
+        Linux systems.</para>
+
+        <para>When used in conjunction with <varname>DynamicUser=</varname> the user/group name specified is
+        dynamically allocated at the time the service is started, and released at the time the service is stopped —
+        unless it is already allocated statically (see below). If <varname>DynamicUser=</varname> is not used the
+        specified user and group must have been created statically in the user database no later than the moment the
+        service is started, for example using the
+        <citerefentry><refentrytitle>sysusers.d</refentrytitle><manvolnum>5</manvolnum></citerefentry> facility, which
+        is applied at boot or package install time.</para></listitem>
       </varlistentry>
 
       <varlistentry>
index 98f71d2e7e51bf1e3ffa55c99bee40eab983a85e..1bed7d17f162e0a8b06248b8efbdb6ab09c18af9 100644 (file)
 
       <varlistentry>
         <term><varname>Where=</varname></term>
-        <listitem><para>Takes an absolute path of a directory of the
-        mount point. If the mount point does not exist at the time of
+        <listitem><para>Takes an absolute path of a directory for the
+        mount point; in particular, the destination cannot be a symbolic
+        link.  If the mount point does not exist at the time of
         mounting, it is created. This string must be reflected in the
         unit filename. (See above.) This option is
         mandatory.</para></listitem>
index 18ee3800d67c4687ee73b755b99351cdb4799596..f232d9906d7b1009d77d13f34793e0c33aa66dbc 100644 (file)
   <refsect1>
     <title>Description</title>
 
-    <para><command>systemd-sysusers</command> uses the files from
-    <filename>sysusers.d</filename> directory to create system users
-    and groups at package installation or boot time. This tool may be
-    used to allocate system users and groups only, it is not useful
-    for creating non-system users and groups, as it accesses
-    <filename>/etc/passwd</filename> and
-    <filename>/etc/group</filename> directly, bypassing any more
-    complex user databases, for example any database involving NIS or
-    LDAP.</para>
+    <para><command>systemd-sysusers</command> uses the files from <filename>sysusers.d</filename> directory to create
+    system users and groups at package installation or boot time. This tool may be used to allocate system users and
+    groups only, it is not useful for creating non-system (i.e. regular, "human") users and groups, as it accesses
+    <filename>/etc/passwd</filename> and <filename>/etc/group</filename> directly, bypassing any more complex user
+    databases, for example any database involving NIS or LDAP.</para>
   </refsect1>
 
   <refsect1>
@@ -83,6 +79,9 @@ g input - -
 m authd input
 u root 0 "Superuser" /root</programlisting>
 
+    <para>Empty lines and lines beginning with the <literal>#</literal> character are ignored, and may be used for
+    commenting.</para>
+
     <refsect2>
       <title>Type</title>
 
@@ -134,14 +133,14 @@ u root 0 "Superuser" /root</programlisting>
     <refsect2>
       <title>Name</title>
 
-      <para>The name field specifies the user or group name. It should
-      be shorter than 31 characters and avoid any non-ASCII
-      characters, and not begin with a numeric character. It is
-      strongly recommended to pick user and group names that are
-      unlikely to clash with normal users created by the
-      administrator. A good scheme to guarantee this is by prefixing
-      all system and group names with the underscore, and avoiding too
-      generic names.</para>
+      <para>The name field specifies the user or group name. The specified name must consist only of the characters a-z,
+      A-Z, 0-9, <literal>_</literal> and <literal>-</literal>, except for the first character which must be one of a-z,
+      A-Z or <literal>_</literal> (i.e. numbers and <literal>-</literal> are not permitted as first character). The
+      user/group name must have at least one character, and at most 31.</para>
+
+      <para>It is strongly recommended to pick user and group names that are unlikely to clash with normal users
+      created by the administrator. A good scheme to guarantee this is by prefixing all system and group names with the
+      underscore, and avoiding too generic names.</para>
 
       <para>For <varname>m</varname> lines, this field should contain
       the user name to add to a group.</para>
index ce59d18b83fc17970cc00274d8cbde49c30f9d86..20b27c860017d4d736b797ceada30ddbf6b2f5eb 100644 (file)
@@ -230,7 +230,8 @@ if cxx.found()
         add_languages('cpp')
 endif
 
-foreach arg : ['-Wundef',
+foreach arg : ['-Wextra',
+               '-Wundef',
                '-Wlogical-op',
                '-Wmissing-include-dirs',
                '-Wold-style-definition',
@@ -795,23 +796,23 @@ if want_libidn == 'true' and want_libidn2 == 'true'
         error('libidn and libidn2 cannot be requested simultaneously')
 endif
 
-if want_libidn2 != 'false' and want_libidn != 'true'
-        libidn = dependency('libidn2',
-                            required : want_libidn2 == 'true')
-        # libidn is used for both libidn and libidn2 objects
+if want_libidn != 'false' and want_libidn2 != 'true'
+        libidn = dependency('libidn',
+                            required : want_libidn == 'true')
         if libidn.found()
-                conf.set('HAVE_LIBIDN2', true)
-                m4_defines += ['-DHAVE_LIBIDN2']
+                conf.set('HAVE_LIBIDN', true)
+                m4_defines += ['-DHAVE_LIBIDN']
         endif
 else
         libidn = []
 endif
-if not conf.get('HAVE_LIBIDN2', false) and want_libidn != 'false'
-        libidn = dependency('libidn',
-                            required : want_libidn == 'true')
+if not conf.get('HAVE_LIBIDN', false) and want_libidn2 != 'false'
+        # libidn is used for both libidn and libidn2 objects
+        libidn = dependency('libidn2',
+                            required : want_libidn2 == 'true')
         if libidn.found()
-                conf.set('HAVE_LIBIDN', true)
-                m4_defines += ['-DHAVE_LIBIDN']
+                conf.set('HAVE_LIBIDN2', true)
+                m4_defines += ['-DHAVE_LIBIDN2']
         endif
 endif
 
index e27256499391e14f201a9f16727d2ef825c41572..3fd53800a090e6d82037e1fa2a9c51beaa20afb4 100644 (file)
@@ -232,6 +232,8 @@ fail:
 int log_open(void) {
         int r;
 
+        /* Do not call from library code. */
+
         /* If we don't use the console we close it here, to not get
          * killed by SAK. If we don't use syslog we close it here so
          * that we are not confused by somebody deleting the socket in
@@ -306,6 +308,8 @@ void log_set_target(LogTarget target) {
 }
 
 void log_close(void) {
+        /* Do not call from library code. */
+
         log_close_journal();
         log_close_syslog();
         log_close_kmsg();
@@ -313,6 +317,8 @@ void log_close(void) {
 }
 
 void log_forget_fds(void) {
+        /* Do not call from library code. */
+
         console_fd = kmsg_fd = syslog_fd = journal_fd = -1;
 }
 
@@ -1034,6 +1040,8 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat
 }
 
 void log_parse_environment_realm(LogRealm realm) {
+        /* Do not call from library code. */
+
         const char *e;
 
         if (get_ctty_devnr(0, NULL) < 0)
@@ -1041,19 +1049,19 @@ void log_parse_environment_realm(LogRealm realm) {
                    user stuff. */
                 (void) proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_STRIP_RD_PREFIX);
 
-        e = secure_getenv("SYSTEMD_LOG_TARGET");
+        e = getenv("SYSTEMD_LOG_TARGET");
         if (e && log_set_target_from_string(e) < 0)
                 log_warning("Failed to parse log target '%s'. Ignoring.", e);
 
-        e = secure_getenv("SYSTEMD_LOG_LEVEL");
+        e = getenv("SYSTEMD_LOG_LEVEL");
         if (e && log_set_max_level_from_string_realm(realm, e) < 0)
                 log_warning("Failed to parse log level '%s'. Ignoring.", e);
 
-        e = secure_getenv("SYSTEMD_LOG_COLOR");
+        e = getenv("SYSTEMD_LOG_COLOR");
         if (e && log_show_color_from_string(e) < 0)
                 log_warning("Failed to parse bool '%s'. Ignoring.", e);
 
-        e = secure_getenv("SYSTEMD_LOG_LOCATION");
+        e = getenv("SYSTEMD_LOG_LOCATION");
         if (e && log_show_location_from_string(e) < 0)
                 log_warning("Failed to parse bool '%s'. Ignoring.", e);
 }
index 57463fbb839c888890407a88710e8b46c9614011..ff5d776b1d7054f2acd7c3e73eca8b2cf737782e 100644 (file)
@@ -86,6 +86,11 @@ int log_get_max_level_realm(LogRealm realm) _pure_;
 #define log_get_max_level()                     \
         log_get_max_level_realm(LOG_REALM)
 
+/* Functions below that open and close logs or configure logging based on the
+ * environment should not be called from library code — this is always a job
+ * for the application itself.
+ */
+
 int log_open(void);
 void log_close(void);
 void log_forget_fds(void);
index 589575cf00fc2051488ae98409dfc2299cfeb4f6..810eeab4d551b395fe1833aa804ad23121737762 100644 (file)
@@ -46,8 +46,8 @@ int acquire_random_bytes(void *p, size_t n, bool high_quality_required) {
         static int have_syscall = -1;
 
         _cleanup_close_ int fd = -1;
-        int r;
         unsigned already_done = 0;
+        int r;
 
         /* Gathers some randomness from the kernel. This call will never block. If
          * high_quality_required, it will always return some data from the kernel,
@@ -61,7 +61,7 @@ int acquire_random_bytes(void *p, size_t n, bool high_quality_required) {
                 r = getrandom(p, n, GRND_NONBLOCK);
                 if (r > 0) {
                         have_syscall = true;
-                        if (r == (int) n)
+                        if ((size_t) r == n)
                                 return 0;
                         if (!high_quality_required) {
                                 /* Fill in the remaing bytes using pseudorandom values */
@@ -114,7 +114,7 @@ void initialize_srand(void) {
 
         auxv = (void*) getauxval(AT_RANDOM);
         if (auxv) {
-                assert_cc(sizeof(x) < 16);
+                assert_cc(sizeof(x) <= 16);
                 memcpy(&x, auxv, sizeof(x));
         } else
 #endif
@@ -147,11 +147,11 @@ void pseudorandom_bytes(void *p, size_t n) {
                 rr = (unsigned) rand();
 
 #if RAND_STEP >= 3
-                if (q - (uint8_t*) p + 2 < (ptrdiff_t) n)
+                if ((size_t) (q - (uint8_t*) p + 2) < n)
                         q[2] = rr >> 16;
 #endif
 #if RAND_STEP >= 2
-                if (q - (uint8_t*) p + 1 < (ptrdiff_t) n)
+                if ((size_t) (q - (uint8_t*) p + 1) < n)
                         q[1] = rr >> 8;
 #endif
                 q[0] = rr;
index 0eec868eed1f5e0dc46288eadf16b89830d49b7c..c63f11c6ade9627a6fa3af6a2eeb863a82dd71d0 100644 (file)
@@ -770,11 +770,7 @@ static int str_compare(const void *_a, const void *_b) {
 }
 
 char **strv_sort(char **l) {
-
-        if (strv_isempty(l))
-                return l;
-
-        qsort(l, strv_length(l), sizeof(char*), str_compare);
+        qsort_safe(l, strv_length(l), sizeof(char*), str_compare);
         return l;
 }
 
index 3b44985c6974d3e898083afab24f848377854e68..68ba86f6a55902ced6484646a325c03fc54fc84d 100644 (file)
@@ -241,7 +241,7 @@ usec_t timeval_load(const struct timeval *tv) {
 struct timeval *timeval_store(struct timeval *tv, usec_t u) {
         assert(tv);
 
-        if (u == USEC_INFINITY||
+        if (u == USEC_INFINITY ||
             u / USEC_PER_SEC > TIME_T_MAX) {
                 tv->tv_sec = (time_t) -1;
                 tv->tv_usec = (suseconds_t) -1;
@@ -864,10 +864,10 @@ finish:
         if (ret > USEC_TIMESTAMP_FORMATTABLE_MAX)
                 return -EINVAL;
 
-        if (ret > minus)
+        if (ret >= minus)
                 ret -= minus;
         else
-                ret = 0;
+                return -EINVAL;
 
         *usec = ret;
 
index 8efa6050899329c355358a7f1c3d7d45285fb9ff..233bc802929c8c0142cd428885f3ca49a0aa5531 100644 (file)
@@ -73,17 +73,23 @@ static int verify_esp(
         struct statfs sfs;
         sd_id128_t uuid = SD_ID128_NULL;
         uint32_t part = 0;
+        bool quiet;
         int r;
 
         assert(p);
 
+        /* Non-root user can run only `bootctl status`, then if error occured in the following, it does not cause any issues.
+         * So, let's silence the error messages. */
+        quiet = (geteuid() != 0);
+
         if (statfs(p, &sfs) < 0) {
 
                 /* If we are searching for the mount point, don't generate a log message if we can't find the path */
                 if (errno == ENOENT && searching)
                         return -ENOENT;
 
-                return log_error_errno(errno, "Failed to check file system type of \"%s\": %m", p);
+                return log_full_errno(quiet && errno == EACCES ? LOG_DEBUG : LOG_ERR, errno,
+                                      "Failed to check file system type of \"%s\": %m", p);
         }
 
         if (!F_TYPE_EQUAL(sfs.f_type, MSDOS_SUPER_MAGIC)) {
@@ -96,7 +102,8 @@ static int verify_esp(
         }
 
         if (stat(p, &st) < 0)
-                return log_error_errno(errno, "Failed to determine block device node of \"%s\": %m", p);
+                return log_full_errno(quiet && errno == EACCES ? LOG_DEBUG : LOG_ERR, errno,
+                                      "Failed to determine block device node of \"%s\": %m", p);
 
         if (major(st.st_dev) == 0) {
                 log_error("Block device node of %p is invalid.", p);
@@ -106,7 +113,8 @@ static int verify_esp(
         t2 = strjoina(p, "/..");
         r = stat(t2, &st2);
         if (r < 0)
-                return log_error_errno(errno, "Failed to determine block device node of parent of \"%s\": %m", p);
+                return log_full_errno(quiet && errno == EACCES ? LOG_DEBUG : LOG_ERR, errno,
+                                      "Failed to determine block device node of parent of \"%s\": %m", p);
 
         if (st.st_dev == st2.st_dev) {
                 log_error("Directory \"%s\" is not the root of the EFI System Partition (ESP) file system.", p);
@@ -114,8 +122,8 @@ static int verify_esp(
         }
 
         /* In a container we don't have access to block devices, skip this part of the verification, we trust the
-         * container manager set everything up correctly on its own. */
-        if (detect_container() > 0)
+         * container manager set everything up correctly on its own. Also skip the following verification for non-root user. */
+        if (detect_container() > 0 || geteuid() != 0)
                 goto finish;
 
         r = asprintf(&t, "/dev/block/%u:%u", major(st.st_dev), minor(st.st_dev));
@@ -339,7 +347,15 @@ static int status_binaries(const char *esp_path, sd_id128_t partition) {
 
         printf("Boot Loader Binaries:\n");
 
-        printf("          ESP: /dev/disk/by-partuuid/%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\n", SD_ID128_FORMAT_VAL(partition));
+        if (!esp_path) {
+                printf("          ESP: Cannot find or access mount point of ESP.\n\n");
+                return -ENOENT;
+        }
+
+        printf("          ESP: %s", esp_path);
+        if (!sd_id128_is_null(partition))
+                printf(" (/dev/disk/by-partuuid/%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x)", SD_ID128_FORMAT_VAL(partition));
+        printf("\n");
 
         r = enumerate_binaries(esp_path, "EFI/systemd", NULL);
         if (r == 0)
@@ -390,11 +406,6 @@ static int status_variables(void) {
         _cleanup_free_ uint16_t *options = NULL, *order = NULL;
         int i;
 
-        if (!is_efi_boot()) {
-                log_notice("Not booted with EFI, not showing EFI variables.");
-                return 0;
-        }
-
         n_options = efi_get_boot_options(&options);
         if (n_options == -ENOENT)
                 return log_error_errno(n_options,
@@ -1026,15 +1037,9 @@ static int must_be_root(void) {
 static int verb_status(int argc, char *argv[], void *userdata) {
 
         sd_id128_t uuid = SD_ID128_NULL;
-        int r;
+        int r, r2;
 
-        r = must_be_root();
-        if (r < 0)
-                return r;
-
-        r = find_esp(NULL, NULL, NULL, &uuid);
-        if (r < 0)
-                return r;
+        r2 = find_esp(NULL, NULL, NULL, &uuid);
 
         if (is_efi_boot()) {
                 _cleanup_free_ char *fw_type = NULL, *fw_info = NULL, *loader = NULL, *loader_path = NULL;
@@ -1050,44 +1055,47 @@ static int verb_status(int argc, char *argv[], void *userdata) {
 
                 r = efi_loader_get_device_part_uuid(&loader_part_uuid);
                 if (r < 0 && r != -ENOENT)
-                        log_warning_errno(r, "Failed to read EFI variable LoaderDevicePartUUID: %m");
+                        r2 = log_warning_errno(r, "Failed to read EFI variable LoaderDevicePartUUID: %m");
 
                 printf("System:\n");
                 printf("     Firmware: %s (%s)\n", strna(fw_type), strna(fw_info));
 
                 r = is_efi_secure_boot();
                 if (r < 0)
-                        log_warning_errno(r, "Failed to query secure boot status: %m");
+                        r2 = log_warning_errno(r, "Failed to query secure boot status: %m");
                 else
                         printf("  Secure Boot: %sd\n", enable_disable(r));
 
                 r = is_efi_secure_boot_setup_mode();
                 if (r < 0)
-                        log_warning_errno(r, "Failed to query secure boot mode: %m");
+                        r2 = log_warning_errno(r, "Failed to query secure boot mode: %m");
                 else
                         printf("   Setup Mode: %s\n", r ? "setup" : "user");
                 printf("\n");
 
-                printf("Loader:\n");
+                printf("Current Loader:\n");
                 printf("      Product: %s\n", strna(loader));
                 if (!sd_id128_is_null(loader_part_uuid))
-                        printf("    Partition: /dev/disk/by-partuuid/%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\n",
+                        printf("          ESP: /dev/disk/by-partuuid/%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\n",
                                SD_ID128_FORMAT_VAL(loader_part_uuid));
                 else
-                        printf("    Partition: n/a\n");
+                        printf("          ESP: n/a\n");
                 printf("         File: %s%s\n", special_glyph(TREE_RIGHT), strna(loader_path));
                 printf("\n");
         } else
-                printf("System:\n    Not booted with EFI\n");
+                printf("System:\n    Not booted with EFI\n\n");
 
         r = status_binaries(arg_path, uuid);
         if (r < 0)
-                return r;
+                r2 = r;
 
-        if (arg_touch_variables)
+        if (is_efi_boot()) {
                 r = status_variables();
+                if (r < 0)
+                        r2 = r;
+        }
 
-        return r;
+        return r2;
 }
 
 static int verb_install(int argc, char *argv[], void *userdata) {
index db4934a82f22e60fc78ce2d3670667f3769655f4..b28eeb2262ff69dfe314f8b889db56301d8f55ca 100644 (file)
@@ -1832,6 +1832,10 @@ static void unit_check_binds_to(Unit *u) {
                 if (other->job)
                         continue;
 
+                if (!other->coldplugged)
+                        /* We might yet create a job for the other unit… */
+                        continue;
+
                 if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other)))
                         continue;
 
index 9a44b15da71d238ebbf49ffa9a91f77829cbbb41..b0689ffff77f38663043a0f654f00373126a5a02 100644 (file)
@@ -205,7 +205,12 @@ static int found_override(const char *top, const char *bottom) {
         return k;
 }
 
-static int enumerate_dir_d(Hashmap *top, Hashmap *bottom, Hashmap *drops, const char *toppath, const char *drop) {
+static int enumerate_dir_d(
+                OrderedHashmap *top,
+                OrderedHashmap *bottom,
+                OrderedHashmap *drops,
+                const char *toppath, const char *drop) {
+
         _cleanup_free_ char *unit = NULL;
         _cleanup_free_ char *path = NULL;
         _cleanup_strv_free_ char **list = NULL;
@@ -234,8 +239,10 @@ static int enumerate_dir_d(Hashmap *top, Hashmap *bottom, Hashmap *drops, const
         if (r < 0)
                 return log_error_errno(r, "Failed to enumerate %s: %m", path);
 
+        strv_sort(list);
+
         STRV_FOREACH(file, list) {
-                Hashmap *h;
+                OrderedHashmap *h;
                 int k;
                 char *p;
                 char *d;
@@ -249,7 +256,7 @@ static int enumerate_dir_d(Hashmap *top, Hashmap *bottom, Hashmap *drops, const
                 d = p + strlen(toppath) + 1;
 
                 log_debug("Adding at top: %s %s %s", d, special_glyph(ARROW), p);
-                k = hashmap_put(top, d, p);
+                k = ordered_hashmap_put(top, d, p);
                 if (k >= 0) {
                         p = strdup(p);
                         if (!p)
@@ -261,19 +268,19 @@ static int enumerate_dir_d(Hashmap *top, Hashmap *bottom, Hashmap *drops, const
                 }
 
                 log_debug("Adding at bottom: %s %s %s", d, special_glyph(ARROW), p);
-                free(hashmap_remove(bottom, d));
-                k = hashmap_put(bottom, d, p);
+                free(ordered_hashmap_remove(bottom, d));
+                k = ordered_hashmap_put(bottom, d, p);
                 if (k < 0) {
                         free(p);
                         return k;
                 }
 
-                h = hashmap_get(drops, unit);
+                h = ordered_hashmap_get(drops, unit);
                 if (!h) {
-                        h = hashmap_new(&string_hash_ops);
+                        h = ordered_hashmap_new(&string_hash_ops);
                         if (!h)
                                 return -ENOMEM;
-                        hashmap_put(drops, unit, h);
+                        ordered_hashmap_put(drops, unit, h);
                         unit = strdup(unit);
                         if (!unit)
                                 return -ENOMEM;
@@ -285,7 +292,7 @@ static int enumerate_dir_d(Hashmap *top, Hashmap *bottom, Hashmap *drops, const
 
                 log_debug("Adding to drops: %s %s %s %s %s",
                           unit, special_glyph(ARROW), basename(p), special_glyph(ARROW), p);
-                k = hashmap_put(h, basename(p), p);
+                k = ordered_hashmap_put(h, basename(p), p);
                 if (k < 0) {
                         free(p);
                         if (k != -EEXIST)
@@ -295,9 +302,18 @@ static int enumerate_dir_d(Hashmap *top, Hashmap *bottom, Hashmap *drops, const
         return 0;
 }
 
-static int enumerate_dir(Hashmap *top, Hashmap *bottom, Hashmap *drops, const char *path, bool dropins) {
-        _cleanup_closedir_ DIR *d;
+static int enumerate_dir(
+                OrderedHashmap *top,
+                OrderedHashmap *bottom,
+                OrderedHashmap *drops,
+                const char *path, bool dropins) {
+
+        _cleanup_closedir_ DIR *d = NULL;
         struct dirent *de;
+        _cleanup_strv_free_ char **files = NULL, **dirs = NULL;
+        size_t n_files = 0, allocated_files = 0, n_dirs = 0, allocated_dirs = 0;
+        char **t;
+        int r;
 
         assert(top);
         assert(bottom);
@@ -315,40 +331,63 @@ static int enumerate_dir(Hashmap *top, Hashmap *bottom, Hashmap *drops, const ch
         }
 
         FOREACH_DIRENT_ALL(de, d, return -errno) {
-                int k;
-                char *p;
-
                 dirent_ensure_type(d, de);
 
-                if (dropins && de->d_type == DT_DIR && endswith(de->d_name, ".d"))
-                        enumerate_dir_d(top, bottom, drops, path, de->d_name);
+                if (dropins && de->d_type == DT_DIR && endswith(de->d_name, ".d")) {
+                        if (!GREEDY_REALLOC0(dirs, allocated_dirs, n_dirs + 2))
+                                return -ENOMEM;
+
+                        dirs[n_dirs] = strdup(de->d_name);
+                        if (!dirs[n_dirs])
+                                return -ENOMEM;
+                        n_dirs ++;
+                }
 
                 if (!dirent_is_file(de))
                         continue;
 
-                p = strjoin(path, "/", de->d_name);
+                if (!GREEDY_REALLOC0(files, allocated_files, n_files + 2))
+                        return -ENOMEM;
+
+                files[n_files] = strdup(de->d_name);
+                if (!files[n_files])
+                        return -ENOMEM;
+                n_files ++;
+        }
+
+        strv_sort(dirs);
+        strv_sort(files);
+
+        STRV_FOREACH(t, dirs) {
+                r = enumerate_dir_d(top, bottom, drops, path, *t);
+                if (r < 0)
+                        return r;
+        }
+
+        STRV_FOREACH(t, files) {
+                _cleanup_free_ char *p = NULL;
+
+                p = strjoin(path, "/", *t);
                 if (!p)
                         return -ENOMEM;
 
                 log_debug("Adding at top: %s %s %s", basename(p), special_glyph(ARROW), p);
-                k = hashmap_put(top, basename(p), p);
-                if (k >= 0) {
+                r = ordered_hashmap_put(top, basename(p), p);
+                if (r >= 0) {
                         p = strdup(p);
                         if (!p)
                                 return -ENOMEM;
-                } else if (k != -EEXIST) {
-                        free(p);
-                        return k;
-                }
+                } else if (r != -EEXIST)
+                        return r;
 
                 log_debug("Adding at bottom: %s %s %s", basename(p), special_glyph(ARROW), p);
-                free(hashmap_remove(bottom, basename(p)));
-                k = hashmap_put(bottom, basename(p), p);
-                if (k < 0) {
-                        free(p);
-                        return k;
-                }
+                free(ordered_hashmap_remove(bottom, basename(p)));
+                r = ordered_hashmap_put(bottom, basename(p), p);
+                if (r < 0)
+                        return r;
+                p = NULL;
         }
+
         return 0;
 }
 
@@ -370,8 +409,8 @@ static int should_skip_prefix(const char* p) {
 static int process_suffix(const char *suffix, const char *onlyprefix) {
         const char *p;
         char *f;
-        Hashmap *top, *bottom, *drops;
-        Hashmap *h;
+        OrderedHashmap *top, *bottom, *drops;
+        OrderedHashmap *h;
         char *key;
         int r = 0, k;
         Iterator i, j;
@@ -384,9 +423,9 @@ static int process_suffix(const char *suffix, const char *onlyprefix) {
 
         dropins = nulstr_contains(have_dropins, suffix);
 
-        top = hashmap_new(&string_hash_ops);
-        bottom = hashmap_new(&string_hash_ops);
-        drops = hashmap_new(&string_hash_ops);
+        top = ordered_hashmap_new(&string_hash_ops);
+        bottom = ordered_hashmap_new(&string_hash_ops);
+        drops = ordered_hashmap_new(&string_hash_ops);
         if (!top || !bottom || !drops) {
                 r = -ENOMEM;
                 goto finish;
@@ -415,10 +454,10 @@ static int process_suffix(const char *suffix, const char *onlyprefix) {
                         r = k;
         }
 
-        HASHMAP_FOREACH_KEY(f, key, top, i) {
+        ORDERED_HASHMAP_FOREACH_KEY(f, key, top, i) {
                 char *o;
 
-                o = hashmap_get(bottom, key);
+                o = ordered_hashmap_get(bottom, key);
                 assert(o);
 
                 if (!onlyprefix || startswith(o, onlyprefix)) {
@@ -433,23 +472,23 @@ static int process_suffix(const char *suffix, const char *onlyprefix) {
                         }
                 }
 
-                h = hashmap_get(drops, key);
+                h = ordered_hashmap_get(drops, key);
                 if (h)
-                        HASHMAP_FOREACH(o, h, j)
+                        ORDERED_HASHMAP_FOREACH(o, h, j)
                                 if (!onlyprefix || startswith(o, onlyprefix))
                                         n_found += notify_override_extended(f, o);
         }
 
 finish:
-        hashmap_free_free(top);
-        hashmap_free_free(bottom);
+        ordered_hashmap_free_free(top);
+        ordered_hashmap_free_free(bottom);
 
-        HASHMAP_FOREACH_KEY(h, key, drops, i) {
-                hashmap_free_free(hashmap_remove(drops, key));
-                hashmap_remove(drops, key);
+        ORDERED_HASHMAP_FOREACH_KEY(h, key, drops, i) {
+                ordered_hashmap_free_free(ordered_hashmap_remove(drops, key));
+                ordered_hashmap_remove(drops, key);
                 free(key);
         }
-        hashmap_free(drops);
+        ordered_hashmap_free(drops);
 
         return r < 0 ? r : n_found;
 }
index ce9dccfe68c6689577ba128a928205c7502e15da..7f23b9fd7424813bc7bac9c5263319f47820fda3 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "alloc-util.h"
 #include "fd-util.h"
+#include "fs-util.h"
 #include "fileio.h"
 #include "fstab-util.h"
 #include "generator.h"
@@ -290,6 +291,7 @@ static int add_mount(
                 const char *dest,
                 const char *what,
                 const char *where,
+                const char *original_where,
                 const char *fstype,
                 const char *opts,
                 int passno,
@@ -396,11 +398,10 @@ static int add_mount(
                         return r;
         }
 
-        fprintf(f,
-                "\n"
-                "[Mount]\n"
-                "Where=%s\n",
-                where);
+        fprintf(f, "\n[Mount]\n");
+        if (original_where)
+                fprintf(f, "# Canonicalized from %s\n", original_where);
+        fprintf(f, "Where=%s\n", where);
 
         r = write_what(f, what);
         if (r < 0)
@@ -520,7 +521,7 @@ static int parse_fstab(bool initrd) {
         }
 
         while ((me = getmntent(f))) {
-                _cleanup_free_ char *where = NULL, *what = NULL;
+                _cleanup_free_ char *where = NULL, *what = NULL, *canonical_where = NULL;
                 bool noauto, nofail;
                 int k;
 
@@ -540,8 +541,28 @@ static int parse_fstab(bool initrd) {
                 if (!where)
                         return log_oom();
 
-                if (is_path(where))
+                if (is_path(where)) {
                         path_kill_slashes(where);
+                        /* Follow symlinks here; see 5261ba901845c084de5a8fd06500ed09bfb0bd80 which makes sense for
+                         * mount units, but causes problems since it historically worked to have symlinks in e.g.
+                         * /etc/fstab. So we canonicalize here. Note that we use CHASE_NONEXISTENT to handle the case
+                         * where a symlink refers to another mount target; this works assuming the sub-mountpoint
+                         * target is the final directory.
+                         */
+                        r = chase_symlinks(where, initrd ? "/sysroot" : NULL,
+                                           CHASE_PREFIX_ROOT | CHASE_NONEXISTENT,
+                                           &canonical_where);
+                        if (r < 0)
+                                /* In this case for now we continue on as if it wasn't a symlink */
+                                log_warning_errno(r, "Failed to read symlink target for %s: %m", where);
+                        else {
+                                if (streq(canonical_where, where))
+                                        canonical_where = mfree(canonical_where);
+                                else
+                                        log_debug("Canonicalized what=%s where=%s to %s",
+                                                  what, where, canonical_where);
+                        }
+                }
 
                 noauto = fstab_test_yes_no_option(me->mnt_opts, "noauto\0" "auto\0");
                 nofail = fstab_test_yes_no_option(me->mnt_opts, "nofail\0" "fail\0");
@@ -567,7 +588,8 @@ static int parse_fstab(bool initrd) {
 
                         k = add_mount(arg_dest,
                                       what,
-                                      where,
+                                      canonical_where ?: where,
+                                      canonical_where ? where: NULL,
                                       me->mnt_type,
                                       me->mnt_opts,
                                       me->mnt_passno,
@@ -630,6 +652,7 @@ static int add_sysroot_mount(void) {
         return add_mount(arg_dest,
                          what,
                          "/sysroot",
+                         NULL,
                          arg_root_fstype,
                          opts,
                          is_device_path(what) ? 1 : 0, /* passno */
@@ -684,6 +707,7 @@ static int add_sysroot_usr_mount(void) {
         return add_mount(arg_dest,
                          what,
                          "/sysroot/usr",
+                         NULL,
                          arg_usr_fstype,
                          opts,
                          is_device_path(what) ? 1 : 0, /* passno */
@@ -724,6 +748,7 @@ static int add_volatile_var(void) {
         return add_mount(arg_dest_late,
                          "tmpfs",
                          "/var",
+                         NULL,
                          "tmpfs",
                          "mode=0755",
                          0,
index 243d5198d9fa1396ae746b5927f521c8484a082f..4ff38de2e6a9a94d386fee007593bf93c9468ae1 100644 (file)
@@ -162,7 +162,7 @@ static int journal_file_set_offline_thread_join(JournalFile *f) {
 
         f->offline_state = OFFLINE_JOINED;
 
-        if (mmap_cache_got_sigbus(f->mmap, f->fd))
+        if (mmap_cache_got_sigbus(f->mmap, f->cache_fd))
                 return -EIO;
 
         return 0;
@@ -300,7 +300,7 @@ static int journal_file_set_online(JournalFile *f) {
                 }
         }
 
-        if (mmap_cache_got_sigbus(f->mmap, f->fd))
+        if (mmap_cache_got_sigbus(f->mmap, f->cache_fd))
                 return -EIO;
 
         switch (f->header->state) {
@@ -356,8 +356,8 @@ JournalFile* journal_file_close(JournalFile *f) {
 
         journal_file_set_offline(f, true);
 
-        if (f->mmap && f->fd >= 0)
-                mmap_cache_close_fd(f->mmap, f->fd);
+        if (f->mmap && f->cache_fd)
+                mmap_cache_free_fd(f->mmap, f->cache_fd);
 
         if (f->fd >= 0 && f->defrag_on_close) {
 
@@ -660,7 +660,7 @@ static int journal_file_allocate(JournalFile *f, uint64_t offset, uint64_t size)
          * for sure, since we always call posix_fallocate()
          * ourselves */
 
-        if (mmap_cache_got_sigbus(f->mmap, f->fd))
+        if (mmap_cache_got_sigbus(f->mmap, f->cache_fd))
                 return -EIO;
 
         old_size =
@@ -749,7 +749,7 @@ static int journal_file_move_to(JournalFile *f, ObjectType type, bool keep_alway
                         return -EADDRNOTAVAIL;
         }
 
-        return mmap_cache_get(f->mmap, f->fd, f->prot, type_to_context(type), keep_always, offset, size, &f->last_stat, ret);
+        return mmap_cache_get(f->mmap, f->cache_fd, f->prot, type_to_context(type), keep_always, offset, size, &f->last_stat, ret);
 }
 
 static uint64_t minimum_header_size(Object *o) {
@@ -1857,7 +1857,7 @@ int journal_file_append_entry(JournalFile *f, const dual_timestamp *ts, const st
          * it is very likely just an effect of a nullified replacement
          * mapping page */
 
-        if (mmap_cache_got_sigbus(f->mmap, f->fd))
+        if (mmap_cache_got_sigbus(f->mmap, f->cache_fd))
                 r = -EIO;
 
         if (f->post_change_timer)
@@ -3144,6 +3144,12 @@ int journal_file_open(
                 f->close_fd = true;
         }
 
+        f->cache_fd = mmap_cache_add_fd(f->mmap, f->fd);
+        if (!f->cache_fd) {
+                r = -ENOMEM;
+                goto fail;
+        }
+
         r = journal_file_fstat(f);
         if (r < 0)
                 goto fail;
@@ -3190,7 +3196,7 @@ int journal_file_open(
                 goto fail;
         }
 
-        r = mmap_cache_get(f->mmap, f->fd, f->prot, CONTEXT_HEADER, true, 0, PAGE_ALIGN(sizeof(Header)), &f->last_stat, &h);
+        r = mmap_cache_get(f->mmap, f->cache_fd, f->prot, CONTEXT_HEADER, true, 0, PAGE_ALIGN(sizeof(Header)), &f->last_stat, &h);
         if (r < 0)
                 goto fail;
 
@@ -3247,7 +3253,7 @@ int journal_file_open(
 #endif
         }
 
-        if (mmap_cache_got_sigbus(f->mmap, f->fd)) {
+        if (mmap_cache_got_sigbus(f->mmap, f->cache_fd)) {
                 r = -EIO;
                 goto fail;
         }
@@ -3269,7 +3275,7 @@ int journal_file_open(
         return 0;
 
 fail:
-        if (f->fd >= 0 && mmap_cache_got_sigbus(f->mmap, f->fd))
+        if (f->cache_fd && mmap_cache_got_sigbus(f->mmap, f->cache_fd))
                 r = -EIO;
 
         (void) journal_file_close(f);
@@ -3482,7 +3488,7 @@ int journal_file_copy_entry(JournalFile *from, JournalFile *to, Object *o, uint6
 
         r = journal_file_append_entry_internal(to, &ts, xor_hash, items, n, seqnum, ret, offset);
 
-        if (mmap_cache_got_sigbus(to->mmap, to->fd))
+        if (mmap_cache_got_sigbus(to->mmap, to->cache_fd))
                 return -EIO;
 
         return r;
index 564e1a8179b8c2bf2bbf049070d8fab0644b9b1d..df457c9a81de1370f957a5b79cdf62513e79c619 100644 (file)
@@ -75,6 +75,7 @@ typedef enum OfflineState {
 
 typedef struct JournalFile {
         int fd;
+        MMapFileDescriptor *cache_fd;
 
         mode_t mode;
 
index 9e4d8a28a545e2f22f171a57e3e164b8994db594..9feb5b5ae6974d5cddee030f7082176d3ce42dd9 100644 (file)
@@ -377,12 +377,12 @@ static int write_uint64(int fd, uint64_t p) {
         return 0;
 }
 
-static int contains_uint64(MMapCache *m, int fd, uint64_t n, uint64_t p) {
+static int contains_uint64(MMapCache *m, MMapFileDescriptor *f, uint64_t n, uint64_t p) {
         uint64_t a, b;
         int r;
 
         assert(m);
-        assert(fd >= 0);
+        assert(f);
 
         /* Bisection ... */
 
@@ -392,7 +392,7 @@ static int contains_uint64(MMapCache *m, int fd, uint64_t n, uint64_t p) {
 
                 c = (a + b) / 2;
 
-                r = mmap_cache_get(m, fd, PROT_READ|PROT_WRITE, 0, false, c * sizeof(uint64_t), sizeof(uint64_t), NULL, (void **) &z);
+                r = mmap_cache_get(m, f, PROT_READ|PROT_WRITE, 0, false, c * sizeof(uint64_t), sizeof(uint64_t), NULL, (void **) &z);
                 if (r < 0)
                         return r;
 
@@ -413,7 +413,7 @@ static int contains_uint64(MMapCache *m, int fd, uint64_t n, uint64_t p) {
 
 static int entry_points_to_data(
                 JournalFile *f,
-                int entry_fd,
+                MMapFileDescriptor *cache_entry_fd,
                 uint64_t n_entries,
                 uint64_t entry_p,
                 uint64_t data_p) {
@@ -424,9 +424,9 @@ static int entry_points_to_data(
         bool found = false;
 
         assert(f);
-        assert(entry_fd >= 0);
+        assert(cache_entry_fd);
 
-        if (!contains_uint64(f->mmap, entry_fd, n_entries, entry_p)) {
+        if (!contains_uint64(f->mmap, cache_entry_fd, n_entries, entry_p)) {
                 error(data_p, "Data object references invalid entry at "OFSfmt, entry_p);
                 return -EBADMSG;
         }
@@ -500,16 +500,16 @@ static int entry_points_to_data(
 static int verify_data(
                 JournalFile *f,
                 Object *o, uint64_t p,
-                int entry_fd, uint64_t n_entries,
-                int entry_array_fd, uint64_t n_entry_arrays) {
+                MMapFileDescriptor *cache_entry_fd, uint64_t n_entries,
+                MMapFileDescriptor *cache_entry_array_fd, uint64_t n_entry_arrays) {
 
         uint64_t i, n, a, last, q;
         int r;
 
         assert(f);
         assert(o);
-        assert(entry_fd >= 0);
-        assert(entry_array_fd >= 0);
+        assert(cache_entry_fd);
+        assert(cache_entry_array_fd);
 
         n = le64toh(o->data.n_entries);
         a = le64toh(o->data.entry_array_offset);
@@ -527,7 +527,7 @@ static int verify_data(
         assert(o->data.entry_offset);
 
         last = q = le64toh(o->data.entry_offset);
-        r = entry_points_to_data(f, entry_fd, n_entries, q, p);
+        r = entry_points_to_data(f, cache_entry_fd, n_entries, q, p);
         if (r < 0)
                 return r;
 
@@ -540,7 +540,7 @@ static int verify_data(
                         return -EBADMSG;
                 }
 
-                if (!contains_uint64(f->mmap, entry_array_fd, n_entry_arrays, a)) {
+                if (!contains_uint64(f->mmap, cache_entry_array_fd, n_entry_arrays, a)) {
                         error(p, "Invalid array offset "OFSfmt, a);
                         return -EBADMSG;
                 }
@@ -565,7 +565,7 @@ static int verify_data(
                         }
                         last = q;
 
-                        r = entry_points_to_data(f, entry_fd, n_entries, q, p);
+                        r = entry_points_to_data(f, cache_entry_fd, n_entries, q, p);
                         if (r < 0)
                                 return r;
 
@@ -583,9 +583,9 @@ static int verify_data(
 
 static int verify_hash_table(
                 JournalFile *f,
-                int data_fd, uint64_t n_data,
-                int entry_fd, uint64_t n_entries,
-                int entry_array_fd, uint64_t n_entry_arrays,
+                MMapFileDescriptor *cache_data_fd, uint64_t n_data,
+                MMapFileDescriptor *cache_entry_fd, uint64_t n_entries,
+                MMapFileDescriptor *cache_entry_array_fd, uint64_t n_entry_arrays,
                 usec_t *last_usec,
                 bool show_progress) {
 
@@ -593,9 +593,9 @@ static int verify_hash_table(
         int r;
 
         assert(f);
-        assert(data_fd >= 0);
-        assert(entry_fd >= 0);
-        assert(entry_array_fd >= 0);
+        assert(cache_data_fd);
+        assert(cache_entry_fd);
+        assert(cache_entry_array_fd);
         assert(last_usec);
 
         n = le64toh(f->header->data_hash_table_size) / sizeof(HashItem);
@@ -617,7 +617,7 @@ static int verify_hash_table(
                         Object *o;
                         uint64_t next;
 
-                        if (!contains_uint64(f->mmap, data_fd, n_data, p)) {
+                        if (!contains_uint64(f->mmap, cache_data_fd, n_data, p)) {
                                 error(p, "Invalid data object at hash entry %"PRIu64" of %"PRIu64, i, n);
                                 return -EBADMSG;
                         }
@@ -637,7 +637,7 @@ static int verify_hash_table(
                                 return -EBADMSG;
                         }
 
-                        r = verify_data(f, o, p, entry_fd, n_entries, entry_array_fd, n_entry_arrays);
+                        r = verify_data(f, o, p, cache_entry_fd, n_entries, cache_entry_array_fd, n_entry_arrays);
                         if (r < 0)
                                 return r;
 
@@ -689,14 +689,14 @@ static int data_object_in_hash_table(JournalFile *f, uint64_t hash, uint64_t p)
 static int verify_entry(
                 JournalFile *f,
                 Object *o, uint64_t p,
-                int data_fd, uint64_t n_data) {
+                MMapFileDescriptor *cache_data_fd, uint64_t n_data) {
 
         uint64_t i, n;
         int r;
 
         assert(f);
         assert(o);
-        assert(data_fd >= 0);
+        assert(cache_data_fd);
 
         n = journal_file_entry_n_items(o);
         for (i = 0; i < n; i++) {
@@ -706,7 +706,7 @@ static int verify_entry(
                 q = le64toh(o->entry.items[i].object_offset);
                 h = le64toh(o->entry.items[i].hash);
 
-                if (!contains_uint64(f->mmap, data_fd, n_data, q)) {
+                if (!contains_uint64(f->mmap, cache_data_fd, n_data, q)) {
                         error(p, "Invalid data object of entry");
                         return -EBADMSG;
                 }
@@ -734,9 +734,9 @@ static int verify_entry(
 
 static int verify_entry_array(
                 JournalFile *f,
-                int data_fd, uint64_t n_data,
-                int entry_fd, uint64_t n_entries,
-                int entry_array_fd, uint64_t n_entry_arrays,
+                MMapFileDescriptor *cache_data_fd, uint64_t n_data,
+                MMapFileDescriptor *cache_entry_fd, uint64_t n_entries,
+                MMapFileDescriptor *cache_entry_array_fd, uint64_t n_entry_arrays,
                 usec_t *last_usec,
                 bool show_progress) {
 
@@ -744,9 +744,9 @@ static int verify_entry_array(
         int r;
 
         assert(f);
-        assert(data_fd >= 0);
-        assert(entry_fd >= 0);
-        assert(entry_array_fd >= 0);
+        assert(cache_data_fd);
+        assert(cache_entry_fd);
+        assert(cache_entry_array_fd);
         assert(last_usec);
 
         n = le64toh(f->header->n_entries);
@@ -763,7 +763,7 @@ static int verify_entry_array(
                         return -EBADMSG;
                 }
 
-                if (!contains_uint64(f->mmap, entry_array_fd, n_entry_arrays, a)) {
+                if (!contains_uint64(f->mmap, cache_entry_array_fd, n_entry_arrays, a)) {
                         error(a, "Invalid array %"PRIu64" of %"PRIu64, i, n);
                         return -EBADMSG;
                 }
@@ -789,7 +789,7 @@ static int verify_entry_array(
                         }
                         last = p;
 
-                        if (!contains_uint64(f->mmap, entry_fd, n_entries, p)) {
+                        if (!contains_uint64(f->mmap, cache_entry_fd, n_entries, p)) {
                                 error(a, "Invalid array entry at %"PRIu64" of %"PRIu64, i, n);
                                 return -EBADMSG;
                         }
@@ -798,7 +798,7 @@ static int verify_entry_array(
                         if (r < 0)
                                 return r;
 
-                        r = verify_entry(f, o, p, data_fd, n_data);
+                        r = verify_entry(f, o, p, cache_data_fd, n_data);
                         if (r < 0)
                                 return r;
 
@@ -829,6 +829,7 @@ int journal_file_verify(
         uint64_t n_weird = 0, n_objects = 0, n_entries = 0, n_data = 0, n_fields = 0, n_data_hash_tables = 0, n_field_hash_tables = 0, n_entry_arrays = 0, n_tags = 0;
         usec_t last_usec = 0;
         int data_fd = -1, entry_fd = -1, entry_array_fd = -1;
+        MMapFileDescriptor *cache_data_fd = NULL, *cache_entry_fd = NULL, *cache_entry_array_fd = NULL;
         unsigned i;
         bool found_last = false;
         const char *tmp_dir = NULL;
@@ -876,6 +877,24 @@ int journal_file_verify(
                 goto fail;
         }
 
+        cache_data_fd = mmap_cache_add_fd(f->mmap, data_fd);
+        if (!cache_data_fd) {
+                r = log_oom();
+                goto fail;
+        }
+
+        cache_entry_fd = mmap_cache_add_fd(f->mmap, entry_fd);
+        if (!cache_entry_fd) {
+                r = log_oom();
+                goto fail;
+        }
+
+        cache_entry_array_fd = mmap_cache_add_fd(f->mmap, entry_array_fd);
+        if (!cache_entry_array_fd) {
+                r = log_oom();
+                goto fail;
+        }
+
         if (le32toh(f->header->compatible_flags) & ~HEADER_COMPATIBLE_SUPPORTED) {
                 log_error("Cannot verify file with unknown extensions.");
                 r = -EOPNOTSUPP;
@@ -1247,18 +1266,18 @@ int journal_file_verify(
          * referenced is consistent. */
 
         r = verify_entry_array(f,
-                               data_fd, n_data,
-                               entry_fd, n_entries,
-                               entry_array_fd, n_entry_arrays,
+                               cache_data_fd, n_data,
+                               cache_entry_fd, n_entries,
+                               cache_entry_array_fd, n_entry_arrays,
                                &last_usec,
                                show_progress);
         if (r < 0)
                 goto fail;
 
         r = verify_hash_table(f,
-                              data_fd, n_data,
-                              entry_fd, n_entries,
-                              entry_array_fd, n_entry_arrays,
+                              cache_data_fd, n_data,
+                              cache_entry_fd, n_entries,
+                              cache_entry_array_fd, n_entry_arrays,
                               &last_usec,
                               show_progress);
         if (r < 0)
@@ -1267,9 +1286,9 @@ int journal_file_verify(
         if (show_progress)
                 flush_progress();
 
-        mmap_cache_close_fd(f->mmap, data_fd);
-        mmap_cache_close_fd(f->mmap, entry_fd);
-        mmap_cache_close_fd(f->mmap, entry_array_fd);
+        mmap_cache_free_fd(f->mmap, cache_data_fd);
+        mmap_cache_free_fd(f->mmap, cache_entry_fd);
+        mmap_cache_free_fd(f->mmap, cache_entry_array_fd);
 
         safe_close(data_fd);
         safe_close(entry_fd);
@@ -1294,20 +1313,23 @@ fail:
                   (unsigned long long) f->last_stat.st_size,
                   100 * p / f->last_stat.st_size);
 
-        if (data_fd >= 0) {
-                mmap_cache_close_fd(f->mmap, data_fd);
+        if (data_fd >= 0)
                 safe_close(data_fd);
-        }
 
-        if (entry_fd >= 0) {
-                mmap_cache_close_fd(f->mmap, entry_fd);
+        if (entry_fd >= 0)
                 safe_close(entry_fd);
-        }
 
-        if (entry_array_fd >= 0) {
-                mmap_cache_close_fd(f->mmap, entry_array_fd);
+        if (entry_array_fd >= 0)
                 safe_close(entry_array_fd);
-        }
+
+        if (cache_data_fd)
+                mmap_cache_free_fd(f->mmap, cache_data_fd);
+
+        if (cache_entry_fd)
+                mmap_cache_free_fd(f->mmap, cache_entry_fd);
+
+        if (cache_entry_array_fd)
+                mmap_cache_free_fd(f->mmap, cache_entry_array_fd);
 
         return r;
 }
index 698a5a9dc85f273a2981a030fcc024f39cab7035..2313c8c6786dceb17153e284f5751bc7374c2cdd 100644 (file)
@@ -2483,6 +2483,7 @@ int main(int argc, char *argv[]) {
                         break;
                 }
 
+                fflush(stdout);
                 r = sd_journal_wait(j, (uint64_t) -1);
                 if (r < 0) {
                         log_error_errno(r, "Couldn't wait for journal event: %m");
@@ -2493,6 +2494,7 @@ int main(int argc, char *argv[]) {
         }
 
 finish:
+        fflush(stdout);
         pager_close();
 
         strv_free(arg_file);
index d91247b52449988c91bc74507b218f03b1e9cf41..5dfda73c56a7d7d7f3503c23c31631e7eea3f1e0 100644 (file)
@@ -33,7 +33,6 @@
 
 typedef struct Window Window;
 typedef struct Context Context;
-typedef struct FileDescriptor FileDescriptor;
 
 struct Window {
         MMapCache *cache;
@@ -47,7 +46,7 @@ struct Window {
         uint64_t offset;
         size_t size;
 
-        FileDescriptor *fd;
+        MMapFileDescriptor *fd;
 
         LIST_FIELDS(Window, by_fd);
         LIST_FIELDS(Window, unused);
@@ -63,7 +62,7 @@ struct Context {
         LIST_FIELDS(Context, by_window);
 };
 
-struct FileDescriptor {
+struct MMapFileDescriptor {
         MMapCache *cache;
         int fd;
         bool sigbus;
@@ -158,24 +157,24 @@ static void window_free(Window *w) {
         free(w);
 }
 
-_pure_ static bool window_matches(Window *w, int fd, int prot, uint64_t offset, size_t size) {
+_pure_ static bool window_matches(Window *w, MMapFileDescriptor *f, int prot, uint64_t offset, size_t size) {
         assert(w);
-        assert(fd >= 0);
+        assert(f);
         assert(size > 0);
 
         return
                 w->fd &&
-                fd == w->fd->fd &&
+                f->fd == w->fd->fd &&
                 prot == w->prot &&
                 offset >= w->offset &&
                 offset + size <= w->offset + w->size;
 }
 
-static Window *window_add(MMapCache *m, FileDescriptor *fd, int prot, bool keep_always, uint64_t offset, size_t size, void *ptr) {
+static Window *window_add(MMapCache *m, MMapFileDescriptor *f, int prot, bool keep_always, uint64_t offset, size_t size, void *ptr) {
         Window *w;
 
         assert(m);
-        assert(fd);
+        assert(f);
 
         if (!m->last_unused || m->n_windows <= WINDOWS_MIN) {
 
@@ -193,14 +192,14 @@ static Window *window_add(MMapCache *m, FileDescriptor *fd, int prot, bool keep_
         }
 
         w->cache = m;
-        w->fd = fd;
+        w->fd = f;
         w->prot = prot;
         w->keep_always = keep_always;
         w->offset = offset;
         w->size = size;
         w->ptr = ptr;
 
-        LIST_PREPEND(by_fd, fd->windows, w);
+        LIST_PREPEND(by_fd, f->windows, w);
 
         return w;
 }
@@ -290,49 +289,7 @@ static void context_free(Context *c) {
         free(c);
 }
 
-static void fd_free(FileDescriptor *f) {
-        assert(f);
-
-        while (f->windows)
-                window_free(f->windows);
-
-        if (f->cache)
-                assert_se(hashmap_remove(f->cache->fds, FD_TO_PTR(f->fd)));
-
-        free(f);
-}
-
-static FileDescriptor* fd_add(MMapCache *m, int fd) {
-        FileDescriptor *f;
-        int r;
-
-        assert(m);
-        assert(fd >= 0);
-
-        f = hashmap_get(m->fds, FD_TO_PTR(fd));
-        if (f)
-                return f;
-
-        r = hashmap_ensure_allocated(&m->fds, NULL);
-        if (r < 0)
-                return NULL;
-
-        f = new0(FileDescriptor, 1);
-        if (!f)
-                return NULL;
-
-        f->cache = m;
-        f->fd = fd;
-
-        r = hashmap_put(m->fds, FD_TO_PTR(fd), f);
-        if (r < 0)
-                return mfree(f);
-
-        return f;
-}
-
 static void mmap_cache_free(MMapCache *m) {
-        FileDescriptor *f;
         int i;
 
         assert(m);
@@ -341,9 +298,6 @@ static void mmap_cache_free(MMapCache *m) {
                 if (m->contexts[i])
                         context_free(m->contexts[i]);
 
-        while ((f = hashmap_first(m->fds)))
-                fd_free(f);
-
         hashmap_free(m->fds);
 
         while (m->unused)
@@ -378,7 +332,7 @@ static int make_room(MMapCache *m) {
 
 static int try_context(
                 MMapCache *m,
-                int fd,
+                MMapFileDescriptor *f,
                 int prot,
                 unsigned context,
                 bool keep_always,
@@ -390,7 +344,7 @@ static int try_context(
 
         assert(m);
         assert(m->n_ref > 0);
-        assert(fd >= 0);
+        assert(f);
         assert(size > 0);
         assert(ret);
 
@@ -403,7 +357,7 @@ static int try_context(
         if (!c->window)
                 return 0;
 
-        if (!window_matches(c->window, fd, prot, offset, size)) {
+        if (!window_matches(c->window, f, prot, offset, size)) {
 
                 /* Drop the reference to the window, since it's unnecessary now */
                 context_detach_window(c);
@@ -421,7 +375,7 @@ static int try_context(
 
 static int find_mmap(
                 MMapCache *m,
-                int fd,
+                MMapFileDescriptor *f,
                 int prot,
                 unsigned context,
                 bool keep_always,
@@ -429,26 +383,19 @@ static int find_mmap(
                 size_t size,
                 void **ret) {
 
-        FileDescriptor *f;
         Window *w;
         Context *c;
 
         assert(m);
         assert(m->n_ref > 0);
-        assert(fd >= 0);
+        assert(f);
         assert(size > 0);
 
-        f = hashmap_get(m->fds, FD_TO_PTR(fd));
-        if (!f)
-                return 0;
-
-        assert(f->fd == fd);
-
         if (f->sigbus)
                 return -EIO;
 
         LIST_FOREACH(by_fd, w, f->windows)
-                if (window_matches(w, fd, prot, offset, size))
+                if (window_matches(w, f, prot, offset, size))
                         break;
 
         if (!w)
@@ -465,17 +412,17 @@ static int find_mmap(
         return 1;
 }
 
-static int mmap_try_harder(MMapCache *m, void *addr, int fd, int prot, int flags, uint64_t offset, size_t size, void **res) {
+static int mmap_try_harder(MMapCache *m, void *addr, MMapFileDescriptor *f, int prot, int flags, uint64_t offset, size_t size, void **res) {
         void *ptr;
 
         assert(m);
-        assert(fd >= 0);
+        assert(f);
         assert(res);
 
         for (;;) {
                 int r;
 
-                ptr = mmap(addr, size, prot, flags, fd, offset);
+                ptr = mmap(addr, size, prot, flags, f->fd, offset);
                 if (ptr != MAP_FAILED)
                         break;
                 if (errno != ENOMEM)
@@ -494,7 +441,7 @@ static int mmap_try_harder(MMapCache *m, void *addr, int fd, int prot, int flags
 
 static int add_mmap(
                 MMapCache *m,
-                int fd,
+                MMapFileDescriptor *f,
                 int prot,
                 unsigned context,
                 bool keep_always,
@@ -505,14 +452,13 @@ static int add_mmap(
 
         uint64_t woffset, wsize;
         Context *c;
-        FileDescriptor *f;
         Window *w;
         void *d;
         int r;
 
         assert(m);
         assert(m->n_ref > 0);
-        assert(fd >= 0);
+        assert(f);
         assert(size > 0);
         assert(ret);
 
@@ -545,7 +491,7 @@ static int add_mmap(
                         wsize = PAGE_ALIGN(st->st_size - woffset);
         }
 
-        r = mmap_try_harder(m, NULL, fd, prot, MAP_SHARED, woffset, wsize, &d);
+        r = mmap_try_harder(m, NULL, f, prot, MAP_SHARED, woffset, wsize, &d);
         if (r < 0)
                 return r;
 
@@ -553,10 +499,6 @@ static int add_mmap(
         if (!c)
                 goto outofmem;
 
-        f = fd_add(m, fd);
-        if (!f)
-                goto outofmem;
-
         w = window_add(m, f, prot, keep_always, woffset, wsize, d);
         if (!w)
                 goto outofmem;
@@ -575,7 +517,7 @@ outofmem:
 
 int mmap_cache_get(
                 MMapCache *m,
-                int fd,
+                MMapFileDescriptor *f,
                 int prot,
                 unsigned context,
                 bool keep_always,
@@ -588,20 +530,20 @@ int mmap_cache_get(
 
         assert(m);
         assert(m->n_ref > 0);
-        assert(fd >= 0);
+        assert(f);
         assert(size > 0);
         assert(ret);
         assert(context < MMAP_CACHE_MAX_CONTEXTS);
 
         /* Check whether the current context is the right one already */
-        r = try_context(m, fd, prot, context, keep_always, offset, size, ret);
+        r = try_context(m, f, prot, context, keep_always, offset, size, ret);
         if (r != 0) {
                 m->n_hit++;
                 return r;
         }
 
         /* Search for a matching mmap */
-        r = find_mmap(m, fd, prot, context, keep_always, offset, size, ret);
+        r = find_mmap(m, f, prot, context, keep_always, offset, size, ret);
         if (r != 0) {
                 m->n_hit++;
                 return r;
@@ -610,7 +552,7 @@ int mmap_cache_get(
         m->n_missed++;
 
         /* Create a new mmap */
-        return add_mmap(m, fd, prot, context, keep_always, offset, size, st, ret);
+        return add_mmap(m, f, prot, context, keep_always, offset, size, st, ret);
 }
 
 unsigned mmap_cache_get_hit(MMapCache *m) {
@@ -627,7 +569,7 @@ unsigned mmap_cache_get_missed(MMapCache *m) {
 
 static void mmap_cache_process_sigbus(MMapCache *m) {
         bool found = false;
-        FileDescriptor *f;
+        MMapFileDescriptor *f;
         Iterator i;
         int r;
 
@@ -688,36 +630,59 @@ static void mmap_cache_process_sigbus(MMapCache *m) {
         }
 }
 
-bool mmap_cache_got_sigbus(MMapCache *m, int fd) {
-        FileDescriptor *f;
-
+bool mmap_cache_got_sigbus(MMapCache *m, MMapFileDescriptor *f) {
         assert(m);
-        assert(fd >= 0);
+        assert(f);
 
         mmap_cache_process_sigbus(m);
 
-        f = hashmap_get(m->fds, FD_TO_PTR(fd));
-        if (!f)
-                return false;
-
         return f->sigbus;
 }
 
-void mmap_cache_close_fd(MMapCache *m, int fd) {
-        FileDescriptor *f;
+MMapFileDescriptor* mmap_cache_add_fd(MMapCache *m, int fd) {
+        MMapFileDescriptor *f;
+        int r;
 
         assert(m);
         assert(fd >= 0);
 
+        f = hashmap_get(m->fds, FD_TO_PTR(fd));
+        if (f)
+                return f;
+
+        r = hashmap_ensure_allocated(&m->fds, NULL);
+        if (r < 0)
+                return NULL;
+
+        f = new0(MMapFileDescriptor, 1);
+        if (!f)
+                return NULL;
+
+        f->cache = m;
+        f->fd = fd;
+
+        r = hashmap_put(m->fds, FD_TO_PTR(fd), f);
+        if (r < 0)
+                return mfree(f);
+
+        return f;
+}
+
+void mmap_cache_free_fd(MMapCache *m, MMapFileDescriptor *f) {
+        assert(m);
+        assert(f);
+
         /* Make sure that any queued SIGBUS are first dispatched, so
          * that we don't end up with a SIGBUS entry we cannot relate
          * to any existing memory map */
 
         mmap_cache_process_sigbus(m);
 
-        f = hashmap_get(m->fds, FD_TO_PTR(fd));
-        if (!f)
-                return;
+        while (f->windows)
+                window_free(f->windows);
+
+        if (f->cache)
+                assert_se(hashmap_remove(f->cache->fds, FD_TO_PTR(f->fd)));
 
-        fd_free(f);
+        free(f);
 }
index 199d944647938199167b1209317032047680f968..7b332185636c401418cc8f43b872479828020ecf 100644 (file)
@@ -26,6 +26,7 @@
 #define MMAP_CACHE_MAX_CONTEXTS 9
 
 typedef struct MMapCache MMapCache;
+typedef struct MMapFileDescriptor MMapFileDescriptor;
 
 MMapCache* mmap_cache_new(void);
 MMapCache* mmap_cache_ref(MMapCache *m);
@@ -33,7 +34,7 @@ MMapCache* mmap_cache_unref(MMapCache *m);
 
 int mmap_cache_get(
         MMapCache *m,
-        int fd,
+        MMapFileDescriptor *f,
         int prot,
         unsigned context,
         bool keep_always,
@@ -41,9 +42,10 @@ int mmap_cache_get(
         size_t size,
         struct stat *st,
         void **ret);
-void mmap_cache_close_fd(MMapCache *m, int fd);
+MMapFileDescriptor * mmap_cache_add_fd(MMapCache *m, int fd);
+void mmap_cache_free_fd(MMapCache *m, MMapFileDescriptor *f);
 
 unsigned mmap_cache_get_hit(MMapCache *m);
 unsigned mmap_cache_get_missed(MMapCache *m);
 
-bool mmap_cache_got_sigbus(MMapCache *m, int fd);
+bool mmap_cache_got_sigbus(MMapCache *m, MMapFileDescriptor *f);
index 0ad49aeb5fd5322a6294275d94b212c5b9a3728e..c51b069f8bd200eb90703c0d2c6ad1d4908e528c 100644 (file)
@@ -29,6 +29,7 @@
 #include "util.h"
 
 int main(int argc, char *argv[]) {
+        MMapFileDescriptor *fx;
         int x, y, z, r;
         char px[] = "/tmp/testmmapXXXXXXX", py[] = "/tmp/testmmapYXXXXXX", pz[] = "/tmp/testmmapZXXXXXX";
         MMapCache *m;
@@ -40,6 +41,8 @@ int main(int argc, char *argv[]) {
         assert_se(x >= 0);
         unlink(px);
 
+        assert_se(fx = mmap_cache_add_fd(m, x));
+
         y = mkostemp_safe(py);
         assert_se(y >= 0);
         unlink(py);
@@ -48,27 +51,28 @@ int main(int argc, char *argv[]) {
         assert_se(z >= 0);
         unlink(pz);
 
-        r = mmap_cache_get(m, x, PROT_READ, 0, false, 1, 2, NULL, &p);
+        r = mmap_cache_get(m, fx, PROT_READ, 0, false, 1, 2, NULL, &p);
         assert_se(r >= 0);
 
-        r = mmap_cache_get(m, x, PROT_READ, 0, false, 2, 2, NULL, &q);
+        r = mmap_cache_get(m, fx, PROT_READ, 0, false, 2, 2, NULL, &q);
         assert_se(r >= 0);
 
         assert_se((uint8_t*) p + 1 == (uint8_t*) q);
 
-        r = mmap_cache_get(m, x, PROT_READ, 1, false, 3, 2, NULL, &q);
+        r = mmap_cache_get(m, fx, PROT_READ, 1, false, 3, 2, NULL, &q);
         assert_se(r >= 0);
 
         assert_se((uint8_t*) p + 2 == (uint8_t*) q);
 
-        r = mmap_cache_get(m, x, PROT_READ, 0, false, 16ULL*1024ULL*1024ULL, 2, NULL, &p);
+        r = mmap_cache_get(m, fx, PROT_READ, 0, false, 16ULL*1024ULL*1024ULL, 2, NULL, &p);
         assert_se(r >= 0);
 
-        r = mmap_cache_get(m, x, PROT_READ, 1, false, 16ULL*1024ULL*1024ULL+1, 2, NULL, &q);
+        r = mmap_cache_get(m, fx, PROT_READ, 1, false, 16ULL*1024ULL*1024ULL+1, 2, NULL, &q);
         assert_se(r >= 0);
 
         assert_se((uint8_t*) p + 1 == (uint8_t*) q);
 
+        mmap_cache_free_fd(m, fx);
         mmap_cache_unref(m);
 
         safe_close(x);
index b75acef82c09675f7d9dfb221ba6bed8f1813fdf..5fb7fd99d50970fe653104b5fe94795a611ddcd7 100644 (file)
@@ -293,7 +293,7 @@ _public_ int sd_uid_get_state(uid_t uid, char**state) {
                         return -ENOMEM;
 
         }
-        if (r < 0) {
+        else if (r < 0) {
                 free(s);
                 return r;
         }
@@ -878,7 +878,8 @@ _public_ int sd_get_uids(uid_t **users) {
 }
 
 _public_ int sd_get_machine_names(char ***machines) {
-        char **l, **a, **b;
+        _cleanup_strv_free_ char **l = NULL;
+        char **a, **b;
         int r;
 
         r = get_files_in_directory("/run/systemd/machines/", &l);
@@ -907,8 +908,10 @@ _public_ int sd_get_machine_names(char ***machines) {
                 *b = NULL;
         }
 
-        if (machines)
+        if (machines) {
                 *machines = l;
+                l = NULL;
+        }
         return r;
 }
 
index 0ab06ac3b9d315e917b405f372053f1bc37eb948..ed6578d54021f88b5c1d1a06b73467c56b383496 100644 (file)
@@ -736,13 +736,13 @@ static int find_mount_points(const char *what, char ***list) {
                 if (!GREEDY_REALLOC(l, bufsize, n + 2))
                         return log_oom();
 
-                l[n] = strdup(where);
-                if (!l[n])
-                        return log_oom();
-
-                n++;
+                l[n++] = where;
+                where = NULL;
         }
 
+        if (!GREEDY_REALLOC(l, bufsize, n + 1))
+                return log_oom();
+
         l[n] = NULL;
         *list = l;
         l = NULL; /* avoid freeing */
@@ -759,11 +759,8 @@ static int find_loop_device(const char *backing_file, char **loop_dev) {
         assert(loop_dev);
 
         d = opendir("/sys/devices/virtual/block");
-        if (!d) {
-                if (errno == ENOENT)
-                        return -ENOENT;
-                return log_error_errno(errno, "Can't open directory /sys/devices/virtual/block: %m");
-        }
+        if (!d)
+                return -errno;
 
         FOREACH_DIRENT(de, d, return -errno) {
                 _cleanup_free_ char *sys = NULL, *fname = NULL;
@@ -779,24 +776,26 @@ static int find_loop_device(const char *backing_file, char **loop_dev) {
 
                 sys = strjoin("/sys/devices/virtual/block/", de->d_name, "/loop/backing_file");
                 if (!sys)
-                        return log_oom();
+                        return -ENOMEM;
 
                 r = read_one_line_file(sys, &fname);
-                if (r < 0)
+                if (r < 0) {
+                        log_debug_errno(r, "Failed to read %s, ignoring: %m", sys);
                         continue;
+                }
 
                 if (files_same(fname, backing_file, 0) <= 0)
                         continue;
 
                 l = strjoin("/dev/", de->d_name);
                 if (!l)
-                        return log_oom();
+                        return -ENOMEM;
 
                 break;
         }
 
         if (!l)
-                return -ENOENT;
+                return -ENXIO;
 
         *loop_dev = l;
         l = NULL; /* avoid freeing */
@@ -955,7 +954,7 @@ static int umount_loop(sd_bus *bus, const char *backing_file) {
 
         r = find_loop_device(backing_file, &loop_dev);
         if (r < 0)
-                return log_error_errno(r, r == -ENOENT ? "File %s is not mounted." : "Can't get loop device for %s: %m", backing_file);
+                return log_error_errno(r, r == -ENXIO ? "File %s is not mounted." : "Can't get loop device for %s: %m", backing_file);
 
         return umount_by_device(bus, loop_dev);
 }
@@ -1230,10 +1229,10 @@ static int discover_loop_backing_file(void) {
         int r;
 
         r = find_loop_device(arg_mount_what, &loop_dev);
-        if (r < 0 && r != -ENOENT)
+        if (r < 0 && r != -ENXIO)
                 return log_error_errno(errno, "Can't get loop device for %s: %m", arg_mount_what);
 
-        if (r == -ENOENT) {
+        if (r == -ENXIO) {
                 _cleanup_free_ char *escaped = NULL;
 
                 if (arg_mount_where)
@@ -1242,8 +1241,10 @@ static int discover_loop_backing_file(void) {
                 escaped = xescape(basename(arg_mount_what), "\\");
                 if (!escaped)
                         return log_oom();
-                if (!filename_is_valid(escaped))
+                if (!filename_is_valid(escaped)) {
+                        log_error("Escaped name %s is not a valid filename.", escaped);
                         return -EINVAL;
+                }
 
                 arg_mount_where = strjoin("/run/media/system/", escaped);
                 if (!arg_mount_where)
index e2578a298b99042756ef9923c693e9bcb4ba5e1c..d2b10107b8360b8185b9c80efaf5cb30bfd26ecb 100644 (file)
@@ -109,7 +109,7 @@ static int ipv4ll_address_handler(sd_netlink *rtnl, sd_netlink_message *m, void
 
         link->ipv4ll_address = true;
 
-        if (link->ipv4ll_route == true)
+        if (link->ipv4ll_route)
                 link_check_ready(link);
 
         return 1;
index efa16ad93d68559eb746d93f0d71538c5bd334b8..5aa23485761ec9821889e03d096e055f596ec291 100644 (file)
@@ -345,10 +345,10 @@ static int bus_method_resolve_hostname(sd_bus_message *message, void *userdata,
                 return r;
 
         r = dns_question_new_address(&question_idna, family, hostname, true);
-        if (r < 0)
+        if (r < 0 && r != -EALREADY)
                 return r;
 
-        r = dns_query_new(m, &q, question_utf8, question_idna, ifindex, flags);
+        r = dns_query_new(m, &q, question_utf8, question_idna ?: question_utf8, ifindex, flags);
         if (r < 0)
                 return r;
 
index af29f73164342df23423260df5022ab787e8a844..24f3e8e351f0a2f78deed1f46e77be5d5dc13702 100644 (file)
@@ -309,8 +309,14 @@ int dns_question_new_address(DnsQuestion **ret, int family, const char *name, bo
                 r = dns_name_apply_idna(name, &buf);
                 if (r < 0)
                         return r;
-                if (r > 0)
+                if (r > 0 && !streq(name, buf))
                         name = buf;
+                else
+                        /* We did not manage to create convert the idna name, or it's
+                         * the same as the original name. We assume the caller already
+                         * created an uncoverted question, so let's not repeat work
+                         * unnecessarily. */
+                        return -EALREADY;
         }
 
         q = dns_question_new(family == AF_UNSPEC ? 2 : 1);
index cc9b26d4d53d4fca097ee37fbb12f7614515e45c..b6620875eae334001b392be1bcfa42049d54e782 100644 (file)
@@ -583,7 +583,7 @@ int manager_new(Manager **ret) {
 
         r = manager_parse_config_file(m);
         if (r < 0)
-                return r;
+                log_warning_errno(r, "Failed to parse configuration file: %m");
 
         r = sd_event_default(&m->event);
         if (r < 0)
index 40aec3a1ea77cfbc5169b6203d6ddc0607284c29..12c4d65dd3f66f82311ee4d977d272b43a860ed6 100644 (file)
@@ -1282,10 +1282,13 @@ int dns_name_apply_idna(const char *name, char **ret) {
                            IDN2_NFC_INPUT | IDN2_NONTRANSITIONAL);
         if (r == IDN2_OK)
                 return 1; /* *ret has been written */
-        else if (IN_SET(r, IDN2_TOO_BIG_DOMAIN, IDN2_TOO_BIG_LABEL))
+        log_debug("idn2_lookup_u8(\"%s\") failed: %s", name, idn2_strerror(r));
+        if (r == IDN2_2HYPHEN)
+                /* The name has two hypens — forbidden by IDNA2008 in some cases */
+                return 0;
+        if (IN_SET(r, IDN2_TOO_BIG_DOMAIN, IDN2_TOO_BIG_LABEL))
                 return -ENOSPC;
-        else
-                return -EINVAL;
+        return -EINVAL;
 #elif defined(HAVE_LIBIDN)
         _cleanup_free_ char *buf = NULL;
         size_t n = 0, allocated = 0;
@@ -1322,7 +1325,7 @@ int dns_name_apply_idna(const char *name, char **ret) {
                 else
                         buf[n++] = '.';
 
-                n +=r;
+                n += r;
         }
 
         if (n > DNS_HOSTNAME_MAX)
@@ -1335,7 +1338,7 @@ int dns_name_apply_idna(const char *name, char **ret) {
         *ret = buf;
         buf = NULL;
 
-        return (int) n;
+        return 1;
 #else
         return 0;
 #endif
index c735fa159d921f5778c5e2c74cbd45ebe01fe79a..02ae4265c6b5ef0b67b02e89c2ec875d278db268 100644 (file)
@@ -991,7 +991,6 @@ int output_journal(
                 n_columns = columns();
 
         ret = output_funcs[mode](f, j, mode, n_columns, flags);
-        fflush(stdout);
 
         if (ellipsized && ret > 0)
                 *ellipsized = true;
index f5402f0b7083b4d70b303fab2a92e2c84e106e79..83ed9ef9f71e0f134f8a2c08d068389a00521a14 100644 (file)
@@ -6033,6 +6033,34 @@ static int mangle_names(char **original_names, char ***mangled_names) {
         return 0;
 }
 
+static int normalize_filenames(char **names) {
+        char **u;
+        int r;
+
+        STRV_FOREACH(u, names)
+                if (!path_is_absolute(*u)) {
+                        char* normalized_path;
+
+                        if (!isempty(arg_root)) {
+                                log_error("Non-absolute paths are not allowed when --root is used: %s", *u);
+                                return -EINVAL;
+                        }
+
+                        if (!strchr(*u,'/')) {
+                                log_error("Link argument does contain at least one directory separator: %s", *u);
+                                return -EINVAL;
+                        }
+
+                        r = path_make_absolute_cwd(*u, &normalized_path);
+                        if (r < 0)
+                                return r;
+
+                        free_and_replace(*u, normalized_path);
+                }
+
+        return 0;
+}
+
 static int normalize_names(char **names, bool warn_if_path) {
         char **u;
         bool was_path = false;
@@ -6129,6 +6157,12 @@ static int enable_unit(int argc, char *argv[], void *userdata) {
                         return r;
         }
 
+        if (streq(verb, "link")) {
+                r = normalize_filenames(names);
+                if (r < 0)
+                        return r;
+        }
+
         if (install_client_side()) {
                 UnitFileFlags flags;
 
index a952f779dc7e01353ff5c1f21b21462e806f835e..0e7d44fade9f5d1e03e3d82c7d5642b7e642027c 100644 (file)
 
 static void test_should_pass(const char *p) {
         usec_t t, q;
-        char buf[FORMAT_TIMESTAMP_MAX], buf_relative[FORMAT_TIMESTAMP_RELATIVE_MAX], *sp;
+        char buf[FORMAT_TIMESTAMP_MAX], buf_relative[FORMAT_TIMESTAMP_RELATIVE_MAX];
 
+        log_info("Test: %s", p);
         assert_se(parse_timestamp(p, &t) >= 0);
-        format_timestamp_us(buf, sizeof(buf), t);
+        assert_se(format_timestamp_us(buf, sizeof(buf), t));
         log_info("\"%s\" → \"%s\"", p, buf);
 
-        /* Chop off timezone */
-        sp = strrchr(buf, ' ');
-        assert_se(sp);
-        *sp = 0;
-
         assert_se(parse_timestamp(buf, &q) >= 0);
         assert_se(q == t);
 
-        format_timestamp_relative(buf_relative, sizeof(buf_relative), t);
+        assert_se(format_timestamp_relative(buf_relative, sizeof(buf_relative), t));
         log_info("%s", strna(buf_relative));
-        assert_se(parse_timestamp(buf, &q) >= 0);
 }
 
 static void test_should_parse(const char *p) {
         usec_t t;
 
+        log_info("Test: %s", p);
         assert_se(parse_timestamp(p, &t) >= 0);
+        log_info("\"%s\" → \"@%" PRI_USEC "\"", p, t);
 }
 
 static void test_should_fail(const char *p) {
         usec_t t;
+        int r;
 
-        assert_se(parse_timestamp(p, &t) < 0);
+        log_info("Test: %s", p);
+        r = parse_timestamp(p, &t);
+        if (r >= 0)
+                log_info("\"%s\" → \"@%" PRI_USEC "\" (unexpected)", p, t);
+        else
+                log_info("parse_timestamp() returns %d (expected)", r);
+        assert_se(r < 0);
 }
 
 static void test_one(const char *p) {
         _cleanup_free_ char *with_utc;
 
-        log_info("Test: %s", p);
         with_utc = strjoin(p, " UTC");
         test_should_pass(p);
         test_should_pass(with_utc);
@@ -68,7 +71,6 @@ static void test_one(const char *p) {
 static void test_one_noutc(const char *p) {
         _cleanup_free_ char *with_utc;
 
-        log_info("Test: %s", p);
         with_utc = strjoin(p, " UTC");
         test_should_pass(p);
         test_should_fail(with_utc);
@@ -85,25 +87,26 @@ int main(int argc, char *argv[]) {
         test_one("2012-12-30 18:42");
         test_one("2012-10-02");
         test_one("Tue 2012-10-02");
-        test_one_noutc("now");
         test_one("yesterday");
         test_one("today");
         test_one("tomorrow");
+        test_one_noutc("now");
         test_one_noutc("+2d");
         test_one_noutc("+2y 4d");
         test_one_noutc("5months ago");
         test_one_noutc("@1395716396");
-        test_should_parse("today UTC");
-        test_should_fail("today UTC UTC");
         test_should_parse("1970-1-1 UTC");
-        test_should_fail("1969-1-1 UTC");
+        test_should_pass("1970-1-1 00:00:01 UTC");
+        test_should_fail("1969-12-31 UTC");
+        test_should_fail("-100y");
+        test_should_fail("today UTC UTC");
 #if SIZEOF_TIME_T == 8
-        test_should_parse("9999-12-30 23:59:59 UTC");
+        test_should_pass("9999-12-30 23:59:59 UTC");
         test_should_fail("9999-12-31 00:00:00 UTC");
         test_should_fail("10000-01-01 00:00:00 UTC");
 #elif SIZEOF_TIME_T == 4
-        test_should_parse("2038-01-19 03:14:07 UTC");
-        test_should_fail( "2038-01-19 03:14:08 UTC");
+        test_should_pass("2038-01-19 03:14:07 UTC");
+        test_should_fail("2038-01-19 03:14:08 UTC");
 #endif
 
         return 0;
index d86add94db5daf9a12aa1c5c16a859b3728e0365..11cf0b1f0b2459ed543975a6348bf9507eed7594 100644 (file)
@@ -607,24 +607,53 @@ static void test_dns_name_common_suffix(void) {
         test_dns_name_common_suffix_one("FOO.BAR", "tEST.bAR", "BAR");
 }
 
-static void test_dns_name_apply_idna_one(const char *s, const char *result) {
-#if defined(HAVE_LIBIDN2) || defined(HAVE_LIBIDN)
+static void test_dns_name_apply_idna_one(const char *s, int expected, const char *result) {
         _cleanup_free_ char *buf = NULL;
-        assert_se(dns_name_apply_idna(s, &buf) >= 0);
-        assert_se(dns_name_equal(buf, result) > 0);
-#endif
+        int r;
+
+        r = dns_name_apply_idna(s, &buf);
+        log_debug("dns_name_apply_idna: \"%s\" → %d/\"%s\" (expected %d/\"%s\")",
+                  s, r, strnull(buf), expected, strnull(result));
+
+        assert_se(r == expected);
+        if (expected == 1)
+                assert_se(dns_name_equal(buf, result) == 1);
 }
 
 static void test_dns_name_apply_idna(void) {
-        test_dns_name_apply_idna_one("", "");
-        test_dns_name_apply_idna_one("foo", "foo");
-        test_dns_name_apply_idna_one("foo.", "foo");
-        test_dns_name_apply_idna_one("foo.bar", "foo.bar");
-        test_dns_name_apply_idna_one("foo.bar.", "foo.bar");
-        test_dns_name_apply_idna_one("föö", "xn--f-1gaa");
-        test_dns_name_apply_idna_one("föö.", "xn--f-1gaa");
-        test_dns_name_apply_idna_one("föö.bär", "xn--f-1gaa.xn--br-via");
-        test_dns_name_apply_idna_one("föö.bär.", "xn--f-1gaa.xn--br-via");
+#if defined HAVE_LIBIDN2 || defined HAVE_LIBIDN
+        const int ret = 1;
+#else
+        const int ret = 0;
+#endif
+
+        /* IDNA2008 forbids names with hyphens in third and fourth positions
+         * (https://tools.ietf.org/html/rfc5891#section-4.2.3.1).
+         * IDNA2003 does not have this restriction
+         * (https://tools.ietf.org/html/rfc3490#section-5).
+         * This means that when using libidn we will transform and test more
+         * labels. If registrars follow IDNA2008 we'll just be performing a
+         * useless lookup.
+         */
+#if defined HAVE_LIBIDN
+        const int ret2 = 1;
+#else
+        const int ret2 = 0;
+#endif
+
+        test_dns_name_apply_idna_one("", ret, "");
+        test_dns_name_apply_idna_one("foo", ret, "foo");
+        test_dns_name_apply_idna_one("foo.", ret, "foo");
+        test_dns_name_apply_idna_one("foo.bar", ret, "foo.bar");
+        test_dns_name_apply_idna_one("foo.bar.", ret, "foo.bar");
+        test_dns_name_apply_idna_one("föö", ret, "xn--f-1gaa");
+        test_dns_name_apply_idna_one("föö.", ret, "xn--f-1gaa");
+        test_dns_name_apply_idna_one("föö.bär", ret, "xn--f-1gaa.xn--br-via");
+        test_dns_name_apply_idna_one("föö.bär.", ret, "xn--f-1gaa.xn--br-via");
+        test_dns_name_apply_idna_one("xn--f-1gaa.xn--br-via", ret, "xn--f-1gaa.xn--br-via");
+
+        test_dns_name_apply_idna_one("r3---sn-ab5l6ne7.googlevideo.com", ret2,
+                                     ret2 ? "r3---sn-ab5l6ne7.googlevideo.com" : "");
 }
 
 static void test_dns_name_is_valid_or_address(void) {
@@ -640,6 +669,9 @@ static void test_dns_name_is_valid_or_address(void) {
 }
 
 int main(int argc, char *argv[]) {
+        log_set_max_level(LOG_DEBUG);
+        log_parse_environment();
+        log_open();
 
         test_dns_label_unescape();
         test_dns_label_unescape_suffix();
index fd7c198166795f5fc2634a8ae630a7d8cd7fb30e..ea4f700841b57e9f2b88cb5798e93f52b3ebe9d6 100644 (file)
@@ -6,12 +6,13 @@ export PATH
 
 LOOKS_LIKE_DEBIAN=$(source /etc/os-release && [[ "$ID" = "debian" || "$ID_LIKE" = "debian" ]] && echo yes)
 LOOKS_LIKE_ARCH=$(source /etc/os-release && [[ "$ID" = "arch" ]] && echo yes)
+LOOKS_LIKE_SUSE=$(source /etc/os-release && [[ "$ID_LIKE" = "suse" ]] && echo yes)
 KERNEL_VER=${KERNEL_VER-$(uname -r)}
 KERNEL_MODS="/lib/modules/$KERNEL_VER/"
 QEMU_TIMEOUT="${QEMU_TIMEOUT:-infinity}"
 NSPAWN_TIMEOUT="${NSPAWN_TIMEOUT:-infinity}"
 TIMED_OUT=  # will be 1 after run_* if *_TIMEOUT is set and test timed out
-FSTYPE="${FSTYPE:-ext3}"
+[[ "$LOOKS_LIKE_SUSE" ]] && FSTYPE="${FSTYPE:-btrfs}" || FSTYPE="${FSTYPE:-ext3}"
 UNIFIED_CGROUP_HIERARCHY="${UNIFIED_CGROUP_HIERARCHY:-default}"
 
 if ! ROOTLIBDIR=$(pkg-config --variable=systemdutildir systemd); then
@@ -73,6 +74,7 @@ run_qemu() {
     default_fedora_initrd=/boot/initramfs-${KERNEL_VER}.img
     default_debian_initrd=/boot/initrd.img-${KERNEL_VER}
     default_arch_initrd=/boot/initramfs-linux.img
+    default_suse_initrd=/boot/initrd-${KERNEL_VER}
     if [[ ! "$INITRD" ]]; then
         if [[ -e "$default_fedora_initrd" ]]; then
             INITRD="$default_fedora_initrd"
@@ -80,6 +82,8 @@ run_qemu() {
             INITRD="$default_debian_initrd"
         elif [[ "$LOOKS_LIKE_ARCH" && -e "$default_arch_initrd" ]]; then
             INITRD="$default_arch_initrd"
+        elif [[ "$LOOKS_LIKE_SUSE" && -e "$default_suse_initrd" ]]; then
+            INITRD="$default_suse_initrd"
         fi
     fi
 
@@ -99,11 +103,17 @@ run_qemu() {
         exit 1
     fi
 
-    KERNEL_APPEND="root=/dev/sda1 \
+if [[ "$LOOKS_LIKE_SUSE" ]]; then
+    PARAMS+="rd.hostonly=0"
+else
+    PARAMS+="ro"
+fi
+
+KERNEL_APPEND="$PARAMS \
+root=/dev/sda1 \
 raid=noautodetect \
 loglevel=2 \
 init=$ROOTLIBDIR/systemd \
-ro \
 console=ttyS0 \
 selinux=0 \
 $_cgroup_args \
@@ -314,6 +324,8 @@ install_systemd() {
     # and it could fill the available space
     strip_binaries
 
+   [[ "$LOOKS_LIKE_SUSE" ]] && setup_suse
+
     # enable debug logging in PID1
     echo LogLevel=debug >> $initdir/etc/systemd/system.conf
 }
@@ -442,8 +454,14 @@ install_config_files() {
     # set the hostname
     echo systemd-testsuite > $initdir/etc/hostname
     # fstab
+    if [[ "$LOOKS_LIKE_SUSE" ]]; then
+       ROOTMOUNT="/dev/sda1           /       ${FSTYPE}    rw 0 1"
+    else
+       ROOTMOUNT="LABEL=systemd           /       ${FSTYPE}    rw 0 1"
+    fi
+
     cat >$initdir/etc/fstab <<EOF
-LABEL=systemd           /       ${FSTYPE}    rw 0 1
+$ROOTMOUNT
 EOF
 }
 
@@ -1336,6 +1354,12 @@ inst_libdir_file() {
     fi
 }
 
+setup_suse() {
+    ln -s ../usr/bin/systemctl $initdir/bin/systemctl
+    ln -s ../usr/lib/systemd $initdir/lib/systemd
+    inst_simple "/usr/lib/systemd/system/haveged.service"
+}
+
 do_test() {
     if [[ $UID != "0" ]]; then
         echo "TEST: $TEST_DESCRIPTION [SKIPPED]: not root" >&2
index 413d94094b19a683af2d8a1c951befffb324154c..d9d0cba4d9a4a51a14b51548df761506082ba74b 100644 (file)
@@ -16,7 +16,10 @@ After=rc-local.service
 Before=getty.target
 
 [Service]
-ExecStart=-/sbin/agetty --noclear --keep-baud console 115200,38400,9600 $TERM
+# The '-o' option value tells agetty to replace 'login' arguments with an
+# option to preserve environment (-p), followed by '--' for safety, and then
+# the entered username.
+ExecStart=-/sbin/agetty -o '-p -- \\u' --noclear --keep-baud console 115200,38400,9600 $TERM
 Type=idle
 Restart=always
 RestartSec=0
index e126f3a48999c8ce18351a6d33af93243659cd4d..fd0be86ba7f09a70aa5b9e763819703f6bb36060 100644 (file)
@@ -17,7 +17,10 @@ IgnoreOnIsolate=yes
 ConditionPathExists=/dev/pts/%I
 
 [Service]
-ExecStart=-/sbin/agetty --noclear --keep-baud pts/%I 115200,38400,9600 $TERM
+# The '-o' option value tells agetty to replace 'login' arguments with an
+# option to preserve environment (-p), followed by '--' for safety, and then
+# the entered username.
+ExecStart=-/sbin/agetty -o '-p -- \\u' --noclear --keep-baud pts/%I 115200,38400,9600 $TERM
 Type=idle
 Restart=always
 RestartSec=0
index 5b82c13fc5eb08a979625353bf7bbf0509399198..2a84061ed67d3a3468048dfc2114a7121bc16d15 100644 (file)
@@ -33,7 +33,10 @@ ConditionPathExists=/dev/tty0
 
 [Service]
 # the VT is cleared by TTYVTDisallocate
-ExecStart=-/sbin/agetty --noclear %I $TERM
+# The '-o' option value tells agetty to replace 'login' arguments with an
+# option to preserve environment (-p), followed by '--' for safety, and then
+# the entered username.
+ExecStart=-/sbin/agetty -o '-p -- \\u' --noclear %I $TERM
 Type=idle
 Restart=always
 RestartSec=0
index 609c5b62ee2bfc14d2a2d1b9c341bf9250493f4e..b7caeaff449a364bc5c18e188b0500253d32d5f6 100644 (file)
@@ -28,7 +28,10 @@ Conflicts=rescue.service
 Before=rescue.service
 
 [Service]
-ExecStart=-/sbin/agetty --keep-baud 115200,38400,9600 %I $TERM
+# The '-o' option value tells agetty to replace 'login' arguments with an
+# option to preserve environment (-p), followed by '--' for safety, and then
+# the entered username.
+ExecStart=-/sbin/agetty -o '-p -- \\u' --keep-baud 115200,38400,9600 %I $TERM
 Type=idle
 Restart=always
 UtmpIdentifier=%I