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
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:
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:
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
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
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.
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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.
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.
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.
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.
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
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
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
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
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.
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.
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
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.
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.
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.
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
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
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
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.
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
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
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*
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
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
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
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.
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
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
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
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.
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.
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
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
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
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
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
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
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
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.
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
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
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
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.
acpi:MVN*:
ID_VENDOR_FROM_DATABASE=Meta Company
+acpi:MVR*:
+ ID_VENDOR_FROM_DATABASE=MediCapture, Inc.
+
acpi:MVS*:
ID_VENDOR_FROM_DATABASE=Microvision
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.
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.
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
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
acpi:TLL*:
ID_VENDOR_FROM_DATABASE=Thinklogical
+acpi:TLN*:
+ ID_VENDOR_FROM_DATABASE=Techlogix Networx
+
acpi:TLS*:
ID_VENDOR_FROM_DATABASE=Teleste Educational OY
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
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]
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]
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]
pci:v00001002d00006843*
ID_MODEL_FROM_DATABASE=Thames [Radeon HD 7670M]
+pci:v00001002d00006863*
+ ID_MODEL_FROM_DATABASE=Vega 10 [Radeon Vega Frontier Edition]
+
pci:v00001002d0000687F*
ID_MODEL_FROM_DATABASE=Vega [Radeon RX Vega]
pci: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
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
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)
pci:v00001077d00002532*
ID_MODEL_FROM_DATABASE=ISP2532-based 8Gb Fibre Channel to PCI Express HBA
+pci:v00001077d00002532sv00001014sd0000041E*
+ ID_MODEL_FROM_DATABASE=ISP2532-based 8Gb Fibre Channel to PCI Express HBA (FC EN0Y/EN12 PCIe2 LP 8 Gb 4-port Fibre Channel Adapter for POWER)
+
pci:v00001077d00002532sv0000103Csd00003262*
ID_MODEL_FROM_DATABASE=ISP2532-based 8Gb Fibre Channel to PCI Express HBA (StorageWorks 81Q)
pci:v00001077d00002532sv0000103Csd00003263*
ID_MODEL_FROM_DATABASE=ISP2532-based 8Gb Fibre Channel to PCI Express HBA (StorageWorks 82Q)
+pci:v00001077d00002532sv00001077sd0000015C*
+ ID_MODEL_FROM_DATABASE=ISP2532-based 8Gb Fibre Channel to PCI Express HBA (QLE2560 PCI Express to 8Gb FC Single Channel)
+
+pci:v00001077d00002532sv00001077sd0000015D*
+ ID_MODEL_FROM_DATABASE=ISP2532-based 8Gb Fibre Channel to PCI Express HBA (QLE2562 PCI Express to 8Gb FC Dual Channel)
+
+pci:v00001077d00002532sv00001077sd0000015E*
+ ID_MODEL_FROM_DATABASE=ISP2532-based 8Gb Fibre Channel to PCI Express HBA (QLE2564 PCI Express to 8Gb FC Quad Channel)
+
pci:v00001077d00002532sv00001077sd00000167*
ID_MODEL_FROM_DATABASE=ISP2532-based 8Gb Fibre Channel to PCI Express HBA (QME2572 Dual Port FC8 HBA Mezzanine)
pci: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
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]
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]
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]
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
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
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
pci:v00001425d00006081*
ID_MODEL_FROM_DATABASE=T62100-6081 Unified Wire Ethernet Controller
+pci:v00001425d00006082*
+ ID_MODEL_FROM_DATABASE=T6225-6082 Unified Wire Ethernet Controller
+
+pci:v00001425d00006083*
+ ID_MODEL_FROM_DATABASE=T62100-6083 Unified Wire Ethernet Controller
+
+pci:v00001425d00006084*
+ ID_MODEL_FROM_DATABASE=T64100-6084 Unified Wire Ethernet Controller
+
pci:v00001425d00006401*
ID_MODEL_FROM_DATABASE=T6225-CR Unified Wire Ethernet Controller
pci:v00001425d00006481*
ID_MODEL_FROM_DATABASE=T62100-6081 Unified Wire Ethernet Controller
+pci:v00001425d00006482*
+ ID_MODEL_FROM_DATABASE=T6225-6082 Unified Wire Ethernet Controller
+
+pci:v00001425d00006483*
+ ID_MODEL_FROM_DATABASE=T62100-6083 Unified Wire Ethernet Controller
+
+pci:v00001425d00006484*
+ ID_MODEL_FROM_DATABASE=T64100-6084 Unified Wire Ethernet Controller
+
pci:v00001425d00006501*
ID_MODEL_FROM_DATABASE=T6225-CR Unified Wire Storage Controller
pci:v00001425d00006581*
ID_MODEL_FROM_DATABASE=T62100-6081 Unified Wire Storage Controller
+pci:v00001425d00006582*
+ ID_MODEL_FROM_DATABASE=T6225-6082 Unified Wire Storage Controller
+
+pci:v00001425d00006583*
+ ID_MODEL_FROM_DATABASE=T62100-6083 Unified Wire Storage Controller
+
+pci:v00001425d00006584*
+ ID_MODEL_FROM_DATABASE=T64100-6084 Unified Wire Storage Controller
+
pci:v00001425d00006601*
ID_MODEL_FROM_DATABASE=T6225-CR Unified Wire Storage Controller
pci:v00001425d00006681*
ID_MODEL_FROM_DATABASE=T62100-6081 Unified Wire Storage Controller
+pci:v00001425d00006682*
+ ID_MODEL_FROM_DATABASE=T6225-6082 Unified Wire Storage Controller
+
+pci:v00001425d00006683*
+ ID_MODEL_FROM_DATABASE=T62100-6083 Unified Wire Storage Controller
+
+pci:v00001425d00006684*
+ ID_MODEL_FROM_DATABASE=T64100-6084 Unified Wire Storage Controller
+
pci:v00001425d00006801*
ID_MODEL_FROM_DATABASE=T6225-CR Unified Wire Ethernet Controller [VF]
pci: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
pci:v000015B3d00001003sv000015B3sd00000026*
ID_MODEL_FROM_DATABASE=MT27500 Family [ConnectX-3] (ConnectX-3 IB FDR Dual Port Mezzanine Card)
+pci:v000015B3d00001003sv000015B3sd00000028*
+ ID_MODEL_FROM_DATABASE=MT27500 Family [ConnectX-3] (ConnectX-3 VPI Dual QSFP+ Port QDR Infiniband 40Gb/s or 10Gb Ethernet)
+
pci:v000015B3d00001003sv000015B3sd00000059*
ID_MODEL_FROM_DATABASE=MT27500 Family [ConnectX-3] (ConnectX-3 VPI IB FDR/40 GbE Single Port QSFP+ Mezzanine Card)
pci: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)
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]
ID_MODEL_FROM_DATABASE=OneConnect 10Gb iSCSI Initiator
pci:v000019A2d00000704*
- ID_MODEL_FROM_DATABASE=OneConnect 10Gb FCoE Initiator
+ ID_MODEL_FROM_DATABASE=OneConnect OCe10100/OCe10102 Series 10 GbE CNA
+
+pci:v000019A2d00000704sv000010DFsd0000E602*
+ ID_MODEL_FROM_DATABASE=OneConnect OCe10100/OCe10102 Series 10 GbE CNA (OneConnect OCe10100 10Gb CNA)
+
+pci:v000019A2d00000704sv000010DFsd0000E630*
+ ID_MODEL_FROM_DATABASE=OneConnect OCe10100/OCe10102 Series 10 GbE CNA (OneConnect OCe10102-FM-E / OCe10102-FX-E for EMC VNX Symmetrix)
pci:v000019A2d00000710*
ID_MODEL_FROM_DATABASE=OneConnect 10Gb NIC (be3)
pci: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)
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)
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)
pci:v00008086d0000152E*
ID_MODEL_FROM_DATABASE=82599 Virtual Function
+pci:v00008086d0000152F*
+ ID_MODEL_FROM_DATABASE=I350 Virtual Function
+
pci:v00008086d00001530*
ID_MODEL_FROM_DATABASE=X540 Virtual Function
pci: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
pci:v00008086d000015D8*
ID_MODEL_FROM_DATABASE=Ethernet Connection (4) I219-V
+pci:v00008086d000015D8sv000017AAsd0000224F*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection (4) I219-V (ThinkPad X1 Carbon 5th Gen)
+
pci:v00008086d000015D9*
ID_MODEL_FROM_DATABASE=JHL6340 Thunderbolt 3 NHI (C step) [Alpine Ridge 2C 2016]
pci:v00008086d000015DA*
ID_MODEL_FROM_DATABASE=JHL6340 Thunderbolt 3 Bridge (C step) [Alpine Ridge 2C 2016]
+pci:v00008086d000015DF*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection (8) I219-LM
+
+pci:v00008086d000015E0*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection (8) I219-V
+
+pci:v00008086d000015E1*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection (9) I219-LM
+
+pci:v00008086d000015E2*
+ ID_MODEL_FROM_DATABASE=Ethernet Connection (9) I219-V
+
pci:v00008086d000015E3*
ID_MODEL_FROM_DATABASE=Ethernet Connection (5) I219-LM
pci: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
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)
pci:v00008086d00005902*
ID_MODEL_FROM_DATABASE=HD Graphics 610
+pci:v00008086d00005904*
+ ID_MODEL_FROM_DATABASE=Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
+
+pci:v00008086d00005904sv000017AAsd0000224F*
+ ID_MODEL_FROM_DATABASE=Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers (ThinkPad X1 Carbon 5th Gen)
+
pci:v00008086d0000590F*
ID_MODEL_FROM_DATABASE=Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
pci: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
pci:v00008086d00009D03sv000017AAsd0000382A*
ID_MODEL_FROM_DATABASE=Sunrise Point-LP SATA Controller [AHCI mode] (B51-80 Laptop)
+pci:v00008086d00009D10*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP PCI Express Root Port #1
+
+pci:v00008086d00009D12*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP PCI Express Root Port #3
+
pci:v00008086d00009D14*
ID_MODEL_FROM_DATABASE=Sunrise Point-LP PCI Express Root Port #5
pci:v00008086d00009D21sv00001028sd000006F3*
ID_MODEL_FROM_DATABASE=Sunrise Point-LP PMC (Latitude 3570)
+pci:v00008086d00009D21sv000017AAsd0000224F*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP PMC (ThinkPad X1 Carbon 5th Gen)
+
pci:v00008086d00009D21sv000017AAsd0000382A*
ID_MODEL_FROM_DATABASE=Sunrise Point-LP PMC (B51-80 Laptop)
pci:v00008086d00009D23sv00001028sd000006F3*
ID_MODEL_FROM_DATABASE=Sunrise Point-LP SMBus (Latitude 3570)
+pci:v00008086d00009D23sv000017AAsd0000224F*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP SMBus (ThinkPad X1 Carbon 5th Gen)
+
pci:v00008086d00009D23sv000017AAsd0000382A*
ID_MODEL_FROM_DATABASE=Sunrise Point-LP SMBus (B51-80 Laptop)
pci:v00008086d00009D31sv00001028sd000006F3*
ID_MODEL_FROM_DATABASE=Sunrise Point-LP Thermal subsystem (Latitude 3570)
+pci:v00008086d00009D31sv000017AAsd0000224F*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP Thermal subsystem (ThinkPad X1 Carbon 5th Gen)
+
pci:v00008086d00009D31sv000017AAsd0000382A*
ID_MODEL_FROM_DATABASE=Sunrise Point-LP Thermal subsystem (B51-80 Laptop)
pci:v00008086d00009D3Asv00001028sd000006F3*
ID_MODEL_FROM_DATABASE=Sunrise Point-LP CSME HECI #1 (Latitude 3570)
+pci:v00008086d00009D3Asv000017AAsd0000224F*
+ ID_MODEL_FROM_DATABASE=Sunrise Point-LP CSME HECI #1 (ThinkPad X1 Carbon 5th Gen)
+
pci:v00008086d00009D3Asv000017AAsd0000382A*
ID_MODEL_FROM_DATABASE=Sunrise Point-LP CSME HECI #1 (B51-80 Laptop)
pci: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
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)
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
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>
<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 a numeric ID as argument. For system services (services run by the system service manager,
i.e. managed by PID 1) and for user services of the root user (services managed by root's instance of
<command>systemd --user</command>), the default is <literal>root</literal>, but <varname>User=</varname> may be
used to specify a different user. For user services of any other user, switching user identity is not
permitted, hence the only valid setting is the same user the user's service manager is running as. If no group
is set, the default group of the user is used. This setting does not affect commands whose command line is
- prefixed with <literal>+</literal>.</para></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>
<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>
<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>
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>
<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>
add_languages('cpp')
endif
-foreach arg : ['-Wundef',
+foreach arg : ['-Wextra',
+ '-Wundef',
'-Wlogical-op',
'-Wmissing-include-dirs',
'-Wold-style-definition',
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
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
}
void log_close(void) {
+ /* Do not call from library code. */
+
log_close_journal();
log_close_syslog();
log_close_kmsg();
}
void log_forget_fds(void) {
+ /* Do not call from library code. */
+
console_fd = kmsg_fd = syslog_fd = journal_fd = -1;
}
}
void log_parse_environment_realm(LogRealm realm) {
+ /* Do not call from library code. */
+
const char *e;
if (get_ctty_devnr(0, NULL) < 0)
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);
}
#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);
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,
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 */
auxv = (void*) getauxval(AT_RANDOM);
if (auxv) {
- assert_cc(sizeof(x) < 16);
+ assert_cc(sizeof(x) <= 16);
memcpy(&x, auxv, sizeof(x));
} else
#endif
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;
}
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;
}
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;
if (ret > USEC_TIMESTAMP_FORMATTABLE_MAX)
return -EINVAL;
- if (ret > minus)
+ if (ret >= minus)
ret -= minus;
else
- ret = 0;
+ return -EINVAL;
*usec = ret;
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)) {
}
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);
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);
}
/* 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));
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)
_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,
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;
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) {
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;
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;
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;
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)
}
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;
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)
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);
}
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;
}
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;
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;
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)) {
}
}
- 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;
}
#include "alloc-util.h"
#include "fd-util.h"
+#include "fs-util.h"
#include "fileio.h"
#include "fstab-util.h"
#include "generator.h"
const char *dest,
const char *what,
const char *where,
+ const char *original_where,
const char *fstype,
const char *opts,
int passno,
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)
}
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;
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");
k = add_mount(arg_dest,
what,
- where,
+ canonical_where ?: where,
+ canonical_where ? where: NULL,
me->mnt_type,
me->mnt_opts,
me->mnt_passno,
return add_mount(arg_dest,
what,
"/sysroot",
+ NULL,
arg_root_fstype,
opts,
is_device_path(what) ? 1 : 0, /* passno */
return add_mount(arg_dest,
what,
"/sysroot/usr",
+ NULL,
arg_usr_fstype,
opts,
is_device_path(what) ? 1 : 0, /* passno */
return add_mount(arg_dest_late,
"tmpfs",
"/var",
+ NULL,
"tmpfs",
"mode=0755",
0,
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;
}
}
- 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) {
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) {
* 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 =
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) {
* 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)
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;
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;
#endif
}
- if (mmap_cache_got_sigbus(f->mmap, f->fd)) {
+ if (mmap_cache_got_sigbus(f->mmap, f->cache_fd)) {
r = -EIO;
goto fail;
}
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);
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;
typedef struct JournalFile {
int fd;
+ MMapFileDescriptor *cache_fd;
mode_t mode;
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 ... */
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;
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) {
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;
}
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);
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;
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;
}
}
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;
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) {
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);
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;
}
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;
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++) {
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;
}
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) {
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);
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;
}
}
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;
}
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;
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;
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;
* 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)
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);
(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;
}
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");
}
finish:
+ fflush(stdout);
pager_close();
strv_free(arg_file);
typedef struct Window Window;
typedef struct Context Context;
-typedef struct FileDescriptor FileDescriptor;
struct Window {
MMapCache *cache;
uint64_t offset;
size_t size;
- FileDescriptor *fd;
+ MMapFileDescriptor *fd;
LIST_FIELDS(Window, by_fd);
LIST_FIELDS(Window, unused);
LIST_FIELDS(Context, by_window);
};
-struct FileDescriptor {
+struct MMapFileDescriptor {
MMapCache *cache;
int fd;
bool sigbus;
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) {
}
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;
}
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);
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)
static int try_context(
MMapCache *m,
- int fd,
+ MMapFileDescriptor *f,
int prot,
unsigned context,
bool keep_always,
assert(m);
assert(m->n_ref > 0);
- assert(fd >= 0);
+ assert(f);
assert(size > 0);
assert(ret);
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);
static int find_mmap(
MMapCache *m,
- int fd,
+ MMapFileDescriptor *f,
int prot,
unsigned context,
bool keep_always,
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)
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)
static int add_mmap(
MMapCache *m,
- int fd,
+ MMapFileDescriptor *f,
int prot,
unsigned context,
bool keep_always,
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);
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;
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;
int mmap_cache_get(
MMapCache *m,
- int fd,
+ MMapFileDescriptor *f,
int prot,
unsigned context,
bool keep_always,
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;
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) {
static void mmap_cache_process_sigbus(MMapCache *m) {
bool found = false;
- FileDescriptor *f;
+ MMapFileDescriptor *f;
Iterator i;
int r;
}
}
-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);
}
#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);
int mmap_cache_get(
MMapCache *m,
- int fd,
+ MMapFileDescriptor *f,
int prot,
unsigned context,
bool keep_always,
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);
#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;
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);
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);
return -ENOMEM;
}
- if (r < 0) {
+ else if (r < 0) {
free(s);
return r;
}
}
_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);
*b = NULL;
}
- if (machines)
+ if (machines) {
*machines = l;
+ l = NULL;
+ }
return r;
}
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 */
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;
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 */
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);
}
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)
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)
link->ipv4ll_address = true;
- if (link->ipv4ll_route == true)
+ if (link->ipv4ll_route)
link_check_ready(link);
return 1;
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;
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);
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)
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;
else
buf[n++] = '.';
- n +=r;
+ n += r;
}
if (n > DNS_HOSTNAME_MAX)
*ret = buf;
buf = NULL;
- return (int) n;
+ return 1;
#else
return 0;
#endif
n_columns = columns();
ret = output_funcs[mode](f, j, mode, n_columns, flags);
- fflush(stdout);
if (ellipsized && ret > 0)
*ellipsized = true;
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;
return r;
}
+ if (streq(verb, "link")) {
+ r = normalize_filenames(names);
+ if (r < 0)
+ return r;
+ }
+
if (install_client_side()) {
UnitFileFlags flags;
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);
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);
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;
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) {
}
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();
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
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"
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
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 \
# 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
}
# 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
}
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
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
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
[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
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