diff options
97 files changed, 8720 insertions, 1806 deletions
diff --git a/.gitignore b/.gitignore index 031b36aa4f..d64c40a1dc 100644 --- a/.gitignore +++ b/.gitignore @@ -48,10 +48,6 @@ docs/libudev/libudev.prerequisites docs/libudev/libudev.signals docs/libudev/html/ docs/libudev/xml/ -man/udev.7 -man/udev.conf.5 -man/udevd.8 -man/udevadm.8 rule_generator/write_cd_rules rule_generator/write_net_rules @@ -0,0 +1,8 @@ + +2014-12-15 + + * We did not move builtin-hwdb - port to sd-hwdb: + http://cgit.freedesktop.org/systemd/systemd/commit/?id=c532d8a00cacacc6775effb7aadca680b1d39ccd + + * We did not break out hwdb from udevadm: + http://cgit.freedesktop.org/systemd/systemd/commit/?id=65eb4378c3e1de25383d8cd606909e64c71edc80 diff --git a/autogen.sh b/autogen.sh index 6d65bb2a02..98fec16244 100755 --- a/autogen.sh +++ b/autogen.sh @@ -1,3 +1,6 @@ #!/bin/sh autoreconf -f -i + +cd man +./make.sh diff --git a/configure.ac b/configure.ac index 548695e47b..dbca833f6b 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ AC_PREREQ([2.68]) -AC_INIT([eudev],[2.1],[https://github.com/gentoo/eudev/issues]) +AC_INIT([eudev],[2.1.1],[https://github.com/gentoo/eudev/issues]) AC_SUBST(UDEV_VERSION, 217) AC_CONFIG_SRCDIR([src/udev/udevd.c]) @@ -49,31 +49,38 @@ AC_CHECK_HEADERS( ) AC_CHECK_HEADERS( - [linux/btrfs.h mtd/mtd-user.h], + [mtd/mtd-user.h], [], [AC_MSG_ERROR([*** KERNEL header not found])] ) +AC_CHECK_HEADERS( + [linux/btrfs.h], + [], + [AC_MSG_WARN([*** KERNEL header not found])] +) + # Checks for typedefs, structures, and compiler characteristics. AC_TYPE_UID_T AC_C_INLINE AC_TYPE_MODE_T AC_TYPE_PID_T AC_CHECK_MEMBERS([struct stat.st_rdev]) -AC_CHECK_DECLS([gettid, name_to_handle_at, accept4, mkostemp], [], [], [[#include <sys/types.h> +AC_CHECK_DECLS([getrandom, gettid, name_to_handle_at, accept4, mkostemp], [], [], [[#include <sys/types.h> #include <unistd.h> #include <sys/mount.h> #include <fcntl.h> -#include <sys/socket.h>]]) +#include <sys/socket.h> +#include <linux/random.h>]]) AC_CHECK_SIZEOF(pid_t) AC_CHECK_SIZEOF(uid_t) AC_CHECK_SIZEOF(gid_t) +AC_CHECK_SIZEOF(dev_t) AC_CHECK_SIZEOF(time_t) -AC_CHECK_SIZEOF(rlim_t,,[ - #include <sys/time.h> - #include <sys/resource.h> -]) +AC_CHECK_SIZEOF(rlim_t,,[[ +#include <sys/time.h> +#include <sys/resource.h>]]) # Checks for library functions. AC_FUNC_CHOWN diff --git a/hwdb/20-OUI.hwdb b/hwdb/20-OUI.hwdb index 73df96cf6b..4134659cde 100644 --- a/hwdb/20-OUI.hwdb +++ b/hwdb/20-OUI.hwdb @@ -1522,6 +1522,9 @@ OUI:0050C2201* OUI:0050C2202* ID_OUI_FROM_DATABASE=Audio Riders Oy +OUI:0050C2203* + ID_OUI_FROM_DATABASE=Vocality International Ltd + OUI:0050C2204* ID_OUI_FROM_DATABASE=Algodue Elettronica srl @@ -2576,7 +2579,7 @@ OUI:0050C2364* ID_OUI_FROM_DATABASE=TATTILE SRL OUI:0050C2365* - ID_OUI_FROM_DATABASE=Vishay Nobel AB + ID_OUI_FROM_DATABASE=VPG OUI:0050C2366* ID_OUI_FROM_DATABASE=Vanguard Technology Corp. @@ -4181,7 +4184,7 @@ OUI:0050C257B* ID_OUI_FROM_DATABASE=ptswitch OUI:0050C257C* - ID_OUI_FROM_DATABASE=CYBERSYS + ID_OUI_FROM_DATABASE=éolane OUI:0050C257D* ID_OUI_FROM_DATABASE=Sierra Video Systems @@ -4637,7 +4640,7 @@ OUI:0050C2613* ID_OUI_FROM_DATABASE=TATTILE SRL OUI:0050C2614* - ID_OUI_FROM_DATABASE=SICOM AS + ID_OUI_FROM_DATABASE=Proserv OUI:0050C2615* ID_OUI_FROM_DATABASE=Axis Electronics @@ -4885,6 +4888,9 @@ OUI:0050C2665* OUI:0050C2666* ID_OUI_FROM_DATABASE=Xworks NZ Limited +OUI:0050C2667* + ID_OUI_FROM_DATABASE=Vocality International Ltd + OUI:0050C2668* ID_OUI_FROM_DATABASE=Keith & Koep GmbH @@ -8392,6 +8398,9 @@ OUI:0050C2AF9* OUI:0050C2AFA* ID_OUI_FROM_DATABASE=Absolute Fire Solutions Inc. +OUI:0050C2AFB* + ID_OUI_FROM_DATABASE=Vocality International Ltd + OUI:0050C2AFC* ID_OUI_FROM_DATABASE=Odus Technologies SA @@ -10384,6 +10393,9 @@ OUI:0050C2D9C* OUI:0050C2D9D* ID_OUI_FROM_DATABASE=Mistral Solutions Pvt. Ltd +OUI:0050C2D9E* + ID_OUI_FROM_DATABASE=Vocality International + OUI:0050C2D9F* ID_OUI_FROM_DATABASE=BitWise Controls @@ -10724,7 +10736,7 @@ OUI:0050C2E10* ID_OUI_FROM_DATABASE=Radinetworks Co., Ltd OUI:0050C2E11* - ID_OUI_FROM_DATABASE=RF Neulink + ID_OUI_FROM_DATABASE=RadioMobile Inc OUI:0050C2E12* ID_OUI_FROM_DATABASE=Kago Electronics BV @@ -10846,6 +10858,9 @@ OUI:0050C2E38* OUI:0050C2E39* ID_OUI_FROM_DATABASE=Telemetrics Inc. +OUI:0050C2E3A* + ID_OUI_FROM_DATABASE=Vocality International + OUI:0050C2E3B* ID_OUI_FROM_DATABASE=Nanosolution Inc. @@ -12860,7 +12875,7 @@ OUI:40D8550DD* ID_OUI_FROM_DATABASE=Embed Limited OUI:40D8550DE* - ID_OUI_FROM_DATABASE=Vishay Nobel AB + ID_OUI_FROM_DATABASE=VPG OUI:40D8550DF* ID_OUI_FROM_DATABASE=Xadi Inc @@ -13180,6 +13195,9 @@ OUI:40D855149* OUI:40D85514A* ID_OUI_FROM_DATABASE=GENERAL DYNAMICS C4 SYSTEMS +OUI:40D85514B* + ID_OUI_FROM_DATABASE=Vocality International + OUI:40D85514C* ID_OUI_FROM_DATABASE=PLT @@ -14162,7 +14180,7 @@ OUI:0000AE* ID_OUI_FROM_DATABASE=DASSAULT ELECTRONIQUE OUI:0000AF* - ID_OUI_FROM_DATABASE=NUCLEAR DATA INSTRUMENTATION + ID_OUI_FROM_DATABASE=Canberra Industries, Inc. OUI:0000B0* ID_OUI_FROM_DATABASE=RND-RAD NETWORK DEVICES @@ -14228,7 +14246,7 @@ OUI:0000C4* ID_OUI_FROM_DATABASE=WATERS DIV. OF MILLIPORE OUI:0000C5* - ID_OUI_FROM_DATABASE=FARALLON COMPUTING/NETOPIA + ID_OUI_FROM_DATABASE=ARRIS Group, Inc. OUI:0000C6* ID_OUI_FROM_DATABASE=EON SYSTEMS @@ -17531,7 +17549,7 @@ OUI:000511* ID_OUI_FROM_DATABASE=Complementary Technologies Ltd OUI:000512* - ID_OUI_FROM_DATABASE=MeshNetworks, Inc. + ID_OUI_FROM_DATABASE=Zebra Technologies Inc OUI:000513* ID_OUI_FROM_DATABASE=VTLinx Multimedia Systems, Inc. @@ -18443,7 +18461,7 @@ OUI:000643* ID_OUI_FROM_DATABASE=SONO Computer Co., Ltd. OUI:000644* - ID_OUI_FROM_DATABASE=Neix,Inc + ID_OUI_FROM_DATABASE=neix,Inc OUI:000645* ID_OUI_FROM_DATABASE=Meisei Electric Co. Ltd. @@ -19205,7 +19223,7 @@ OUI:000741* ID_OUI_FROM_DATABASE=Sierra Automated Systems OUI:000742* - ID_OUI_FROM_DATABASE=Current Technologies, LLC + ID_OUI_FROM_DATABASE=Ormazabal OUI:000743* ID_OUI_FROM_DATABASE=Chelsio Communications @@ -19532,7 +19550,7 @@ OUI:0007AE* ID_OUI_FROM_DATABASE=Britestream Networks, Inc. OUI:0007AF* - ID_OUI_FROM_DATABASE=N-TRON Corporation + ID_OUI_FROM_DATABASE=Red Lion Controls, LP OUI:0007B0* ID_OUI_FROM_DATABASE=Office Details, Inc. @@ -21986,7 +22004,7 @@ OUI:000AFC* ID_OUI_FROM_DATABASE=Core Tec Communications, LLC OUI:000AFD* - ID_OUI_FROM_DATABASE=Viking Electronic Services + ID_OUI_FROM_DATABASE=Kentec Electronics OUI:000AFE* ID_OUI_FROM_DATABASE=NovaPal Ltd @@ -24998,7 +25016,7 @@ OUI:000EF3* ID_OUI_FROM_DATABASE=Smarthome OUI:000EF4* - ID_OUI_FROM_DATABASE=Kasda Digital Technology Co.,Ltd + ID_OUI_FROM_DATABASE=Kasda Networks Inc OUI:000EF5* ID_OUI_FROM_DATABASE=iPAC Technology Co., Ltd. @@ -25643,7 +25661,7 @@ OUI:000FCB* ID_OUI_FROM_DATABASE=3Com Ltd OUI:000FCC* - ID_OUI_FROM_DATABASE=Netopia, Inc. + ID_OUI_FROM_DATABASE=ARRIS Group, Inc. OUI:000FCD* ID_OUI_FROM_DATABASE=Nortel Networks @@ -27518,7 +27536,7 @@ OUI:00123C* ID_OUI_FROM_DATABASE=Second Rule LLC OUI:00123D* - ID_OUI_FROM_DATABASE=GES + ID_OUI_FROM_DATABASE=GES Co, Ltd OUI:00123E* ID_OUI_FROM_DATABASE=ERUNE technology Co., Ltd. @@ -28316,7 +28334,7 @@ OUI:001346* ID_OUI_FROM_DATABASE=D-Link Corporation OUI:001347* - ID_OUI_FROM_DATABASE=BlueTree Wireless Data Inc. + ID_OUI_FROM_DATABASE=Red Lion Controls, LP OUI:001348* ID_OUI_FROM_DATABASE=Artila Electronics Co., Ltd. @@ -29402,7 +29420,7 @@ OUI:0014B0* ID_OUI_FROM_DATABASE=Naeil Community OUI:0014B1* - ID_OUI_FROM_DATABASE=Avitec AB + ID_OUI_FROM_DATABASE=Axell Wireless Limited OUI:0014B2* ID_OUI_FROM_DATABASE=mCubelogics Corporation @@ -29975,7 +29993,7 @@ OUI:00156F* ID_OUI_FROM_DATABASE=Xiranet Communications GmbH OUI:001570* - ID_OUI_FROM_DATABASE=Symbol TechnologiesWholly owned Subsidiary of Motorola + ID_OUI_FROM_DATABASE=Zebra Technologies Inc OUI:001571* ID_OUI_FROM_DATABASE=Nolan Systems @@ -33239,7 +33257,7 @@ OUI:0019B3* ID_OUI_FROM_DATABASE=Stanford Research Systems OUI:0019B4* - ID_OUI_FROM_DATABASE=VideoCast Ltd. + ID_OUI_FROM_DATABASE=Intellio Ltd OUI:0019B5* ID_OUI_FROM_DATABASE=Famar Fueguina S.A. @@ -40679,7 +40697,7 @@ OUI:002367* ID_OUI_FROM_DATABASE=UniControls a.s. OUI:002368* - ID_OUI_FROM_DATABASE=Motorola + ID_OUI_FROM_DATABASE=Zebra Technologies Inc OUI:002369* ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC @@ -46496,7 +46514,7 @@ OUI:0060D9* ID_OUI_FROM_DATABASE=TRANSYS NETWORKS INC. OUI:0060DA* - ID_OUI_FROM_DATABASE=JBM ELECTRONICS CO. + ID_OUI_FROM_DATABASE=Red Lion Controls, LP OUI:0060DB* ID_OUI_FROM_DATABASE=NTP ELEKTRONIK A/S @@ -46639,6 +46657,9 @@ OUI:0070B0* OUI:0070B3* ID_OUI_FROM_DATABASE=DATA RECALL LTD. +OUI:0071C2* + ID_OUI_FROM_DATABASE=PEGATRON CORPORATION + OUI:0071CC* ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd. @@ -47141,7 +47162,7 @@ OUI:00809E* ID_OUI_FROM_DATABASE=DATUS GMBH OUI:00809F* - ID_OUI_FROM_DATABASE=ALCATEL BUSINESS SYSTEMS + ID_OUI_FROM_DATABASE=Alcatel-Lucent Enterprise OUI:0080A0* ID_OUI_FROM_DATABASE=EDISA HEWLETT PACKARD S/A @@ -48338,7 +48359,7 @@ OUI:00A01C* ID_OUI_FROM_DATABASE=NASCENT NETWORKS CORPORATION OUI:00A01D* - ID_OUI_FROM_DATABASE=SIXNET + ID_OUI_FROM_DATABASE=Red Lion Controls, LP OUI:00A01E* ID_OUI_FROM_DATABASE=EST CORPORATION @@ -48989,7 +49010,7 @@ OUI:00A0F7* ID_OUI_FROM_DATABASE=V.I COMPUTER CORP. OUI:00A0F8* - ID_OUI_FROM_DATABASE=SYMBOL TECHNOLOGIES, INC. + ID_OUI_FROM_DATABASE=Zebra Technologies Inc OUI:00A0F9* ID_OUI_FROM_DATABASE=BINTEC COMMUNICATIONS GMBH @@ -49024,6 +49045,9 @@ OUI:00A2F5* OUI:00A2FF* ID_OUI_FROM_DATABASE=abatec group AG +OUI:00A509* + ID_OUI_FROM_DATABASE=WigWag Inc. + OUI:00AA00* ID_OUI_FROM_DATABASE=INTEL CORPORATION @@ -51044,7 +51068,7 @@ OUI:00E049* ID_OUI_FROM_DATABASE=MICROWI ELECTRONIC GmbH OUI:00E04A* - ID_OUI_FROM_DATABASE=ENHANCED MESSAGING SYSTEMS, INC + ID_OUI_FROM_DATABASE=ZX Technologies, Inc OUI:00E04B* ID_OUI_FROM_DATABASE=JUMP INDUSTRIELLE COMPUTERTECHNIK GmbH @@ -52717,6 +52741,9 @@ OUI:08D09F* OUI:08D29A* ID_OUI_FROM_DATABASE=Proformatique +OUI:08D34B* + ID_OUI_FROM_DATABASE=Techman Electronics (Changshu) Co., Ltd. + OUI:08D40C* ID_OUI_FROM_DATABASE=Intel Corporate @@ -52807,6 +52834,9 @@ OUI:0C130B* OUI:0C1420* ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd +OUI:0C1539* + ID_OUI_FROM_DATABASE=Apple + OUI:0C15C5* ID_OUI_FROM_DATABASE=SDTEC Co., Ltd. @@ -52864,6 +52894,9 @@ OUI:0C469D* OUI:0C473D* ID_OUI_FROM_DATABASE=Hitron Technologies. Inc +OUI:0C4885* + ID_OUI_FROM_DATABASE=LG Electronics + OUI:0C4C39* ID_OUI_FROM_DATABASE=Mitrastar Technology @@ -53008,6 +53041,9 @@ OUI:0CB319* OUI:0CB4EF* ID_OUI_FROM_DATABASE=Digience Co.,Ltd. +OUI:0CBC9F* + ID_OUI_FROM_DATABASE=Apple + OUI:0CBD51* ID_OUI_FROM_DATABASE=TCT Mobile Limited @@ -53107,6 +53143,9 @@ OUI:0CEEE6* OUI:0CEF7C* ID_OUI_FROM_DATABASE=AnaCom Inc +OUI:0CEFAF* + ID_OUI_FROM_DATABASE=IEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information. + OUI:0CF019* ID_OUI_FROM_DATABASE=Malgn Technology Co., Ltd. @@ -53122,6 +53161,9 @@ OUI:0CF3EE* OUI:0CF405* ID_OUI_FROM_DATABASE=Beijing Signalway Technologies Co.,Ltd +OUI:0CF5A4* + ID_OUI_FROM_DATABASE=Cisco + OUI:0CF893* ID_OUI_FROM_DATABASE=ARRIS Group, Inc. @@ -53263,6 +53305,9 @@ OUI:104780* OUI:1048B1* ID_OUI_FROM_DATABASE=Beijing Duokan Technology Limited +OUI:104A7D* + ID_OUI_FROM_DATABASE=Intel Corporate + OUI:104B46* ID_OUI_FROM_DATABASE=Mitsubishi Electric Corporation @@ -53326,6 +53371,9 @@ OUI:10768A* OUI:1077B1* ID_OUI_FROM_DATABASE=Samsung Electronics Co.,LTD +OUI:107873* + ID_OUI_FROM_DATABASE=Shenzhen Jinkeyi Communication Co., Ltd. + OUI:1078CE* ID_OUI_FROM_DATABASE=Hanvit SI, Inc. @@ -53374,6 +53422,9 @@ OUI:10A13B* OUI:10A5D0* ID_OUI_FROM_DATABASE=Murata Manufacturing Co.,Ltd. +OUI:10A659* + ID_OUI_FROM_DATABASE=Mobile Create Co.,Ltd. + OUI:10A743* ID_OUI_FROM_DATABASE=SK Mtek Limited @@ -53428,6 +53479,9 @@ OUI:10CCDB* OUI:10D1DC* ID_OUI_FROM_DATABASE=INSTAR Deutschland GmbH +OUI:10D38A* + ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd + OUI:10D542* ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd @@ -53452,6 +53506,9 @@ OUI:10E4AF* OUI:10E6AE* ID_OUI_FROM_DATABASE=Source Technologies, LLC +OUI:10E878* + ID_OUI_FROM_DATABASE=Alcatel-Lucent + OUI:10E8EE* ID_OUI_FROM_DATABASE=PhaseSpace @@ -53512,6 +53569,9 @@ OUI:14144B* OUI:141A51* ID_OUI_FROM_DATABASE=Treetech Sistemas Digitais +OUI:141AA3* + ID_OUI_FROM_DATABASE=Motorola Mobility LLC + OUI:141BBD* ID_OUI_FROM_DATABASE=Volex Inc. @@ -53524,6 +53584,9 @@ OUI:141FBA* OUI:1423D7* ID_OUI_FROM_DATABASE=EUTRONIX CO., LTD. +OUI:142971* + ID_OUI_FROM_DATABASE=NEMOA ELECTRONICS (HK) CO. LTD + OUI:142BD2* ID_OUI_FROM_DATABASE=Armtel Ltd. @@ -53614,6 +53677,9 @@ OUI:146308* OUI:146A0B* ID_OUI_FROM_DATABASE=Cypress Electronics Limited +OUI:146B72* + ID_OUI_FROM_DATABASE=Shenzhen Fortune Ship Technology Co., Ltd. + OUI:147373* ID_OUI_FROM_DATABASE=TUBITAK UEKAE @@ -53635,12 +53701,18 @@ OUI:14825B* OUI:148692* ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD. +OUI:14893E* + ID_OUI_FROM_DATABASE=VIXTEL TECHNOLOGIES LIMTED + OUI:1489FD* ID_OUI_FROM_DATABASE=Samsung Electronics OUI:148A70* ID_OUI_FROM_DATABASE=ADS GmbH +OUI:148F21* + ID_OUI_FROM_DATABASE=Garmin International + OUI:148FC6* ID_OUI_FROM_DATABASE=Apple @@ -53863,9 +53935,15 @@ OUI:1836FC* OUI:183825* ID_OUI_FROM_DATABASE=Wuhan Lingjiu High-tech Co.,Ltd. +OUI:183864* + ID_OUI_FROM_DATABASE=CAP-TECH INTERNATIONAL CO., LTD. + OUI:183919* ID_OUI_FROM_DATABASE=Unicoi Systems +OUI:183A2D* + ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd + OUI:183BD2* ID_OUI_FROM_DATABASE=BYD Precision Manufacture Company Ltd. @@ -53905,6 +53983,9 @@ OUI:18550F* OUI:185933* ID_OUI_FROM_DATABASE=Cisco SPVTG +OUI:185936* + ID_OUI_FROM_DATABASE=XIAOMI INC + OUI:185AE8* ID_OUI_FROM_DATABASE=Zenotech.Co.,Ltd @@ -53929,6 +54010,9 @@ OUI:186751* OUI:1867B0* ID_OUI_FROM_DATABASE=Samsung Electronics Co.,LTD +OUI:186882* + ID_OUI_FROM_DATABASE=Beward R&D Co., Ltd. + OUI:186D99* ID_OUI_FROM_DATABASE=Adanis Inc. @@ -53998,6 +54082,9 @@ OUI:189C5D* OUI:189EFC* ID_OUI_FROM_DATABASE=Apple +OUI:18A3E8* + ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Tech.Co.,Ltd. + OUI:18A905* ID_OUI_FROM_DATABASE=Hewlett-Packard Company @@ -54028,6 +54115,9 @@ OUI:18AF8F* OUI:18AF9F* ID_OUI_FROM_DATABASE=DIGITRONIC Automationsanlagen GmbH +OUI:18B169* + ID_OUI_FROM_DATABASE=Sonicwall + OUI:18B209* ID_OUI_FROM_DATABASE=Torrey Pines Logic, Inc @@ -54049,6 +54139,9 @@ OUI:18C086* OUI:18C451* ID_OUI_FROM_DATABASE=Tucson Embedded Systems +OUI:18C58A* + ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD + OUI:18C8E7* ID_OUI_FROM_DATABASE=Shenzhen Hualistone Technology Co.,Ltd @@ -54094,12 +54187,21 @@ OUI:18E80F* OUI:18E8DD* ID_OUI_FROM_DATABASE=MODULETEK +OUI:18EE69* + ID_OUI_FROM_DATABASE=Apple + OUI:18EF63* ID_OUI_FROM_DATABASE=CISCO SYSTEMS, INC. +OUI:18F145* + ID_OUI_FROM_DATABASE=NetComm Wireless Limited + OUI:18F46A* ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd. +OUI:18F643* + ID_OUI_FROM_DATABASE=Apple + OUI:18F650* ID_OUI_FROM_DATABASE=Multimedia Pacific Limited @@ -54118,6 +54220,9 @@ OUI:18FC9F* OUI:18FE34* ID_OUI_FROM_DATABASE=Espressif Inc. +OUI:18FF0F* + ID_OUI_FROM_DATABASE=Intel Corporate + OUI:18FF2E* ID_OUI_FROM_DATABASE=Shenzhen Rui Ying Da Technology Co., Ltd @@ -54142,6 +54247,9 @@ OUI:1C129D* OUI:1C1448* ID_OUI_FROM_DATABASE=ARRIS Group, Inc. +OUI:1C14B3* + ID_OUI_FROM_DATABASE=Pinyon Technologies + OUI:1C17D3* ID_OUI_FROM_DATABASE=CISCO SYSTEMS, INC. @@ -54178,6 +54286,9 @@ OUI:1C35F1* OUI:1C37BF* ID_OUI_FROM_DATABASE=Cloudium Systems Ltd. +OUI:1C3947* + ID_OUI_FROM_DATABASE=COMPAL INFORMATION (KUNSHAN) CO., LTD. + OUI:1C3A4F* ID_OUI_FROM_DATABASE=AccuSpec Electronics, LLC @@ -54283,6 +54394,9 @@ OUI:1C7C45* OUI:1C7CC7* ID_OUI_FROM_DATABASE=Coriant GmbH +OUI:1C7D22* + ID_OUI_FROM_DATABASE=Fuji Xerox Co., Ltd. + OUI:1C7E51* ID_OUI_FROM_DATABASE=3bumen.com @@ -54298,6 +54412,9 @@ OUI:1C8464* OUI:1C86AD* ID_OUI_FROM_DATABASE=MCT CO., LTD. +OUI:1C8E5C* + ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd + OUI:1C8E8E* ID_OUI_FROM_DATABASE=DB Communication & Systems Co., ltd. @@ -54334,6 +54451,9 @@ OUI:1C9ECB* OUI:1CA2B1* ID_OUI_FROM_DATABASE=ruwido austria gmbh +OUI:1CA532* + ID_OUI_FROM_DATABASE=Shenzhen Gongjin Electronics Co.,Ltd + OUI:1CA770* ID_OUI_FROM_DATABASE=SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LT @@ -54385,6 +54505,9 @@ OUI:1CC316* OUI:1CC63C* ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation +OUI:1CC72D* + ID_OUI_FROM_DATABASE=Shenzhen Huapu Digital CO.,Ltd + OUI:1CD40C* ID_OUI_FROM_DATABASE=Kriwan Industrie-Elektronik GmbH @@ -54409,6 +54532,9 @@ OUI:1CE62B* OUI:1CE6C7* ID_OUI_FROM_DATABASE=Cisco +OUI:1CE85D* + ID_OUI_FROM_DATABASE=Cisco + OUI:1CEEE8* ID_OUI_FROM_DATABASE=Ilshin Elecom @@ -54487,12 +54613,18 @@ OUI:202564* OUI:202598* ID_OUI_FROM_DATABASE=Teleview +OUI:2028BC* + ID_OUI_FROM_DATABASE=Visionscape Co,. Ltd. + OUI:202BC1* ID_OUI_FROM_DATABASE=Shenzhen Huawei Communication Technologies Co., Ltd OUI:202CB7* ID_OUI_FROM_DATABASE=Kong Yue Electronics & Information Industry (Xinhui) Ltd. +OUI:2031EB* + ID_OUI_FROM_DATABASE=HDSN + OUI:203706* ID_OUI_FROM_DATABASE=CISCO SYSTEMS, INC. @@ -54550,6 +54682,9 @@ OUI:205B5E* OUI:205CFA* ID_OUI_FROM_DATABASE=Yangzhou ChangLian Network Technology Co,ltd. +OUI:206274* + ID_OUI_FROM_DATABASE=Microsoft Corporation + OUI:206432* ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO MECHANICS CO.,LTD. @@ -54616,6 +54751,9 @@ OUI:209AE9* OUI:209BA5* ID_OUI_FROM_DATABASE=JIAXING GLEAD Electronics Co.,Ltd +OUI:20A2E4* + ID_OUI_FROM_DATABASE=Apple + OUI:20A2E7* ID_OUI_FROM_DATABASE=Lee-Dickens Ltd @@ -54652,6 +54790,9 @@ OUI:20BBC6* OUI:20BFDB* ID_OUI_FROM_DATABASE=DVL +OUI:20C06D* + ID_OUI_FROM_DATABASE=SHENZHEN SPACETEK TECHNOLOGY CO.,LTD + OUI:20C1AF* ID_OUI_FROM_DATABASE=i Wit Digital Co., Limited @@ -54754,6 +54895,9 @@ OUI:24050F* OUI:240917* ID_OUI_FROM_DATABASE=Devlin Electronics Limited +OUI:240995* + ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd + OUI:240A11* ID_OUI_FROM_DATABASE=TCT Mobile Limited @@ -54784,6 +54928,9 @@ OUI:241A8C* OUI:241B13* ID_OUI_FROM_DATABASE=Shanghai Nutshell Electronic Co., Ltd. +OUI:241B44* + ID_OUI_FROM_DATABASE=Hangzhou Tuners Electronics Co., Ltd + OUI:241F2C* ID_OUI_FROM_DATABASE=Calsys, Inc. @@ -54817,6 +54964,12 @@ OUI:24470E* OUI:24497B* ID_OUI_FROM_DATABASE=Innovative Converged Devices Inc +OUI:244B03* + ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd + +OUI:244B81* + ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd + OUI:244F1D* ID_OUI_FROM_DATABASE=iRule LLC @@ -54847,6 +55000,9 @@ OUI:24767D* OUI:247703* ID_OUI_FROM_DATABASE=Intel Corporate +OUI:247F3C* + ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd + OUI:248000* ID_OUI_FROM_DATABASE=Westcontrol AS @@ -54874,6 +55030,9 @@ OUI:249504* OUI:2497ED* ID_OUI_FROM_DATABASE=Techvision Intelligent Technology Limited +OUI:24A074* + ID_OUI_FROM_DATABASE=Apple + OUI:24A2E1* ID_OUI_FROM_DATABASE=Apple, Inc @@ -55126,6 +55285,9 @@ OUI:284FCE* OUI:285132* ID_OUI_FROM_DATABASE=Shenzhen Prayfly Technology Co.,Ltd +OUI:2852E0* + ID_OUI_FROM_DATABASE=Layon international Electronic & Telecom Co.,Ltd + OUI:285767* ID_OUI_FROM_DATABASE=Echostar Technologies Corp @@ -55171,6 +55333,9 @@ OUI:287994* OUI:288023* ID_OUI_FROM_DATABASE=Hewlett Packard +OUI:2884FA* + ID_OUI_FROM_DATABASE=SHARP Corporation + OUI:28852D* ID_OUI_FROM_DATABASE=Touch Networks @@ -55333,6 +55498,9 @@ OUI:28E31F* OUI:28E347* ID_OUI_FROM_DATABASE=Liteon Technology Corporation +OUI:28E476* + ID_OUI_FROM_DATABASE=Pi-Coral + OUI:28E608* ID_OUI_FROM_DATABASE=Tokheim @@ -55369,6 +55537,9 @@ OUI:28FC51* OUI:28FCF6* ID_OUI_FROM_DATABASE=Shenzhen Xin KingBrand enterprises Co.,Ltd +OUI:28FD80* + ID_OUI_FROM_DATABASE=IEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information. + OUI:2C002C* ID_OUI_FROM_DATABASE=UNOWHY @@ -55402,12 +55573,18 @@ OUI:2C1A31* OUI:2C1EEA* ID_OUI_FROM_DATABASE=AERODEV +OUI:2C1F23* + ID_OUI_FROM_DATABASE=Apple + OUI:2C2172* ID_OUI_FROM_DATABASE=Juniper Networks OUI:2C245F* ID_OUI_FROM_DATABASE=Babolat VS +OUI:2C265F* + ID_OUI_FROM_DATABASE=IEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information. + OUI:2C26C5* ID_OUI_FROM_DATABASE=zte corporation @@ -55591,6 +55768,9 @@ OUI:2C9EFC* OUI:2CA157* ID_OUI_FROM_DATABASE=acromate, Inc. +OUI:2CA2B4* + ID_OUI_FROM_DATABASE=Fortify Technologies, LLC + OUI:2CA30E* ID_OUI_FROM_DATABASE=POWER DRAGON DEVELOPMENT LIMITED @@ -55606,6 +55786,9 @@ OUI:2CAB25* OUI:2CABA4* ID_OUI_FROM_DATABASE=Cisco SPVTG +OUI:2CAD13* + ID_OUI_FROM_DATABASE=SHENZHEN ZHILU TECHNOLOGY CO.,LTD + OUI:2CB05D* ID_OUI_FROM_DATABASE=NETGEAR @@ -55702,6 +55885,9 @@ OUI:300D2A* OUI:300ED5* ID_OUI_FROM_DATABASE=Hon Hai Precision Ind.Co.Ltd +OUI:300EE3* + ID_OUI_FROM_DATABASE=Aquantia Corporation + OUI:3010B3* ID_OUI_FROM_DATABASE=Liteon Technology Corporation @@ -56044,6 +56230,9 @@ OUI:343111* OUI:3431C4* ID_OUI_FROM_DATABASE=AVM GmbH +OUI:34363B* + ID_OUI_FROM_DATABASE=Apple + OUI:3438AF* ID_OUI_FROM_DATABASE=Inlab Software GmbH @@ -56059,6 +56248,9 @@ OUI:344B3D* OUI:344B50* ID_OUI_FROM_DATABASE=ZTE Corporation +OUI:344CA4* + ID_OUI_FROM_DATABASE=amazipoint technology Ltd. + OUI:344DEA* ID_OUI_FROM_DATABASE=zte corporation @@ -56101,9 +56293,15 @@ OUI:3464A9* OUI:34684A* ID_OUI_FROM_DATABASE=Teraworks Co., Ltd. +OUI:346895* + ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd. + OUI:346BD3* ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd +OUI:346C0F* + ID_OUI_FROM_DATABASE=Pramod Telecom Pvt. Ltd + OUI:346E8A* ID_OUI_FROM_DATABASE=Ecosense @@ -56143,6 +56341,9 @@ OUI:348446* OUI:34862A* ID_OUI_FROM_DATABASE=Heinz Lackmann GmbH & Co KG +OUI:34873D* + ID_OUI_FROM_DATABASE=Quectel Wireless Solution Co.,Ltd. + OUI:34885D* ID_OUI_FROM_DATABASE=Logitech Far East @@ -56167,9 +56368,15 @@ OUI:349A0D* OUI:349D90* ID_OUI_FROM_DATABASE=Heinzmann GmbH & CO. KG +OUI:349E34* + ID_OUI_FROM_DATABASE=Evervictory Electronic Co.Ltd + OUI:34A183* ID_OUI_FROM_DATABASE=AWare, Inc +OUI:34A395* + ID_OUI_FROM_DATABASE=Apple + OUI:34A3BF* ID_OUI_FROM_DATABASE=Terewave. Inc. @@ -56344,6 +56551,9 @@ OUI:34FA40* OUI:34FC6F* ID_OUI_FROM_DATABASE=ALCEA +OUI:34FCEF* + ID_OUI_FROM_DATABASE=LG Electronics + OUI:380197* ID_OUI_FROM_DATABASE=Toshiba Samsung Storage Technolgoy Korea Corporation @@ -56353,6 +56563,9 @@ OUI:3806B4* OUI:3808FD* ID_OUI_FROM_DATABASE=Silca Spa +OUI:3809A4* + ID_OUI_FROM_DATABASE=Firefly Integrations + OUI:380A0A* ID_OUI_FROM_DATABASE=Sky-City Communication and Electronics Limited Company @@ -56578,6 +56791,9 @@ OUI:38CA97* OUI:38D135* ID_OUI_FROM_DATABASE=EasyIO Corporation Sdn. Bhd. +OUI:38D82F* + ID_OUI_FROM_DATABASE=zte corporation + OUI:38DBBB* ID_OUI_FROM_DATABASE=Sunbow Telecom Co., Ltd. @@ -56689,6 +56905,9 @@ OUI:3C1915* OUI:3C197D* ID_OUI_FROM_DATABASE=Ericsson AB +OUI:3C1A0F* + ID_OUI_FROM_DATABASE=ClearSky Data + OUI:3C1A57* ID_OUI_FROM_DATABASE=Cardiopulmonary Corp @@ -56698,6 +56917,9 @@ OUI:3C1A79* OUI:3C1CBE* ID_OUI_FROM_DATABASE=JADAK LLC +OUI:3C1E04* + ID_OUI_FROM_DATABASE=D-Link International + OUI:3C1E13* ID_OUI_FROM_DATABASE=HANGZHOU SUNRISE TECHNOLOGY CO., LTD @@ -56710,6 +56932,9 @@ OUI:3C26D5* OUI:3C2763* ID_OUI_FROM_DATABASE=SLE quality engineering GmbH & Co. KG +OUI:3C2C94* + ID_OUI_FROM_DATABASE=杭州德澜科技有限公司(HangZhou Delan Technology Co.,Ltd) + OUI:3C2DB7* ID_OUI_FROM_DATABASE=Texas Instruments @@ -56770,6 +56995,9 @@ OUI:3C5A37* OUI:3C5AB4* ID_OUI_FROM_DATABASE=Google +OUI:3C5EC3* + ID_OUI_FROM_DATABASE=Cisco + OUI:3C5F01* ID_OUI_FROM_DATABASE=Synerchip Co., Ltd. @@ -56788,6 +57016,9 @@ OUI:3C672C* OUI:3C6A7D* ID_OUI_FROM_DATABASE=Niigata Power Systems Co., Ltd. +OUI:3C6A9D* + ID_OUI_FROM_DATABASE=Dexatek Technology LTD. + OUI:3C6E63* ID_OUI_FROM_DATABASE=Mitron OY @@ -56833,6 +57064,12 @@ OUI:3C8AE5* OUI:3C8BFE* ID_OUI_FROM_DATABASE=Samsung Electronics +OUI:3C8C40* + ID_OUI_FROM_DATABASE=Hangzhou H3C Technologies Co., Limited + +OUI:3C912B* + ID_OUI_FROM_DATABASE=Vexata Inc + OUI:3C9157* ID_OUI_FROM_DATABASE=Hangzhou Yulong Conmunication Co.,Ltd @@ -56884,6 +57121,9 @@ OUI:3CB15B* OUI:3CB17F* ID_OUI_FROM_DATABASE=Wattwatchers Pty Ld +OUI:3CB792* + ID_OUI_FROM_DATABASE=Hitachi Maxell, Ltd., Optronics Division + OUI:3CB9A6* ID_OUI_FROM_DATABASE=Belden Deutschland GmbH @@ -56902,6 +57142,9 @@ OUI:3CC1F6* OUI:3CC243* ID_OUI_FROM_DATABASE=Nokia Corporation +OUI:3CC2E1* + ID_OUI_FROM_DATABASE=XINHUA CONTROL ENGINEERING CO.,LTD + OUI:3CC99E* ID_OUI_FROM_DATABASE=Huiyang Technology Co., Ltd @@ -56977,6 +57220,9 @@ OUI:3CF808* OUI:3CFB96* ID_OUI_FROM_DATABASE=Emcraft Systems LLC +OUI:3CFDFE* + ID_OUI_FROM_DATABASE=Intel Corporate + OUI:400107* ID_OUI_FROM_DATABASE=Arista Corp @@ -57017,7 +57263,7 @@ OUI:4018B1* ID_OUI_FROM_DATABASE=Aerohive Networks Inc. OUI:4018D7* - ID_OUI_FROM_DATABASE=Wyle Telemetry and Data Systems + ID_OUI_FROM_DATABASE=Smartronix, Inc. OUI:401D59* ID_OUI_FROM_DATABASE=Biometric Associates, LP @@ -57106,6 +57352,9 @@ OUI:406186* OUI:40618E* ID_OUI_FROM_DATABASE=Stella-Green Co +OUI:4062B6* + ID_OUI_FROM_DATABASE=Tele system communication + OUI:40667A* ID_OUI_FROM_DATABASE=mediola - connected living AG @@ -57149,7 +57398,7 @@ OUI:408256* ID_OUI_FROM_DATABASE=Continental Automotive GmbH OUI:4083DE* - ID_OUI_FROM_DATABASE=Motorola + ID_OUI_FROM_DATABASE=Zebra Technologies Inc OUI:408493* ID_OUI_FROM_DATABASE=Clavister AB @@ -57187,6 +57436,9 @@ OUI:409B0D* OUI:409FC7* ID_OUI_FROM_DATABASE=BAEKCHUN I&C Co., Ltd. +OUI:40A5EF* + ID_OUI_FROM_DATABASE=Shenzhen Four Seas Global Link Network Technology Co., Ltd. + OUI:40A6A4* ID_OUI_FROM_DATABASE=PassivSystems Ltd @@ -57256,6 +57508,9 @@ OUI:40CBA8* OUI:40CD3A* ID_OUI_FROM_DATABASE=Z3 Technology +OUI:40D28A* + ID_OUI_FROM_DATABASE=Nintendo Co., Ltd. + OUI:40D32D* ID_OUI_FROM_DATABASE=Apple @@ -57367,6 +57622,9 @@ OUI:44334C* OUI:44348F* ID_OUI_FROM_DATABASE=MXT INDUSTRIAL LTDA +OUI:44356F* + ID_OUI_FROM_DATABASE=Neterix + OUI:443719* ID_OUI_FROM_DATABASE=2 Save Energy Ltd @@ -57424,6 +57682,9 @@ OUI:445829* OUI:44599F* ID_OUI_FROM_DATABASE=Criticare Systems, Inc +OUI:445ECD* + ID_OUI_FROM_DATABASE=Razer Inc + OUI:445EF3* ID_OUI_FROM_DATABASE=Tonalite Holding B.V. @@ -57532,6 +57793,9 @@ OUI:44A6E5* OUI:44A7CF* ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd. +OUI:44A842* + ID_OUI_FROM_DATABASE=Dell Inc. + OUI:44A8C2* ID_OUI_FROM_DATABASE=SEWOO TECH CO., LTD @@ -57613,6 +57877,9 @@ OUI:44E4D9* OUI:44E8A5* ID_OUI_FROM_DATABASE=Myreka Technologies Sdn. Bhd. +OUI:44E9DD* + ID_OUI_FROM_DATABASE=SAGEMCOM SAS + OUI:44ED57* ID_OUI_FROM_DATABASE=Longicorn, inc. @@ -57622,6 +57889,9 @@ OUI:44EE30* OUI:44F459* ID_OUI_FROM_DATABASE=Samsung Electronics +OUI:44F477* + ID_OUI_FROM_DATABASE=Juniper Networks + OUI:44F849* ID_OUI_FROM_DATABASE=Union Pacific Railroad @@ -57673,6 +57943,9 @@ OUI:48343D* OUI:483D32* ID_OUI_FROM_DATABASE=Syscor Controls & Automation +OUI:48437C* + ID_OUI_FROM_DATABASE=Apple + OUI:484487* ID_OUI_FROM_DATABASE=Cisco SPVTG @@ -57691,6 +57964,12 @@ OUI:4851B7* OUI:485261* ID_OUI_FROM_DATABASE=SOREEL +OUI:485415* + ID_OUI_FROM_DATABASE=NET RULES TECNOLOGIA EIRELI + +OUI:48555F* + ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Tech.Co.,Ltd. + OUI:4857DD* ID_OUI_FROM_DATABASE=Facebook @@ -57739,6 +58018,9 @@ OUI:48746E* OUI:488244* ID_OUI_FROM_DATABASE=Life Fitness / Div. of Brunswick +OUI:4886E8* + ID_OUI_FROM_DATABASE=Microsoft Corporation + OUI:488E42* ID_OUI_FROM_DATABASE=DIGALOG GmbH @@ -57766,6 +58048,9 @@ OUI:48A2B7* OUI:48A6D2* ID_OUI_FROM_DATABASE=GJsun Optical Science and Tech Co.,Ltd. +OUI:48A9D2* + ID_OUI_FROM_DATABASE=Wistron Neweb Corp. + OUI:48AA5D* ID_OUI_FROM_DATABASE=Store Electronic Systems @@ -57787,6 +58072,9 @@ OUI:48B9C2* OUI:48BE2D* ID_OUI_FROM_DATABASE=Symanitron +OUI:48C093* + ID_OUI_FROM_DATABASE=Xirrus, Inc. + OUI:48C1AC* ID_OUI_FROM_DATABASE=PLANTRONICS, INC. @@ -57832,6 +58120,9 @@ OUI:48DF1C* OUI:48E1AF* ID_OUI_FROM_DATABASE=Vity +OUI:48E9F1* + ID_OUI_FROM_DATABASE=Apple + OUI:48EA63* ID_OUI_FROM_DATABASE=Zhejiang Uniview Technologies Co., Ltd. @@ -57844,6 +58135,9 @@ OUI:48ED80* OUI:48EE07* ID_OUI_FROM_DATABASE=Silver Palm Technologies LLC +OUI:48EE0C* + ID_OUI_FROM_DATABASE=D-Link International + OUI:48EE86* ID_OUI_FROM_DATABASE=UTStarcom (China) Co.,Ltd @@ -57889,6 +58183,9 @@ OUI:4C07C9* OUI:4C09B4* ID_OUI_FROM_DATABASE=zte corporation +OUI:4C09D4* + ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation + OUI:4C0B3A* ID_OUI_FROM_DATABASE=TCT Mobile Limited @@ -58033,6 +58330,9 @@ OUI:4C73A5* OUI:4C7403* ID_OUI_FROM_DATABASE=Mundo Reader (bq) +OUI:4C7625* + ID_OUI_FROM_DATABASE=Dell Inc. + OUI:4C774F* ID_OUI_FROM_DATABASE=Embedded Wireless Labs @@ -58042,6 +58342,9 @@ OUI:4C7897* OUI:4C79BA* ID_OUI_FROM_DATABASE=Intel Corporate +OUI:4C7C5F* + ID_OUI_FROM_DATABASE=Apple + OUI:4C7F62* ID_OUI_FROM_DATABASE=Nokia Corporation @@ -58087,12 +58390,18 @@ OUI:4C9EE4* OUI:4C9EFF* ID_OUI_FROM_DATABASE=ZyXEL Communications Corp +OUI:4CA515* + ID_OUI_FROM_DATABASE=Baikal Electronics JSC + OUI:4CA56D* ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd OUI:4CA74B* ID_OUI_FROM_DATABASE=Alcatel Lucent +OUI:4CA928* + ID_OUI_FROM_DATABASE=Insensi + OUI:4CAA16* ID_OUI_FROM_DATABASE=AzureWave Technologies (Shanghai) Inc. @@ -58147,6 +58456,9 @@ OUI:4CCBF5* OUI:4CCC34* ID_OUI_FROM_DATABASE=Motorola Solutions Inc. +OUI:4CD08A* + ID_OUI_FROM_DATABASE=HUMAX.CO.,LTD + OUI:4CD637* ID_OUI_FROM_DATABASE=Qsono Electronics Co., Ltd @@ -58294,9 +58606,15 @@ OUI:504A6E* OUI:504F94* ID_OUI_FROM_DATABASE=Loxone Electronics GmbH +OUI:50502A* + ID_OUI_FROM_DATABASE=Egardia + OUI:505065* ID_OUI_FROM_DATABASE=TAKT Corporation +OUI:505527* + ID_OUI_FROM_DATABASE=LG Electronics + OUI:505663* ID_OUI_FROM_DATABASE=Texas Instruments @@ -58330,6 +58648,9 @@ OUI:506313* OUI:506441* ID_OUI_FROM_DATABASE=Greenlee +OUI:5065F3* + ID_OUI_FROM_DATABASE=Hewlett Packard + OUI:506787* ID_OUI_FROM_DATABASE=iTellus @@ -58345,6 +58666,9 @@ OUI:506F9A* OUI:5070E5* ID_OUI_FROM_DATABASE=He Shan World Fair Electronics Technology Limited +OUI:507224* + ID_OUI_FROM_DATABASE=Texas Instruments + OUI:50724D* ID_OUI_FROM_DATABASE=BEG Brueck Electronic GmbH @@ -58582,6 +58906,9 @@ OUI:543530* OUI:5435DF* ID_OUI_FROM_DATABASE=Symeo GmbH +OUI:54369B* + ID_OUI_FROM_DATABASE=In one network technology (Beijing) Co., Ltd. + OUI:543968* ID_OUI_FROM_DATABASE=Edgewater Networks Inc @@ -58645,6 +58972,9 @@ OUI:54781A* OUI:547975* ID_OUI_FROM_DATABASE=Nokia Corporation +OUI:547C69* + ID_OUI_FROM_DATABASE=Cisco + OUI:547F54* ID_OUI_FROM_DATABASE=INGENICO @@ -58687,6 +59017,9 @@ OUI:549B12* OUI:549D85* ID_OUI_FROM_DATABASE=EnerAccess inc +OUI:549F13* + ID_OUI_FROM_DATABASE=Apple + OUI:549F35* ID_OUI_FROM_DATABASE=Dell Inc. @@ -58834,6 +59167,9 @@ OUI:581CBD* OUI:581D91* ID_OUI_FROM_DATABASE=Advanced Mobile Telecom co.,ltd. +OUI:581F28* + ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd + OUI:581F67* ID_OUI_FROM_DATABASE=Open-m technology limited @@ -58873,6 +59209,9 @@ OUI:58468F* OUI:5846E1* ID_OUI_FROM_DATABASE=Baxter Healthcare +OUI:584704* + ID_OUI_FROM_DATABASE=Shenzhen Webridge Technology Co.,Ltd + OUI:5848C0* ID_OUI_FROM_DATABASE=COFLEC @@ -58960,6 +59299,9 @@ OUI:587FC8* OUI:5884E4* ID_OUI_FROM_DATABASE=IP500 Alliance e.V. +OUI:58856E* + ID_OUI_FROM_DATABASE=QSC AG + OUI:58874C* ID_OUI_FROM_DATABASE=LITE-ON CLEAN ENERGY TECHNOLOGY CORP. @@ -58993,6 +59335,9 @@ OUI:589835* OUI:58986F* ID_OUI_FROM_DATABASE=Revolution Display +OUI:589B0B* + ID_OUI_FROM_DATABASE=Shineway Technologies, Inc. + OUI:589CFC* ID_OUI_FROM_DATABASE=FreeBSD Foundation @@ -59002,6 +59347,9 @@ OUI:58A2B5* OUI:58A76F* ID_OUI_FROM_DATABASE=iD corporation +OUI:58A839* + ID_OUI_FROM_DATABASE=Intel Corporate + OUI:58B035* ID_OUI_FROM_DATABASE=Apple @@ -59108,7 +59456,7 @@ OUI:5C0CBB* ID_OUI_FROM_DATABASE=CELIZION Inc. OUI:5C0E8B* - ID_OUI_FROM_DATABASE=Motorola + ID_OUI_FROM_DATABASE=Zebra Technologies Inc OUI:5C1193* ID_OUI_FROM_DATABASE=Seal One AG @@ -59185,12 +59533,18 @@ OUI:5C36B8* OUI:5C38E0* ID_OUI_FROM_DATABASE=Shanghai Super Electronics Technology Co.,LTD +OUI:5C3B35* + ID_OUI_FROM_DATABASE=Gehirn Inc. + OUI:5C3C27* ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd OUI:5C4058* ID_OUI_FROM_DATABASE=Jefferson Audio Video Systems, Inc. +OUI:5C41E7* + ID_OUI_FROM_DATABASE=Wiatec International Ltd. + OUI:5C43D2* ID_OUI_FROM_DATABASE=HAZEMEYER @@ -59257,9 +59611,15 @@ OUI:5C864A* OUI:5C8778* ID_OUI_FROM_DATABASE=Cybertelbridge co.,ltd +OUI:5C899A* + ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD + OUI:5C89D4* ID_OUI_FROM_DATABASE=Beijing Banner Electric Co.,Ltd +OUI:5C8A38* + ID_OUI_FROM_DATABASE=Hewlett Packard + OUI:5C8D4E* ID_OUI_FROM_DATABASE=Apple @@ -59326,6 +59686,9 @@ OUI:5CC9D3* OUI:5CCA32* ID_OUI_FROM_DATABASE=Theben AG +OUI:5CCCFF* + ID_OUI_FROM_DATABASE=Techroutes Network Pvt Ltd + OUI:5CCEAD* ID_OUI_FROM_DATABASE=CDYNE Corporation @@ -59398,9 +59761,15 @@ OUI:5CF4AB* OUI:5CF50D* ID_OUI_FROM_DATABASE=Institute of microelectronic applications +OUI:5CF5DA* + ID_OUI_FROM_DATABASE=Apple + OUI:5CF6DC* ID_OUI_FROM_DATABASE=Samsung Electronics Co.,LTD +OUI:5CF7C3* + ID_OUI_FROM_DATABASE=SYNTECH (HK) TECHNOLOGY LIMITED + OUI:5CF8A1* ID_OUI_FROM_DATABASE=Murata Manufactuaring Co.,Ltd. @@ -59416,6 +59785,9 @@ OUI:5CF9DD* OUI:5CF9F0* ID_OUI_FROM_DATABASE=Atomos Engineering P/L +OUI:5CFC66* + ID_OUI_FROM_DATABASE=Cisco + OUI:5CFF35* ID_OUI_FROM_DATABASE=Wistron Corporation @@ -59446,6 +59818,9 @@ OUI:601199* OUI:601283* ID_OUI_FROM_DATABASE=Soluciones Tecnologicas para la Salud y el Bienestar SA +OUI:60128B* + ID_OUI_FROM_DATABASE=CANON INC. + OUI:6015C7* ID_OUI_FROM_DATABASE=IdaTech @@ -59536,6 +59911,9 @@ OUI:605464* OUI:605718* ID_OUI_FROM_DATABASE=Intel Corporate +OUI:605BB4* + ID_OUI_FROM_DATABASE=AzureWave Technologies, Inc. + OUI:60601F* ID_OUI_FROM_DATABASE=SZ DJI TECHNOLOGY CO.,LTD @@ -59635,6 +60013,9 @@ OUI:60A8FE* OUI:60A9B0* ID_OUI_FROM_DATABASE=Merchandising Technologies, Inc +OUI:60AF6D* + ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd + OUI:60B185* ID_OUI_FROM_DATABASE=ATH system @@ -59707,6 +60088,9 @@ OUI:60D30A* OUI:60D819* ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd. +OUI:60D9A0* + ID_OUI_FROM_DATABASE=Lenovo Mobile Communication Technology Ltd. + OUI:60D9C7* ID_OUI_FROM_DATABASE=Apple @@ -59737,6 +60121,9 @@ OUI:60EB69* OUI:60F13D* ID_OUI_FROM_DATABASE=JABLOCOM s.r.o. +OUI:60F189* + ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd. + OUI:60F281* ID_OUI_FROM_DATABASE=TRANWO TECHNOLOGY CO., LTD. @@ -59755,6 +60142,9 @@ OUI:60F59C* OUI:60F673* ID_OUI_FROM_DATABASE=TERUMO CORPORATION +OUI:60F81D* + ID_OUI_FROM_DATABASE=Apple + OUI:60FACD* ID_OUI_FROM_DATABASE=Apple @@ -59851,6 +60241,9 @@ OUI:64317E* OUI:643409* ID_OUI_FROM_DATABASE=BITwave Pte Ltd +OUI:643AB1* + ID_OUI_FROM_DATABASE=SICHUAN TIANYI COMHEART TELECOMCO.,LTD + OUI:643E8C* ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD @@ -60010,6 +60403,9 @@ OUI:649968* OUI:6499A0* ID_OUI_FROM_DATABASE=AG Elektronik AB +OUI:649ABE* + ID_OUI_FROM_DATABASE=Apple + OUI:649B24* ID_OUI_FROM_DATABASE=V Technology Co., Ltd. @@ -60169,6 +60565,9 @@ OUI:64F242* OUI:64F50E* ID_OUI_FROM_DATABASE=Kinion Technology Company Limited +OUI:64F69D* + ID_OUI_FROM_DATABASE=Cisco + OUI:64F970* ID_OUI_FROM_DATABASE=Kenade Electronics Technology Co.,LTD. @@ -60229,6 +60628,9 @@ OUI:68234B* OUI:6828BA* ID_OUI_FROM_DATABASE=Dejai +OUI:6828F6* + ID_OUI_FROM_DATABASE=Vubiq Networks, Inc. + OUI:682DDC* ID_OUI_FROM_DATABASE=Wuhan Changjiang Electro-Communication Equipment CO.,LTD @@ -60238,6 +60640,9 @@ OUI:6836B5* OUI:683B1E* ID_OUI_FROM_DATABASE=Countwise LTD +OUI:683C7D* + ID_OUI_FROM_DATABASE=Magic Intelligence Technology Limited + OUI:683EEC* ID_OUI_FROM_DATABASE=ERECA @@ -60280,6 +60685,9 @@ OUI:685E6B* OUI:686359* ID_OUI_FROM_DATABASE=Advanced Digital Broadcast SA +OUI:68644B* + ID_OUI_FROM_DATABASE=Apple + OUI:68692E* ID_OUI_FROM_DATABASE=Zycoo Co.,Ltd @@ -60346,6 +60754,9 @@ OUI:68876B* OUI:688AB5* ID_OUI_FROM_DATABASE=EDP Servicos +OUI:688F84* + ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD + OUI:689234* ID_OUI_FROM_DATABASE=Ruckus Wireless @@ -60412,6 +60823,9 @@ OUI:68B6FC* OUI:68B8D9* ID_OUI_FROM_DATABASE=Act KDE, Inc. +OUI:68B983* + ID_OUI_FROM_DATABASE=b-plus GmbH + OUI:68BC0C* ID_OUI_FROM_DATABASE=CISCO SYSTEMS, INC. @@ -60481,6 +60895,9 @@ OUI:68EFBD* OUI:68F06D* ID_OUI_FROM_DATABASE=ALONG INDUSTRIAL CO., LIMITED +OUI:68F0BC* + ID_OUI_FROM_DATABASE=Shenzhen LiWiFi Technology Co., Ltd + OUI:68F125* ID_OUI_FROM_DATABASE=Data Controls Inc. @@ -60547,6 +60964,9 @@ OUI:6C2C06* OUI:6C2E33* ID_OUI_FROM_DATABASE=Accelink Technologies Co.,Ltd. +OUI:6C2E72* + ID_OUI_FROM_DATABASE=B&B EXPORTING LIMITED + OUI:6C2E85* ID_OUI_FROM_DATABASE=SAGEMCOM @@ -60697,6 +61117,12 @@ OUI:6CA682* OUI:6CA780* ID_OUI_FROM_DATABASE=Nokia Corporation +OUI:6CA7FA* + ID_OUI_FROM_DATABASE=YOUNGBO ENGINEERING INC. + +OUI:6CA849* + ID_OUI_FROM_DATABASE=Avaya, Inc + OUI:6CA906* ID_OUI_FROM_DATABASE=Telefield Ltd @@ -60733,6 +61159,9 @@ OUI:6CB311* OUI:6CB350* ID_OUI_FROM_DATABASE=Anhui comhigher tech co.,ltd +OUI:6CB56B* + ID_OUI_FROM_DATABASE=HUMAX.CO.,LTD + OUI:6CB7F4* ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd @@ -60751,6 +61180,9 @@ OUI:6CC217* OUI:6CC26B* ID_OUI_FROM_DATABASE=Apple +OUI:6CCA08* + ID_OUI_FROM_DATABASE=ARRIS Group, Inc. + OUI:6CD032* ID_OUI_FROM_DATABASE=LG Electronics @@ -60796,6 +61228,9 @@ OUI:6CF373* OUI:6CF37F* ID_OUI_FROM_DATABASE=Aruba Networks +OUI:6CF5E8* + ID_OUI_FROM_DATABASE=Mooredoll Inc. + OUI:6CF97C* ID_OUI_FROM_DATABASE=Nanoptix Inc. @@ -60925,6 +61360,9 @@ OUI:704CED* OUI:704E01* ID_OUI_FROM_DATABASE=KWANGWON TECH CO., LTD. +OUI:704E66* + ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD + OUI:7052C5* ID_OUI_FROM_DATABASE=Avaya, Inc. @@ -61063,6 +61501,9 @@ OUI:709E29* OUI:709E86* ID_OUI_FROM_DATABASE=X6D Limited +OUI:709F2D* + ID_OUI_FROM_DATABASE=zte corporation + OUI:70A191* ID_OUI_FROM_DATABASE=Trendsetter Medical, LLC @@ -61078,6 +61519,9 @@ OUI:70A8E3* OUI:70AAB2* ID_OUI_FROM_DATABASE=Research In Motion +OUI:70AD54* + ID_OUI_FROM_DATABASE=Malvern Instruments Ltd + OUI:70AF25* ID_OUI_FROM_DATABASE=Nishiyama Industry Co.,LTD. @@ -61108,6 +61552,9 @@ OUI:70BAEF* OUI:70C6AC* ID_OUI_FROM_DATABASE=Bosch Automotive Aftermarket +OUI:70C76F* + ID_OUI_FROM_DATABASE=INNO S + OUI:70CA9B* ID_OUI_FROM_DATABASE=CISCO SYSTEMS, INC. @@ -61129,6 +61576,9 @@ OUI:70D6B6* OUI:70D880* ID_OUI_FROM_DATABASE=Upos System sp. z o.o. +OUI:70DA9C* + ID_OUI_FROM_DATABASE=TECSEN + OUI:70DDA1* ID_OUI_FROM_DATABASE=Tellabs @@ -61183,6 +61633,9 @@ OUI:70FF5C* OUI:70FF76* ID_OUI_FROM_DATABASE=Texas Instruments +OUI:7403BD* + ID_OUI_FROM_DATABASE=Buffalo Inc. + OUI:740ABC* ID_OUI_FROM_DATABASE=JSJS Designs (Europe) Limited @@ -61225,6 +61678,9 @@ OUI:742B62* OUI:742D0A* ID_OUI_FROM_DATABASE=Norfolk Elektronik AG +OUI:742EFC* + ID_OUI_FROM_DATABASE=DirectPacket Research, Inc, + OUI:742F68* ID_OUI_FROM_DATABASE=Azurewave Technologies, Inc. @@ -61324,6 +61780,9 @@ OUI:747E1A* OUI:747E2D* ID_OUI_FROM_DATABASE=Beijing Thomson CITIC Digital Technology Co. LTD. +OUI:748114* + ID_OUI_FROM_DATABASE=Apple + OUI:74867A* ID_OUI_FROM_DATABASE=Dell Inc @@ -61351,21 +61810,39 @@ OUI:749050* OUI:74911A* ID_OUI_FROM_DATABASE=Ruckus Wireless +OUI:7491BD* + ID_OUI_FROM_DATABASE=Four systems Co.,Ltd. + OUI:7493A4* ID_OUI_FROM_DATABASE=Zebra Technologies Corp. OUI:74943D* ID_OUI_FROM_DATABASE=AgJunction +OUI:749637* + ID_OUI_FROM_DATABASE=Todaair Electronic Co., Ltd + OUI:749975* ID_OUI_FROM_DATABASE=IBM Corporation OUI:749C52* ID_OUI_FROM_DATABASE=Huizhou Desay SV Automotive Co., Ltd. +OUI:749CE3* + ID_OUI_FROM_DATABASE=Art2Wave Canada Inc. + OUI:749DDC* ID_OUI_FROM_DATABASE=2Wire +OUI:74A02F* + ID_OUI_FROM_DATABASE=Cisco + +OUI:74A063* + ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD + +OUI:74A34A* + ID_OUI_FROM_DATABASE=ZIMI CORPORATION + OUI:74A4A7* ID_OUI_FROM_DATABASE=QRS Music Technologies, Inc. @@ -61396,6 +61873,9 @@ OUI:74BE08* OUI:74BFA1* ID_OUI_FROM_DATABASE=HYUNTECK +OUI:74C246* + ID_OUI_FROM_DATABASE=Amazon Technologies Inc. + OUI:74C621* ID_OUI_FROM_DATABASE=Zhejiang Hite Renewable Energy Co.,LTD @@ -61423,6 +61903,9 @@ OUI:74D435* OUI:74D675* ID_OUI_FROM_DATABASE=WYMA Tecnologia +OUI:74D6EA* + ID_OUI_FROM_DATABASE=Texas Instruments + OUI:74D850* ID_OUI_FROM_DATABASE=Evrisko Systems @@ -61444,6 +61927,12 @@ OUI:74E14A* OUI:74E1B6* ID_OUI_FROM_DATABASE=Apple +OUI:74E277* + ID_OUI_FROM_DATABASE=Vizmonet Pte Ltd + +OUI:74E28C* + ID_OUI_FROM_DATABASE=Microsoft Corporation + OUI:74E2F5* ID_OUI_FROM_DATABASE=Apple @@ -61582,6 +62071,9 @@ OUI:783E53* OUI:783F15* ID_OUI_FROM_DATABASE=EasySYNC Ltd. +OUI:7840E4* + ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd + OUI:784405* ID_OUI_FROM_DATABASE=FUJITU(HONG KONG) ELECTRONIC Co.,LTD. @@ -61630,6 +62122,9 @@ OUI:785517* OUI:785712* ID_OUI_FROM_DATABASE=Mobile Integration Workgroup +OUI:7858F3* + ID_OUI_FROM_DATABASE=Vachen Co.,Ltd + OUI:78593E* ID_OUI_FROM_DATABASE=RAFI GmbH & Co.KG @@ -61654,6 +62149,12 @@ OUI:786A89* OUI:786C1C* ID_OUI_FROM_DATABASE=Apple +OUI:78719C* + ID_OUI_FROM_DATABASE=ARRIS Group, Inc. + +OUI:787E61* + ID_OUI_FROM_DATABASE=Apple + OUI:787F62* ID_OUI_FROM_DATABASE=GiK mbH @@ -61720,6 +62221,9 @@ OUI:78A183* OUI:78A2A0* ID_OUI_FROM_DATABASE=Nintendo Co., Ltd. +OUI:78A351* + ID_OUI_FROM_DATABASE=SHENZHEN ZHIBOTONG ELECTRONICS CO.,LTD + OUI:78A3E4* ID_OUI_FROM_DATABASE=Apple @@ -61747,6 +62251,9 @@ OUI:78AB60* OUI:78ABBB* ID_OUI_FROM_DATABASE=Samsung Electronics Co.,LTD +OUI:78ACBF* + ID_OUI_FROM_DATABASE=Igneous Systems + OUI:78ACC0* ID_OUI_FROM_DATABASE=Hewlett-Packard Company @@ -61858,6 +62365,9 @@ OUI:78E7D1* OUI:78E8B6* ID_OUI_FROM_DATABASE=zte corporation +OUI:78E980* + ID_OUI_FROM_DATABASE=RainUs Co.,Ltd + OUI:78EB14* ID_OUI_FROM_DATABASE=SHENZHEN FAST TECHNOLOGIES CO.,LTD @@ -61882,6 +62392,9 @@ OUI:78F7BE* OUI:78F7D0* ID_OUI_FROM_DATABASE=Silverbrook Research +OUI:78FC14* + ID_OUI_FROM_DATABASE=B Communications Pty Ltd + OUI:78FD94* ID_OUI_FROM_DATABASE=Apple @@ -61945,6 +62458,9 @@ OUI:7C1A03* OUI:7C1AFC* ID_OUI_FROM_DATABASE=Dalian Co-Edifice Video Technology Co., Ltd +OUI:7C1DD9* + ID_OUI_FROM_DATABASE=XIAOMI IMC + OUI:7C1E52* ID_OUI_FROM_DATABASE=Microsoft @@ -61981,6 +62497,9 @@ OUI:7C3920* OUI:7C3BD5* ID_OUI_FROM_DATABASE=Imago Group +OUI:7C3CB6* + ID_OUI_FROM_DATABASE=Shenzhen Homecare Technology Co.,Ltd. + OUI:7C3E9D* ID_OUI_FROM_DATABASE=PATECH @@ -62011,9 +62530,15 @@ OUI:7C4CA5* OUI:7C4FB5* ID_OUI_FROM_DATABASE=Arcadyan Technology Corporation +OUI:7C534A* + ID_OUI_FROM_DATABASE=Metamako + OUI:7C55E7* ID_OUI_FROM_DATABASE=YSI, Inc. +OUI:7C5CF8* + ID_OUI_FROM_DATABASE=Intel Corporate + OUI:7C6097* ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD @@ -62068,6 +62593,9 @@ OUI:7C72E4* OUI:7C7673* ID_OUI_FROM_DATABASE=ENMAS GmbH +OUI:7C7A53* + ID_OUI_FROM_DATABASE=Phytrex Technology Corp. + OUI:7C7A91* ID_OUI_FROM_DATABASE=Intel Corporate @@ -62080,6 +62608,9 @@ OUI:7C7D41* OUI:7C822D* ID_OUI_FROM_DATABASE=Nortec +OUI:7C8274* + ID_OUI_FROM_DATABASE=Shenzhen Hikeen Technology CO.,LTD + OUI:7C8306* ID_OUI_FROM_DATABASE=Glen Dimplex Nordic as @@ -62158,6 +62689,9 @@ OUI:7CC4EF* OUI:7CC537* ID_OUI_FROM_DATABASE=Apple +OUI:7CC709* + ID_OUI_FROM_DATABASE=Shenzhen RF-LINK Elec&Technology.,Ltd + OUI:7CC8AB* ID_OUI_FROM_DATABASE=Acro Associates, Inc. @@ -62401,6 +62935,9 @@ OUI:8065E9* OUI:806629* ID_OUI_FROM_DATABASE=Prescope Technologies CO.,LTD. +OUI:806AB0* + ID_OUI_FROM_DATABASE=Tinno Mobile Technology Corp + OUI:806C1B* ID_OUI_FROM_DATABASE=Motorola Mobility LLC @@ -62446,6 +62983,9 @@ OUI:808698* OUI:8086F2* ID_OUI_FROM_DATABASE=Intel Corporate +OUI:808917* + ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD + OUI:808B5C* ID_OUI_FROM_DATABASE=Shenzhen Runhuicheng Technology Co., Ltd @@ -62479,11 +63019,14 @@ OUI:809B20* OUI:80A1D7* ID_OUI_FROM_DATABASE=Shanghai DareGlobal Technologies Co.,Ltd +OUI:80A85D* + ID_OUI_FROM_DATABASE=Osterhout Design Group + OUI:80AAA4* ID_OUI_FROM_DATABASE=USAG OUI:80AD67* - ID_OUI_FROM_DATABASE=Kasda Digital Technology Co.,Ltd + ID_OUI_FROM_DATABASE=Kasda Networks Inc OUI:80B219* ID_OUI_FROM_DATABASE=ELEKTRON TECHNOLOGY UK LIMITED @@ -62536,6 +63079,9 @@ OUI:80CF41* OUI:80D019* ID_OUI_FROM_DATABASE=Embed, Inc +OUI:80D09B* + ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd + OUI:80D18B* ID_OUI_FROM_DATABASE=Hangzhou I'converge Technology Co.,Ltd @@ -62566,6 +63112,9 @@ OUI:80EE73* OUI:80F25E* ID_OUI_FROM_DATABASE=Kyynel +OUI:80F503* + ID_OUI_FROM_DATABASE=Pace plc + OUI:80F593* ID_OUI_FROM_DATABASE=IRCO Sistemas de Telecomunicación S.A. @@ -62624,7 +63173,7 @@ OUI:842141* ID_OUI_FROM_DATABASE=Shenzhen Ginwave Technologies Ltd. OUI:84248D* - ID_OUI_FROM_DATABASE=Motorola Solutions Inc + ID_OUI_FROM_DATABASE=Zebra Technologies Inc OUI:84253F* ID_OUI_FROM_DATABASE=Silex Technology, Inc @@ -62698,6 +63247,9 @@ OUI:844823* OUI:844915* ID_OUI_FROM_DATABASE=vArmour Networks, Inc. +OUI:844BB7* + ID_OUI_FROM_DATABASE=Beijing Sankuai Online Technology Co.,Ltd + OUI:844BF5* ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd. @@ -62722,6 +63274,9 @@ OUI:845C93* OUI:845DD7* ID_OUI_FROM_DATABASE=Shenzhen Netcom Electronics Co.,Ltd +OUI:8461A0* + ID_OUI_FROM_DATABASE=ARRIS Group, Inc. + OUI:846223* ID_OUI_FROM_DATABASE=Shenzhen Coship Electronics Co., Ltd. @@ -62740,6 +63295,9 @@ OUI:846EB1* OUI:847207* ID_OUI_FROM_DATABASE=I&C Technology +OUI:847303* + ID_OUI_FROM_DATABASE=Letv Mobile and Intelligent Information Technology (Beijing) Corporation Ltd. + OUI:84742A* ID_OUI_FROM_DATABASE=zte corporation @@ -62758,6 +63316,9 @@ OUI:847A88* OUI:847E40* ID_OUI_FROM_DATABASE=Texas Instruments +OUI:84802D* + ID_OUI_FROM_DATABASE=Cisco + OUI:8482F4* ID_OUI_FROM_DATABASE=Beijing Huasun Unicreate Technology Co., Ltd @@ -62851,6 +63412,9 @@ OUI:84B59C* OUI:84C2E4* ID_OUI_FROM_DATABASE=Jiangsu Qinheng Co., Ltd. +OUI:84C3E8* + ID_OUI_FROM_DATABASE=Vaillant GmbH + OUI:84C727* ID_OUI_FROM_DATABASE=Gnodal Ltd @@ -62863,6 +63427,9 @@ OUI:84C8B1* OUI:84C9B2* ID_OUI_FROM_DATABASE=D-Link International +OUI:84CFBF* + ID_OUI_FROM_DATABASE=Fairphone + OUI:84D32A* ID_OUI_FROM_DATABASE=IEEE 1905.1 @@ -62872,6 +63439,9 @@ OUI:84D9C8* OUI:84DB2F* ID_OUI_FROM_DATABASE=Sierra Wireless Inc +OUI:84DBAC* + ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd + OUI:84DD20* ID_OUI_FROM_DATABASE=Texas Instruments @@ -62986,6 +63556,9 @@ OUI:88354C* OUI:883612* ID_OUI_FROM_DATABASE=SRC Computers, LLC +OUI:883B8B* + ID_OUI_FROM_DATABASE=Cheering Connection Co. Ltd. + OUI:8841C1* ID_OUI_FROM_DATABASE=ORBISAT DA AMAZONIA IND E AEROL SA @@ -63157,6 +63730,9 @@ OUI:88C9D0* OUI:88CB87* ID_OUI_FROM_DATABASE=Apple +OUI:88CEFA* + ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd + OUI:88D7BC* ID_OUI_FROM_DATABASE=DEP Company @@ -63175,9 +63751,15 @@ OUI:88E0A0* OUI:88E0F3* ID_OUI_FROM_DATABASE=Juniper Networks +OUI:88E161* + ID_OUI_FROM_DATABASE=Art Beijing Science and Technology Development Co., Ltd. + OUI:88E3AB* ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd +OUI:88E603* + ID_OUI_FROM_DATABASE=Avotek corporation + OUI:88E712* ID_OUI_FROM_DATABASE=Whirlpool Corporation @@ -63394,6 +63976,9 @@ OUI:8C7F3B* OUI:8C82A8* ID_OUI_FROM_DATABASE=Insigma Technology Co.,Ltd +OUI:8C873B* + ID_OUI_FROM_DATABASE=Leica Camera AG + OUI:8C89A5* ID_OUI_FROM_DATABASE=Micro-Star INT'L CO., LTD @@ -63448,6 +64033,9 @@ OUI:8CBEBE* OUI:8CBF9D* ID_OUI_FROM_DATABASE=Shanghai Xinyou Information Technology Ltd. Co. +OUI:8CBFA6* + ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd + OUI:8CC121* ID_OUI_FROM_DATABASE=Panasonic Corporation AVC Networks Company @@ -63529,6 +64117,9 @@ OUI:8CFDF0* OUI:90004E* ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd. +OUI:9000DB* + ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd + OUI:90013B* ID_OUI_FROM_DATABASE=SAGEMCOM @@ -63640,6 +64231,9 @@ OUI:903D6B* OUI:903EAB* ID_OUI_FROM_DATABASE=ARRIS Group, Inc. +OUI:904506* + ID_OUI_FROM_DATABASE=Tokyo Boeki Medisys Inc. + OUI:9046B7* ID_OUI_FROM_DATABASE=Vadaro Pte Ltd @@ -63754,6 +64348,9 @@ OUI:908C63* OUI:908D1D* ID_OUI_FROM_DATABASE=GH Technologies +OUI:908D6C* + ID_OUI_FROM_DATABASE=Apple + OUI:908FCF* ID_OUI_FROM_DATABASE=UNO System Co., Ltd @@ -63826,6 +64423,9 @@ OUI:90B97D* OUI:90C115* ID_OUI_FROM_DATABASE=Sony Ericsson Mobile Communications AB +OUI:90C35F* + ID_OUI_FROM_DATABASE=Nanjing Jiahao Technology Co., Ltd. + OUI:90C792* ID_OUI_FROM_DATABASE=ARRIS Group, Inc. @@ -63877,6 +64477,9 @@ OUI:90E2BA* OUI:90E6BA* ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC. +OUI:90E7C4* + ID_OUI_FROM_DATABASE=HTC Corporation + OUI:90EA60* ID_OUI_FROM_DATABASE=SPI Lasers Ltd @@ -63925,6 +64528,9 @@ OUI:940149* OUI:9401C2* ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd +OUI:94049C* + ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD + OUI:9405B6* ID_OUI_FROM_DATABASE=Liling FullRiver Electronics & Technology Ltd @@ -64084,6 +64690,9 @@ OUI:949F3F* OUI:949FB4* ID_OUI_FROM_DATABASE=ChengDu JiaFaAnTai Technology Co.,Ltd +OUI:94A1A2* + ID_OUI_FROM_DATABASE=AMPAK Technology Inc. + OUI:94A7BC* ID_OUI_FROM_DATABASE=BodyMedia, Inc. @@ -64162,6 +64771,9 @@ OUI:94CE31* OUI:94D019* ID_OUI_FROM_DATABASE=Cydle Corp. +OUI:94D417* + ID_OUI_FROM_DATABASE=GPI KOREA INC. + OUI:94D60E* ID_OUI_FROM_DATABASE=shenzhen yunmao information technologies co., ltd @@ -64201,6 +64813,9 @@ OUI:94E0D0* OUI:94E226* ID_OUI_FROM_DATABASE=D. ORtiz Consulting, LLC +OUI:94E2FD* + ID_OUI_FROM_DATABASE=Boge Kompressoren Otto Boge GmbH & Co. KG + OUI:94E711* ID_OUI_FROM_DATABASE=Xirka Dama Persada PT @@ -64216,6 +64831,9 @@ OUI:94EB2C* OUI:94EBCD* ID_OUI_FROM_DATABASE=Research In Motion Limited +OUI:94F19E* + ID_OUI_FROM_DATABASE=HUIZHOU MAORONG INTELLIGENT TECHNOLOGY CO.,LTD + OUI:94F692* ID_OUI_FROM_DATABASE=Geminico co.,Ltd. @@ -64258,6 +64876,9 @@ OUI:981094* OUI:9816EC* ID_OUI_FROM_DATABASE=IC Intracom +OUI:981DFA* + ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd + OUI:98208E* ID_OUI_FROM_DATABASE=Definium Technologies @@ -64477,6 +65098,9 @@ OUI:98E79A* OUI:98EC65* ID_OUI_FROM_DATABASE=Cosesy ApS +OUI:98EECB* + ID_OUI_FROM_DATABASE=Wistron InfoComm(ZhongShan)Corporation + OUI:98F0AB* ID_OUI_FROM_DATABASE=Apple @@ -64486,6 +65110,9 @@ OUI:98F170* OUI:98F537* ID_OUI_FROM_DATABASE=zte corporation +OUI:98F5A9* + ID_OUI_FROM_DATABASE=OHSUNG ELECTRONICS CO.,LTD. + OUI:98F8C1* ID_OUI_FROM_DATABASE=IDT Technology Limited @@ -64657,9 +65284,15 @@ OUI:9C65F9* OUI:9C6650* ID_OUI_FROM_DATABASE=Glodio Technolies Co.,Ltd Tianjin Branch +OUI:9C685B* + ID_OUI_FROM_DATABASE=Octonion SA + OUI:9C6ABE* ID_OUI_FROM_DATABASE=QEES ApS. +OUI:9C6C15* + ID_OUI_FROM_DATABASE=Microsoft Corporation + OUI:9C7514* ID_OUI_FROM_DATABASE=Wildix srl @@ -64760,7 +65393,7 @@ OUI:9CC077* ID_OUI_FROM_DATABASE=PrintCounts, LLC OUI:9CC0D2* - ID_OUI_FROM_DATABASE=Conductix-Wampfler AG + ID_OUI_FROM_DATABASE=Conductix-Wampfler GmbH OUI:9CC172* ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd @@ -64783,6 +65416,9 @@ OUI:9CD21E* OUI:9CD24B* ID_OUI_FROM_DATABASE=zte corporation +OUI:9CD35B* + ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd + OUI:9CD36D* ID_OUI_FROM_DATABASE=NETGEAR INC., @@ -64801,6 +65437,9 @@ OUI:9CE10E* OUI:9CE1D6* ID_OUI_FROM_DATABASE=Junger Audio-Studiotechnik GmbH +OUI:9CE230* + ID_OUI_FROM_DATABASE=JULONG CO,.LTD. + OUI:9CE635* ID_OUI_FROM_DATABASE=Nintendo Co., Ltd. @@ -64813,6 +65452,9 @@ OUI:9CE7BD* OUI:9CEBE8* ID_OUI_FROM_DATABASE=BizLink (Kunshan) Co.,Ltd +OUI:9CF387* + ID_OUI_FROM_DATABASE=Apple + OUI:9CF61A* ID_OUI_FROM_DATABASE=UTC Fire and Security @@ -65065,6 +65707,9 @@ OUI:A0A8CD* OUI:A0AAFD* ID_OUI_FROM_DATABASE=EraThink Technologies Corp. +OUI:A0ADA1* + ID_OUI_FROM_DATABASE=JMR Electronics, Inc + OUI:A0B100* ID_OUI_FROM_DATABASE=ShenZhen Cando Electronics Co.,Ltd @@ -65086,15 +65731,24 @@ OUI:A0B9ED* OUI:A0BAB8* ID_OUI_FROM_DATABASE=Pixon Imaging +OUI:A0BB3E* + ID_OUI_FROM_DATABASE=IEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information. + OUI:A0BF50* ID_OUI_FROM_DATABASE=S.C. ADD-PRODUCTION S.R.L. OUI:A0BFA5* ID_OUI_FROM_DATABASE=CORESYS +OUI:A0C2DE* + ID_OUI_FROM_DATABASE=Costar Video Systems + OUI:A0C3DE* ID_OUI_FROM_DATABASE=Triton Electronic Systems Ltd. +OUI:A0C562* + ID_OUI_FROM_DATABASE=Pace plc + OUI:A0C6EC* ID_OUI_FROM_DATABASE=ShenZhen ANYK Technology Co.,LTD @@ -65137,6 +65791,9 @@ OUI:A0E295* OUI:A0E453* ID_OUI_FROM_DATABASE=Sony Mobile Communications AB +OUI:A0E4CB* + ID_OUI_FROM_DATABASE=ZyXEL Communications Corporation + OUI:A0E534* ID_OUI_FROM_DATABASE=Stratec Biomedical AG @@ -65155,6 +65812,9 @@ OUI:A0EB76* OUI:A0EC80* ID_OUI_FROM_DATABASE=zte corporation +OUI:A0ECF9* + ID_OUI_FROM_DATABASE=Cisco + OUI:A0EDCD* ID_OUI_FROM_DATABASE=Apple @@ -65239,6 +65899,9 @@ OUI:A42940* OUI:A429B7* ID_OUI_FROM_DATABASE=bluesky +OUI:A42B8C* + ID_OUI_FROM_DATABASE=Netgear Inc + OUI:A42C08* ID_OUI_FROM_DATABASE=Masterwork Automodules @@ -65278,6 +65941,9 @@ OUI:A44E2D* OUI:A44E31* ID_OUI_FROM_DATABASE=Intel Corporate +OUI:A44F29* + ID_OUI_FROM_DATABASE=IEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information. + OUI:A45055* ID_OUI_FROM_DATABASE=busware.de @@ -65302,6 +65968,9 @@ OUI:A45D36* OUI:A45DA1* ID_OUI_FROM_DATABASE=ADB Broadband Italia +OUI:A45E60* + ID_OUI_FROM_DATABASE=Apple + OUI:A46032* ID_OUI_FROM_DATABASE=MRV Communications (Networks) LTD @@ -65350,6 +66019,9 @@ OUI:A4856B* OUI:A4895B* ID_OUI_FROM_DATABASE=ARK INFOSOLUTIONS PVT LTD +OUI:A48CDB* + ID_OUI_FROM_DATABASE=Lenovo + OUI:A49005* ID_OUI_FROM_DATABASE=CHINA GREATWALL COMPUTER SHENZHEN CO.,LTD @@ -65449,6 +66121,9 @@ OUI:A4C2AB* OUI:A4C361* ID_OUI_FROM_DATABASE=Apple +OUI:A4C494* + ID_OUI_FROM_DATABASE=Intel Corporate + OUI:A4C7DE* ID_OUI_FROM_DATABASE=Cambridge Industries(Group) Co.,Ltd. @@ -65611,6 +66286,9 @@ OUI:A8556A* OUI:A8574E* ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD. +OUI:A85B78* + ID_OUI_FROM_DATABASE=Apple + OUI:A85BB0* ID_OUI_FROM_DATABASE=Shenzhen Dehoo Technology Co.,Ltd @@ -65683,6 +66361,9 @@ OUI:A88D7B* OUI:A88E24* ID_OUI_FROM_DATABASE=Apple +OUI:A89008* + ID_OUI_FROM_DATABASE=Beijing Yuecheng Technology Co. Ltd. + OUI:A8922C* ID_OUI_FROM_DATABASE=LG Electronics @@ -65707,9 +66388,15 @@ OUI:A8995C* OUI:A89B10* ID_OUI_FROM_DATABASE=inMotion Ltd. +OUI:A89D21* + ID_OUI_FROM_DATABASE=Cisco + OUI:A89DD2* ID_OUI_FROM_DATABASE=Shanghai DareGlobal Technologies Co., Ltd +OUI:A89FBA* + ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd + OUI:A8A668* ID_OUI_FROM_DATABASE=zte corporation @@ -65773,6 +66460,9 @@ OUI:A8E539* OUI:A8EF26* ID_OUI_FROM_DATABASE=Tritonwave +OUI:A8F038* + ID_OUI_FROM_DATABASE=SHEN ZHEN SHI JIN HUA TAI ELECTRONICS CO.,LTD + OUI:A8F274* ID_OUI_FROM_DATABASE=Samsung Electronics @@ -66022,6 +66712,9 @@ OUI:AC9B84* OUI:AC9CE4* ID_OUI_FROM_DATABASE=Alcatel-Lucent Shanghai Bell Co., Ltd +OUI:AC9E17* + ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC. + OUI:ACA016* ID_OUI_FROM_DATABASE=CISCO SYSTEMS, INC. @@ -66046,9 +66739,15 @@ OUI:ACA9A0* OUI:ACAB8D* ID_OUI_FROM_DATABASE=Lyngso Marine A/S +OUI:ACABBF* + ID_OUI_FROM_DATABASE=AthenTek Inc. + OUI:ACB313* ID_OUI_FROM_DATABASE=ARRIS Group, Inc. +OUI:ACB57D* + ID_OUI_FROM_DATABASE=Liteon Technology Corporation + OUI:ACB74F* ID_OUI_FROM_DATABASE=METEL s.r.o. @@ -66073,6 +66772,9 @@ OUI:ACC595* OUI:ACC698* ID_OUI_FROM_DATABASE=Kohzu Precision Co., Ltd. +OUI:ACC73F* + ID_OUI_FROM_DATABASE=VITSMO CO., LTD. + OUI:ACC935* ID_OUI_FROM_DATABASE=Ness Corporation @@ -66082,6 +66784,9 @@ OUI:ACCA54* OUI:ACCA8E* ID_OUI_FROM_DATABASE=ODA Technologies +OUI:ACCAAB* + ID_OUI_FROM_DATABASE=Virtual Electric Inc + OUI:ACCABA* ID_OUI_FROM_DATABASE=Midokura Co., Ltd. @@ -66100,9 +66805,15 @@ OUI:ACCF23* OUI:ACCF5C* ID_OUI_FROM_DATABASE=Apple +OUI:ACD074* + ID_OUI_FROM_DATABASE=Espressif Inc. + OUI:ACD180* ID_OUI_FROM_DATABASE=Crexendo Business Solutions, Inc. +OUI:ACD1B8* + ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd. + OUI:ACD364* ID_OUI_FROM_DATABASE=ABB SPA, ABB SACE DIV. @@ -66235,6 +66946,9 @@ OUI:B046FC* OUI:B0487A* ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO., LTD. +OUI:B0495F* + ID_OUI_FROM_DATABASE=OMRON HEALTHCARE Co., Ltd. + OUI:B04C05* ID_OUI_FROM_DATABASE=Fresenius Medical Care Deutschland GmbH @@ -66400,6 +67114,9 @@ OUI:B0C4E7* OUI:B0C554* ID_OUI_FROM_DATABASE=D-Link International +OUI:B0C559* + ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd + OUI:B0C69A* ID_OUI_FROM_DATABASE=Juniper Networks @@ -66439,6 +67156,12 @@ OUI:B0DA00* OUI:B0DF3A* ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd +OUI:B0E03C* + ID_OUI_FROM_DATABASE=TCT mobile ltd + +OUI:B0E2E5* + ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Tech.Co.,Ltd. + OUI:B0E39D* ID_OUI_FROM_DATABASE=CAT SYSTEM CO.,LTD. @@ -66478,6 +67201,9 @@ OUI:B40142* OUI:B40418* ID_OUI_FROM_DATABASE=Smartchip Integrated Inc. +OUI:B40566* + ID_OUI_FROM_DATABASE=SP Best Corporation Co., LTD. + OUI:B407F9* ID_OUI_FROM_DATABASE=SAMSUNG ELECTRO-MECHANICS @@ -66538,6 +67264,9 @@ OUI:B42C92* OUI:B42CBE* ID_OUI_FROM_DATABASE=Direct Payment Solutions Limited +OUI:B43052* + ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd + OUI:B431B8* ID_OUI_FROM_DATABASE=Aviwest @@ -66619,6 +67348,9 @@ OUI:B46698* OUI:B467E9* ID_OUI_FROM_DATABASE=Qingdao GoerTek Technology Co., Ltd. +OUI:B47356* + ID_OUI_FROM_DATABASE=Hangzhou Treebear Networking Co., Ltd. + OUI:B4749F* ID_OUI_FROM_DATABASE=askey computer corp @@ -66691,6 +67423,9 @@ OUI:B4A82B* OUI:B4A95A* ID_OUI_FROM_DATABASE=Avaya, Inc +OUI:B4A9FE* + ID_OUI_FROM_DATABASE=GHIA Technology (Shenzhen) LTD + OUI:B4AA4D* ID_OUI_FROM_DATABASE=Ensequence, Inc. @@ -66698,7 +67433,7 @@ OUI:B4AB2C* ID_OUI_FROM_DATABASE=MtM Technology Corporation OUI:B4AE6F* - ID_OUI_FROM_DATABASE=Circle Reliance, Inc. + ID_OUI_FROM_DATABASE=Circle Reliance, Inc DBA Cranberry Networks OUI:B4B017* ID_OUI_FROM_DATABASE=Avaya, Inc @@ -66728,7 +67463,7 @@ OUI:B4C44E* ID_OUI_FROM_DATABASE=VXL eTech Pvt Ltd OUI:B4C799* - ID_OUI_FROM_DATABASE=Motorola Solutions Inc. + ID_OUI_FROM_DATABASE=Zebra Technologies Inc OUI:B4C810* ID_OUI_FROM_DATABASE=UMPI Elettronica @@ -66775,6 +67510,9 @@ OUI:B4EEB4* OUI:B4EED4* ID_OUI_FROM_DATABASE=Texas Instruments +OUI:B4EF39* + ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd + OUI:B4F0AB* ID_OUI_FROM_DATABASE=Apple @@ -66799,6 +67537,9 @@ OUI:B80415* OUI:B808CF* ID_OUI_FROM_DATABASE=Intel Corporate +OUI:B8098A* + ID_OUI_FROM_DATABASE=Apple + OUI:B80B9D* ID_OUI_FROM_DATABASE=ROPEX Industrie-Elektronik GmbH @@ -66886,9 +67627,15 @@ OUI:B84FD5* OUI:B85510* ID_OUI_FROM_DATABASE=Zioncom Electronics (Shenzhen) Ltd. +OUI:B856BD* + ID_OUI_FROM_DATABASE=ITT LLC + OUI:B85810* ID_OUI_FROM_DATABASE=NUMERA, INC. +OUI:B85A73* + ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd + OUI:B85AF7* ID_OUI_FROM_DATABASE=Ouya, Inc @@ -66973,6 +67720,9 @@ OUI:B88D12* OUI:B88E3A* ID_OUI_FROM_DATABASE=Infinite Technologies JLT +OUI:B88EC6* + ID_OUI_FROM_DATABASE=Stateless Networks + OUI:B88F14* ID_OUI_FROM_DATABASE=Analytica GmbH @@ -67132,6 +67882,9 @@ OUI:B8EE65* OUI:B8EE79* ID_OUI_FROM_DATABASE=YWire Technologies, Inc. +OUI:B8F080* + ID_OUI_FROM_DATABASE=SPS, INC. + OUI:B8F317* ID_OUI_FROM_DATABASE=iSun Smasher Communications Private Limited @@ -67183,6 +67936,9 @@ OUI:BC125E* OUI:BC1401* ID_OUI_FROM_DATABASE=Hitron Technologies. Inc +OUI:BC1485* + ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd + OUI:BC14EF* ID_OUI_FROM_DATABASE=ITON Technology Limited @@ -67267,6 +68023,9 @@ OUI:BC4760* OUI:BC4B79* ID_OUI_FROM_DATABASE=SensingTek +OUI:BC4CC4* + ID_OUI_FROM_DATABASE=Apple + OUI:BC4DFB* ID_OUI_FROM_DATABASE=Hitron Technologies. Inc @@ -67285,9 +68044,15 @@ OUI:BC52B4* OUI:BC52B7* ID_OUI_FROM_DATABASE=Apple +OUI:BC54F9* + ID_OUI_FROM_DATABASE=Drogoo Technology Co., Ltd. + OUI:BC5FF4* ID_OUI_FROM_DATABASE=ASRock Incorporation +OUI:BC6010* + ID_OUI_FROM_DATABASE=Qingdao Hisense Communications Co.,Ltd + OUI:BC629F* ID_OUI_FROM_DATABASE=Telenet Systems P. Ltd. @@ -67312,6 +68077,9 @@ OUI:BC6A29* OUI:BC6B4D* ID_OUI_FROM_DATABASE=Alcatel-Lucent +OUI:BC6E64* + ID_OUI_FROM_DATABASE=Sony Mobile Communications AB + OUI:BC6E76* ID_OUI_FROM_DATABASE=Green Energy Options Ltd @@ -67402,6 +68170,9 @@ OUI:BCB181* OUI:BCB1F3* ID_OUI_FROM_DATABASE=Samsung Electronics +OUI:BCB308* + ID_OUI_FROM_DATABASE=HONGKONG RAGENTEK COMMUNICATION TECHNOLOGY CO.,LIMITED + OUI:BCB852* ID_OUI_FROM_DATABASE=Cybera, Inc. @@ -67441,6 +68212,9 @@ OUI:BCCD45* OUI:BCCFCC* ID_OUI_FROM_DATABASE=HTC Corporation +OUI:BCD165* + ID_OUI_FROM_DATABASE=Cisco SPVTG + OUI:BCD177* ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO.,LTD. @@ -67459,12 +68233,18 @@ OUI:BCE09D* OUI:BCE59F* ID_OUI_FROM_DATABASE=WATERWORLD Technology Co.,LTD +OUI:BCE767* + ID_OUI_FROM_DATABASE=Quanzhou TDX Electronics Co., Ltd + OUI:BCEA2B* ID_OUI_FROM_DATABASE=CityCom GmbH OUI:BCEAFA* ID_OUI_FROM_DATABASE=Hewlett Packard +OUI:BCEC23* + ID_OUI_FROM_DATABASE=SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LTD + OUI:BCEE7B* ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC. @@ -67501,6 +68281,9 @@ OUI:C0143D* OUI:C01885* ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd. +OUI:C01ADA* + ID_OUI_FROM_DATABASE=Apple + OUI:C01E9B* ID_OUI_FROM_DATABASE=Pixavi AS @@ -67525,6 +68308,9 @@ OUI:C02BFC* OUI:C02C7A* ID_OUI_FROM_DATABASE=Shen Zhen Horn audio Co., Ltd. +OUI:C0335E* + ID_OUI_FROM_DATABASE=Microsoft + OUI:C034B4* ID_OUI_FROM_DATABASE=Gigastone Corporation @@ -67579,6 +68365,9 @@ OUI:C04A00* OUI:C04DF7* ID_OUI_FROM_DATABASE=SERELEC +OUI:C05627* + ID_OUI_FROM_DATABASE=Belkin International, Inc. + OUI:C056E3* ID_OUI_FROM_DATABASE=Hangzhou Hikvision Digital Technology Co.,Ltd. @@ -67618,6 +68407,9 @@ OUI:C06C0F* OUI:C06C6D* ID_OUI_FROM_DATABASE=MagneMotion, Inc. +OUI:C07009* + ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd + OUI:C07BBC* ID_OUI_FROM_DATABASE=Cisco @@ -67708,6 +68500,9 @@ OUI:C0BAE6* OUI:C0BD42* ID_OUI_FROM_DATABASE=ZPA Smart Energy a.s. +OUI:C0BDD1* + ID_OUI_FROM_DATABASE=Samsung Electro Mechanics co., LTD. + OUI:C0C1C0* ID_OUI_FROM_DATABASE=Cisco-Linksys, LLC @@ -67771,6 +68566,9 @@ OUI:C0F8DA* OUI:C0F991* ID_OUI_FROM_DATABASE=GME Standard Communications P/L +OUI:C0FFD4* + ID_OUI_FROM_DATABASE=Netgear Inc + OUI:C40006* ID_OUI_FROM_DATABASE=Lipi Data Systems Ltd. @@ -67855,6 +68653,9 @@ OUI:C42C03* OUI:C4346B* ID_OUI_FROM_DATABASE=Hewlett Packard +OUI:C4366C* + ID_OUI_FROM_DATABASE=LG Innotek + OUI:C436DA* ID_OUI_FROM_DATABASE=Rusteletech Ltd. @@ -67867,6 +68668,9 @@ OUI:C4393A* OUI:C43A9F* ID_OUI_FROM_DATABASE=Siconix Inc. +OUI:C43ABE* + ID_OUI_FROM_DATABASE=Sony Mobile Communications AB + OUI:C43C3C* ID_OUI_FROM_DATABASE=CYBELEC SA @@ -67985,7 +68789,7 @@ OUI:C47D4F* ID_OUI_FROM_DATABASE=CISCO SYSTEMS, INC. OUI:C47DCC* - ID_OUI_FROM_DATABASE=Motorola Solutions Inc. + ID_OUI_FROM_DATABASE=Zebra Technologies Inc OUI:C47DFE* ID_OUI_FROM_DATABASE=A.N. Solutions GmbH @@ -68005,9 +68809,15 @@ OUI:C48508* OUI:C488E5* ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd +OUI:C48E8F* + ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd. + OUI:C4913A* ID_OUI_FROM_DATABASE=Shenzhen Sanland Electronic Co., ltd. +OUI:C4924C* + ID_OUI_FROM_DATABASE=KEISOKUKI CENTER CO.,LTD. + OUI:C49300* ID_OUI_FROM_DATABASE=8Devices @@ -68125,6 +68935,9 @@ OUI:C802A6* OUI:C80718* ID_OUI_FROM_DATABASE=TDSi +OUI:C808E9* + ID_OUI_FROM_DATABASE=LG Electronics + OUI:C80AA9* ID_OUI_FROM_DATABASE=Quanta Computer Inc. @@ -68311,6 +69124,9 @@ OUI:C8A70A* OUI:C8A729* ID_OUI_FROM_DATABASE=SYStronics Co., Ltd. +OUI:C8A823* + ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd + OUI:C8AA21* ID_OUI_FROM_DATABASE=ARRIS Group, Inc. @@ -68383,6 +69199,9 @@ OUI:C8D5FE* OUI:C8D719* ID_OUI_FROM_DATABASE=Cisco Consumer Products, LLC +OUI:C8D779* + ID_OUI_FROM_DATABASE=Qingdao Haier Telecom Co.,Ltd + OUI:C8DDC9* ID_OUI_FROM_DATABASE=Lenovo Mobile Communication Technology Ltd. @@ -68890,6 +69709,9 @@ OUI:D05162* OUI:D052A8* ID_OUI_FROM_DATABASE=Physical Graph Corporation +OUI:D05349* + ID_OUI_FROM_DATABASE=Liteon Technology Co., Ltd. + OUI:D0542D* ID_OUI_FROM_DATABASE=Cambridge Industries(Group) Co.,Ltd. @@ -68995,6 +69817,9 @@ OUI:D08CB5* OUI:D08CFF* ID_OUI_FROM_DATABASE=UPWIS AB +OUI:D0929E* + ID_OUI_FROM_DATABASE=Microsoft Corporation + OUI:D093F8* ID_OUI_FROM_DATABASE=Stonestreet One LLC @@ -69016,6 +69841,12 @@ OUI:D0A0D6* OUI:D0A311* ID_OUI_FROM_DATABASE=Neuberger Gebäudeautomation GmbH +OUI:D0A5A6* + ID_OUI_FROM_DATABASE=Cisco + +OUI:D0A637* + ID_OUI_FROM_DATABASE=Apple + OUI:D0AEEC* ID_OUI_FROM_DATABASE=Alpha Networks Inc. @@ -69043,6 +69874,9 @@ OUI:D0BD01* OUI:D0BE2C* ID_OUI_FROM_DATABASE=CNSLink Co., Ltd. +OUI:D0BF9C* + ID_OUI_FROM_DATABASE=Hewlett Packard + OUI:D0C1B1* ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd @@ -69148,6 +69982,12 @@ OUI:D4016D* OUI:D4024A* ID_OUI_FROM_DATABASE=Delphian Systems LLC +OUI:D40598* + ID_OUI_FROM_DATABASE=ARRIS Group, Inc. + +OUI:D40B1A* + ID_OUI_FROM_DATABASE=HTC Corporation + OUI:D40BB9* ID_OUI_FROM_DATABASE=Solid Semecs bv. @@ -69179,7 +70019,7 @@ OUI:D41E35* ID_OUI_FROM_DATABASE=TOHO Electronics INC. OUI:D41F0C* - ID_OUI_FROM_DATABASE=TVI Vision Oy + ID_OUI_FROM_DATABASE=JAI Oy OUI:D4206D* ID_OUI_FROM_DATABASE=HTC Corporation @@ -69259,6 +70099,9 @@ OUI:D45297* OUI:D453AF* ID_OUI_FROM_DATABASE=VIGO System S.A. +OUI:D45556* + ID_OUI_FROM_DATABASE=Fiber Mountain Inc. + OUI:D45AB2* ID_OUI_FROM_DATABASE=Galleon Systems @@ -69283,6 +70126,9 @@ OUI:D46761* OUI:D467E7* ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Tech.Co.,Ltd. +OUI:D4684D* + ID_OUI_FROM_DATABASE=Ruckus Wireless + OUI:D46867* ID_OUI_FROM_DATABASE=Neoventus Design Group @@ -69298,6 +70144,9 @@ OUI:D46CBF* OUI:D46CDA* ID_OUI_FROM_DATABASE=CSM GmbH +OUI:D46D50* + ID_OUI_FROM_DATABASE=Cisco + OUI:D46E5C* ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd @@ -69613,6 +70462,9 @@ OUI:D850E6* OUI:D8543A* ID_OUI_FROM_DATABASE=Texas Instruments +OUI:D855A3* + ID_OUI_FROM_DATABASE=zte corporation + OUI:D857EF* ID_OUI_FROM_DATABASE=Samsung Electronics @@ -69625,6 +70477,9 @@ OUI:D85D4C* OUI:D85D84* ID_OUI_FROM_DATABASE=CAx soft GmbH +OUI:D85DE2* + ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd. + OUI:D86194* ID_OUI_FROM_DATABASE=Objetivos y Sevicios de Valor Añadido @@ -69655,6 +70510,9 @@ OUI:D86CE9* OUI:D87157* ID_OUI_FROM_DATABASE=Lenovo Mobile Communication Technology Ltd. +OUI:D87495* + ID_OUI_FROM_DATABASE=zte corporation + OUI:D87533* ID_OUI_FROM_DATABASE=Nokia Corporation @@ -69685,9 +70543,15 @@ OUI:D88466* OUI:D88A3B* ID_OUI_FROM_DATABASE=UNIT-EM +OUI:D88D5C* + ID_OUI_FROM_DATABASE=Elentec + OUI:D890E8* ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd +OUI:D89341* + ID_OUI_FROM_DATABASE=General Electric Global Research + OUI:D8952F* ID_OUI_FROM_DATABASE=Texas Instruments @@ -69880,6 +70744,9 @@ OUI:DC05ED* OUI:DC07C1* ID_OUI_FROM_DATABASE=HangZhou QiYang Technology Co.,Ltd. +OUI:DC0914* + ID_OUI_FROM_DATABASE=Talk-A-Phone Co. + OUI:DC0B1A* ID_OUI_FROM_DATABASE=ADB Broadband Italia @@ -69976,6 +70843,9 @@ OUI:DC5726* OUI:DC5E36* ID_OUI_FROM_DATABASE=Paterson Technology +OUI:DC60A1* + ID_OUI_FROM_DATABASE=Teledyne DALSA Professional Imaging + OUI:DC647C* ID_OUI_FROM_DATABASE=C.R.S. iiMotion GmbH @@ -70099,6 +70969,12 @@ OUI:DCDA4F* OUI:DCDECA* ID_OUI_FROM_DATABASE=Akyllor +OUI:DCE026* + ID_OUI_FROM_DATABASE=Patrol Tag, Inc + +OUI:DCE1AD* + ID_OUI_FROM_DATABASE=Shenzhen Wintop Photoelectric Technology Co., Ltd + OUI:DCE2AC* ID_OUI_FROM_DATABASE=Lumens Digital Optics Inc. @@ -70150,6 +71026,9 @@ OUI:E0143E* OUI:E01877* ID_OUI_FROM_DATABASE=Fujitsu Limited +OUI:E0191D* + ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd + OUI:E01C41* ID_OUI_FROM_DATABASE=Aerohive Networks Inc. @@ -70282,9 +71161,15 @@ OUI:E087B1* OUI:E0885D* ID_OUI_FROM_DATABASE=Technicolor CH USA Inc +OUI:E0899D* + ID_OUI_FROM_DATABASE=Cisco + OUI:E08A7E* ID_OUI_FROM_DATABASE=Exponent +OUI:E08E3C* + ID_OUI_FROM_DATABASE=Aztech Electronics Pte Ltd + OUI:E08FEC* ID_OUI_FROM_DATABASE=REPOTEC CO., LTD. @@ -70306,6 +71191,9 @@ OUI:E09796* OUI:E097F2* ID_OUI_FROM_DATABASE=Atomax Inc. +OUI:E09971* + ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd + OUI:E09D31* ID_OUI_FROM_DATABASE=Intel Corporate @@ -70408,6 +71296,9 @@ OUI:E0CF2D* OUI:E0D10A* ID_OUI_FROM_DATABASE=Katoudenkikougyousyo co ltd +OUI:E0D173* + ID_OUI_FROM_DATABASE=Cisco + OUI:E0D1E6* ID_OUI_FROM_DATABASE=Aliph dba Jawbone @@ -70474,6 +71365,9 @@ OUI:E0F9BE* OUI:E0FAEC* ID_OUI_FROM_DATABASE=Platan sp. z o.o. sp. k. +OUI:E0FFF7* + ID_OUI_FROM_DATABASE=Softiron Inc. + OUI:E40439* ID_OUI_FROM_DATABASE=TomTom Software Ltd @@ -70576,6 +71470,9 @@ OUI:E45614* OUI:E457A8* ID_OUI_FROM_DATABASE=Stuart Manufacturing, Inc. +OUI:E458E7* + ID_OUI_FROM_DATABASE=Samsung Electronics Co.,Ltd + OUI:E45D52* ID_OUI_FROM_DATABASE=Avaya, Inc @@ -70588,6 +71485,9 @@ OUI:E467BA* OUI:E468A3* ID_OUI_FROM_DATABASE=HUAWEI TECHNOLOGIES CO.,LTD +OUI:E4695A* + ID_OUI_FROM_DATABASE=Dictum Health, Inc. + OUI:E46C21* ID_OUI_FROM_DATABASE=messMa GmbH @@ -70624,6 +71524,9 @@ OUI:E481B3* OUI:E48399* ID_OUI_FROM_DATABASE=ARRIS Group, Inc. +OUI:E48501* + ID_OUI_FROM_DATABASE=Geberit International AG + OUI:E48AD5* ID_OUI_FROM_DATABASE=RF WINDOW CO., LTD. @@ -70738,9 +71641,15 @@ OUI:E4F7A1* OUI:E4F8EF* ID_OUI_FROM_DATABASE=Samsung Elec Co.,Ltd +OUI:E4F939* + ID_OUI_FROM_DATABASE=Minxon Hotel Technology INC. + OUI:E4FA1D* ID_OUI_FROM_DATABASE=PAD Peripheral Advanced Design Inc. +OUI:E4FED9* + ID_OUI_FROM_DATABASE=EDMI Europe Ltd + OUI:E4FFDD* ID_OUI_FROM_DATABASE=ELECTRON INDIA @@ -70786,6 +71695,9 @@ OUI:E81324* OUI:E8150E* ID_OUI_FROM_DATABASE=Nokia Corporation +OUI:E8162B* + ID_OUI_FROM_DATABASE=IDEO Security Co., Ltd. + OUI:E817FC* ID_OUI_FROM_DATABASE=NIFTY Corporation @@ -70834,6 +71746,9 @@ OUI:E840F2* OUI:E843B6* ID_OUI_FROM_DATABASE=QNAP Systems, Inc. +OUI:E8447E* + ID_OUI_FROM_DATABASE=Bitdefender SRL + OUI:E8481F* ID_OUI_FROM_DATABASE=Advanced Automotive Antennas @@ -70897,6 +71812,9 @@ OUI:E86D6E* OUI:E8718D* ID_OUI_FROM_DATABASE=Elsys Equipamentos Eletronicos Ltda +OUI:E874E6* + ID_OUI_FROM_DATABASE=ADB BROADBAND ITALIA + OUI:E8757F* ID_OUI_FROM_DATABASE=FIRS Technologies(Shenzhen) Co., Ltd @@ -70993,6 +71911,9 @@ OUI:E8C229* OUI:E8C320* ID_OUI_FROM_DATABASE=Austco Communication Systems Pty Ltd +OUI:E8C74F* + ID_OUI_FROM_DATABASE=Liteon Technology Corporation + OUI:E8CBA1* ID_OUI_FROM_DATABASE=Nokia Corporation @@ -71149,6 +72070,9 @@ OUI:EC3BF0* OUI:EC3C5A* ID_OUI_FROM_DATABASE=SHEN ZHEN HENG SHENG HUI DIGITAL TECHNOLOGY CO.,LTD +OUI:EC3C88* + ID_OUI_FROM_DATABASE=MCNEX Co.,Ltd. + OUI:EC3E09* ID_OUI_FROM_DATABASE=PERFORMANCE DESIGNED PRODUCTS, LLC @@ -71209,6 +72133,9 @@ OUI:EC6C9F* OUI:EC71DB* ID_OUI_FROM_DATABASE=Shenzhen Baichuan Digital Technology Co., Ltd. +OUI:EC74BA* + ID_OUI_FROM_DATABASE=Hirschmann Automation and Control GmbH + OUI:EC7C74* ID_OUI_FROM_DATABASE=Justone Technologies Co., Ltd. @@ -71227,6 +72154,9 @@ OUI:EC852F* OUI:EC888F* ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO., LTD. +OUI:EC8892* + ID_OUI_FROM_DATABASE=Motorola Mobility LLC + OUI:EC89F5* ID_OUI_FROM_DATABASE=Lenovo Mobile Communication Technology Ltd. @@ -71269,12 +72199,18 @@ OUI:ECA86B* OUI:ECB106* ID_OUI_FROM_DATABASE=Acuro Networks, Inc +OUI:ECB1D7* + ID_OUI_FROM_DATABASE=Hewlett Packard + OUI:ECB541* ID_OUI_FROM_DATABASE=SHINANO E and E Co.Ltd. OUI:ECB907* ID_OUI_FROM_DATABASE=CloudGenix Inc +OUI:ECBAFE* + ID_OUI_FROM_DATABASE=GIROPTIC + OUI:ECBBAE* ID_OUI_FROM_DATABASE=Digivoice Tecnologia em Eletronica Ltda @@ -71320,6 +72256,9 @@ OUI:ECE09B* OUI:ECE1A9* ID_OUI_FROM_DATABASE=Cisco +OUI:ECE2FD* + ID_OUI_FROM_DATABASE=SKG Electric Group(Thailand) Co., Ltd. + OUI:ECE512* ID_OUI_FROM_DATABASE=tado GmbH @@ -71392,6 +72331,9 @@ OUI:F01C13* OUI:F01C2D* ID_OUI_FROM_DATABASE=Juniper Networks +OUI:F01E34* + ID_OUI_FROM_DATABASE=ORICO Technologies Co., Ltd + OUI:F01FAF* ID_OUI_FROM_DATABASE=Dell Inc @@ -71407,6 +72349,9 @@ OUI:F02405* OUI:F02408* ID_OUI_FROM_DATABASE=Talaris (Sweden) AB +OUI:F02475* + ID_OUI_FROM_DATABASE=Apple + OUI:F02572* ID_OUI_FROM_DATABASE=CISCO SYSTEMS, INC. @@ -71422,6 +72367,9 @@ OUI:F02765* OUI:F02929* ID_OUI_FROM_DATABASE=Cisco +OUI:F02A23* + ID_OUI_FROM_DATABASE=Creative Next Design + OUI:F02A61* ID_OUI_FROM_DATABASE=Waldo Networks, Inc. @@ -71509,6 +72457,9 @@ OUI:F07765* OUI:F077D0* ID_OUI_FROM_DATABASE=Xcellen +OUI:F07959* + ID_OUI_FROM_DATABASE=ASUSTek COMPUTER INC. + OUI:F07BCB* ID_OUI_FROM_DATABASE=Hon Hai Precision Ind. Co.,Ltd. @@ -71554,6 +72505,9 @@ OUI:F0933A* OUI:F093C5* ID_OUI_FROM_DATABASE=Garland Technology +OUI:F099BF* + ID_OUI_FROM_DATABASE=Apple + OUI:F09CBB* ID_OUI_FROM_DATABASE=RaonThink Inc. @@ -71575,6 +72529,9 @@ OUI:F0AD4E* OUI:F0AE51* ID_OUI_FROM_DATABASE=Xi3 Corp +OUI:F0B052* + ID_OUI_FROM_DATABASE=Ruckus Wireless + OUI:F0B479* ID_OUI_FROM_DATABASE=Apple @@ -71626,6 +72583,9 @@ OUI:F0DA7C* OUI:F0DB30* ID_OUI_FROM_DATABASE=Yottabyte +OUI:F0DBE2* + ID_OUI_FROM_DATABASE=Apple + OUI:F0DBF8* ID_OUI_FROM_DATABASE=Apple @@ -71701,6 +72661,9 @@ OUI:F0FE6B* OUI:F40321* ID_OUI_FROM_DATABASE=BeNeXt B.V. +OUI:F4032F* + ID_OUI_FROM_DATABASE=Reduxio Systems + OUI:F4044C* ID_OUI_FROM_DATABASE=ValenceTech Limited @@ -71755,6 +72718,12 @@ OUI:F42853* OUI:F42896* ID_OUI_FROM_DATABASE=SPECTO PAINEIS ELETRONICOS LTDA +OUI:F42981* + ID_OUI_FROM_DATABASE=vivo Mobile Communication Co., Ltd. + +OUI:F42C56* + ID_OUI_FROM_DATABASE=SENOR TECH CO LTD + OUI:F436E1* ID_OUI_FROM_DATABASE=Abilis Systems SARL @@ -71830,6 +72799,9 @@ OUI:F4600D* OUI:F46349* ID_OUI_FROM_DATABASE=Diffon Corporation +OUI:F4645D* + ID_OUI_FROM_DATABASE=Toshiba + OUI:F46ABC* ID_OUI_FROM_DATABASE=Adonit Corp. Ltd. @@ -72013,9 +72985,15 @@ OUI:F4FD2B* OUI:F80113* ID_OUI_FROM_DATABASE=Huawei Technologies Co., Ltd +OUI:F80278* + ID_OUI_FROM_DATABASE=IEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information. + OUI:F80332* ID_OUI_FROM_DATABASE=Khomp +OUI:F8042E* + ID_OUI_FROM_DATABASE=Samsung Electro Mechanics co., LTD. + OUI:F8051C* ID_OUI_FROM_DATABASE=DRS Imaging and Targeting Solutions @@ -72049,6 +73027,9 @@ OUI:F81547* OUI:F81654* ID_OUI_FROM_DATABASE=Intel Corporate +OUI:F81897* + ID_OUI_FROM_DATABASE=2Wire + OUI:F81A67* ID_OUI_FROM_DATABASE=TP-LINK TECHNOLOGIES CO., LTD. @@ -72187,6 +73168,9 @@ OUI:F87394* OUI:F8769B* ID_OUI_FROM_DATABASE=Neopis Co., Ltd. +OUI:F87AEF* + ID_OUI_FROM_DATABASE=Rosonix Technology, Inc. + OUI:F87B62* ID_OUI_FROM_DATABASE=FASTWEL INTERNATIONAL CO., LTD. Taiwan Branch @@ -72286,9 +73270,15 @@ OUI:F8C091* OUI:F8C288* ID_OUI_FROM_DATABASE=Cisco +OUI:F8C397* + ID_OUI_FROM_DATABASE=NZXT Corp. Ltd. + OUI:F8C678* ID_OUI_FROM_DATABASE=Carefusion +OUI:F8C96C* + ID_OUI_FROM_DATABASE=Fiberhome Telecommunication Tech.Co.,Ltd. + OUI:F8D0AC* ID_OUI_FROM_DATABASE=Sony Computer Entertainment Inc. @@ -72416,7 +73406,7 @@ OUI:FC09F6* ID_OUI_FROM_DATABASE=GUANGDONG TONZE ELECTRIC CO.,LTD OUI:FC0A81* - ID_OUI_FROM_DATABASE=Motorola Solutions Inc. + ID_OUI_FROM_DATABASE=Zebra Technologies Inc OUI:FC0FE6* ID_OUI_FROM_DATABASE=Sony Computer Entertainment Inc. @@ -72484,12 +73474,18 @@ OUI:FC2E2D* OUI:FC2F40* ID_OUI_FROM_DATABASE=Calxeda, Inc. +OUI:FC3288* + ID_OUI_FROM_DATABASE=CELOT Wireless Co., Ltd + OUI:FC3598* ID_OUI_FROM_DATABASE=Favite Inc. OUI:FC35E6* ID_OUI_FROM_DATABASE=Visteon corp +OUI:FC3D93* + ID_OUI_FROM_DATABASE=LONGCHEER TELECOMMUNICATION LIMITED + OUI:FC3FAB* ID_OUI_FROM_DATABASE=Henan Lanxin Technology Co., Ltd @@ -72619,9 +73615,18 @@ OUI:FCAD0F* OUI:FCAF6A* ID_OUI_FROM_DATABASE=Conemtech AB +OUI:FCAFAC* + ID_OUI_FROM_DATABASE=Panasonic System LSI + OUI:FCB0C4* ID_OUI_FROM_DATABASE=Shanghai DareGlobal Technologies Co., Ltd +OUI:FCB4E6* + ID_OUI_FROM_DATABASE=ASKEY COMPUTER CORP. + +OUI:FCB698* + ID_OUI_FROM_DATABASE=Cambridge Industries(Group) Co.,Ltd. + OUI:FCBBA1* ID_OUI_FROM_DATABASE=Shenzhen Minicreate Technology Co.,Ltd @@ -72664,6 +73669,9 @@ OUI:FCDB96* OUI:FCDBB3* ID_OUI_FROM_DATABASE=Murata Manufacturing Co., Ltd. +OUI:FCDC4A* + ID_OUI_FROM_DATABASE=G-Wearables Corp. + OUI:FCDD55* ID_OUI_FROM_DATABASE=Shenzhen WeWins wireless Co.,Ltd @@ -72685,6 +73693,9 @@ OUI:FCE557* OUI:FCE892* ID_OUI_FROM_DATABASE=Hangzhou Lancable Technology Co.,Ltd +OUI:FCE998* + ID_OUI_FROM_DATABASE=Apple + OUI:FCEDB9* ID_OUI_FROM_DATABASE=Arrayent diff --git a/hwdb/20-bluetooth-vendor-product.hwdb b/hwdb/20-bluetooth-vendor-product.hwdb index ee2efdff2e..d3aea5f66f 100644 --- a/hwdb/20-bluetooth-vendor-product.hwdb +++ b/hwdb/20-bluetooth-vendor-product.hwdb @@ -166,7 +166,7 @@ bluetooth:v0035* ID_VENDOR_FROM_DATABASE=Eclipse (HQ Espana) S.L. bluetooth:v0036* - ID_VENDOR_FROM_DATABASE=Renesas Technology Corp. + ID_VENDOR_FROM_DATABASE=Renesas Electronics Corporation bluetooth:v0037* ID_VENDOR_FROM_DATABASE=Mobilian Corporation @@ -937,7 +937,7 @@ bluetooth:v0135* ID_VENDOR_FROM_DATABASE=Airewear LLC bluetooth:v0136* - ID_VENDOR_FROM_DATABASE=ETC sp. z.o.o. + ID_VENDOR_FROM_DATABASE=Seed Labs, Inc. (formerly ETC sp. z.o.o.) bluetooth:v0137* ID_VENDOR_FROM_DATABASE=Prestigio Plaza Ltd. @@ -1166,3 +1166,162 @@ bluetooth:v0181* bluetooth:v0182* ID_VENDOR_FROM_DATABASE=HOP Ubiquitous + +bluetooth:v0183* + ID_VENDOR_FROM_DATABASE=To Be Assigned + +bluetooth:v0184* + ID_VENDOR_FROM_DATABASE=Nectar + +bluetooth:v0185* + ID_VENDOR_FROM_DATABASE=bel'apps LLC + +bluetooth:v0186* + ID_VENDOR_FROM_DATABASE=CORE Lighting Ltd + +bluetooth:v0187* + ID_VENDOR_FROM_DATABASE=Seraphim Sense Ltd + +bluetooth:v0188* + ID_VENDOR_FROM_DATABASE=Unico RBC + +bluetooth:v0189* + ID_VENDOR_FROM_DATABASE=Physical Enterprises Inc. + +bluetooth:v018A* + ID_VENDOR_FROM_DATABASE=Able Trend Technology Limited + +bluetooth:v018B* + ID_VENDOR_FROM_DATABASE=Konica Minolta, Inc. + +bluetooth:v018C* + ID_VENDOR_FROM_DATABASE=Wilo SE + +bluetooth:v018D* + ID_VENDOR_FROM_DATABASE=Extron Design Services + +bluetooth:v018E* + ID_VENDOR_FROM_DATABASE=Fitbit, Inc. + +bluetooth:v018F* + ID_VENDOR_FROM_DATABASE=Fireflies Systems + +bluetooth:v0190* + ID_VENDOR_FROM_DATABASE=Intelletto Technologies Inc. + +bluetooth:v0191* + ID_VENDOR_FROM_DATABASE=FDK CORPORATION + +bluetooth:v0192* + ID_VENDOR_FROM_DATABASE=Cloudleaf, Inc + +bluetooth:v0193* + ID_VENDOR_FROM_DATABASE=Maveric Automation LLC + +bluetooth:v0194* + ID_VENDOR_FROM_DATABASE=Acoustic Stream Corporation + +bluetooth:v0195* + ID_VENDOR_FROM_DATABASE=Zuli + +bluetooth:v0196* + ID_VENDOR_FROM_DATABASE=Paxton Access Ltd + +bluetooth:v0197* + ID_VENDOR_FROM_DATABASE=WiSilica Inc + +bluetooth:v0198* + ID_VENDOR_FROM_DATABASE=Vengit Limited + +bluetooth:v0199* + ID_VENDOR_FROM_DATABASE=SALTO SYSTEMS S.L. + +bluetooth:v019A* + ID_VENDOR_FROM_DATABASE=T-Engine Forum + +bluetooth:v019B* + ID_VENDOR_FROM_DATABASE=CUBETECH s.r.o. + +bluetooth:v019C* + ID_VENDOR_FROM_DATABASE=Cokiya Incorporated + +bluetooth:v019D* + ID_VENDOR_FROM_DATABASE=CVS Health + +bluetooth:v019E* + ID_VENDOR_FROM_DATABASE=Ceruus + +bluetooth:v019F* + ID_VENDOR_FROM_DATABASE=Strainstall Ltd + +bluetooth:v01A0* + ID_VENDOR_FROM_DATABASE=Channel Enterprises (HK) Ltd. + +bluetooth:v01A1* + ID_VENDOR_FROM_DATABASE=FIAMM + +bluetooth:v01A2* + ID_VENDOR_FROM_DATABASE=GIGALANE.CO.,LTD + +bluetooth:v01A3* + ID_VENDOR_FROM_DATABASE=EROAD + +bluetooth:v01A4* + ID_VENDOR_FROM_DATABASE=Mine Safety Appliances + +bluetooth:v01A5* + ID_VENDOR_FROM_DATABASE=Icon Health and Fitness + +bluetooth:v01A6* + ID_VENDOR_FROM_DATABASE=Asandoo GmbH + +bluetooth:v01A7* + ID_VENDOR_FROM_DATABASE=ENERGOUS CORPORATION + +bluetooth:v01A8* + ID_VENDOR_FROM_DATABASE=Taobao + +bluetooth:v01A9* + ID_VENDOR_FROM_DATABASE=Canon Inc. + +bluetooth:v01AA* + ID_VENDOR_FROM_DATABASE=Geophysical Technology Inc. + +bluetooth:v01AB* + ID_VENDOR_FROM_DATABASE=Facebook, Inc. + +bluetooth:v01AC* + ID_VENDOR_FROM_DATABASE=Nipro Diagnostics, Inc. + +bluetooth:v01AD* + ID_VENDOR_FROM_DATABASE=FlightSafety International + +bluetooth:v01AE* + ID_VENDOR_FROM_DATABASE=Earlens Corporation + +bluetooth:v01AF* + ID_VENDOR_FROM_DATABASE=Sunrise Micro Devices, Inc. + +bluetooth:v01B0* + ID_VENDOR_FROM_DATABASE=Star Micronics Co., Ltd. + +bluetooth:v01B1* + ID_VENDOR_FROM_DATABASE=Netizens Sp. z o.o. + +bluetooth:v01B2* + ID_VENDOR_FROM_DATABASE=Nymi Inc. + +bluetooth:v01B3* + ID_VENDOR_FROM_DATABASE=Nytec, Inc. + +bluetooth:v01B4* + ID_VENDOR_FROM_DATABASE=Trineo Sp. z o.o. + +bluetooth:v01B5* + ID_VENDOR_FROM_DATABASE=Nest Labs Inc. + +bluetooth:v01B6* + ID_VENDOR_FROM_DATABASE=LM Technologies Ltd + +bluetooth:v01B7* + ID_VENDOR_FROM_DATABASE=General Electric Company diff --git a/hwdb/20-pci-vendor-model.hwdb b/hwdb/20-pci-vendor-model.hwdb index 1b98b1d2e7..df9deccd9c 100644 --- a/hwdb/20-pci-vendor-model.hwdb +++ b/hwdb/20-pci-vendor-model.hwdb @@ -689,6 +689,9 @@ pci:v00001000d00000021sv00004C53sd00001310* pci:v00001000d0000002F* ID_MODEL_FROM_DATABASE=MegaRAID SAS 2208 IOV [Thunderbolt] +pci:v00001000d0000002Fsv00001028sd00001F39* + ID_MODEL_FROM_DATABASE=MegaRAID SAS 2208 IOV [Thunderbolt] (SPERC8-e) + pci:v00001000d0000002Fsv00001028sd00001F3E* ID_MODEL_FROM_DATABASE=MegaRAID SAS 2208 IOV [Thunderbolt] (SPERC 8) @@ -4238,9 +4241,15 @@ pci:v00001002d00006605* pci:v00001002d00006606* ID_MODEL_FROM_DATABASE=Mars XTX [Radeon HD 8790M] +pci:v00001002d00006606sv00001028sd00000684* + ID_MODEL_FROM_DATABASE=Mars XTX [Radeon HD 8790M] (FirePro W4170M) + pci:v00001002d00006607* ID_MODEL_FROM_DATABASE=Mars LE [Radeon HD 8530M / R5 M240] +pci:v00001002d00006608* + ID_MODEL_FROM_DATABASE=Oland GL [FirePro W2100] + pci:v00001002d00006610* ID_MODEL_FROM_DATABASE=Oland XT [Radeon HD 8670 / R7 250] @@ -5924,6 +5933,9 @@ pci:v00001002d0000679Asv00001002sd00003000* pci:v00001002d0000679Asv00001462sd00003000* ID_MODEL_FROM_DATABASE=Tahiti PRO [Radeon HD 7950/8950 OEM / R9 280] (Radeon HD 8950 OEM) +pci:v00001002d0000679Asv0000174Bsd0000A003* + ID_MODEL_FROM_DATABASE=Tahiti PRO [Radeon HD 7950/8950 OEM / R9 280] (Radeon R9 280) + pci:v00001002d0000679B* ID_MODEL_FROM_DATABASE=Malta [Radeon HD 7990] @@ -6077,6 +6089,18 @@ pci:v00001002d00006823* pci:v00001002d00006825* ID_MODEL_FROM_DATABASE=Heathrow XT [Radeon HD 7870M] +pci:v00001002d00006825sv00001028sd0000053F* + ID_MODEL_FROM_DATABASE=Heathrow XT [Radeon HD 7870M] (FirePro M6000) + +pci:v00001002d00006825sv00001028sd000005CD* + ID_MODEL_FROM_DATABASE=Heathrow XT [Radeon HD 7870M] (FirePro M6000) + +pci:v00001002d00006825sv00001028sd000015CD* + ID_MODEL_FROM_DATABASE=Heathrow XT [Radeon HD 7870M] (FirePro M6000) + +pci:v00001002d00006825sv0000103Csd0000176C* + ID_MODEL_FROM_DATABASE=Heathrow XT [Radeon HD 7870M] (FirePro M6000) + pci:v00001002d00006825sv00008086sd00002111* ID_MODEL_FROM_DATABASE=Heathrow XT [Radeon HD 7870M] (Chelsea PRO) @@ -6098,6 +6122,9 @@ pci:v00001002d0000682A* pci:v00001002d0000682B* ID_MODEL_FROM_DATABASE=Venus LE [Radeon HD 8830M] +pci:v00001002d0000682C* + ID_MODEL_FROM_DATABASE=Cape Verde GL [FirePro W4100] + pci:v00001002d0000682D* ID_MODEL_FROM_DATABASE=Chelsea XT GL [FirePro M4000] @@ -6233,6 +6260,9 @@ pci:v00001002d00006840sv00001028sd000005B9* pci:v00001002d00006840sv00001028sd000005BB* ID_MODEL_FROM_DATABASE=Thames [Radeon HD 7500M/7600M Series] (Radeon HD 7670M) +pci:v00001002d00006840sv0000103Csd00001789* + ID_MODEL_FROM_DATABASE=Thames [Radeon HD 7500M/7600M Series] (FirePro M2000) + pci:v00001002d00006840sv0000103Csd000017F1* ID_MODEL_FROM_DATABASE=Thames [Radeon HD 7500M/7600M Series] (Radeon HD 7570M) @@ -7874,6 +7904,15 @@ pci:v00001002d00006900* pci:v00001002d00006900sv00001028sd00000640* ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265] (Radeon R7 M265) +pci:v00001002d00006900sv0000103Csd00002269* + ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265] (Radeon R7 M260) + +pci:v00001002d00006900sv0000103Csd000022C8* + ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265] (Radeon R7 M260) + +pci:v00001002d00006900sv00001179sd0000F903* + ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265] (Radeon R7 M260) + pci:v00001002d00006900sv00001179sd0000F934* ID_MODEL_FROM_DATABASE=Topaz XT [Radeon R7 M260/M265] (Radeon R7 M260) @@ -7887,7 +7926,7 @@ pci:v00001002d00006921* ID_MODEL_FROM_DATABASE=Amethyst XT [Radeon R9 M295X] pci:v00001002d0000692B* - ID_MODEL_FROM_DATABASE=Tonga XT GL [FirePro W8100] + ID_MODEL_FROM_DATABASE=Tonga PRO GL [FirePro W7100] pci:v00001002d0000692F* ID_MODEL_FROM_DATABASE=Tonga XT GL [FirePro W8100] @@ -8807,6 +8846,9 @@ pci:v00001002d000095C9* pci:v00001002d000095CC* ID_MODEL_FROM_DATABASE=RV620 GL [FirePro V3700] +pci:v00001002d000095CD* + ID_MODEL_FROM_DATABASE=RV620 [FirePro 2450] + pci:v00001002d000095CF* ID_MODEL_FROM_DATABASE=RV620 GL [FirePro 2260] @@ -9006,13 +9048,13 @@ pci:v00001002d00009853* ID_MODEL_FROM_DATABASE=Mullins [Radeon R2 Graphics] pci:v00001002d00009854* - ID_MODEL_FROM_DATABASE=Mullins [Radeon R3 Graphics] + ID_MODEL_FROM_DATABASE=Mullins [Radeon R3E Graphics] pci:v00001002d00009855* ID_MODEL_FROM_DATABASE=Mullins [Radeon R6 Graphics] pci:v00001002d00009856* - ID_MODEL_FROM_DATABASE=Mullins [Radeon R2 Graphics] + ID_MODEL_FROM_DATABASE=Mullins [Radeon R1E/R2E Graphics] pci:v00001002d00009857* ID_MODEL_FROM_DATABASE=Mullins [Radeon APU XX-2200M with R2 Graphics] @@ -13923,25 +13965,25 @@ pci:v0000103Cd00003239* ID_MODEL_FROM_DATABASE=Smart Array Gen9 Controllers pci:v0000103Cd00003239sv0000103Csd000021BD* - ID_MODEL_FROM_DATABASE=Smart Array Gen9 Controllers (Smart Array) + ID_MODEL_FROM_DATABASE=Smart Array Gen9 Controllers (P244br) pci:v0000103Cd00003239sv0000103Csd000021BE* ID_MODEL_FROM_DATABASE=Smart Array Gen9 Controllers (Smart Array) pci:v0000103Cd00003239sv0000103Csd000021BF* - ID_MODEL_FROM_DATABASE=Smart Array Gen9 Controllers (Smart Array) + ID_MODEL_FROM_DATABASE=Smart Array Gen9 Controllers (H240ar) pci:v0000103Cd00003239sv0000103Csd000021C0* - ID_MODEL_FROM_DATABASE=Smart Array Gen9 Controllers (Smart Array) + ID_MODEL_FROM_DATABASE=Smart Array Gen9 Controllers (P440ar) pci:v0000103Cd00003239sv0000103Csd000021C1* ID_MODEL_FROM_DATABASE=Smart Array Gen9 Controllers (Smart Array) pci:v0000103Cd00003239sv0000103Csd000021C2* - ID_MODEL_FROM_DATABASE=Smart Array Gen9 Controllers (Smart Array) + ID_MODEL_FROM_DATABASE=Smart Array Gen9 Controllers (P440) pci:v0000103Cd00003239sv0000103Csd000021C3* - ID_MODEL_FROM_DATABASE=Smart Array Gen9 Controllers (Smart Array) + ID_MODEL_FROM_DATABASE=Smart Array Gen9 Controllers (P441) pci:v0000103Cd00003239sv0000103Csd000021C4* ID_MODEL_FROM_DATABASE=Smart Array Gen9 Controllers (Smart Array) @@ -13950,13 +13992,13 @@ pci:v0000103Cd00003239sv0000103Csd000021C5* ID_MODEL_FROM_DATABASE=Smart Array Gen9 Controllers (Smart Array) pci:v0000103Cd00003239sv0000103Csd000021C6* - ID_MODEL_FROM_DATABASE=Smart Array Gen9 Controllers (Smart Array) + ID_MODEL_FROM_DATABASE=Smart Array Gen9 Controllers (H244br) pci:v0000103Cd00003239sv0000103Csd000021C7* - ID_MODEL_FROM_DATABASE=Smart Array Gen9 Controllers (Smart Array) + ID_MODEL_FROM_DATABASE=Smart Array Gen9 Controllers (H240) pci:v0000103Cd00003239sv0000103Csd000021C8* - ID_MODEL_FROM_DATABASE=Smart Array Gen9 Controllers (Smart Array) + ID_MODEL_FROM_DATABASE=Smart Array Gen9 Controllers (H241) pci:v0000103Cd00003239sv0000103Csd000021C9* ID_MODEL_FROM_DATABASE=Smart Array Gen9 Controllers (Smart Array) @@ -13965,7 +14007,7 @@ pci:v0000103Cd00003239sv0000103Csd000021CA* ID_MODEL_FROM_DATABASE=Smart Array Gen9 Controllers (Smart Array) pci:v0000103Cd00003239sv0000103Csd000021CB* - ID_MODEL_FROM_DATABASE=Smart Array Gen9 Controllers (Smart Array) + ID_MODEL_FROM_DATABASE=Smart Array Gen9 Controllers (P840) pci:v0000103Cd00003239sv0000103Csd000021CC* ID_MODEL_FROM_DATABASE=Smart Array Gen9 Controllers (Smart Array) @@ -16868,6 +16910,9 @@ pci:v00001077d00008001* pci:v00001077d00008020* ID_MODEL_FROM_DATABASE=cLOM8214 1/10GbE Controller +pci:v00001077d00008020sv00001028sd00001F64* + ID_MODEL_FROM_DATABASE=cLOM8214 1/10GbE Controller (QMD8262-k 10G DP bNDC KR) + pci:v00001077d00008020sv0000103Csd00003346* ID_MODEL_FROM_DATABASE=cLOM8214 1/10GbE Controller (CN1000Q Dual Port Converged Network Adapter) @@ -27659,6 +27704,12 @@ pci:v000010DEd00000BEBsv00001462sd00002322* pci:v000010DEd00000BEE* ID_MODEL_FROM_DATABASE=GF116 High Definition Audio Controller +pci:v000010DEd00000BF0* + ID_MODEL_FROM_DATABASE=Tegra2 PCIe x4 Bridge + +pci:v000010DEd00000BF1* + ID_MODEL_FROM_DATABASE=Tegra2 PCIe x2 Bridge + pci:v000010DEd00000CA0* ID_MODEL_FROM_DATABASE=GT215 [GeForce GT 330] @@ -27938,6 +27989,9 @@ pci:v000010DEd00000E0B* pci:v000010DEd00000E0C* ID_MODEL_FROM_DATABASE=GF114 HDMI Audio Controller +pci:v000010DEd00000E0F* + ID_MODEL_FROM_DATABASE=GK208 HDMI/DP Audio Controller + pci:v000010DEd00000E1A* ID_MODEL_FROM_DATABASE=GK110 HDMI Audio @@ -27950,6 +28004,12 @@ pci:v000010DEd00000E1Bsv0000103Csd0000197B* pci:v000010DEd00000E1Bsv00001043sd00008428* ID_MODEL_FROM_DATABASE=GK107 HDMI Audio Controller (GTX650-DC-1GD5) +pci:v000010DEd00000E1C* + ID_MODEL_FROM_DATABASE=Tegra3+ PCIe x4 Bridge + +pci:v000010DEd00000E1D* + ID_MODEL_FROM_DATABASE=Tegra3+ PCIe x2 Bridge + pci:v000010DEd00000E22* ID_MODEL_FROM_DATABASE=GF104 [GeForce GTX 460] @@ -27983,6 +28043,9 @@ pci:v000010DEd00000F01* pci:v000010DEd00000F02* ID_MODEL_FROM_DATABASE=GF108 [GeForce GT 730] +pci:v000010DEd00000FBB* + ID_MODEL_FROM_DATABASE=GM204 High Definition Audio Controller + pci:v000010DEd00000FC0* ID_MODEL_FROM_DATABASE=GK107 [GeForce GT 640 OEM] @@ -28242,7 +28305,7 @@ pci:v000010DEd0000102A* ID_MODEL_FROM_DATABASE=GK110BGL [Tesla K40t] pci:v000010DEd0000102D* - ID_MODEL_FROM_DATABASE=GK110BGL [Tesla K80] + ID_MODEL_FROM_DATABASE=GK210GL [Tesla K80] pci:v000010DEd0000102E* ID_MODEL_FROM_DATABASE=GK110BGL [Tesla K40d] @@ -29552,6 +29615,9 @@ pci:v000010DEd00001286* pci:v000010DEd00001287* ID_MODEL_FROM_DATABASE=GK208 [GeForce GT 730] +pci:v000010DEd00001288* + ID_MODEL_FROM_DATABASE=GK208 [GeForce GT 720] + pci:v000010DEd00001290* ID_MODEL_FROM_DATABASE=GK208M [GeForce GT 730M] @@ -29681,6 +29747,30 @@ pci:v000010DEd000013BB* pci:v000010DEd000013BD* ID_MODEL_FROM_DATABASE=GM107GL [Tesla M40] +pci:v000010DEd000013C0* + ID_MODEL_FROM_DATABASE=GM204 [GeForce GTX 980] + +pci:v000010DEd000013C0sv00001043sd00008504* + ID_MODEL_FROM_DATABASE=GM204 [GeForce GTX 980] (GTX980-4GD5) + +pci:v000010DEd000013C1* + ID_MODEL_FROM_DATABASE=GM204 + +pci:v000010DEd000013C2* + ID_MODEL_FROM_DATABASE=GM204 [GeForce GTX 970] + +pci:v000010DEd000013C3* + ID_MODEL_FROM_DATABASE=GM204 + +pci:v000010DEd000013D7* + ID_MODEL_FROM_DATABASE=GM204M [GeForce GTX 980M] + +pci:v000010DEd000013D8* + ID_MODEL_FROM_DATABASE=GM204M [GeForce GTX 970M] + +pci:v000010DEd000013D9* + ID_MODEL_FROM_DATABASE=GM204M [GeForce GTX 965M] + pci:v000010DF* ID_VENDOR_FROM_DATABASE=Emulex Corporation @@ -30062,6 +30152,9 @@ pci:v000010E8d00008407* pci:v000010E8d00008851* ID_MODEL_FROM_DATABASE=S5933 on Innes Corp FM Radio Capture card +pci:v000010E8d0000E004* + ID_MODEL_FROM_DATABASE=X-Gene PCIe bridge + pci:v000010E9* ID_VENDOR_FROM_DATABASE=Alps Electric Co., Ltd. @@ -31049,6 +31142,9 @@ pci:v00001103d00000640* pci:v00001103d00000644* ID_MODEL_FROM_DATABASE=RocketRAID 644 4 Port SATA-III Controller (eSATA) +pci:v00001103d00000645* + ID_MODEL_FROM_DATABASE=RocketRAID 644L 4 Port SATA-III Controller (eSATA) + pci:v00001103d00001720* ID_MODEL_FROM_DATABASE=RocketRAID 1720 (2x SATA II RAID Controller) @@ -34622,6 +34718,33 @@ pci:v00001137d00000023* pci:v00001137d00000040* ID_MODEL_FROM_DATABASE=VIC PCIe Upstream Port +pci:v00001137d00000040sv00001137sd0000004F* + ID_MODEL_FROM_DATABASE=VIC PCIe Upstream Port (VIC 1280 Dual 40Gb Mezzanine) + +pci:v00001137d00000040sv00001137sd00000084* + ID_MODEL_FROM_DATABASE=VIC PCIe Upstream Port (VIC 1240 Dual 40Gb MLOM) + +pci:v00001137d00000040sv00001137sd00000085* + ID_MODEL_FROM_DATABASE=VIC PCIe Upstream Port (VIC 1225 Dual 10Gb SFP+ PCIe) + +pci:v00001137d00000040sv00001137sd000000CD* + ID_MODEL_FROM_DATABASE=VIC PCIe Upstream Port (VIC 1285 Dual 40Gb QSFP+ PCIe) + +pci:v00001137d00000040sv00001137sd000000CE* + ID_MODEL_FROM_DATABASE=VIC PCIe Upstream Port (VIC 1225T Dual 10GBaseT PCIe) + +pci:v00001137d00000040sv00001137sd0000012A* + ID_MODEL_FROM_DATABASE=VIC PCIe Upstream Port (VIC M4308 Dual 40Gb) + +pci:v00001137d00000040sv00001137sd0000012C* + ID_MODEL_FROM_DATABASE=VIC PCIe Upstream Port (VIC 1340 Dual 40Gb MLOM) + +pci:v00001137d00000040sv00001137sd0000012E* + ID_MODEL_FROM_DATABASE=VIC PCIe Upstream Port (VIC 1227 Dual 10Gb SFP+ PCIe) + +pci:v00001137d00000040sv00001137sd00000137* + ID_MODEL_FROM_DATABASE=VIC PCIe Upstream Port (VIC 1380 Dual 40Gb Mezzanine) + pci:v00001137d00000041* ID_MODEL_FROM_DATABASE=VIC PCIe Downstream Port @@ -34640,6 +34763,9 @@ pci:v00001137d00000042sv00001137sd000000CD* pci:v00001137d00000042sv00001137sd000000CE* ID_MODEL_FROM_DATABASE=VIC Management Controller (VIC 1225T PCIe Management Controller) +pci:v00001137d00000042sv00001137sd0000012E* + ID_MODEL_FROM_DATABASE=VIC Management Controller (VIC 1227 PCIe Management Controller) + pci:v00001137d00000043* ID_MODEL_FROM_DATABASE=VIC Ethernet NIC @@ -34664,6 +34790,18 @@ pci:v00001137d00000043sv00001137sd000000CD* pci:v00001137d00000043sv00001137sd000000CE* ID_MODEL_FROM_DATABASE=VIC Ethernet NIC (VIC 1225T PCIe Ethernet NIC) +pci:v00001137d00000043sv00001137sd0000012A* + ID_MODEL_FROM_DATABASE=VIC Ethernet NIC (VIC M4308 Ethernet NIC) + +pci:v00001137d00000043sv00001137sd0000012C* + ID_MODEL_FROM_DATABASE=VIC Ethernet NIC (VIC 1340 MLOM Ethernet NIC) + +pci:v00001137d00000043sv00001137sd0000012E* + ID_MODEL_FROM_DATABASE=VIC Ethernet NIC (VIC 1227 PCIe Ethernet NIC) + +pci:v00001137d00000043sv00001137sd00000137* + ID_MODEL_FROM_DATABASE=VIC Ethernet NIC (VIC 1380 Mezzanine Ethernet NIC) + pci:v00001137d00000044* ID_MODEL_FROM_DATABASE=VIC Ethernet NIC Dynamic @@ -34688,6 +34826,18 @@ pci:v00001137d00000044sv00001137sd000000CD* pci:v00001137d00000044sv00001137sd000000CE* ID_MODEL_FROM_DATABASE=VIC Ethernet NIC Dynamic (VIC 1225T PCIe Ethernet NIC Dynamic) +pci:v00001137d00000044sv00001137sd0000012A* + ID_MODEL_FROM_DATABASE=VIC Ethernet NIC Dynamic (VIC M4308 Ethernet NIC Dynamic) + +pci:v00001137d00000044sv00001137sd0000012C* + ID_MODEL_FROM_DATABASE=VIC Ethernet NIC Dynamic (VIC 1340 MLOM Ethernet NIC Dynamic) + +pci:v00001137d00000044sv00001137sd0000012E* + ID_MODEL_FROM_DATABASE=VIC Ethernet NIC Dynamic (VIC 1227 PCIe Ethernet NIC Dynamic) + +pci:v00001137d00000044sv00001137sd00000137* + ID_MODEL_FROM_DATABASE=VIC Ethernet NIC Dynamic (VIC 1380 Mezzanine Ethernet NIC Dynamic) + pci:v00001137d00000045* ID_MODEL_FROM_DATABASE=VIC FCoE HBA @@ -34712,15 +34862,72 @@ pci:v00001137d00000045sv00001137sd000000CD* pci:v00001137d00000045sv00001137sd000000CE* ID_MODEL_FROM_DATABASE=VIC FCoE HBA (VIC 1225T PCIe FCoE HBA) +pci:v00001137d00000045sv00001137sd0000012A* + ID_MODEL_FROM_DATABASE=VIC FCoE HBA (VIC M4308 FCoE HBA) + +pci:v00001137d00000045sv00001137sd0000012C* + ID_MODEL_FROM_DATABASE=VIC FCoE HBA (VIC 1340 MLOM FCoE HBA) + +pci:v00001137d00000045sv00001137sd0000012E* + ID_MODEL_FROM_DATABASE=VIC FCoE HBA (VIC 1227 PCIe FCoE HBA) + +pci:v00001137d00000045sv00001137sd00000137* + ID_MODEL_FROM_DATABASE=VIC FCoE HBA (VIC 1380 Mezzanine FCoE HBA) + +pci:v00001137d00000046* + ID_MODEL_FROM_DATABASE=VIC SCSI Controller + +pci:v00001137d00000046sv00001137sd0000012A* + ID_MODEL_FROM_DATABASE=VIC SCSI Controller (VIC M4308 SCSI Controller) + pci:v00001137d0000004E* ID_MODEL_FROM_DATABASE=VIC 82 PCIe Upstream Port pci:v00001137d00000071* ID_MODEL_FROM_DATABASE=VIC SR-IOV VF +pci:v00001137d0000007A* + ID_MODEL_FROM_DATABASE=VIC 1300 PCIe Upstream Port + +pci:v00001137d0000007Asv00001137sd0000012A* + ID_MODEL_FROM_DATABASE=VIC 1300 PCIe Upstream Port (VIC M4308 Dual 40Gb) + +pci:v00001137d0000007Asv00001137sd0000012C* + ID_MODEL_FROM_DATABASE=VIC 1300 PCIe Upstream Port (VIC 1340 Dual 40Gb MLOM) + +pci:v00001137d0000007Asv00001137sd00000137* + ID_MODEL_FROM_DATABASE=VIC 1300 PCIe Upstream Port (VIC 1380 Dual 40Gb Mezzanine) + pci:v00001137d000000CF* ID_MODEL_FROM_DATABASE=VIC Userspace NIC +pci:v00001137d000000CFsv00001137sd0000004F* + ID_MODEL_FROM_DATABASE=VIC Userspace NIC (VIC 1280 Mezzanine Userspace NIC) + +pci:v00001137d000000CFsv00001137sd00000084* + ID_MODEL_FROM_DATABASE=VIC Userspace NIC (VIC 1240 MLOM Userspace NIC) + +pci:v00001137d000000CFsv00001137sd00000085* + ID_MODEL_FROM_DATABASE=VIC Userspace NIC (VIC 1225 PCIe Userspace NIC) + +pci:v00001137d000000CFsv00001137sd000000CD* + ID_MODEL_FROM_DATABASE=VIC Userspace NIC (VIC 1285 PCIe Userspace NIC) + +pci:v00001137d000000CFsv00001137sd000000CE* + ID_MODEL_FROM_DATABASE=VIC Userspace NIC (VIC 1225T PCIe Userspace NIC) + +pci:v00001137d000000CFsv00001137sd0000012A* + ID_MODEL_FROM_DATABASE=VIC Userspace NIC (VIC M4308 Userspace NIC) + +pci:v00001137d000000CFsv00001137sd0000012C* + ID_MODEL_FROM_DATABASE=VIC Userspace NIC (VIC 1340 MLOM Userspace NIC) + +pci:v00001137d000000CFsv00001137sd0000012E* + ID_MODEL_FROM_DATABASE=VIC Userspace NIC (VIC 1227 PCIe Userspace NIC) + +pci:v00001137d000000CFsv00001137sd00000137* + ID_MODEL_FROM_DATABASE=VIC Userspace NIC (VIC 1380 Mezzanine Userspace NIC) + pci:v00001138* ID_VENDOR_FROM_DATABASE=Ziatech Corporation @@ -37361,6 +37568,9 @@ pci:v000011B0d00000292* pci:v000011B0d00000960* ID_MODEL_FROM_DATABASE=V96xPBC +pci:v000011B0d0000880A* + ID_MODEL_FROM_DATABASE=Deltacast Delta-HD-22 + pci:v000011B0d0000C960* ID_MODEL_FROM_DATABASE=V96DPC @@ -44654,6 +44864,9 @@ pci:v00001425d00005080* pci:v00001425d00005081* ID_MODEL_FROM_DATABASE=T540-5081 Unified Wire Ethernet Controller +pci:v00001425d00005082* + ID_MODEL_FROM_DATABASE=T504-5082 Unified Wire Ethernet Controller + pci:v00001425d00005083* ID_MODEL_FROM_DATABASE=T540-5083 Unified Wire Ethernet Controller @@ -44666,6 +44879,12 @@ pci:v00001425d00005085* pci:v00001425d00005086* ID_MODEL_FROM_DATABASE=T580-5086 Unified Wire Ethernet Controller +pci:v00001425d00005087* + ID_MODEL_FROM_DATABASE=T580-5087 Unified Wire Ethernet Controller + +pci:v00001425d00005088* + ID_MODEL_FROM_DATABASE=T570-5088 Unified Wire Ethernet Controller + pci:v00001425d00005401* ID_MODEL_FROM_DATABASE=T520-CR Unified Wire Ethernet Controller @@ -44735,6 +44954,9 @@ pci:v00001425d00005480* pci:v00001425d00005481* ID_MODEL_FROM_DATABASE=T540-5081 Unified Wire Ethernet Controller +pci:v00001425d00005482* + ID_MODEL_FROM_DATABASE=T504-5082 Unified Wire Ethernet Controller + pci:v00001425d00005483* ID_MODEL_FROM_DATABASE=T540-5083 Unified Wire Ethernet Controller @@ -44747,6 +44969,12 @@ pci:v00001425d00005485* pci:v00001425d00005486* ID_MODEL_FROM_DATABASE=T580-5086 Unified Wire Ethernet Controller +pci:v00001425d00005487* + ID_MODEL_FROM_DATABASE=T580-5087 Unified Wire Ethernet Controller + +pci:v00001425d00005488* + ID_MODEL_FROM_DATABASE=T570-5088 Unified Wire Ethernet Controller + pci:v00001425d00005501* ID_MODEL_FROM_DATABASE=T520-CR Unified Wire Storage Controller @@ -44816,6 +45044,9 @@ pci:v00001425d00005580* pci:v00001425d00005581* ID_MODEL_FROM_DATABASE=T540-5081 Unified Wire Storage Controller +pci:v00001425d00005582* + ID_MODEL_FROM_DATABASE=T504-5082 Unified Wire Storage Controller + pci:v00001425d00005583* ID_MODEL_FROM_DATABASE=T540-5083 Unified Wire Storage Controller @@ -44828,6 +45059,12 @@ pci:v00001425d00005585* pci:v00001425d00005586* ID_MODEL_FROM_DATABASE=T580-5086 Unified Wire Storage Controller +pci:v00001425d00005587* + ID_MODEL_FROM_DATABASE=T580-5087 Unified Wire Storage Controller + +pci:v00001425d00005588* + ID_MODEL_FROM_DATABASE=T570-5088 Unified Wire Storage Controller + pci:v00001425d00005601* ID_MODEL_FROM_DATABASE=T520-CR Unified Wire Storage Controller @@ -44897,6 +45134,9 @@ pci:v00001425d00005680* pci:v00001425d00005681* ID_MODEL_FROM_DATABASE=T540-5081 Unified Wire Storage Controller +pci:v00001425d00005682* + ID_MODEL_FROM_DATABASE=T504-5082 Unified Wire Storage Controller + pci:v00001425d00005683* ID_MODEL_FROM_DATABASE=T540-5083 Unified Wire Storage Controller @@ -44909,6 +45149,12 @@ pci:v00001425d00005685* pci:v00001425d00005686* ID_MODEL_FROM_DATABASE=T580-5086 Unified Wire Storage Controller +pci:v00001425d00005687* + ID_MODEL_FROM_DATABASE=T580-5087 Unified Wire Storage Controller + +pci:v00001425d00005688* + ID_MODEL_FROM_DATABASE=T570-5088 Unified Wire Storage Controller + pci:v00001425d00005701* ID_MODEL_FROM_DATABASE=T520-CR Unified Wire Ethernet Controller @@ -44978,6 +45224,9 @@ pci:v00001425d00005780* pci:v00001425d00005781* ID_MODEL_FROM_DATABASE=T540-5081 Unified Wire Ethernet Controller +pci:v00001425d00005782* + ID_MODEL_FROM_DATABASE=T504-5082 Unified Wire Ethernet Controller + pci:v00001425d00005783* ID_MODEL_FROM_DATABASE=T540-5083 Unified Wire Ethernet Controller @@ -44987,6 +45236,15 @@ pci:v00001425d00005784* pci:v00001425d00005785* ID_MODEL_FROM_DATABASE=T580-5085 Unified Wire Ethernet Controller +pci:v00001425d00005786* + ID_MODEL_FROM_DATABASE=T580-5086 Unified Wire Ethernet Controller + +pci:v00001425d00005787* + ID_MODEL_FROM_DATABASE=T580-5087 Unified Wire Ethernet Controller + +pci:v00001425d00005788* + ID_MODEL_FROM_DATABASE=T570-5088 Unified Wire Ethernet Controller + pci:v00001425d00005801* ID_MODEL_FROM_DATABASE=T520-CR Unified Wire Ethernet Controller [VF] @@ -45056,6 +45314,9 @@ pci:v00001425d00005880* pci:v00001425d00005881* ID_MODEL_FROM_DATABASE=T540-5081 Unified Wire Ethernet Controller [VF] +pci:v00001425d00005882* + ID_MODEL_FROM_DATABASE=T504-5082 Unified Wire Ethernet Controller [VF] + pci:v00001425d00005883* ID_MODEL_FROM_DATABASE=T540-5083 Unified Wire Ethernet Controller [VF] @@ -45068,6 +45329,12 @@ pci:v00001425d00005885* pci:v00001425d00005886* ID_MODEL_FROM_DATABASE=T580-5086 Unified Wire Ethernet Controller [VF] +pci:v00001425d00005887* + ID_MODEL_FROM_DATABASE=T580-5087 Unified Wire Ethernet Controller [VF] + +pci:v00001425d00005888* + ID_MODEL_FROM_DATABASE=T570-5088 Unified Wire Ethernet Controller [VF] + pci:v00001425d0000A000* ID_MODEL_FROM_DATABASE=PE10K Unified Wire Ethernet Controller @@ -46457,6 +46724,9 @@ pci:v000014E4d00001656* pci:v000014E4d00001657* ID_MODEL_FROM_DATABASE=NetXtreme BCM5719 Gigabit Ethernet PCIe +pci:v000014E4d00001657sv0000103Csd0000169D* + ID_MODEL_FROM_DATABASE=NetXtreme BCM5719 Gigabit Ethernet PCIe (Ethernet 1Gb 4-port 331FLR Adapter) + pci:v000014E4d00001659* ID_MODEL_FROM_DATABASE=NetXtreme BCM5721 Gigabit Ethernet PCI Express @@ -47717,6 +47987,27 @@ pci:v000014E4d000043AA* pci:v000014E4d000043B1* ID_MODEL_FROM_DATABASE=BCM4352 802.11ac Wireless Network Adapter +pci:v000014E4d000043BA* + ID_MODEL_FROM_DATABASE=BCM43602 802.11ac Wireless LAN SoC + +pci:v000014E4d000043BB* + ID_MODEL_FROM_DATABASE=BCM43602 802.11ac Wireless LAN SoC + +pci:v000014E4d000043BC* + ID_MODEL_FROM_DATABASE=BCM43602 802.11ac Wireless LAN SoC + +pci:v000014E4d000043D3* + ID_MODEL_FROM_DATABASE=BCM43567 + +pci:v000014E4d000043D9* + ID_MODEL_FROM_DATABASE=BCM43570 + +pci:v000014E4d000043DF* + ID_MODEL_FROM_DATABASE=BCM4354 802.11ac Wireless LAN SoC + +pci:v000014E4d000043EC* + ID_MODEL_FROM_DATABASE=BCM4356 + pci:v000014E4d00004401* ID_MODEL_FROM_DATABASE=BCM4401 100Base-T @@ -48197,6 +48488,9 @@ pci:v000014F1d00001815sv00000E11sd00000022* pci:v000014F1d00001815sv00000E11sd00000042* ID_MODEL_FROM_DATABASE=HCF 56k Modem (Yogi) +pci:v000014F1d00001830* + ID_MODEL_FROM_DATABASE=CX861xx Integrated Host Bridge + pci:v000014F1d00002003* ID_MODEL_FROM_DATABASE=HSF 56k Data/Fax Modem @@ -48698,6 +48992,9 @@ pci:v000014F1d00008852sv00000070sd00008010* pci:v000014F1d00008852sv0000107Dsd00006F22* ID_MODEL_FROM_DATABASE=CX23885 PCI Video and Audio Decoder (WinFast PxTV1200) +pci:v000014F1d00008852sv000013C2sd00003013* + ID_MODEL_FROM_DATABASE=CX23885 PCI Video and Audio Decoder (TT-budget CT2-4500 CI) + pci:v000014F1d00008852sv00001461sd0000C039* ID_MODEL_FROM_DATABASE=CX23885 PCI Video and Audio Decoder (AVerTV Hybrid Express (A577)) @@ -48710,6 +49007,9 @@ pci:v000014F1d00008852sv000018ACsd0000DB78* pci:v000014F1d00008852sv00004254sd00009580* ID_MODEL_FROM_DATABASE=CX23885 PCI Video and Audio Decoder (T9580) +pci:v000014F1d00008852sv00004254sd0000980C* + ID_MODEL_FROM_DATABASE=CX23885 PCI Video and Audio Decoder (T980C) + pci:v000014F1d00008880* ID_MODEL_FROM_DATABASE=CX23887/8 PCIe Broadcast Audio and Video Decoder with 3D Comb @@ -49772,12 +50072,24 @@ pci:v000015B3d000001F6* pci:v000015B3d000001FF* ID_MODEL_FROM_DATABASE=MT27600 Family [Connect-IB Flash Recovery] +pci:v000015B3d00000209* + ID_MODEL_FROM_DATABASE=MT27700 Family [ConnectX-4 Flash Recovery] + pci:v000015B3d00001002* ID_MODEL_FROM_DATABASE=MT25400 Family [ConnectX-2 Virtual Function] pci:v000015B3d00001003* ID_MODEL_FROM_DATABASE=MT27500 Family [ConnectX-3] +pci:v000015B3d00001003sv0000103Csd00001777* + ID_MODEL_FROM_DATABASE=MT27500 Family [ConnectX-3] (InfiniBand FDR/EN 10/40Gb Dual Port 544FLR-QSFP Adapter (Rev Cx)) + +pci:v000015B3d00001003sv0000103Csd000017C9* + ID_MODEL_FROM_DATABASE=MT27500 Family [ConnectX-3] (Infiniband QDR/Ethernet 10Gb 2-port 544i Adapter) + +pci:v000015B3d00001003sv0000103Csd000018D6* + ID_MODEL_FROM_DATABASE=MT27500 Family [ConnectX-3] (InfiniBand FDR/EN 10/40Gb Dual Port 544QSFP Adapter) + pci:v000015B3d00001004* ID_MODEL_FROM_DATABASE=MT27500/MT27520 Family [ConnectX-3/ConnectX-3 Pro Virtual Function] @@ -49821,10 +50133,10 @@ pci:v000015B3d00001012* ID_MODEL_FROM_DATABASE=MT27600 Family [Connect-IB Virtual Function] pci:v000015B3d00001013* - ID_MODEL_FROM_DATABASE=MT27620 Family + ID_MODEL_FROM_DATABASE=MT27700 Family [ConnectX-4] pci:v000015B3d00001014* - ID_MODEL_FROM_DATABASE=MT27621 Family + ID_MODEL_FROM_DATABASE=MT27700 Family [ConnectX-4 Virtual Function] pci:v000015B3d00001015* ID_MODEL_FROM_DATABASE=MT27630 Family @@ -51200,6 +51512,9 @@ pci:v0000168Cd0000002D* pci:v0000168Cd0000002E* ID_MODEL_FROM_DATABASE=AR9287 Wireless Network Adapter (PCI-Express) +pci:v0000168Cd0000002Esv0000105Bsd0000E034* + ID_MODEL_FROM_DATABASE=AR9287 Wireless Network Adapter (PCI-Express) (T77H167.00) + pci:v0000168Cd00000030* ID_MODEL_FROM_DATABASE=AR93xx Wireless Network Adapter @@ -51755,6 +52070,9 @@ pci:v00001760d00000101* pci:v00001760d00000102* ID_MODEL_FROM_DATABASE=PCD-7104 Digital Input & Output PCI Card +pci:v00001760d00000303* + ID_MODEL_FROM_DATABASE=PCD-7006C Digital Input & Output PCI Card + pci:v00001771* ID_VENDOR_FROM_DATABASE=InnoVISION Multimedia Ltd. @@ -52415,6 +52733,12 @@ pci:v000017FEd00002220sv00001737sd00000029* pci:v000017FF* ID_VENDOR_FROM_DATABASE=Benq Corporation +pci:v00001800* + ID_VENDOR_FROM_DATABASE=Qualcore Logic Inc. + +pci:v00001800d00001100* + ID_MODEL_FROM_DATABASE=Nanospeed Trading Gateway + pci:v00001803* ID_VENDOR_FROM_DATABASE=ProdaSafe GmbH @@ -52800,11 +53124,14 @@ pci:v0000186Cd00000622* ID_MODEL_FROM_DATABASE=AD622 Data Acquisition Device pci:v0000186Cd00000624* - ID_MODEL_FROM_DATABASE=MF624 Multifunction I/O Card + ID_MODEL_FROM_DATABASE=MF624 Multifunction I/O PCI Card pci:v0000186Cd00000625* ID_MODEL_FROM_DATABASE=MF625 3-phase Motor Driver +pci:v0000186Cd00000634* + ID_MODEL_FROM_DATABASE=MF634 Multifunction I/O PCIe Card + pci:v0000186F* ID_VENDOR_FROM_DATABASE=WiNRADiO Communications @@ -53618,6 +53945,12 @@ pci:v00001924d00001803* pci:v00001924d00001813* ID_MODEL_FROM_DATABASE=SFL9021 Virtual Function [Solarstorm] +pci:v00001924d00001903* + ID_MODEL_FROM_DATABASE=SFC9120 Virtual Function + +pci:v00001924d00001923* + ID_MODEL_FROM_DATABASE=SFC9140 Virtual Function + pci:v00001924d00006703* ID_MODEL_FROM_DATABASE=SFC4000 rev A iSCSI/Onload [Solarstorm] @@ -53951,6 +54284,30 @@ pci:v00001957d00000408* pci:v00001957d00000409* ID_MODEL_FROM_DATABASE=P4040 +pci:v00001957d00000440* + ID_MODEL_FROM_DATABASE=T4240 with security + +pci:v00001957d00000441* + ID_MODEL_FROM_DATABASE=T4240 without security + +pci:v00001957d00000446* + ID_MODEL_FROM_DATABASE=T4160 with security + +pci:v00001957d00000447* + ID_MODEL_FROM_DATABASE=T4160 without security + +pci:v00001957d00000830* + ID_MODEL_FROM_DATABASE=T2080 with security + +pci:v00001957d00000831* + ID_MODEL_FROM_DATABASE=T2080 without security + +pci:v00001957d00000838* + ID_MODEL_FROM_DATABASE=T2081 with security + +pci:v00001957d00000839* + ID_MODEL_FROM_DATABASE=T2081 without security + pci:v00001957d0000580C* ID_MODEL_FROM_DATABASE=MPC5121e @@ -54801,7 +55158,7 @@ pci:v00001AEC* ID_VENDOR_FROM_DATABASE=Wolfson Microelectronics pci:v00001AED* - ID_VENDOR_FROM_DATABASE=Fusion-io + ID_VENDOR_FROM_DATABASE=SanDisk pci:v00001AEDd00001003* ID_MODEL_FROM_DATABASE=ioDimm3 (v1.2) @@ -55103,6 +55460,9 @@ pci:v00001B55d0000E5F4* pci:v00001B55d0000F1C4* ID_MODEL_FROM_DATABASE=Dual ASI-RX/TX-CI card +pci:v00001B66* + ID_VENDOR_FROM_DATABASE=Deltacast + pci:v00001B6F* ID_VENDOR_FROM_DATABASE=Etron Technology, Inc. @@ -55283,6 +55643,12 @@ pci:v00001C44* pci:v00001C44d00008000* ID_MODEL_FROM_DATABASE=8000 Storage IO Controller +pci:v00001C7E* + ID_VENDOR_FROM_DATABASE=TTTech Computertechnik AG + +pci:v00001C7Ed00000200* + ID_MODEL_FROM_DATABASE=zFAS Debug Port + pci:v00001C7F* ID_VENDOR_FROM_DATABASE=Elektrobit Austria GmbH @@ -55304,6 +55670,12 @@ pci:v00001CC5* pci:v00001CC5d00000100* ID_MODEL_FROM_DATABASE=CAN-PCIe-02 +pci:v00001CD2* + ID_VENDOR_FROM_DATABASE=SesKion GmbH + +pci:v00001CD2d00000301* + ID_MODEL_FROM_DATABASE=Simulyzer-RT CompactPCI Serial DIO-1 card + pci:v00001CE4* ID_VENDOR_FROM_DATABASE=Exablaze @@ -56972,6 +57344,15 @@ pci:v0000584D* pci:v00005851* ID_VENDOR_FROM_DATABASE=Exacq Technologies +pci:v00005851d00008008* + ID_MODEL_FROM_DATABASE=tDVR8008 8-port video capture card + +pci:v00005851d00008016* + ID_MODEL_FROM_DATABASE=tDVR8016 16-chan video capture card + +pci:v00005851d00008032* + ID_MODEL_FROM_DATABASE=tDVR8032 32-chan video capture card + pci:v00005853* ID_VENDOR_FROM_DATABASE=XenSource, Inc. @@ -57086,6 +57467,12 @@ pci:v00007063d00005500* pci:v00007284* ID_VENDOR_FROM_DATABASE=HT OMEGA Inc. +pci:v00007401* + ID_VENDOR_FROM_DATABASE=EndRun Technologies + +pci:v00007401d0000E100* + ID_MODEL_FROM_DATABASE=PTP3100 PCIe PTP Slave Clock + pci:v00007604* ID_VENDOR_FROM_DATABASE=O.N. Electronic Co Ltd. @@ -58007,15 +58394,27 @@ pci:v00008086d000008AFsv00008086sd00001017* pci:v00008086d000008B1* ID_MODEL_FROM_DATABASE=Wireless 7260 +pci:v00008086d000008B1sv00008086sd00004020* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-N 7260) + +pci:v00008086d000008B1sv00008086sd0000402A* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-N 7260) + pci:v00008086d000008B1sv00008086sd00004060* ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-N 7260) pci:v00008086d000008B1sv00008086sd00004062* ID_MODEL_FROM_DATABASE=Wireless 7260 (Wireless-N 7260) +pci:v00008086d000008B1sv00008086sd0000406A* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-N 7260) + pci:v00008086d000008B1sv00008086sd00004070* ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) +pci:v00008086d000008B1sv00008086sd00004072* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) + pci:v00008086d000008B1sv00008086sd00004160* ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-N 7260) @@ -58025,15 +58424,30 @@ pci:v00008086d000008B1sv00008086sd00004162* pci:v00008086d000008B1sv00008086sd00004170* ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) +pci:v00008086d000008B1sv00008086sd00004420* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-N 7260) + pci:v00008086d000008B1sv00008086sd00004460* ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-N 7260) pci:v00008086d000008B1sv00008086sd00004462* ID_MODEL_FROM_DATABASE=Wireless 7260 (Wireless-N 7260) +pci:v00008086d000008B1sv00008086sd0000446A* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-N 7260) + pci:v00008086d000008B1sv00008086sd00004470* ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) +pci:v00008086d000008B1sv00008086sd00004472* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) + +pci:v00008086d000008B1sv00008086sd00004560* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-N 7260) + +pci:v00008086d000008B1sv00008086sd00004570* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) + pci:v00008086d000008B1sv00008086sd0000486E* ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) @@ -58049,18 +58463,45 @@ pci:v00008086d000008B1sv00008086sd00004A6E* pci:v00008086d000008B1sv00008086sd00004A70* ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) +pci:v00008086d000008B1sv00008086sd00004C60* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) + +pci:v00008086d000008B1sv00008086sd00004C70* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) + +pci:v00008086d000008B1sv00008086sd00005070* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) + +pci:v00008086d000008B1sv00008086sd00005072* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) + +pci:v00008086d000008B1sv00008086sd00005170* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) + +pci:v00008086d000008B1sv00008086sd00005770* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) + pci:v00008086d000008B1sv00008086sd0000C020* ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-N 7260) +pci:v00008086d000008B1sv00008086sd0000C02A* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-N 7260) + pci:v00008086d000008B1sv00008086sd0000C060* ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-N 7260) pci:v00008086d000008B1sv00008086sd0000C062* ID_MODEL_FROM_DATABASE=Wireless 7260 (Wireless-N 7260) +pci:v00008086d000008B1sv00008086sd0000C06A* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-N 7260) + pci:v00008086d000008B1sv00008086sd0000C070* ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) +pci:v00008086d000008B1sv00008086sd0000C072* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) + pci:v00008086d000008B1sv00008086sd0000C160* ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-N 7260) @@ -58070,6 +58511,9 @@ pci:v00008086d000008B1sv00008086sd0000C162* pci:v00008086d000008B1sv00008086sd0000C170* ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) +pci:v00008086d000008B1sv00008086sd0000C360* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-N 7260) + pci:v00008086d000008B1sv00008086sd0000C420* ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-N 7260) @@ -58082,6 +58526,27 @@ pci:v00008086d000008B1sv00008086sd0000C462* pci:v00008086d000008B1sv00008086sd0000C470* ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) +pci:v00008086d000008B1sv00008086sd0000C472* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) + +pci:v00008086d000008B1sv00008086sd0000C560* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-N 7260) + +pci:v00008086d000008B1sv00008086sd0000C570* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) + +pci:v00008086d000008B1sv00008086sd0000C760* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-N 7260) + +pci:v00008086d000008B1sv00008086sd0000C770* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) + +pci:v00008086d000008B1sv00008086sd0000CC60* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) + +pci:v00008086d000008B1sv00008086sd0000CC70* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) + pci:v00008086d000008B2* ID_MODEL_FROM_DATABASE=Wireless 7260 @@ -58094,7 +58559,19 @@ pci:v00008086d000008B2sv00008086sd00004260* pci:v00008086d000008B2sv00008086sd00004262* ID_MODEL_FROM_DATABASE=Wireless 7260 (Wireless-N 7260) +pci:v00008086d000008B2sv00008086sd0000426A* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-N 7260) + pci:v00008086d000008B2sv00008086sd00004270* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Wireless-N 7260) + +pci:v00008086d000008B2sv00008086sd00004272* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) + +pci:v00008086d000008B2sv00008086sd00004360* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-N 7260) + +pci:v00008086d000008B2sv00008086sd00004370* ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) pci:v00008086d000008B2sv00008086sd0000C220* @@ -58106,9 +58583,18 @@ pci:v00008086d000008B2sv00008086sd0000C260* pci:v00008086d000008B2sv00008086sd0000C262* ID_MODEL_FROM_DATABASE=Wireless 7260 (Wireless-N 7260) +pci:v00008086d000008B2sv00008086sd0000C26A* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-N 7260) + pci:v00008086d000008B2sv00008086sd0000C270* ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) +pci:v00008086d000008B2sv00008086sd0000C272* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) + +pci:v00008086d000008B2sv00008086sd0000C370* + ID_MODEL_FROM_DATABASE=Wireless 7260 (Dual Band Wireless-AC 7260) + pci:v00008086d000008B3* ID_MODEL_FROM_DATABASE=Wireless 3160 @@ -58121,12 +58607,30 @@ pci:v00008086d000008B3sv00008086sd00000062* pci:v00008086d000008B3sv00008086sd00000070* ID_MODEL_FROM_DATABASE=Wireless 3160 (Dual Band Wireless-AC 3160) +pci:v00008086d000008B3sv00008086sd00000072* + ID_MODEL_FROM_DATABASE=Wireless 3160 (Dual Band Wireless-AC 3160) + pci:v00008086d000008B3sv00008086sd00000170* ID_MODEL_FROM_DATABASE=Wireless 3160 (Dual Band Wireless-AC 3160) +pci:v00008086d000008B3sv00008086sd00000172* + ID_MODEL_FROM_DATABASE=Wireless 3160 (Dual Band Wireless-AC 3160) + +pci:v00008086d000008B3sv00008086sd00000260* + ID_MODEL_FROM_DATABASE=Wireless 3160 (Dual Band Wireless-N 3160) + pci:v00008086d000008B3sv00008086sd00000470* ID_MODEL_FROM_DATABASE=Wireless 3160 (Dual Band Wireless-AC 3160) +pci:v00008086d000008B3sv00008086sd00000472* + ID_MODEL_FROM_DATABASE=Wireless 3160 (Dual Band Wireless-AC 3160) + +pci:v00008086d000008B3sv00008086sd00001070* + ID_MODEL_FROM_DATABASE=Wireless 3160 (Dual Band Wireless-AC 3160) + +pci:v00008086d000008B3sv00008086sd00001170* + ID_MODEL_FROM_DATABASE=Wireless 3160 (Dual Band Wireless-AC 3160) + pci:v00008086d000008B3sv00008086sd00008060* ID_MODEL_FROM_DATABASE=Wireless 3160 (Dual Band Wireless N-3160) @@ -58136,24 +58640,69 @@ pci:v00008086d000008B3sv00008086sd00008062* pci:v00008086d000008B3sv00008086sd00008070* ID_MODEL_FROM_DATABASE=Wireless 3160 (Dual Band Wireless AC 3160) +pci:v00008086d000008B3sv00008086sd00008072* + ID_MODEL_FROM_DATABASE=Wireless 3160 (Dual Band Wireless AC 3160) + pci:v00008086d000008B3sv00008086sd00008170* ID_MODEL_FROM_DATABASE=Wireless 3160 (Dual Band Wireless AC 3160) +pci:v00008086d000008B3sv00008086sd00008172* + ID_MODEL_FROM_DATABASE=Wireless 3160 (Dual Band Wireless AC 3160) + pci:v00008086d000008B3sv00008086sd00008470* ID_MODEL_FROM_DATABASE=Wireless 3160 (Dual Band Wireless AC 3160) +pci:v00008086d000008B3sv00008086sd00008570* + ID_MODEL_FROM_DATABASE=Wireless 3160 (Dual Band Wireless AC 3160) + pci:v00008086d000008B4* ID_MODEL_FROM_DATABASE=Wireless 3160 pci:v00008086d000008B4sv00008086sd00000270* ID_MODEL_FROM_DATABASE=Wireless 3160 (Dual Band Wireless-AC 3160) +pci:v00008086d000008B4sv00008086sd00000272* + ID_MODEL_FROM_DATABASE=Wireless 3160 (Dual Band Wireless-AC 3160) + +pci:v00008086d000008B4sv00008086sd00000370* + ID_MODEL_FROM_DATABASE=Wireless 3160 (Dual Band Wireless-AC 3160) + +pci:v00008086d000008B4sv00008086sd00008260* + ID_MODEL_FROM_DATABASE=Wireless 3160 (Dual Band Wireless AC 3160) + pci:v00008086d000008B4sv00008086sd00008270* ID_MODEL_FROM_DATABASE=Wireless 3160 (Dual Band Wireless AC 3160) +pci:v00008086d000008B4sv00008086sd00008272* + ID_MODEL_FROM_DATABASE=Wireless 3160 (Dual Band Wireless AC 3160) + +pci:v00008086d000008B4sv00008086sd00008370* + ID_MODEL_FROM_DATABASE=Wireless 3160 (Dual Band Wireless AC 3160) + pci:v00008086d000008CF* ID_MODEL_FROM_DATABASE=Atom Processor Z2760 Integrated Graphics Controller +pci:v00008086d00000953* + ID_MODEL_FROM_DATABASE=PCIe Data Center SSD + +pci:v00008086d00000953sv00008086sd00003702* + ID_MODEL_FROM_DATABASE=PCIe Data Center SSD (DC P3700 SSD) + +pci:v00008086d00000953sv00008086sd00003703* + ID_MODEL_FROM_DATABASE=PCIe Data Center SSD (DC P3700 SSD [2.5" SFF]) + +pci:v00008086d00000953sv00008086sd00003704* + ID_MODEL_FROM_DATABASE=PCIe Data Center SSD (DC P3500 SSD [Add-in Card]) + +pci:v00008086d00000953sv00008086sd00003705* + ID_MODEL_FROM_DATABASE=PCIe Data Center SSD (DC P3500 SSD [2.5" SFF]) + +pci:v00008086d00000953sv00008086sd00003709* + ID_MODEL_FROM_DATABASE=PCIe Data Center SSD (DC P3600 SSD [Add-in Card]) + +pci:v00008086d00000953sv00008086sd0000370A* + ID_MODEL_FROM_DATABASE=PCIe Data Center SSD (DC P3600 SSD [2.5" SFF]) + pci:v00008086d0000095A* ID_MODEL_FROM_DATABASE=Wireless 7265 @@ -58187,6 +58736,9 @@ pci:v00008086d0000095Asv00008086sd00005090* pci:v00008086d0000095Asv00008086sd00005100* ID_MODEL_FROM_DATABASE=Wireless 7265 (Dual Band Wireless-AC 7265) +pci:v00008086d0000095Asv00008086sd00005102* + ID_MODEL_FROM_DATABASE=Wireless 7265 (Wireless-N 7265) + pci:v00008086d0000095Asv00008086sd0000510A* ID_MODEL_FROM_DATABASE=Wireless 7265 (Dual Band Wireless-AC 7265) @@ -58205,15 +58757,27 @@ pci:v00008086d0000095Asv00008086sd00005400* pci:v00008086d0000095Asv00008086sd00005410* ID_MODEL_FROM_DATABASE=Wireless 7265 (Dual Band Wireless-AC 7265) +pci:v00008086d0000095Asv00008086sd00005412* + ID_MODEL_FROM_DATABASE=Wireless 7265 (Dual Band Wireless-AC 7265) + pci:v00008086d0000095Asv00008086sd00005420* ID_MODEL_FROM_DATABASE=Wireless 7265 (Dual Band Wireless-N 7265) pci:v00008086d0000095Asv00008086sd00005490* ID_MODEL_FROM_DATABASE=Wireless 7265 (Dual Band Wireless-AC 7265) +pci:v00008086d0000095Asv00008086sd00005510* + ID_MODEL_FROM_DATABASE=Wireless 7265 (Dual Band Wireless-AC 7265) + pci:v00008086d0000095Asv00008086sd00005590* ID_MODEL_FROM_DATABASE=Wireless 7265 (Dual Band Wireless-AC 7265) +pci:v00008086d0000095Asv00008086sd00009000* + ID_MODEL_FROM_DATABASE=Wireless 7265 (Dual Band Wireless-AC 7265) + +pci:v00008086d0000095Asv00008086sd0000900A* + ID_MODEL_FROM_DATABASE=Wireless 7265 (Dual Band Wireless-AC 7265) + pci:v00008086d0000095Asv00008086sd00009010* ID_MODEL_FROM_DATABASE=Wireless 7265 (Dual Band Wireless-AC 7265) @@ -58232,6 +58796,9 @@ pci:v00008086d0000095Asv00008086sd00009210* pci:v00008086d0000095Asv00008086sd00009310* ID_MODEL_FROM_DATABASE=Wireless 7265 (Dual Band Wireless-AC 7265) +pci:v00008086d0000095Asv00008086sd00009400* + ID_MODEL_FROM_DATABASE=Wireless 7265 (Dual Band Wireless-AC 7265) + pci:v00008086d0000095Asv00008086sd00009410* ID_MODEL_FROM_DATABASE=Wireless 7265 (Dual Band Wireless-AC 7265) @@ -58247,18 +58814,27 @@ pci:v00008086d0000095Bsv00008086sd00005200* pci:v00008086d0000095Bsv00008086sd00005202* ID_MODEL_FROM_DATABASE=Wireless 7265 (Wireless-N 7265) +pci:v00008086d0000095Bsv00008086sd0000520A* + ID_MODEL_FROM_DATABASE=Wireless 7265 (Dual Band Wireless-N 7265) + pci:v00008086d0000095Bsv00008086sd00005210* ID_MODEL_FROM_DATABASE=Wireless 7265 (Dual Band Wireless-AC 7265) +pci:v00008086d0000095Bsv00008086sd00005212* + ID_MODEL_FROM_DATABASE=Wireless 7265 (Dual Band Wireless-AC 7265) + pci:v00008086d0000095Bsv00008086sd00005290* ID_MODEL_FROM_DATABASE=Wireless 7265 (Dual Band Wireless-AC 7265) pci:v00008086d0000095Bsv00008086sd00005302* - ID_MODEL_FROM_DATABASE=Wireless 7265 (Dual Band Wireless-AC 7265) + ID_MODEL_FROM_DATABASE=Wireless 7265 (Wireless-N 7265) pci:v00008086d0000095Bsv00008086sd00005310* ID_MODEL_FROM_DATABASE=Wireless 7265 (Dual Band Wireless-AC 7265) +pci:v00008086d0000095Bsv00008086sd00009200* + ID_MODEL_FROM_DATABASE=Wireless 7265 (Dual Band Wireless-AC 7265) + pci:v00008086d00000960* ID_MODEL_FROM_DATABASE=80960RP (i960RP) Microprocessor/Bridge @@ -60170,6 +60746,9 @@ pci:v00008086d000010CE* pci:v00008086d000010D3* ID_MODEL_FROM_DATABASE=82574L Gigabit Network Connection +pci:v00008086d000010D3sv0000103Csd00001785* + ID_MODEL_FROM_DATABASE=82574L Gigabit Network Connection (NC112i 1-port Ethernet Server Adapter) + pci:v00008086d000010D3sv0000103Csd00003250* ID_MODEL_FROM_DATABASE=82574L Gigabit Network Connection (NC112T PCI Express single Port Gigabit Server Adapter) @@ -61424,6 +62003,9 @@ pci:v00008086d00001533sv00001093sd00007706* pci:v00008086d00001533sv000010A9sd0000802C* ID_MODEL_FROM_DATABASE=I210 Gigabit Network Connection (UV300 BaseIO single-port GbE) +pci:v00008086d00001533sv000010A9sd0000802D* + ID_MODEL_FROM_DATABASE=I210 Gigabit Network Connection (UV3000 BaseIO GbE Network) + pci:v00008086d00001533sv000017AAsd00001100* ID_MODEL_FROM_DATABASE=I210 Gigabit Network Connection (ThinkServer Ethernet Server Adapter) @@ -61541,6 +62123,12 @@ pci:v00008086d00001572* pci:v00008086d00001572sv00001028sd00001F99* ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (Ethernet 10G 4P X710/I350 rNDC) +pci:v00008086d00001572sv000017AAsd00000000* + ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (ThinkServer XL710 AnyFabric) + +pci:v00008086d00001572sv000017AAsd00004001* + ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (ThinkServer XL710-4 AnyFabric) + pci:v00008086d00001572sv00008086sd00000000* ID_MODEL_FROM_DATABASE=Ethernet Controller X710 for 10GbE SFP+ (Ethernet Converged Network Adapter X710) @@ -61742,6 +62330,63 @@ pci:v00008086d0000163D* pci:v00008086d0000163E* ID_MODEL_FROM_DATABASE=Broadwell-U Integrated Graphics +pci:v00008086d00001900* + ID_MODEL_FROM_DATABASE=Sky Lake Host Bridge/DRAM Registers + +pci:v00008086d00001901* + ID_MODEL_FROM_DATABASE=Sky Lake PCIe Controller (x16) + +pci:v00008086d00001904* + ID_MODEL_FROM_DATABASE=Sky Lake Host Bridge/DRAM Registers + +pci:v00008086d00001905* + ID_MODEL_FROM_DATABASE=Sky Lake PCIe Controller (x8) + +pci:v00008086d00001908* + ID_MODEL_FROM_DATABASE=Sky Lake Host Bridge/DRAM Registers + +pci:v00008086d00001909* + ID_MODEL_FROM_DATABASE=Sky Lake PCIe Controller (x4) + +pci:v00008086d0000190C* + ID_MODEL_FROM_DATABASE=Sky Lake Host Bridge/DRAM Registers + +pci:v00008086d0000190F* + ID_MODEL_FROM_DATABASE=Sky Lake Host Bridge/DRAM Registers + +pci:v00008086d00001910* + ID_MODEL_FROM_DATABASE=Sky Lake Host Bridge/DRAM Registers + +pci:v00008086d00001911* + ID_MODEL_FROM_DATABASE=Sky Lake Gaussian Mixture Model + +pci:v00008086d00001912* + ID_MODEL_FROM_DATABASE=Sky Lake Integrated Graphics + +pci:v00008086d00001916* + ID_MODEL_FROM_DATABASE=Sky Lake Integrated Graphics + +pci:v00008086d00001918* + ID_MODEL_FROM_DATABASE=Sky Lake Host Bridge/DRAM Registers + +pci:v00008086d00001919* + ID_MODEL_FROM_DATABASE=Sky Lake Imaging Unit + +pci:v00008086d0000191E* + ID_MODEL_FROM_DATABASE=Sky Lake Integrated Graphics + +pci:v00008086d0000191F* + ID_MODEL_FROM_DATABASE=Sky Lake Host Bridge/DRAM Registers + +pci:v00008086d00001926* + ID_MODEL_FROM_DATABASE=Sky Lake Integrated Graphics + +pci:v00008086d00001932* + ID_MODEL_FROM_DATABASE=Sky Lake Integrated Graphics + +pci:v00008086d0000193B* + ID_MODEL_FROM_DATABASE=Sky Lake Integrated Graphics + pci:v00008086d00001960* ID_MODEL_FROM_DATABASE=80960RP (i960RP) Microprocessor @@ -61907,6 +62552,9 @@ pci:v00008086d00001C03sv00008086sd00007270* pci:v00008086d00001C04* ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family SATA RAID Controller +pci:v00008086d00001C04sv0000103Csd00003118* + ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family SATA RAID Controller (Smart Array B110i SATA RAID Controller) + pci:v00008086d00001C05* ID_MODEL_FROM_DATABASE=6 Series/C200 Series Chipset Family SATA RAID Controller @@ -62945,6 +63593,114 @@ pci:v00008086d00001F44* pci:v00008086d00001F45* ID_MODEL_FROM_DATABASE=Ethernet Connection I354 2.5 GbE Backplane +pci:v00008086d00002014* + ID_MODEL_FROM_DATABASE=Sky Lake-E Ubox Registers + +pci:v00008086d00002015* + ID_MODEL_FROM_DATABASE=Sky Lake-E Ubox Registers + +pci:v00008086d00002016* + ID_MODEL_FROM_DATABASE=Sky Lake-E Ubox Registers + +pci:v00008086d00002018* + ID_MODEL_FROM_DATABASE=Sky Lake-E M2PCI Registers + +pci:v00008086d0000201A* + ID_MODEL_FROM_DATABASE=Sky Lake-E Non-Transparent Bridge Registers + +pci:v00008086d0000201C* + ID_MODEL_FROM_DATABASE=Sky Lake-E Non-Transparent Bridge Registers + +pci:v00008086d00002021* + ID_MODEL_FROM_DATABASE=Sky Lake-E CBDMA Registers + +pci:v00008086d00002024* + ID_MODEL_FROM_DATABASE=Sky Lake-E MM/Vt-d Configuration Registers + +pci:v00008086d00002030* + ID_MODEL_FROM_DATABASE=Sky Lake-E PCI Express Root Port 1A + +pci:v00008086d00002031* + ID_MODEL_FROM_DATABASE=Sky Lake-E PCI Express Root Port 1B + +pci:v00008086d00002032* + ID_MODEL_FROM_DATABASE=Sky Lake-E PCI Express Root Port 1C + +pci:v00008086d00002033* + ID_MODEL_FROM_DATABASE=Sky Lake-E PCI Express Root Port 1D + +pci:v00008086d00002035* + ID_MODEL_FROM_DATABASE=Sky Lake-E RAS Configuration Registers + +pci:v00008086d0000204C* + ID_MODEL_FROM_DATABASE=Sky Lake-E M3KTI Registers + +pci:v00008086d0000204D* + ID_MODEL_FROM_DATABASE=Sky Lake-E M3KTI Registers + +pci:v00008086d0000204E* + ID_MODEL_FROM_DATABASE=Sky Lake-E M3KTI Registers + +pci:v00008086d00002054* + ID_MODEL_FROM_DATABASE=Sky Lake-E CHA Registers + +pci:v00008086d00002055* + ID_MODEL_FROM_DATABASE=Sky Lake-E CHA Registers + +pci:v00008086d00002056* + ID_MODEL_FROM_DATABASE=Sky Lake-E CHA Registers + +pci:v00008086d00002057* + ID_MODEL_FROM_DATABASE=Sky Lake-E CHA Registers + +pci:v00008086d00002068* + ID_MODEL_FROM_DATABASE=Sky Lake-E DDRIO Registers + +pci:v00008086d00002069* + ID_MODEL_FROM_DATABASE=Sky Lake-E DDRIO Registers + +pci:v00008086d0000206A* + ID_MODEL_FROM_DATABASE=Sky Lake-E IOxAPIC Configuration Registers + +pci:v00008086d0000206E* + ID_MODEL_FROM_DATABASE=Sky Lake-E DDRIO Registers + +pci:v00008086d0000206F* + ID_MODEL_FROM_DATABASE=Sky Lake-E DDRIO Registers + +pci:v00008086d00002078* + ID_MODEL_FROM_DATABASE=Sky Lake-E PCU Registers + +pci:v00008086d0000207A* + ID_MODEL_FROM_DATABASE=Sky Lake-E PCU Registers + +pci:v00008086d00002080* + ID_MODEL_FROM_DATABASE=Sky Lake-E PCU Registers + +pci:v00008086d00002081* + ID_MODEL_FROM_DATABASE=Sky Lake-E PCU Registers + +pci:v00008086d00002082* + ID_MODEL_FROM_DATABASE=Sky Lake-E PCU Registers + +pci:v00008086d00002083* + ID_MODEL_FROM_DATABASE=Sky Lake-E PCU Registers + +pci:v00008086d00002084* + ID_MODEL_FROM_DATABASE=Sky Lake-E PCU Registers + +pci:v00008086d00002085* + ID_MODEL_FROM_DATABASE=Sky Lake-E PCU Registers + +pci:v00008086d00002086* + ID_MODEL_FROM_DATABASE=Sky Lake-E PCU Registers + +pci:v00008086d0000208D* + ID_MODEL_FROM_DATABASE=Sky Lake-E CHA Registers + +pci:v00008086d0000208E* + ID_MODEL_FROM_DATABASE=Sky Lake-E CHA Registers + pci:v00008086d00002250* ID_MODEL_FROM_DATABASE=Xeon Phi coprocessor 5100 series @@ -67419,16 +68175,16 @@ pci:v00008086d00002821* ID_MODEL_FROM_DATABASE=82801HR/HO/HH (ICH8R/DO/DH) 6 port SATA Controller [AHCI mode] pci:v00008086d00002822* - ID_MODEL_FROM_DATABASE=82801 SATA Controller [RAID mode] + ID_MODEL_FROM_DATABASE=SATA Controller [RAID mode] pci:v00008086d00002822sv00001028sd0000020D* - ID_MODEL_FROM_DATABASE=82801 SATA Controller [RAID mode] (Inspiron 530) + ID_MODEL_FROM_DATABASE=SATA Controller [RAID mode] (Inspiron 530) pci:v00008086d00002822sv0000103Csd00002A6F* - ID_MODEL_FROM_DATABASE=82801 SATA Controller [RAID mode] (Asus IPIBL-LB Motherboard) + ID_MODEL_FROM_DATABASE=SATA Controller [RAID mode] (Asus IPIBL-LB Motherboard) pci:v00008086d00002823* - ID_MODEL_FROM_DATABASE=Wellsburg sSATA RAID Controller + ID_MODEL_FROM_DATABASE=C610/X99 series chipset sSATA Controller [RAID mode] pci:v00008086d00002824* ID_MODEL_FROM_DATABASE=82801HB (ICH8) 4 port SATA Controller [AHCI mode] @@ -67449,7 +68205,7 @@ pci:v00008086d00002826* ID_MODEL_FROM_DATABASE=C600/X79 series chipset SATA RAID Controller pci:v00008086d00002827* - ID_MODEL_FROM_DATABASE=Wellsburg sSATA RAID Controller + ID_MODEL_FROM_DATABASE=C610/X99 series chipset sSATA Controller [RAID mode] pci:v00008086d00002828* ID_MODEL_FROM_DATABASE=82801HM/HEM (ICH8M/ICH8M-E) SATA Controller [IDE mode] @@ -69840,481 +70596,490 @@ pci:v00008086d00002E96* ID_MODEL_FROM_DATABASE=4 Series Chipset PT IDER Controller pci:v00008086d00002F00* - ID_MODEL_FROM_DATABASE=Haswell-E DMI2 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 DMI2 pci:v00008086d00002F01* - ID_MODEL_FROM_DATABASE=Haswell-E PCI Express Root Port 0 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 PCI Express Root Port 0 pci:v00008086d00002F02* - ID_MODEL_FROM_DATABASE=Haswell-E PCI Express Root Port 1 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 PCI Express Root Port 1 pci:v00008086d00002F03* - ID_MODEL_FROM_DATABASE=Haswell-E PCI Express Root Port 1 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 PCI Express Root Port 1 pci:v00008086d00002F04* - ID_MODEL_FROM_DATABASE=Haswell-E PCI Express Root Port 2 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 PCI Express Root Port 2 pci:v00008086d00002F05* - ID_MODEL_FROM_DATABASE=Haswell-E PCI Express Root Port 2 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 PCI Express Root Port 2 pci:v00008086d00002F06* - ID_MODEL_FROM_DATABASE=Haswell-E PCI Express Root Port 2 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 PCI Express Root Port 2 pci:v00008086d00002F07* - ID_MODEL_FROM_DATABASE=Haswell-E PCI Express Root Port 2 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 PCI Express Root Port 2 pci:v00008086d00002F08* - ID_MODEL_FROM_DATABASE=Haswell-E PCI Express Root Port 3 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 PCI Express Root Port 3 pci:v00008086d00002F09* - ID_MODEL_FROM_DATABASE=Haswell-E PCI Express Root Port 3 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 PCI Express Root Port 3 pci:v00008086d00002F0A* - ID_MODEL_FROM_DATABASE=Haswell-E PCI Express Root Port 3 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 PCI Express Root Port 3 pci:v00008086d00002F0B* - ID_MODEL_FROM_DATABASE=Haswell-E PCI Express Root Port 3 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 PCI Express Root Port 3 pci:v00008086d00002F10* - ID_MODEL_FROM_DATABASE=Haswell-E IIO Debug + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 IIO Debug pci:v00008086d00002F11* - ID_MODEL_FROM_DATABASE=Haswell-E IIO Debug + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 IIO Debug pci:v00008086d00002F12* - ID_MODEL_FROM_DATABASE=Haswell-E IIO Debug + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 IIO Debug pci:v00008086d00002F13* - ID_MODEL_FROM_DATABASE=Haswell-E IIO Debug + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 IIO Debug pci:v00008086d00002F14* - ID_MODEL_FROM_DATABASE=Haswell-E IIO Debug + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 IIO Debug pci:v00008086d00002F15* - ID_MODEL_FROM_DATABASE=Haswell-E IIO Debug + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 IIO Debug pci:v00008086d00002F16* - ID_MODEL_FROM_DATABASE=Haswell-E IIO Debug + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 IIO Debug pci:v00008086d00002F17* - ID_MODEL_FROM_DATABASE=Haswell-E IIO Debug + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 IIO Debug pci:v00008086d00002F18* - ID_MODEL_FROM_DATABASE=Haswell-E IIO Debug + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 IIO Debug pci:v00008086d00002F19* - ID_MODEL_FROM_DATABASE=Haswell-E IIO Debug + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 IIO Debug pci:v00008086d00002F1A* - ID_MODEL_FROM_DATABASE=Haswell-E IIO Debug + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 IIO Debug pci:v00008086d00002F1B* - ID_MODEL_FROM_DATABASE=Haswell-E IIO Debug + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 IIO Debug pci:v00008086d00002F1C* - ID_MODEL_FROM_DATABASE=Haswell-E IIO Debug + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 IIO Debug pci:v00008086d00002F1D* - ID_MODEL_FROM_DATABASE=Haswell-E PCIe Ring Interface + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 PCIe Ring Interface pci:v00008086d00002F1E* - ID_MODEL_FROM_DATABASE=Haswell-E Scratchpad & Semaphore Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Scratchpad & Semaphore Registers pci:v00008086d00002F1F* - ID_MODEL_FROM_DATABASE=Haswell-E Scratchpad & Semaphore Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Scratchpad & Semaphore Registers pci:v00008086d00002F20* - ID_MODEL_FROM_DATABASE=Haswell-E DMA Channel 0 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 DMA Channel 0 pci:v00008086d00002F21* - ID_MODEL_FROM_DATABASE=Haswell-E DMA Channel 1 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 DMA Channel 1 pci:v00008086d00002F22* - ID_MODEL_FROM_DATABASE=Haswell-E DMA Channel 2 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 DMA Channel 2 pci:v00008086d00002F23* - ID_MODEL_FROM_DATABASE=Haswell-E DMA Channel 3 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 DMA Channel 3 pci:v00008086d00002F24* - ID_MODEL_FROM_DATABASE=Haswell-E DMA Channel 4 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 DMA Channel 4 pci:v00008086d00002F25* - ID_MODEL_FROM_DATABASE=Haswell-E DMA Channel 5 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 DMA Channel 5 pci:v00008086d00002F26* - ID_MODEL_FROM_DATABASE=Haswell-E DMA Channel 6 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 DMA Channel 6 pci:v00008086d00002F27* - ID_MODEL_FROM_DATABASE=Haswell-E DMA Channel 7 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 DMA Channel 7 pci:v00008086d00002F28* - ID_MODEL_FROM_DATABASE=Haswell-E Address Map, VTd_Misc, System Management + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Address Map, VTd_Misc, System Management pci:v00008086d00002F29* - ID_MODEL_FROM_DATABASE=Haswell-E Hot Plug + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Hot Plug pci:v00008086d00002F2A* - ID_MODEL_FROM_DATABASE=Haswell-E RAS, Control Status and Global Errors + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 RAS, Control Status and Global Errors pci:v00008086d00002F2C* - ID_MODEL_FROM_DATABASE=Haswell-E I/O Apic + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 I/O APIC pci:v00008086d00002F2E* - ID_MODEL_FROM_DATABASE=Haswell-E RAID 5/6 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 RAID 5/6 pci:v00008086d00002F2F* - ID_MODEL_FROM_DATABASE=Haswell-E RAID 5/6 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 RAID 5/6 pci:v00008086d00002F30* - ID_MODEL_FROM_DATABASE=Haswell-E Home Agent 0 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Home Agent 0 pci:v00008086d00002F32* - ID_MODEL_FROM_DATABASE=Haswell-E QPI Link 0 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 QPI Link 0 pci:v00008086d00002F33* - ID_MODEL_FROM_DATABASE=Haswell-E QPI Link 1 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 QPI Link 1 pci:v00008086d00002F34* - ID_MODEL_FROM_DATABASE=Haswell-E PCIe Ring Interface + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 PCIe Ring Interface pci:v00008086d00002F36* - ID_MODEL_FROM_DATABASE=Haswell-E R3 QPI Link 0 & 1 Monitoring + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 R3 QPI Link 0 & 1 Monitoring pci:v00008086d00002F37* - ID_MODEL_FROM_DATABASE=Haswell-E R3 QPI Link 0 & 1 Monitoring + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 R3 QPI Link 0 & 1 Monitoring pci:v00008086d00002F38* - ID_MODEL_FROM_DATABASE=Haswell-E Home Agent 1 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Home Agent 1 pci:v00008086d00002F39* - ID_MODEL_FROM_DATABASE=Haswell-E I/O Performance Monitoring + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 I/O Performance Monitoring pci:v00008086d00002F3A* - ID_MODEL_FROM_DATABASE=Haswell-E QPI Link 2 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 QPI Link 2 pci:v00008086d00002F3E* - ID_MODEL_FROM_DATABASE=Haswell-E R3 QPI Link 2 Monitoring + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 R3 QPI Link 2 Monitoring pci:v00008086d00002F3F* - ID_MODEL_FROM_DATABASE=Haswell-E R3 QPI Link 2 Monitoring + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 R3 QPI Link 2 Monitoring pci:v00008086d00002F40* - ID_MODEL_FROM_DATABASE=Haswell-E QPI Link 2 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 QPI Link 2 pci:v00008086d00002F41* - ID_MODEL_FROM_DATABASE=Haswell-E R3 QPI Link 2 Monitoring + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 R3 QPI Link 2 Monitoring pci:v00008086d00002F43* - ID_MODEL_FROM_DATABASE=Haswell-E QPI Link 2 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 QPI Link 2 pci:v00008086d00002F45* - ID_MODEL_FROM_DATABASE=Haswell-E QPI Link 2 Debug + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 QPI Link 2 Debug pci:v00008086d00002F46* - ID_MODEL_FROM_DATABASE=Haswell-E QPI Link 2 Debug + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 QPI Link 2 Debug pci:v00008086d00002F47* - ID_MODEL_FROM_DATABASE=Haswell-E QPI Link 2 Debug + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 QPI Link 2 Debug pci:v00008086d00002F60* - ID_MODEL_FROM_DATABASE=Haswell-E Home Agent 1 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Home Agent 1 pci:v00008086d00002F68* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 1 Target Address, Thermal & RAS Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 1 Target Address, Thermal & RAS Registers pci:v00008086d00002F6A* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 1 Channel Target Address Decoder + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 1 Channel Target Address Decoder pci:v00008086d00002F6B* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 1 Channel Target Address Decoder + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 1 Channel Target Address Decoder pci:v00008086d00002F6C* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 1 Channel Target Address Decoder + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 1 Channel Target Address Decoder pci:v00008086d00002F6D* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 1 Channel Target Address Decoder + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 1 Channel Target Address Decoder pci:v00008086d00002F6E* - ID_MODEL_FROM_DATABASE=Haswell-E DDRIO Channel 2/3 Broadcast + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 DDRIO Channel 2/3 Broadcast pci:v00008086d00002F6F* - ID_MODEL_FROM_DATABASE=Haswell-E DDRIO Global Broadcast + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 DDRIO Global Broadcast pci:v00008086d00002F70* - ID_MODEL_FROM_DATABASE=Haswell-E Home Agent 0 Debug + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Home Agent 0 Debug pci:v00008086d00002F71* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 0 Target Address, Thermal & RAS Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 0 Target Address, Thermal & RAS Registers pci:v00008086d00002F76* - ID_MODEL_FROM_DATABASE=Haswell-E E3 QPI Link Debug + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 E3 QPI Link Debug pci:v00008086d00002F78* - ID_MODEL_FROM_DATABASE=Haswell-E Home Agent 1 Debug + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Home Agent 1 Debug pci:v00008086d00002F79* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 1 Target Address, Thermal & RAS Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 1 Target Address, Thermal & RAS Registers pci:v00008086d00002F7D* - ID_MODEL_FROM_DATABASE=Haswell-E Scratchpad & Semaphore Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Scratchpad & Semaphore Registers pci:v00008086d00002F7E* - ID_MODEL_FROM_DATABASE=Haswell-E E3 QPI Link Debug + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 E3 QPI Link Debug pci:v00008086d00002F80* - ID_MODEL_FROM_DATABASE=Haswell-E QPI Link 0 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 QPI Link 0 pci:v00008086d00002F81* - ID_MODEL_FROM_DATABASE=Haswell-E R3 QPI Link 0 & 1 Monitoring + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 R3 QPI Link 0 & 1 Monitoring pci:v00008086d00002F83* - ID_MODEL_FROM_DATABASE=Haswell-E QPI Link 0 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 QPI Link 0 pci:v00008086d00002F85* - ID_MODEL_FROM_DATABASE=Haswell-E QPI Link 0 Debug + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 QPI Link 0 Debug pci:v00008086d00002F86* - ID_MODEL_FROM_DATABASE=Haswell-E QPI Link 0 Debug + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 QPI Link 0 Debug pci:v00008086d00002F87* - ID_MODEL_FROM_DATABASE=Haswell-E QPI Link 0 Debug + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 QPI Link 0 Debug pci:v00008086d00002F88* - ID_MODEL_FROM_DATABASE=Haswell-E VCU + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 VCU pci:v00008086d00002F8A* - ID_MODEL_FROM_DATABASE=Haswell-E VCU + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 VCU pci:v00008086d00002F90* - ID_MODEL_FROM_DATABASE=Haswell-E QPI Link 1 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 QPI Link 1 pci:v00008086d00002F93* - ID_MODEL_FROM_DATABASE=Haswell-E QPI Link 1 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 QPI Link 1 pci:v00008086d00002F95* - ID_MODEL_FROM_DATABASE=Haswell-E QPI Link 1 Debug + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 QPI Link 1 Debug pci:v00008086d00002F96* - ID_MODEL_FROM_DATABASE=Haswell-E QPI Link 1 Debug + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 QPI Link 1 Debug pci:v00008086d00002F98* - ID_MODEL_FROM_DATABASE=Haswell-E Power Control Unit + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Power Control Unit pci:v00008086d00002F99* - ID_MODEL_FROM_DATABASE=Haswell-E Power Control Unit + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Power Control Unit pci:v00008086d00002F9A* - ID_MODEL_FROM_DATABASE=Haswell-E Power Control Unit + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Power Control Unit pci:v00008086d00002F9C* - ID_MODEL_FROM_DATABASE=Haswell-E Power Control Unit + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Power Control Unit pci:v00008086d00002FA0* - ID_MODEL_FROM_DATABASE=Haswell-E Home Agent 0 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Home Agent 0 pci:v00008086d00002FA8* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 0 Target Address, Thermal & RAS Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 0 Target Address, Thermal & RAS Registers pci:v00008086d00002FAA* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 0 Channel Target Address Decoder + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 0 Channel Target Address Decoder pci:v00008086d00002FAB* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 0 Channel Target Address Decoder + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 0 Channel Target Address Decoder pci:v00008086d00002FAC* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 0 Channel Target Address Decoder + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 0 Channel Target Address Decoder pci:v00008086d00002FAD* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 0 Channel Target Address Decoder + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 0 Channel Target Address Decoder pci:v00008086d00002FAE* - ID_MODEL_FROM_DATABASE=Haswell-E DDRIO Channel 0/1 Broadcast + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 DDRIO Channel 0/1 Broadcast pci:v00008086d00002FAF* - ID_MODEL_FROM_DATABASE=Haswell-E DDRIO Global Broadcast + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 DDRIO Global Broadcast pci:v00008086d00002FB0* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 0 Channel 0 Thermal Control + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 0 Channel 0 Thermal Control pci:v00008086d00002FB1* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 0 Channel 1 Thermal Control + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 0 Channel 1 Thermal Control pci:v00008086d00002FB2* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 0 Channel 0 ERROR Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 0 Channel 0 ERROR Registers pci:v00008086d00002FB3* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 0 Channel 1 ERROR Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 0 Channel 1 ERROR Registers pci:v00008086d00002FB4* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 0 Channel 2 Thermal Control + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 0 Channel 2 Thermal Control pci:v00008086d00002FB5* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 0 Channel 3 Thermal Control + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 0 Channel 3 Thermal Control pci:v00008086d00002FB6* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 0 Channel 2 ERROR Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 0 Channel 2 ERROR Registers pci:v00008086d00002FB7* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 0 Channel 3 ERROR Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 0 Channel 3 ERROR Registers pci:v00008086d00002FB8* - ID_MODEL_FROM_DATABASE=Haswell-E DDRIO (VMSE) 2 & 3 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 DDRIO (VMSE) 2 & 3 pci:v00008086d00002FB9* - ID_MODEL_FROM_DATABASE=Haswell-E DDRIO (VMSE) 2 & 3 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 DDRIO (VMSE) 2 & 3 pci:v00008086d00002FBA* - ID_MODEL_FROM_DATABASE=Haswell-E DDRIO (VMSE) 2 & 3 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 DDRIO (VMSE) 2 & 3 pci:v00008086d00002FBB* - ID_MODEL_FROM_DATABASE=Haswell-E DDRIO (VMSE) 2 & 3 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 DDRIO (VMSE) 2 & 3 pci:v00008086d00002FBC* - ID_MODEL_FROM_DATABASE=Haswell-E DDRIO (VMSE) 0 & 1 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 DDRIO (VMSE) 0 & 1 pci:v00008086d00002FBD* - ID_MODEL_FROM_DATABASE=Haswell-E DDRIO (VMSE) 0 & 1 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 DDRIO (VMSE) 0 & 1 pci:v00008086d00002FBE* - ID_MODEL_FROM_DATABASE=Haswell-E DDRIO (VMSE) 0 & 1 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 DDRIO (VMSE) 0 & 1 pci:v00008086d00002FBF* - ID_MODEL_FROM_DATABASE=Haswell-E DDRIO (VMSE) 0 & 1 + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 DDRIO (VMSE) 0 & 1 pci:v00008086d00002FC0* - ID_MODEL_FROM_DATABASE=Haswell-E Power Control Unit + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Power Control Unit pci:v00008086d00002FC1* - ID_MODEL_FROM_DATABASE=Haswell-E Power Control Unit + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Power Control Unit pci:v00008086d00002FC2* - ID_MODEL_FROM_DATABASE=Haswell-E Power Control Unit + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Power Control Unit pci:v00008086d00002FC3* - ID_MODEL_FROM_DATABASE=Haswell-E Power Control Unit + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Power Control Unit pci:v00008086d00002FC4* - ID_MODEL_FROM_DATABASE=Haswell-E Power Control Unit + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Power Control Unit pci:v00008086d00002FC5* - ID_MODEL_FROM_DATABASE=Haswell-E Power Control Unit + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Power Control Unit pci:v00008086d00002FD0* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 1 Channel 0 Thermal Control + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 1 Channel 0 Thermal Control pci:v00008086d00002FD1* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 1 Channel 1 Thermal Control + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 1 Channel 1 Thermal Control pci:v00008086d00002FD2* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 1 Channel 0 ERROR Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 1 Channel 0 ERROR Registers pci:v00008086d00002FD3* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 1 Channel 1 ERROR Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 1 Channel 1 ERROR Registers pci:v00008086d00002FD4* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 1 Channel 2 Thermal Control + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 1 Channel 2 Thermal Control pci:v00008086d00002FD5* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 1 Channel 3 Thermal Control + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 1 Channel 3 Thermal Control pci:v00008086d00002FD6* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 1 Channel 2 ERROR Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 1 Channel 2 ERROR Registers pci:v00008086d00002FD7* - ID_MODEL_FROM_DATABASE=Haswell-E Integrated Memory Controller 1 Channel 3 ERROR Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Integrated Memory Controller 1 Channel 3 ERROR Registers pci:v00008086d00002FE0* - ID_MODEL_FROM_DATABASE=Haswell-E Unicast Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Unicast Registers pci:v00008086d00002FE1* - ID_MODEL_FROM_DATABASE=Haswell-E Unicast Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Unicast Registers pci:v00008086d00002FE2* - ID_MODEL_FROM_DATABASE=Haswell-E Unicast Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Unicast Registers pci:v00008086d00002FE3* - ID_MODEL_FROM_DATABASE=Haswell-E Unicast Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Unicast Registers pci:v00008086d00002FE4* - ID_MODEL_FROM_DATABASE=Haswell-E Unicast Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Unicast Registers pci:v00008086d00002FE5* - ID_MODEL_FROM_DATABASE=Haswell-E Unicast Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Unicast Registers pci:v00008086d00002FE6* - ID_MODEL_FROM_DATABASE=Haswell-E Unicast Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Unicast Registers pci:v00008086d00002FE7* - ID_MODEL_FROM_DATABASE=Haswell-E Unicast Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Unicast Registers pci:v00008086d00002FE8* - ID_MODEL_FROM_DATABASE=Haswell-E Unicast Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Unicast Registers pci:v00008086d00002FE9* - ID_MODEL_FROM_DATABASE=Haswell-E Unicast Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Unicast Registers pci:v00008086d00002FEA* - ID_MODEL_FROM_DATABASE=Haswell-E Unicast Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Unicast Registers pci:v00008086d00002FEB* - ID_MODEL_FROM_DATABASE=Haswell-E Unicast Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Unicast Registers pci:v00008086d00002FEC* - ID_MODEL_FROM_DATABASE=Haswell-E Unicast Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Unicast Registers pci:v00008086d00002FED* - ID_MODEL_FROM_DATABASE=Haswell-E Unicast Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Unicast Registers pci:v00008086d00002FEE* - ID_MODEL_FROM_DATABASE=Haswell-E Unicast Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Unicast Registers pci:v00008086d00002FEF* - ID_MODEL_FROM_DATABASE=Haswell-E Unicast Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Unicast Registers pci:v00008086d00002FF0* - ID_MODEL_FROM_DATABASE=Haswell-E Unicast Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Unicast Registers pci:v00008086d00002FF1* - ID_MODEL_FROM_DATABASE=Haswell-E Unicast Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Unicast Registers pci:v00008086d00002FF2* - ID_MODEL_FROM_DATABASE=Haswell-E Unicast Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Unicast Registers pci:v00008086d00002FF3* - ID_MODEL_FROM_DATABASE=Haswell-E Unicast Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Unicast Registers pci:v00008086d00002FF4* - ID_MODEL_FROM_DATABASE=Haswell-E Unicast Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Unicast Registers pci:v00008086d00002FF5* - ID_MODEL_FROM_DATABASE=Haswell-E Unicast Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Unicast Registers pci:v00008086d00002FF6* - ID_MODEL_FROM_DATABASE=Haswell-E Unicast Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Unicast Registers pci:v00008086d00002FF7* - ID_MODEL_FROM_DATABASE=Haswell-E Unicast Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Unicast Registers pci:v00008086d00002FF8* - ID_MODEL_FROM_DATABASE=Haswell-E Buffered Ring Agent + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Buffered Ring Agent pci:v00008086d00002FF9* - ID_MODEL_FROM_DATABASE=Haswell-E Buffered Ring Agent + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Buffered Ring Agent pci:v00008086d00002FFA* - ID_MODEL_FROM_DATABASE=Haswell-E Buffered Ring Agent + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Buffered Ring Agent pci:v00008086d00002FFB* - ID_MODEL_FROM_DATABASE=Haswell-E Buffered Ring Agent + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 Buffered Ring Agent pci:v00008086d00002FFC* - ID_MODEL_FROM_DATABASE=Haswell-E System Address Decoder & Broadcast Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 System Address Decoder & Broadcast Registers pci:v00008086d00002FFD* - ID_MODEL_FROM_DATABASE=Haswell-E System Address Decoder & Broadcast Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 System Address Decoder & Broadcast Registers pci:v00008086d00002FFE* - ID_MODEL_FROM_DATABASE=Haswell-E System Address Decoder & Broadcast Registers + ID_MODEL_FROM_DATABASE=Xeon E5 v3/Core i7 System Address Decoder & Broadcast Registers + +pci:v00008086d00003165* + ID_MODEL_FROM_DATABASE=Wireless 3165 + +pci:v00008086d00003165sv00008086sd00004010* + ID_MODEL_FROM_DATABASE=Wireless 3165 (Dual Band Wireless AC 3165) + +pci:v00008086d00003165sv00008086sd00004210* + ID_MODEL_FROM_DATABASE=Wireless 3165 (Dual Band Wireless AC 3165) pci:v00008086d00003200* ID_MODEL_FROM_DATABASE=GD31244 PCI-X SATA HBA @@ -74049,190 +74814,190 @@ pci:v00008086d00008CC6* ID_MODEL_FROM_DATABASE=9 Series Chipset Family H97 Controller pci:v00008086d00008D00* - ID_MODEL_FROM_DATABASE=Wellsburg 4-port SATA Controller [IDE mode] + ID_MODEL_FROM_DATABASE=C610/X99 series chipset 4-port SATA Controller [IDE mode] pci:v00008086d00008D02* - ID_MODEL_FROM_DATABASE=Wellsburg 6-Port SATA Controller [AHCI mode] + ID_MODEL_FROM_DATABASE=C610/X99 series chipset 6-Port SATA Controller [AHCI mode] pci:v00008086d00008D04* - ID_MODEL_FROM_DATABASE=Wellsburg SATA Controller [RAID mode] + ID_MODEL_FROM_DATABASE=C610/X99 series chipset SATA Controller [RAID mode] pci:v00008086d00008D06* - ID_MODEL_FROM_DATABASE=Wellsburg SATA Controller [RAID mode] + ID_MODEL_FROM_DATABASE=C610/X99 series chipset SATA Controller [RAID mode] pci:v00008086d00008D06sv000017AAsd00001031* - ID_MODEL_FROM_DATABASE=Wellsburg SATA Controller [RAID mode] (ThinkServer RAID 110i) + ID_MODEL_FROM_DATABASE=C610/X99 series chipset SATA Controller [RAID mode] (ThinkServer RAID 110i) pci:v00008086d00008D08* - ID_MODEL_FROM_DATABASE=Wellsburg 2-port SATA Controller [IDE mode] + ID_MODEL_FROM_DATABASE=C610/X99 series chipset 2-port SATA Controller [IDE mode] pci:v00008086d00008D0E* - ID_MODEL_FROM_DATABASE=Wellsburg SATA Controller [RAID mode] + ID_MODEL_FROM_DATABASE=C610/X99 series chipset SATA Controller [RAID mode] pci:v00008086d00008D10* - ID_MODEL_FROM_DATABASE=Wellsburg PCI Express Root Port #1 + ID_MODEL_FROM_DATABASE=C610/X99 series chipset PCI Express Root Port #1 pci:v00008086d00008D11* - ID_MODEL_FROM_DATABASE=Wellsburg PCI Express Root Port #1 + ID_MODEL_FROM_DATABASE=C610/X99 series chipset PCI Express Root Port #1 pci:v00008086d00008D12* - ID_MODEL_FROM_DATABASE=Wellsburg PCI Express Root Port #2 + ID_MODEL_FROM_DATABASE=C610/X99 series chipset PCI Express Root Port #2 pci:v00008086d00008D13* - ID_MODEL_FROM_DATABASE=Wellsburg PCI Express Root Port #2 + ID_MODEL_FROM_DATABASE=C610/X99 series chipset PCI Express Root Port #2 pci:v00008086d00008D14* - ID_MODEL_FROM_DATABASE=Wellsburg PCI Express Root Port #3 + ID_MODEL_FROM_DATABASE=C610/X99 series chipset PCI Express Root Port #3 pci:v00008086d00008D15* - ID_MODEL_FROM_DATABASE=Wellsburg PCI Express Root Port #3 + ID_MODEL_FROM_DATABASE=C610/X99 series chipset PCI Express Root Port #3 pci:v00008086d00008D16* - ID_MODEL_FROM_DATABASE=Wellsburg PCI Express Root Port #4 + ID_MODEL_FROM_DATABASE=C610/X99 series chipset PCI Express Root Port #4 pci:v00008086d00008D17* - ID_MODEL_FROM_DATABASE=Wellsburg PCI Express Root Port #4 + ID_MODEL_FROM_DATABASE=C610/X99 series chipset PCI Express Root Port #4 pci:v00008086d00008D18* - ID_MODEL_FROM_DATABASE=Wellsburg PCI Express Root Port #5 + ID_MODEL_FROM_DATABASE=C610/X99 series chipset PCI Express Root Port #5 pci:v00008086d00008D19* - ID_MODEL_FROM_DATABASE=Wellsburg PCI Express Root Port #5 + ID_MODEL_FROM_DATABASE=C610/X99 series chipset PCI Express Root Port #5 pci:v00008086d00008D1A* - ID_MODEL_FROM_DATABASE=Wellsburg PCI Express Root Port #6 + ID_MODEL_FROM_DATABASE=C610/X99 series chipset PCI Express Root Port #6 pci:v00008086d00008D1B* - ID_MODEL_FROM_DATABASE=Wellsburg PCI Express Root Port #6 + ID_MODEL_FROM_DATABASE=C610/X99 series chipset PCI Express Root Port #6 pci:v00008086d00008D1C* - ID_MODEL_FROM_DATABASE=Wellsburg PCI Express Root Port #7 + ID_MODEL_FROM_DATABASE=C610/X99 series chipset PCI Express Root Port #7 pci:v00008086d00008D1D* - ID_MODEL_FROM_DATABASE=Wellsburg PCI Express Root Port #7 + ID_MODEL_FROM_DATABASE=C610/X99 series chipset PCI Express Root Port #7 pci:v00008086d00008D1E* - ID_MODEL_FROM_DATABASE=Wellsburg PCI Express Root Port #8 + ID_MODEL_FROM_DATABASE=C610/X99 series chipset PCI Express Root Port #8 pci:v00008086d00008D1F* - ID_MODEL_FROM_DATABASE=Wellsburg PCI Express Root Port #8 + ID_MODEL_FROM_DATABASE=C610/X99 series chipset PCI Express Root Port #8 pci:v00008086d00008D20* - ID_MODEL_FROM_DATABASE=Wellsburg HD Audio Controller + ID_MODEL_FROM_DATABASE=C610/X99 series chipset HD Audio Controller pci:v00008086d00008D21* - ID_MODEL_FROM_DATABASE=Wellsburg HD Audio Controller + ID_MODEL_FROM_DATABASE=C610/X99 series chipset HD Audio Controller pci:v00008086d00008D22* - ID_MODEL_FROM_DATABASE=Wellsburg SMBus Controller + ID_MODEL_FROM_DATABASE=C610/X99 series chipset SMBus Controller pci:v00008086d00008D24* - ID_MODEL_FROM_DATABASE=Wellsburg Thermal Subsystem + ID_MODEL_FROM_DATABASE=C610/X99 series chipset Thermal Subsystem pci:v00008086d00008D26* - ID_MODEL_FROM_DATABASE=Wellsburg USB Enhanced Host Controller #1 + ID_MODEL_FROM_DATABASE=C610/X99 series chipset USB Enhanced Host Controller #1 pci:v00008086d00008D2D* - ID_MODEL_FROM_DATABASE=Wellsburg USB Enhanced Host Controller #2 + ID_MODEL_FROM_DATABASE=C610/X99 series chipset USB Enhanced Host Controller #2 pci:v00008086d00008D31* - ID_MODEL_FROM_DATABASE=Wellsburg USB xHCI Host Controller + ID_MODEL_FROM_DATABASE=C610/X99 series chipset USB xHCI Host Controller pci:v00008086d00008D33* - ID_MODEL_FROM_DATABASE=Wellsburg LAN Controller + ID_MODEL_FROM_DATABASE=C610/X99 series chipset LAN Controller pci:v00008086d00008D34* - ID_MODEL_FROM_DATABASE=Wellsburg NAND Controller + ID_MODEL_FROM_DATABASE=C610/X99 series chipset NAND Controller pci:v00008086d00008D3A* - ID_MODEL_FROM_DATABASE=Wellsburg MEI Controller #1 + ID_MODEL_FROM_DATABASE=C610/X99 series chipset MEI Controller #1 pci:v00008086d00008D3B* - ID_MODEL_FROM_DATABASE=Wellsburg MEI Controller #2 + ID_MODEL_FROM_DATABASE=C610/X99 series chipset MEI Controller #2 pci:v00008086d00008D3C* - ID_MODEL_FROM_DATABASE=Wellsburg IDE-r Controller + ID_MODEL_FROM_DATABASE=C610/X99 series chipset IDE-r Controller pci:v00008086d00008D3D* - ID_MODEL_FROM_DATABASE=Wellsburg KT Controller + ID_MODEL_FROM_DATABASE=C610/X99 series chipset KT Controller pci:v00008086d00008D40* - ID_MODEL_FROM_DATABASE=Wellsburg LPC Controller + ID_MODEL_FROM_DATABASE=C610/X99 series chipset LPC Controller pci:v00008086d00008D41* - ID_MODEL_FROM_DATABASE=Wellsburg LPC Controller + ID_MODEL_FROM_DATABASE=C610/X99 series chipset LPC Controller pci:v00008086d00008D42* - ID_MODEL_FROM_DATABASE=Wellsburg LPC Controller + ID_MODEL_FROM_DATABASE=C610/X99 series chipset LPC Controller pci:v00008086d00008D43* - ID_MODEL_FROM_DATABASE=Wellsburg LPC Controller + ID_MODEL_FROM_DATABASE=C610/X99 series chipset LPC Controller pci:v00008086d00008D44* - ID_MODEL_FROM_DATABASE=Wellsburg LPC Controller + ID_MODEL_FROM_DATABASE=C610/X99 series chipset LPC Controller pci:v00008086d00008D45* - ID_MODEL_FROM_DATABASE=Wellsburg LPC Controller + ID_MODEL_FROM_DATABASE=C610/X99 series chipset LPC Controller pci:v00008086d00008D46* - ID_MODEL_FROM_DATABASE=Wellsburg LPC Controller + ID_MODEL_FROM_DATABASE=C610/X99 series chipset LPC Controller pci:v00008086d00008D47* - ID_MODEL_FROM_DATABASE=Wellsburg LPC Controller + ID_MODEL_FROM_DATABASE=C610/X99 series chipset LPC Controller pci:v00008086d00008D48* - ID_MODEL_FROM_DATABASE=Wellsburg LPC Controller + ID_MODEL_FROM_DATABASE=C610/X99 series chipset LPC Controller pci:v00008086d00008D49* - ID_MODEL_FROM_DATABASE=Wellsburg LPC Controller + ID_MODEL_FROM_DATABASE=C610/X99 series chipset LPC Controller pci:v00008086d00008D4A* - ID_MODEL_FROM_DATABASE=Wellsburg LPC Controller + ID_MODEL_FROM_DATABASE=C610/X99 series chipset LPC Controller pci:v00008086d00008D4B* - ID_MODEL_FROM_DATABASE=Wellsburg LPC Controller + ID_MODEL_FROM_DATABASE=C610/X99 series chipset LPC Controller pci:v00008086d00008D4C* - ID_MODEL_FROM_DATABASE=Wellsburg LPC Controller + ID_MODEL_FROM_DATABASE=C610/X99 series chipset LPC Controller pci:v00008086d00008D4D* - ID_MODEL_FROM_DATABASE=Wellsburg LPC Controller + ID_MODEL_FROM_DATABASE=C610/X99 series chipset LPC Controller pci:v00008086d00008D4E* - ID_MODEL_FROM_DATABASE=Wellsburg LPC Controller + ID_MODEL_FROM_DATABASE=C610/X99 series chipset LPC Controller pci:v00008086d00008D4F* - ID_MODEL_FROM_DATABASE=Wellsburg LPC Controller + ID_MODEL_FROM_DATABASE=C610/X99 series chipset LPC Controller pci:v00008086d00008D60* - ID_MODEL_FROM_DATABASE=Wellsburg sSATA Controller [IDE mode] + ID_MODEL_FROM_DATABASE=C610/X99 series chipset sSATA Controller [IDE mode] pci:v00008086d00008D62* - ID_MODEL_FROM_DATABASE=Wellsburg sSATA Controller [AHCI mode] + ID_MODEL_FROM_DATABASE=C610/X99 series chipset sSATA Controller [AHCI mode] pci:v00008086d00008D64* - ID_MODEL_FROM_DATABASE=Wellsburg sSATA Controller [RAID mode] + ID_MODEL_FROM_DATABASE=C610/X99 series chipset sSATA Controller [RAID mode] pci:v00008086d00008D66* - ID_MODEL_FROM_DATABASE=Wellsburg sSATA Controller [RAID mode] + ID_MODEL_FROM_DATABASE=C610/X99 series chipset sSATA Controller [RAID mode] pci:v00008086d00008D68* - ID_MODEL_FROM_DATABASE=Wellsburg sSATA Controller [IDE mode] + ID_MODEL_FROM_DATABASE=C610/X99 series chipset sSATA Controller [IDE mode] pci:v00008086d00008D6E* - ID_MODEL_FROM_DATABASE=Wellsburg sSATA Controller [RAID mode] + ID_MODEL_FROM_DATABASE=C610/X99 series chipset sSATA Controller [RAID mode] pci:v00008086d00008D7C* - ID_MODEL_FROM_DATABASE=Wellsburg SPSR + ID_MODEL_FROM_DATABASE=C610/X99 series chipset SPSR pci:v00008086d00008D7D* - ID_MODEL_FROM_DATABASE=Wellsburg MS SMBus 0 + ID_MODEL_FROM_DATABASE=C610/X99 series chipset MS SMBus 0 pci:v00008086d00008D7E* - ID_MODEL_FROM_DATABASE=Wellsburg MS SMBus 1 + ID_MODEL_FROM_DATABASE=C610/X99 series chipset MS SMBus 1 pci:v00008086d00008D7F* - ID_MODEL_FROM_DATABASE=Wellsburg MS SMBus 2 + ID_MODEL_FROM_DATABASE=C610/X99 series chipset MS SMBus 2 pci:v00008086d00009000* ID_MODEL_FROM_DATABASE=IXP2000 Family Network Processor @@ -74618,6 +75383,249 @@ pci:v00008086d0000A012sv0000144Dsd0000C072* pci:v00008086d0000A013* ID_MODEL_FROM_DATABASE=Atom Processor D4xx/D5xx/N4xx/N5xx CHAPS counter +pci:v00008086d0000A103* + ID_MODEL_FROM_DATABASE=Sunrise Point-H SATA Controller [AHCI mode] + +pci:v00008086d0000A105* + ID_MODEL_FROM_DATABASE=Sunrise Point-H SATA Controller [RAID mode] + +pci:v00008086d0000A107* + ID_MODEL_FROM_DATABASE=Sunrise Point-H SATA Controller [RAID mode] + +pci:v00008086d0000A10F* + ID_MODEL_FROM_DATABASE=Sunrise Point-H SATA Controller [RAID mode] + +pci:v00008086d0000A110* + ID_MODEL_FROM_DATABASE=Sunrise Point-H PCI Express Root Port #1 + +pci:v00008086d0000A111* + ID_MODEL_FROM_DATABASE=Sunrise Point-H PCI Express Root Port #2 + +pci:v00008086d0000A112* + ID_MODEL_FROM_DATABASE=Sunrise Point-H PCI Express Root Port #3 + +pci:v00008086d0000A113* + ID_MODEL_FROM_DATABASE=Sunrise Point-H PCI Express Root Port #4 + +pci:v00008086d0000A114* + ID_MODEL_FROM_DATABASE=Sunrise Point-H PCI Express Root Port #5 + +pci:v00008086d0000A115* + ID_MODEL_FROM_DATABASE=Sunrise Point-H PCI Express Root Port #6 + +pci:v00008086d0000A116* + ID_MODEL_FROM_DATABASE=Sunrise Point-H PCI Express Root Port #7 + +pci:v00008086d0000A117* + ID_MODEL_FROM_DATABASE=Sunrise Point-H PCI Express Root Port #8 + +pci:v00008086d0000A118* + ID_MODEL_FROM_DATABASE=Sunrise Point-H PCI Express Root Port #9 + +pci:v00008086d0000A119* + ID_MODEL_FROM_DATABASE=Sunrise Point-H PCI Express Root Port #10 + +pci:v00008086d0000A11A* + ID_MODEL_FROM_DATABASE=Sunrise Point-H PCI Express Root Port #11 + +pci:v00008086d0000A11B* + ID_MODEL_FROM_DATABASE=Sunrise Point-H PCI Express Root Port #12 + +pci:v00008086d0000A11C* + ID_MODEL_FROM_DATABASE=Sunrise Point-H PCI Express Root Port #13 + +pci:v00008086d0000A11D* + ID_MODEL_FROM_DATABASE=Sunrise Point-H PCI Express Root Port #14 + +pci:v00008086d0000A11E* + ID_MODEL_FROM_DATABASE=Sunrise Point-H PCI Express Root Port #15 + +pci:v00008086d0000A11F* + ID_MODEL_FROM_DATABASE=Sunrise Point-H PCI Express Root Port #16 + +pci:v00008086d0000A120* + ID_MODEL_FROM_DATABASE=Sunrise Point-H P2SB + +pci:v00008086d0000A121* + ID_MODEL_FROM_DATABASE=Sunrise Point-H PMC + +pci:v00008086d0000A122* + ID_MODEL_FROM_DATABASE=Sunrise Point-H cAVS + +pci:v00008086d0000A123* + ID_MODEL_FROM_DATABASE=Sunrise Point-H SMBus + +pci:v00008086d0000A124* + ID_MODEL_FROM_DATABASE=Sunrise Point-H SPI Controller + +pci:v00008086d0000A125* + ID_MODEL_FROM_DATABASE=Sunrise Point-H Gigabit Ethernet Controller + +pci:v00008086d0000A126* + ID_MODEL_FROM_DATABASE=Sunrise Point-H Northpeak + +pci:v00008086d0000A127* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPSS UART #0 + +pci:v00008086d0000A128* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPSS UART #1 + +pci:v00008086d0000A129* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPSS SPI #0 + +pci:v00008086d0000A12A* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPSS SPI #1 + +pci:v00008086d0000A12F* + ID_MODEL_FROM_DATABASE=Sunrise Point-H USB 3.0 xHCI Controller + +pci:v00008086d0000A130* + ID_MODEL_FROM_DATABASE=Sunrise Point-H USB Device Controller (OTG) + +pci:v00008086d0000A131* + ID_MODEL_FROM_DATABASE=Sunrise Point-H Thermal subsystem + +pci:v00008086d0000A133* + ID_MODEL_FROM_DATABASE=Sunrise Point-H Northpeak ACPI Function + +pci:v00008086d0000A135* + ID_MODEL_FROM_DATABASE=Sunrise Point-H Integrated Sensor Hub + +pci:v00008086d0000A13A* + ID_MODEL_FROM_DATABASE=Sunrise Point-H CSME HECI #1 + +pci:v00008086d0000A13B* + ID_MODEL_FROM_DATABASE=Sunrise Point-H CSME HECI #2 + +pci:v00008086d0000A13C* + ID_MODEL_FROM_DATABASE=Sunrise Point-H CSME IDE Redirection + +pci:v00008086d0000A13D* + ID_MODEL_FROM_DATABASE=Sunrise Point-H KT Redirection + +pci:v00008086d0000A13E* + ID_MODEL_FROM_DATABASE=Sunrise Point-H CSME HECI #3 + +pci:v00008086d0000A140* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A141* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A142* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A143* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A144* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A145* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A146* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A147* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A148* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A149* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A14A* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A14B* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A14C* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A14D* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A14E* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A14F* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A150* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A151* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A152* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A153* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A154* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A155* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A156* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A157* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A158* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A159* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A15A* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A15B* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A15C* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A15D* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A15E* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A15F* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPC Controller + +pci:v00008086d0000A160* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPSS I2C Controller #0 + +pci:v00008086d0000A161* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPSS I2C Controller #1 + +pci:v00008086d0000A166* + ID_MODEL_FROM_DATABASE=Sunrise Point-H LPSS UART Controller #2 + +pci:v00008086d0000A167* + ID_MODEL_FROM_DATABASE=Sunrise Point-H PCI Root Port #17 + +pci:v00008086d0000A168* + ID_MODEL_FROM_DATABASE=Sunrise Point-H PCI Root Port #18 + +pci:v00008086d0000A169* + ID_MODEL_FROM_DATABASE=Sunrise Point-H PCI Root Port #19 + +pci:v00008086d0000A16A* + ID_MODEL_FROM_DATABASE=Sunrise Point-H PCI Root Port #20 + +pci:v00008086d0000A170* + ID_MODEL_FROM_DATABASE=Sunrise Point-H HD Audio + pci:v00008086d0000A620* ID_MODEL_FROM_DATABASE=6400/6402 Advanced Memory Buffer (AMB) @@ -76163,6 +77171,9 @@ pci:v0000BDBDd0000A11D* pci:v0000BDBDd0000A11E* ID_MODEL_FROM_DATABASE=DeckLink Optical Fibre +pci:v0000BDBDd0000A120* + ID_MODEL_FROM_DATABASE=Decklink Studio 2 + pci:v0000BDBDd0000A121* ID_MODEL_FROM_DATABASE=DeckLink HD Extreme 3D/3D+ @@ -76196,6 +77207,9 @@ pci:v0000BDBDd0000A130* pci:v0000BDBDd0000A132* ID_MODEL_FROM_DATABASE=UltraStudio 4K +pci:v0000BDBDd0000A138* + ID_MODEL_FROM_DATABASE=Decklink SDI 4K + pci:v0000C001* ID_VENDOR_FROM_DATABASE=TSI Telsys @@ -76289,6 +77303,9 @@ pci:v0000D161d00001220* pci:v0000D161d00001405* ID_MODEL_FROM_DATABASE=Wildcard TE405P/TE407P quad-span T1/E1/J1 card 5.0V (u1) +pci:v0000D161d00001410* + ID_MODEL_FROM_DATABASE=Wildcard TE410P quad-span T1/E1/J1 card 3.3V (5th Gen) + pci:v0000D161d00001420* ID_MODEL_FROM_DATABASE=Wildcard TE420 quad-span T1/E1/J1 card 3.3V (PCI-Express) (5th gen) @@ -76760,9 +77777,21 @@ pci:v0000EACEd00008400* pci:v0000EACEd00008500* ID_MODEL_FROM_DATABASE=DAG 8.5I Infiniband x4 DDR +pci:v0000EACEd00009200* + ID_MODEL_FROM_DATABASE=DAG 9.2SX2 10G Ethernet + pci:v0000EACEd0000920E* ID_MODEL_FROM_DATABASE=DAG 9.2X2 10G Ethernet +pci:v0000EACEd0000A120* + ID_MODEL_FROM_DATABASE=DAG 10X2-P 10G Ethernet + +pci:v0000EACEd0000A12E* + ID_MODEL_FROM_DATABASE=DAG 10X2-S 10G Ethernet + +pci:v0000EACEd0000A140* + ID_MODEL_FROM_DATABASE=DAG 10X4-P 10G Ethernet + pci:v0000EC80* ID_VENDOR_FROM_DATABASE=Belkin Corporation @@ -76808,6 +77837,9 @@ pci:v0000F1D0d0000CAFE* pci:v0000F1D0d0000CFEE* ID_MODEL_FROM_DATABASE=Xena LS/SD-22-DA/SD-DA +pci:v0000F1D0d0000DAFF* + ID_MODEL_FROM_DATABASE=KONA LHi + pci:v0000F1D0d0000DCAF* ID_MODEL_FROM_DATABASE=Kona HD diff --git a/hwdb/20-usb-vendor-model.hwdb b/hwdb/20-usb-vendor-model.hwdb index ea1c3e3e61..9879106561 100644 --- a/hwdb/20-usb-vendor-model.hwdb +++ b/hwdb/20-usb-vendor-model.hwdb @@ -47,6 +47,12 @@ usb:v0105* usb:v0105p145F* ID_MODEL_FROM_DATABASE=NW-3100 802.11b/g 54Mbps Wireless Network Adapter [zd1211] +usb:v0127* + ID_VENDOR_FROM_DATABASE=IBP + +usb:v0127p0002* + ID_MODEL_FROM_DATABASE=HDM Interface + usb:v0145* ID_VENDOR_FROM_DATABASE=Unknown @@ -500,6 +506,9 @@ usb:v03F0p0217* usb:v03F0p0218* ID_MODEL_FROM_DATABASE=APOLLO P2500/2600 +usb:v03F0p0241* + ID_MODEL_FROM_DATABASE=Link-5 micro dongle + usb:v03F0p0304* ID_MODEL_FROM_DATABASE=DeskJet 810c/812c @@ -689,6 +698,9 @@ usb:v03F0p0F12* usb:v03F0p0F17* ID_MODEL_FROM_DATABASE=LaserJet 1150 +usb:v03F0p0F2A* + ID_MODEL_FROM_DATABASE=LaserJet 400 color M451dn + usb:v03F0p1001* ID_MODEL_FROM_DATABASE=Photo Scanner 1000 @@ -1079,6 +1091,9 @@ usb:v03F0p2717* usb:v03F0p2724* ID_MODEL_FROM_DATABASE=Magnetic Stripe Reader IDRA-334133-HP +usb:v03F0p2805* + ID_MODEL_FROM_DATABASE=Scanjet G2710 + usb:v03F0p2811* ID_MODEL_FROM_DATABASE=PSC-2100 @@ -1247,6 +1262,9 @@ usb:v03F0p3817* usb:v03F0p3902* ID_MODEL_FROM_DATABASE=PhotoSmart 130 +usb:v03F0p3912* + ID_MODEL_FROM_DATABASE=Officejet Pro 8500 + usb:v03F0p3A02* ID_MODEL_FROM_DATABASE=PhotoSmart 7150 @@ -1835,6 +1853,9 @@ usb:v03F0pC002* usb:v03F0pC102* ID_MODEL_FROM_DATABASE=PhotoSmart 8000 series +usb:v03F0pC111* + ID_MODEL_FROM_DATABASE=Deskjet 1510 + usb:v03F0pC202* ID_MODEL_FROM_DATABASE=PhotoSmart 8200 series @@ -2046,7 +2067,7 @@ usb:v0403* ID_VENDOR_FROM_DATABASE=Future Technology Devices International, Ltd usb:v0403p0000* - ID_MODEL_FROM_DATABASE=H4SMK 7 Port Hub + ID_MODEL_FROM_DATABASE=H4SMK 7 Port Hub / Bricked Counterfeit FT232 Serial (UART) IC usb:v0403p0232* ID_MODEL_FROM_DATABASE=Serial Converter @@ -2153,6 +2174,9 @@ usb:v0403pA6D0* usb:v0403pA951* ID_MODEL_FROM_DATABASE=HCP HIT GSM/GPRS modem [Cinterion MC55i] +usb:v0403pA9A0* + ID_MODEL_FROM_DATABASE=FT2232D - Dual UART/FIFO IC - FTDI + usb:v0403pABB8* ID_MODEL_FROM_DATABASE=Lego Mindstorms NXTCam @@ -2264,6 +2288,30 @@ usb:v0403pD012* usb:v0403pD013* ID_MODEL_FROM_DATABASE=SCS DRAGON 1 +usb:v0403pD388* + ID_MODEL_FROM_DATABASE=Xsens converter + +usb:v0403pD389* + ID_MODEL_FROM_DATABASE=Xsens Wireless Receiver + +usb:v0403pD38A* + ID_MODEL_FROM_DATABASE=Xsens serial converter + +usb:v0403pD38B* + ID_MODEL_FROM_DATABASE=Xsens serial converter + +usb:v0403pD38C* + ID_MODEL_FROM_DATABASE=Xsens Wireless Receiver + +usb:v0403pD38D* + ID_MODEL_FROM_DATABASE=Xsens Awinda Station + +usb:v0403pD38E* + ID_MODEL_FROM_DATABASE=Xsens serial converter + +usb:v0403pD38F* + ID_MODEL_FROM_DATABASE=Xsens serial converter + usb:v0403pD491* ID_MODEL_FROM_DATABASE=Zolix Omni 1509 monochromator @@ -2285,6 +2333,9 @@ usb:v0403pD9A9* usb:v0403pD9AA* ID_MODEL_FROM_DATABASE=Actisense NGT-1 NMEA2000 PC Interface +usb:v0403pDAF4* + ID_MODEL_FROM_DATABASE=Qundis Serial Infrared Head + usb:v0403pE0D0* ID_MODEL_FROM_DATABASE=Total Phase Aardvark I2C/SPI Host Adapter @@ -2324,6 +2375,9 @@ usb:v0403pE8DC* usb:v0403pEA90* ID_MODEL_FROM_DATABASE=Eclo 1-Wire Adapter +usb:v0403pECD9* + ID_MODEL_FROM_DATABASE=miControl miCan-Stick + usb:v0403pED71* ID_MODEL_FROM_DATABASE=HAMEG HO870 Serial Port @@ -4442,6 +4496,9 @@ usb:v0424p4060* usb:v0424p4064* ID_MODEL_FROM_DATABASE=Ultra Fast Media Reader +usb:v0424p5434* + ID_MODEL_FROM_DATABASE=Hub + usb:v0424p7500* ID_MODEL_FROM_DATABASE=LAN7500 Ethernet 10/100/1000 Adapter @@ -6131,6 +6188,12 @@ usb:v045Ep02BF* usb:v045Ep02C2* ID_MODEL_FROM_DATABASE=Kinect for Windows NUI Motor +usb:v045Ep02D1* + ID_MODEL_FROM_DATABASE=XBOX One Controller for Windows + +usb:v045Ep02D5* + ID_MODEL_FROM_DATABASE=Xbox One Digital TV Tuner + usb:v045Ep0400* ID_MODEL_FROM_DATABASE=Windows Powered Pocket PC 2002 @@ -6530,6 +6593,9 @@ usb:v045Ep0708* usb:v045Ep070A* ID_MODEL_FROM_DATABASE=Charon Bluetooth Dongle (DFU) +usb:v045Ep070F* + ID_MODEL_FROM_DATABASE=LifeChat LX-3000 Headset + usb:v045Ep0710* ID_MODEL_FROM_DATABASE=Zune Media Player @@ -6551,6 +6617,9 @@ usb:v045Ep0723* usb:v045Ep0724* ID_MODEL_FROM_DATABASE=SideWinder Mouse +usb:v045Ep0728* + ID_MODEL_FROM_DATABASE=LifeCam VX-5000 + usb:v045Ep0730* ID_MODEL_FROM_DATABASE=Digital Media Keyboard 3000 @@ -6599,6 +6668,9 @@ usb:v045Ep0780* usb:v045Ep0797* ID_MODEL_FROM_DATABASE=Optical Mouse 200 +usb:v045Ep07F8* + ID_MODEL_FROM_DATABASE=Wired Keyboard 600 (model 1576) + usb:v045Ep930A* ID_MODEL_FROM_DATABASE=ISOUSB.SYS Intel 82930 Isochronous IO Test Board @@ -6968,9 +7040,15 @@ usb:v046Dp0821* usb:v046Dp0825* ID_MODEL_FROM_DATABASE=Webcam C270 +usb:v046Dp0826* + ID_MODEL_FROM_DATABASE=HD Webcam C525 + usb:v046Dp0828* ID_MODEL_FROM_DATABASE=HD Webcam B990 +usb:v046Dp082B* + ID_MODEL_FROM_DATABASE=Webcam C170 + usb:v046Dp082D* ID_MODEL_FROM_DATABASE=HD Pro Webcam C920 @@ -7292,6 +7370,9 @@ usb:v046Dp0A29* usb:v046Dp0A38* ID_MODEL_FROM_DATABASE=Headset H340 +usb:v046Dp0A44* + ID_MODEL_FROM_DATABASE=Wired headset + usb:v046Dp0A4D* ID_MODEL_FROM_DATABASE=G430 Surround Sound Gaming Headset @@ -7494,7 +7575,7 @@ usb:v046DpC068* ID_MODEL_FROM_DATABASE=G500 Laser Mouse usb:v046DpC069* - ID_MODEL_FROM_DATABASE=M500 Laser Mouse + ID_MODEL_FROM_DATABASE=M-U0007 [Corded Mouse M500] usb:v046DpC06A* ID_MODEL_FROM_DATABASE=USB Optical Mouse @@ -7538,8 +7619,11 @@ usb:v046DpC125* usb:v046DpC126* ID_MODEL_FROM_DATABASE=Harmony Link +usb:v046DpC129* + ID_MODEL_FROM_DATABASE=Harmony Hub + usb:v046DpC12B* - ID_MODEL_FROM_DATABASE=Harmony Touch Remote + ID_MODEL_FROM_DATABASE=Harmony Touch/Ultimate Remote usb:v046DpC201* ID_MODEL_FROM_DATABASE=WingMan Extreme Joystick with Throttle @@ -7658,6 +7742,9 @@ usb:v046DpC248* usb:v046DpC24A* ID_MODEL_FROM_DATABASE=G600 Gaming Mouse +usb:v046DpC24C* + ID_MODEL_FROM_DATABASE=G400s Optical Mouse + usb:v046DpC24D* ID_MODEL_FROM_DATABASE=G710 Gaming Keyboard @@ -8039,6 +8126,9 @@ usb:v046Ep5408* usb:v046Ep5500* ID_MODEL_FROM_DATABASE=Portable Keyboard 86+9 keys (Model 6100C US) +usb:v046Ep5550* + ID_MODEL_FROM_DATABASE=5 button optical mouse model M873U + usb:v046Ep5720* ID_MODEL_FROM_DATABASE=Smart Card Reader @@ -8471,6 +8561,9 @@ usb:v047Bp1002* usb:v047C* ID_VENDOR_FROM_DATABASE=Dell Computer Corp. +usb:v047CpFFFF* + ID_MODEL_FROM_DATABASE=UPS Tower 500W LV + usb:v047D* ID_VENDOR_FROM_DATABASE=Kensington @@ -8765,6 +8858,9 @@ usb:v0480p0014* usb:v0480p0100* ID_MODEL_FROM_DATABASE=Stor.E Slim USB 3.0 +usb:v0480p0200* + ID_MODEL_FROM_DATABASE=External Disk + usb:v0480pA006* ID_MODEL_FROM_DATABASE=External Disk 1.5TB @@ -8783,6 +8879,9 @@ usb:v0480pB001* usb:v0480pD010* ID_MODEL_FROM_DATABASE=External Disk 3TB +usb:v0480pD011* + ID_MODEL_FROM_DATABASE=Canvio Desk + usb:v0481* ID_VENDOR_FROM_DATABASE=Zenith Data Systems @@ -8975,6 +9074,9 @@ usb:v048Dp9009* usb:v048Dp9135* ID_MODEL_FROM_DATABASE=Zolid Mini DVB-T Stick +usb:v048Dp9306* + ID_MODEL_FROM_DATABASE=IT930x DVB stick + usb:v048Dp9503* ID_MODEL_FROM_DATABASE=ITE it9503 feature-limited DVB-T transmission chip [ccHDtv] @@ -10115,6 +10217,9 @@ usb:v04A9p1909* usb:v04A9p190A* ID_MODEL_FROM_DATABASE=CanoScan LiDE 210 +usb:v04A9p190D* + ID_MODEL_FROM_DATABASE=CanoScan 9000F Mark II + usb:v04A9p2200* ID_MODEL_FROM_DATABASE=CanoScan LiDE 25 @@ -11252,6 +11357,9 @@ usb:v04A9p3264* usb:v04A9p3265* ID_MODEL_FROM_DATABASE=Powershot ELPH 130 IS / IXUS 140 +usb:v04A9p3266* + ID_MODEL_FROM_DATABASE=Powershot ELPH 120 IS / IXUS 135 + usb:v04A9p3268* ID_MODEL_FROM_DATABASE=PowerShot ELPH 330 HS / IXUS 255 HS @@ -11276,9 +11384,15 @@ usb:v04A9p327F* usb:v04A9p3284* ID_MODEL_FROM_DATABASE=PowerShot D30 +usb:v04A9p3285* + ID_MODEL_FROM_DATABASE=PowerShot SX700 HS + usb:v04A9p3286* ID_MODEL_FROM_DATABASE=PowerShot SX600 HS +usb:v04A9p3287* + ID_MODEL_FROM_DATABASE=PowerShot ELPH 140 IS / IXUS 150 + usb:v04A9p3288* ID_MODEL_FROM_DATABASE=Powershot ELPH 135 / IXUS 145 @@ -11549,6 +11663,9 @@ usb:v04B3p3016* usb:v04B3p3018* ID_MODEL_FROM_DATABASE=UltraNav Keyboard +usb:v04B3p301A* + ID_MODEL_FROM_DATABASE=2-port low-power hub + usb:v04B3p301B* ID_MODEL_FROM_DATABASE=SK-8815 Keyboard @@ -11594,6 +11711,9 @@ usb:v04B3p4427* usb:v04B3p4482* ID_MODEL_FROM_DATABASE=Serial Converter +usb:v04B3p4484* + ID_MODEL_FROM_DATABASE=SMSC USB20H04 3-Port Hub [ThinkPad X4 UltraBase, Wistron S Note-3 Media Slice] + usb:v04B3p4485* ID_MODEL_FROM_DATABASE=Serial Converter @@ -12683,6 +12803,9 @@ usb:v04CAp1766* usb:v04CAp2004* ID_MODEL_FROM_DATABASE=Bluetooth 4.0 [Broadcom BCM20702A0] +usb:v04CAp7025* + ID_MODEL_FROM_DATABASE=HP HD Webcam + usb:v04CAp9304* ID_MODEL_FROM_DATABASE=Hub @@ -13130,6 +13253,12 @@ usb:v04D8p900A* usb:v04D8pC001* ID_MODEL_FROM_DATABASE=PicoLCD 20x4 +usb:v04D8pE11C* + ID_MODEL_FROM_DATABASE=TL866CS EEPROM Programmer [MiniPRO] + +usb:v04D8pF437* + ID_MODEL_FROM_DATABASE=SBE Tech Ultrasonic Anemometer + usb:v04D8pF4B5* ID_MODEL_FROM_DATABASE=SmartScope @@ -14312,6 +14441,9 @@ usb:v04E8p6860* usb:v04E8p6863* ID_MODEL_FROM_DATABASE=GT-I9500 [Galaxy S4] / GT-I9250 [Galaxy Nexus] (network tethering) +usb:v04E8p6864* + ID_MODEL_FROM_DATABASE=GT-I9070 (network tethering, USB debugging enabled) + usb:v04E8p6865* ID_MODEL_FROM_DATABASE=GT-I9300 Phone [Galaxy S III] (PTP mode) @@ -15308,6 +15440,9 @@ usb:v04F9p0223* usb:v04F9p0248* ID_MODEL_FROM_DATABASE=DCP-7055 scanner/printer +usb:v04F9p0273* + ID_MODEL_FROM_DATABASE=DCP-7057 scanner/printer + usb:v04F9p02B3* ID_MODEL_FROM_DATABASE=MFC J4510DW @@ -15494,6 +15629,9 @@ usb:v0502p16E2* usb:v0502p16E3* ID_MODEL_FROM_DATABASE=n30 Handheld Sync +usb:v0502p2008* + ID_MODEL_FROM_DATABASE=Liquid Gallant Duo E350 (preloader) + usb:v0502p3202* ID_MODEL_FROM_DATABASE=Liquid @@ -16919,6 +17057,9 @@ usb:v054Cp02D1* usb:v054Cp02D2* ID_MODEL_FROM_DATABASE=PSP Slim +usb:v054Cp02D8* + ID_MODEL_FROM_DATABASE=SBAC-US10 SxS PRO memory card reader/writer + usb:v054Cp02E1* ID_MODEL_FROM_DATABASE=FeliCa S330 [PaSoRi] @@ -17462,6 +17603,9 @@ usb:v0566p2801* usb:v0566p2802* ID_MODEL_FROM_DATABASE=Kbd Hub +usb:v0566p3002* + ID_MODEL_FROM_DATABASE=Keyboard + usb:v0566p3004* ID_MODEL_FROM_DATABASE=Genius KB-29E @@ -17720,6 +17864,9 @@ usb:v056Ap0307* usb:v056Ap0309* ID_MODEL_FROM_DATABASE=Cintiq Companion Hybrid 13HD (DTH-A1300) touchscreen +usb:v056Ap030E* + ID_MODEL_FROM_DATABASE=Intuos Pen Small (CTL480) + usb:v056Ap0400* ID_MODEL_FROM_DATABASE=PenPartner 4x5 @@ -17828,6 +17975,9 @@ usb:v0572p0041* usb:v0572p0042* ID_MODEL_FROM_DATABASE=Webcam Notebook +usb:v0572p0320* + ID_MODEL_FROM_DATABASE=DVBSky T330 DVB-T2/C tuner + usb:v0572p1232* ID_MODEL_FROM_DATABASE=V.90 modem @@ -17858,12 +18008,27 @@ usb:v0572p2002* usb:v0572p262A* ID_MODEL_FROM_DATABASE=tm5600 Video & Audio Grabber Capture +usb:v0572p680C* + ID_MODEL_FROM_DATABASE=DVBSky T680C DVB-T2/C tuner + +usb:v0572p6831* + ID_MODEL_FROM_DATABASE=DVBSky S960 DVB-S2 tuner + usb:v0572p8390* ID_MODEL_FROM_DATABASE=WinFast PalmTop/Novo TV Video usb:v0572p8392* ID_MODEL_FROM_DATABASE=WinFast PalmTop/Novo TV Video +usb:v0572p960C* + ID_MODEL_FROM_DATABASE=DVBSky S960C DVB-S2 tuner + +usb:v0572pC686* + ID_MODEL_FROM_DATABASE=Geniatech T220A DVB-T2 TV Stick + +usb:v0572pC688* + ID_MODEL_FROM_DATABASE=Geniatech T230 DVB-T2 TV Stick + usb:v0572pCAFC* ID_MODEL_FROM_DATABASE=CX861xx ROM Boot Loader @@ -18902,6 +19067,9 @@ usb:v0584p0008* usb:v0584p0220* ID_MODEL_FROM_DATABASE=U2SCX SCSI Converter +usb:v0584p0304* + ID_MODEL_FROM_DATABASE=U2SCX-LVD (SCSI Converter) + usb:v0584pB000* ID_MODEL_FROM_DATABASE=REX-USB60 @@ -19622,6 +19790,24 @@ usb:v05A6p0004* usb:v05A7* ID_VENDOR_FROM_DATABASE=Bose Corp. +usb:v05A7p4000* + ID_MODEL_FROM_DATABASE=Bluetooth Headset + +usb:v05A7p4001* + ID_MODEL_FROM_DATABASE=Bluetooth Headset in DFU mode + +usb:v05A7p4002* + ID_MODEL_FROM_DATABASE=Bluetooth Headset Series 2 + +usb:v05A7p4003* + ID_MODEL_FROM_DATABASE=Bluetooth Headset Series 2 in DFU mode + +usb:v05A7pBC50* + ID_MODEL_FROM_DATABASE=SoundLink Wireless Mobile speaker + +usb:v05A7pBC51* + ID_MODEL_FROM_DATABASE=SoundLink Wireless Mobile speaker in DFU mode + usb:v05A8* ID_VENDOR_FROM_DATABASE=Spacetec IMC Corp. @@ -21071,6 +21257,9 @@ usb:v05DAp5003* usb:v05DAp5013* ID_MODEL_FROM_DATABASE=3200 Scanner +usb:v05DAp6072* + ID_MODEL_FROM_DATABASE=XT-3500 A4 HD Scanner + usb:v05DAp80A3* ID_MODEL_FROM_DATABASE=ScanMaker V6USL (#2) @@ -21392,6 +21581,9 @@ usb:v05E0p0800* usb:v05E0p1200* ID_MODEL_FROM_DATABASE=Bar Code Scanner +usb:v05E0p1701* + ID_MODEL_FROM_DATABASE=Bar Code Scanner (CDC) + usb:v05E0p1900* ID_MODEL_FROM_DATABASE=SNAPI Imaging Device @@ -21758,20 +21950,26 @@ usb:v05F9* usb:v05F9p1104* ID_MODEL_FROM_DATABASE=Magellan 2200VS +usb:v05F9p1206* + ID_MODEL_FROM_DATABASE=Gryphon series (OEM mode) + usb:v05F9p2202* ID_MODEL_FROM_DATABASE=Point of Sale Handheld Scanner usb:v05F9p2206* - ID_MODEL_FROM_DATABASE=Datalogic Gryphon GFS4170 + ID_MODEL_FROM_DATABASE=Gryphon series (keyboard emulation mode) + +usb:v05F9p220C* + ID_MODEL_FROM_DATABASE=Datalogic Gryphon GD4430 usb:v05F9p2601* - ID_MODEL_FROM_DATABASE=Datalogin Magellan 1000i Barcode Scanner + ID_MODEL_FROM_DATABASE=Datalogic Magellan 1000i Barcode Scanner usb:v05F9p2602* ID_MODEL_FROM_DATABASE=Datalogic Magellan 1100i Barcode Scanner usb:v05F9p4204* - ID_MODEL_FROM_DATABASE=Datalogic Gryphon GFS4470 Fixed Scanner + ID_MODEL_FROM_DATABASE=Gryphon series (RS-232 emulation mode) usb:v05F9p5204* ID_MODEL_FROM_DATABASE=Datalogic Gryphon GFS4170 (config mode) @@ -21789,7 +21987,10 @@ usb:v05FAp3303* ID_MODEL_FROM_DATABASE=Keyboard with PS/2 Mouse Port usb:v05FC* - ID_VENDOR_FROM_DATABASE=Harman Multimedia + ID_VENDOR_FROM_DATABASE=Harman + +usb:v05FCp0001* + ID_MODEL_FROM_DATABASE=Soundcraft Si Multi Digital Card usb:v05FCp7849* ID_MODEL_FROM_DATABASE=Harman/Kardon SoundSticks @@ -21873,7 +22074,7 @@ usb:v0603* ID_VENDOR_FROM_DATABASE=Novatek Microelectronics Corp. usb:v0603p00F1* - ID_MODEL_FROM_DATABASE=Keyboard + ID_MODEL_FROM_DATABASE=Keyboard (Labtec Ultra Flat Keyboard) usb:v0603p00F2* ID_MODEL_FROM_DATABASE=Keyboard (Labtec Ultra Flat Keyboard) @@ -22142,6 +22343,9 @@ usb:v062Ap0252* usb:v062Ap3286* ID_MODEL_FROM_DATABASE=Nano Receiver [Sandstrom Laser Mouse SMWLL11] +usb:v062Ap4101* + ID_MODEL_FROM_DATABASE=Wireless Keyboard/Mouse + usb:v062Ap6301* ID_MODEL_FROM_DATABASE=Trust Wireless Optical Mouse MI-4150K @@ -22272,7 +22476,7 @@ usb:v0644p800E* ID_MODEL_FROM_DATABASE=TASCAM US-122L usb:v0644p801D* - ID_MODEL_FROM_DATABASE=DR-100 + ID_MODEL_FROM_DATABASE=TASCAM DR-100 usb:v0644p8021* ID_MODEL_FROM_DATABASE=TASCAM US-122mkII @@ -24032,6 +24236,9 @@ usb:v06C9p0009* usb:v06CA* ID_VENDOR_FROM_DATABASE=Newer Technology, Inc. +usb:v06CAp2003* + ID_MODEL_FROM_DATABASE=uSCSI + usb:v06CB* ID_VENDOR_FROM_DATABASE=Synaptics, Inc. @@ -24068,6 +24275,9 @@ usb:v06CBp0010* usb:v06CBp0013* ID_MODEL_FROM_DATABASE=DisplayPad +usb:v06CBp2970* + ID_MODEL_FROM_DATABASE=touchpad + usb:v06CC* ID_VENDOR_FROM_DATABASE=Terayon Communication Systems @@ -25034,15 +25244,78 @@ usb:v072Fp0001* usb:v072Fp0008* ID_MODEL_FROM_DATABASE=ACR 80 Smart Card Reader +usb:v072Fp0100* + ID_MODEL_FROM_DATABASE=AET65 + +usb:v072Fp0101* + ID_MODEL_FROM_DATABASE=AET65 + +usb:v072Fp0102* + ID_MODEL_FROM_DATABASE=AET62 + +usb:v072Fp0103* + ID_MODEL_FROM_DATABASE=AET62 + +usb:v072Fp0901* + ID_MODEL_FROM_DATABASE=ACR1281U-C4 (BSI) + usb:v072Fp1000* ID_MODEL_FROM_DATABASE=PLDT Drive usb:v072Fp1001* ID_MODEL_FROM_DATABASE=PLDT Drive +usb:v072Fp2011* + ID_MODEL_FROM_DATABASE=ACR88U + +usb:v072Fp2100* + ID_MODEL_FROM_DATABASE=ACR128U + usb:v072Fp2200* ID_MODEL_FROM_DATABASE=ACR122U +usb:v072Fp220A* + ID_MODEL_FROM_DATABASE=ACR1281U-C5 (BSI) + +usb:v072Fp220C* + ID_MODEL_FROM_DATABASE=ACR1283 Bootloader + +usb:v072Fp220F* + ID_MODEL_FROM_DATABASE=ACR1281U-C2 (qPBOC) + +usb:v072Fp2211* + ID_MODEL_FROM_DATABASE=ACR1261 1S Dual Reader + +usb:v072Fp2214* + ID_MODEL_FROM_DATABASE=ACR1222 1SAM PICC Reader + +usb:v072Fp2215* + ID_MODEL_FROM_DATABASE=ACR1281 2S CL Reader + +usb:v072Fp221A* + ID_MODEL_FROM_DATABASE=ACR1251U-A1 + +usb:v072Fp221B* + ID_MODEL_FROM_DATABASE=ACR1251U-C + +usb:v072Fp2224* + ID_MODEL_FROM_DATABASE=ACR1281 1S Dual Reader + +usb:v072Fp222B* + ID_MODEL_FROM_DATABASE=ACR1222U-C8 + +usb:v072Fp222C* + ID_MODEL_FROM_DATABASE=ACR1283L-D2 + +usb:v072Fp222D* + ID_MODEL_FROM_DATABASE=[OEM Reader] + +usb:v072Fp222E* + ID_MODEL_FROM_DATABASE=ACR123U + +usb:v072Fp2242* + ID_MODEL_FROM_DATABASE=ACR1251 1S Dual Reader + usb:v072Fp8002* ID_MODEL_FROM_DATABASE=AET63 BioTRUSTKey @@ -25052,18 +25325,72 @@ usb:v072Fp8003* usb:v072Fp8103* ID_MODEL_FROM_DATABASE=ACR120 +usb:v072Fp8201* + ID_MODEL_FROM_DATABASE=APG8201 + +usb:v072Fp8900* + ID_MODEL_FROM_DATABASE=ACR89U-A1 + +usb:v072Fp8901* + ID_MODEL_FROM_DATABASE=ACR89U-A2 + +usb:v072Fp8902* + ID_MODEL_FROM_DATABASE=ACR89U-A3 + usb:v072Fp9000* ID_MODEL_FROM_DATABASE=ACR38 AC1038-based Smart Card Reader +usb:v072Fp9006* + ID_MODEL_FROM_DATABASE=CryptoMate + usb:v072Fp90CC* ID_MODEL_FROM_DATABASE=ACR38 SmartCard Reader +usb:v072Fp90CE* + ID_MODEL_FROM_DATABASE=[OEM Reader] + usb:v072Fp90CF* ID_MODEL_FROM_DATABASE=ACR38 SAM Smart Card Reader usb:v072Fp90D0* ID_MODEL_FROM_DATABASE=PertoSmart EMV - Card Reader +usb:v072Fp90D2* + ID_MODEL_FROM_DATABASE=ACR83U + +usb:v072Fp90D8* + ID_MODEL_FROM_DATABASE=ACR3801 + +usb:v072Fp90DB* + ID_MODEL_FROM_DATABASE=CryptoMate64 + +usb:v072FpB000* + ID_MODEL_FROM_DATABASE=ACR3901U + +usb:v072FpB100* + ID_MODEL_FROM_DATABASE=ACR39U + +usb:v072FpB101* + ID_MODEL_FROM_DATABASE=ACR39K + +usb:v072FpB102* + ID_MODEL_FROM_DATABASE=ACR39T + +usb:v072FpB103* + ID_MODEL_FROM_DATABASE=ACR39F + +usb:v072FpB104* + ID_MODEL_FROM_DATABASE=ACR39U-SAM + +usb:v072FpB106* + ID_MODEL_FROM_DATABASE=ACOS5T2 + +usb:v072FpB200* + ID_MODEL_FROM_DATABASE=ACOS5T1 + +usb:v072FpB301* + ID_MODEL_FROM_DATABASE=ACR32-A1 + usb:v0731* ID_VENDOR_FROM_DATABASE=Susteen, Inc. @@ -25598,6 +25925,12 @@ usb:v076Bp5121* usb:v076Bp5125* ID_MODEL_FROM_DATABASE=CardMan 5125 +usb:v076Bp5321* + ID_MODEL_FROM_DATABASE=CardMan 5321 + +usb:v076Bp5340* + ID_MODEL_FROM_DATABASE=CardMan 5021 CL + usb:v076Bp6622* ID_MODEL_FROM_DATABASE=CardMan 6121 @@ -26376,7 +26709,7 @@ usb:v07ABpFCD6* ID_MODEL_FROM_DATABASE=Freecom HD Classic usb:v07ABpFCF6* - ID_MODEL_FROM_DATABASE=DataBar 512 MB + ID_MODEL_FROM_DATABASE=DataBar usb:v07ABpFCF8* ID_MODEL_FROM_DATABASE=Freecom Classic SL Network Drive @@ -27293,6 +27626,9 @@ usb:v07CFp4107* usb:v07CFp4500* ID_MODEL_FROM_DATABASE=LV-20 Digital Camera +usb:v07CFp6101* + ID_MODEL_FROM_DATABASE=fx-9750gII + usb:v07CFp6801* ID_MODEL_FROM_DATABASE=PL-40R @@ -28373,6 +28709,9 @@ usb:v085Ap0023* usb:v085Ap0024* ID_MODEL_FROM_DATABASE=Parallel Port +usb:v085Ap0026* + ID_MODEL_FROM_DATABASE=PortGear SCSI + usb:v085Ap0027* ID_MODEL_FROM_DATABASE=1 port to Serial Converter @@ -29894,6 +30233,9 @@ usb:v0922p0020* usb:v0922p1001* ID_MODEL_FROM_DATABASE=LabelManager PnP +usb:v0922p8004* + ID_MODEL_FROM_DATABASE=M25 Digital Postal Scale + usb:v0923* ID_VENDOR_FROM_DATABASE=IC Media Corp. @@ -30506,6 +30848,9 @@ usb:v0951p1613* usb:v0951p1616* ID_MODEL_FROM_DATABASE=DataTraveler Locker 4GB +usb:v0951p161A* + ID_MODEL_FROM_DATABASE=Dell HyperVisor internal flash drive + usb:v0951p1621* ID_MODEL_FROM_DATABASE=DataTraveler 150 (32GB) @@ -30569,6 +30914,21 @@ usb:v0955pB400* usb:v0955pB401* ID_MODEL_FROM_DATABASE=SHIELD +usb:v0955pCF05* + ID_MODEL_FROM_DATABASE=SHIELD Tablet (debug) + +usb:v0955pCF06* + ID_MODEL_FROM_DATABASE=SHIELD Tablet + +usb:v0955pCF07* + ID_MODEL_FROM_DATABASE=SHIELD Tablet + +usb:v0955pCF08* + ID_MODEL_FROM_DATABASE=SHIELD Tablet + +usb:v0955pCF09* + ID_MODEL_FROM_DATABASE=SHIELD Tablet + usb:v0956* ID_VENDOR_FROM_DATABASE=BSquare Corp. @@ -30599,6 +30959,9 @@ usb:v0957p1745* usb:v0957p2918* ID_MODEL_FROM_DATABASE=U2702A oscilloscope +usb:v0957pFB18* + ID_MODEL_FROM_DATABASE=LC Device + usb:v0958* ID_VENDOR_FROM_DATABASE=CompuLink Research, Inc. @@ -30950,6 +31313,12 @@ usb:v09C4p0011* usb:v09C5* ID_VENDOR_FROM_DATABASE=Memory Corp. +usb:v09CA* + ID_VENDOR_FROM_DATABASE=BMC Messsysteme GmbH + +usb:v09CAp5544* + ID_MODEL_FROM_DATABASE=PIO + usb:v09CC* ID_VENDOR_FROM_DATABASE=Workbit Corp. @@ -31247,6 +31616,9 @@ usb:v0A12p000A* usb:v0A12p000B* ID_MODEL_FROM_DATABASE=Nanosira5-ROM +usb:v0A12p0042* + ID_MODEL_FROM_DATABASE=SPI Converter + usb:v0A12p0043* ID_MODEL_FROM_DATABASE=Bluetooth Device @@ -31311,7 +31683,7 @@ usb:v0A17p0004* ID_MODEL_FROM_DATABASE=Optio 330 usb:v0A17p0006* - ID_MODEL_FROM_DATABASE=Optio S + ID_MODEL_FROM_DATABASE=Optio S / S4 usb:v0A17p0007* ID_MODEL_FROM_DATABASE=Optio 550 @@ -31856,6 +32228,9 @@ usb:v0A5Fp0081* usb:v0A5Fp008B* ID_MODEL_FROM_DATABASE=HC100 wristbands Printer +usb:v0A5Fp008C* + ID_MODEL_FROM_DATABASE=ZP 450 Printer + usb:v0A5Fp00D1* ID_MODEL_FROM_DATABASE=Zebra GC420d Label Printer @@ -32807,12 +33182,18 @@ usb:v0B05p17A1* usb:v0B05p17AB* ID_MODEL_FROM_DATABASE=USB-N13 802.11n Network Adapter (rev. B1) [Realtek RTL8192CU] +usb:v0B05p17BA* + ID_MODEL_FROM_DATABASE=N10 Nano 802.11n Network Adapter [Realtek RTL8192CU] + usb:v0B05p17C7* ID_MODEL_FROM_DATABASE=WL-330NUL usb:v0B05p17C9* ID_MODEL_FROM_DATABASE=USB-AC53 802.11a/b/g/n/ac Wireless Adapter [Broadcom BCM43526] +usb:v0B05p17D1* + ID_MODEL_FROM_DATABASE=AC51 802.11a/b/g/n/ac Wireless Adapter [Mediatek MT7610/Ralink RT2870] + usb:v0B05p4C80* ID_MODEL_FROM_DATABASE=Transformer Pad TF300TG @@ -32822,6 +33203,12 @@ usb:v0B05p4C90* usb:v0B05p4C91* ID_MODEL_FROM_DATABASE=Transformer Pad Infinity TF700 (Debug mode) +usb:v0B05p4CA0* + ID_MODEL_FROM_DATABASE=Transformer Pad TF701T + +usb:v0B05p4CA1* + ID_MODEL_FROM_DATABASE=Transformer Pad TF701T (Debug mode) + usb:v0B05p4D00* ID_MODEL_FROM_DATABASE=Transformer Prime TF201 @@ -33125,6 +33512,9 @@ usb:v0B48p300D* usb:v0B48p300E* ID_MODEL_FROM_DATABASE=TT-connect C-2400 +usb:v0B48p3011* + ID_MODEL_FROM_DATABASE=TT-connect S2-4600 + usb:v0B48p3012* ID_MODEL_FROM_DATABASE=TT-connect CT2-4650 CI @@ -33497,6 +33887,9 @@ usb:v0BB3* usb:v0BB4* ID_VENDOR_FROM_DATABASE=HTC (High Tech Computer Corp.) +usb:v0BB4p0001* + ID_MODEL_FROM_DATABASE=Android Phone via mass storage [Wiko Cink Peax 2] + usb:v0BB4p00CE* ID_MODEL_FROM_DATABASE=mmO2 XDA GSM/GPRS Pocket PC @@ -34061,6 +34454,9 @@ usb:v0BB4p0CAE* usb:v0BB4p0DEA* ID_MODEL_FROM_DATABASE=M7_UL [HTC One] +usb:v0BB4p0F64* + ID_MODEL_FROM_DATABASE=Desire 601 + usb:v0BB4p0FF8* ID_MODEL_FROM_DATABASE=Desire HD (Tethering Mode) @@ -34073,6 +34469,12 @@ usb:v0BB4p0FFE* usb:v0BB4p0FFF* ID_MODEL_FROM_DATABASE=Android Fastboot Bootloader +usb:v0BB4p2008* + ID_MODEL_FROM_DATABASE=Android Phone via MTP [Wiko Cink Peax 2] + +usb:v0BB4p200B* + ID_MODEL_FROM_DATABASE=Android Phone via PTP [Wiko Cink Peax 2] + usb:v0BB5* ID_VENDOR_FROM_DATABASE=Murata Manufacturing Co., Ltd @@ -34130,6 +34532,9 @@ usb:v0BC2p2300* usb:v0BC2p2320* ID_MODEL_FROM_DATABASE=USB 3.0 bridge [Portable Expansion Drive] +usb:v0BC2p3000* + ID_MODEL_FROM_DATABASE=FreeAgent Desktop + usb:v0BC2p3008* ID_MODEL_FROM_DATABASE=FreeAgent Desk 1TB @@ -34190,6 +34595,12 @@ usb:v0BC2pAB00* usb:v0BC2pAB20* ID_MODEL_FROM_DATABASE=Backup Plus Portable Drive +usb:v0BC2pAB21* + ID_MODEL_FROM_DATABASE=Backup Plus Slim + +usb:v0BC2pAB31* + ID_MODEL_FROM_DATABASE=Backup Plus Desktop Drive (5TB) + usb:v0BC3* ID_VENDOR_FROM_DATABASE=IPWireless, Inc. @@ -34385,6 +34796,9 @@ usb:v0BDAp2838* usb:v0BDAp5730* ID_MODEL_FROM_DATABASE=HP 2.0MP High Definition Webcam +usb:v0BDAp5775* + ID_MODEL_FROM_DATABASE=HP "Truevision HD" laptop camera + usb:v0BDAp8150* ID_MODEL_FROM_DATABASE=RTL8150 Fast Ethernet Adapter @@ -34820,6 +35234,9 @@ usb:v0C2Ep0B61* usb:v0C2Ep0B6A* ID_MODEL_FROM_DATABASE=Vuquest 3310 Area-Imaging Scanner +usb:v0C2Ep0B81* + ID_MODEL_FROM_DATABASE=Barcode scanner Voyager 1400g Series + usb:v0C35* ID_VENDOR_FROM_DATABASE=Eagletron, Inc. @@ -37076,6 +37493,9 @@ usb:v0DA4* usb:v0DA4p0001* ID_MODEL_FROM_DATABASE=Interface +usb:v0DA4p0008* + ID_MODEL_FROM_DATABASE=Loop + usb:v0DA7* ID_VENDOR_FROM_DATABASE=IOGear, Inc. @@ -37295,6 +37715,9 @@ usb:v0DC4p0042* usb:v0DC4p0101* ID_MODEL_FROM_DATABASE=Hi-Speed Mass Storage Device +usb:v0DC4p0209* + ID_MODEL_FROM_DATABASE=SK-3500 S2 + usb:v0DC4p020A* ID_MODEL_FROM_DATABASE=Oyen Digital MiniPro 2.5" hard drive enclosure @@ -37691,6 +38114,12 @@ usb:v0E0C* usb:v0E0Cp0101* ID_MODEL_FROM_DATABASE=LonUSB LonTalk Network Adapter +usb:v0E0D* + ID_VENDOR_FROM_DATABASE=PicoQuant GmbH + +usb:v0E0Dp0003* + ID_MODEL_FROM_DATABASE=PicoHarp 300 + usb:v0E0F* ID_VENDOR_FROM_DATABASE=VMware, Inc. @@ -38121,7 +38550,7 @@ usb:v0E8Dp0023* ID_MODEL_FROM_DATABASE=S103 usb:v0E8Dp1806* - ID_MODEL_FROM_DATABASE=Samsung SE-208AB Slim Portable DVD Writer + ID_MODEL_FROM_DATABASE=Samsung SE-208 Slim Portable DVD Writer usb:v0E8Dp1836* ID_MODEL_FROM_DATABASE=Samsung SE-S084 Super WriteMaster Slim External DVD writer @@ -38217,7 +38646,7 @@ usb:v0EA0p2153* ID_MODEL_FROM_DATABASE=SD Card Reader Key usb:v0EA0p2168* - ID_MODEL_FROM_DATABASE=Transcend JetFlash 2.0 / Astone USB Drive + ID_MODEL_FROM_DATABASE=Transcend JetFlash 2.0 / Astone USB Drive / Intellegent Stick 2.0 usb:v0EA0p6803* ID_MODEL_FROM_DATABASE=OTI-6803 Flash Disk @@ -39054,7 +39483,7 @@ usb:v0FCEp8004* ID_MODEL_FROM_DATABASE=9000 Phone [Mass Storage] usb:v0FCEpADDE* - ID_MODEL_FROM_DATABASE=Boot loader + ID_MODEL_FROM_DATABASE=C2005 (Xperia M dual) in service mode usb:v0FCEpD008* ID_MODEL_FROM_DATABASE=V800-Vodafone 802SE Phone @@ -39116,9 +39545,15 @@ usb:v0FCEpD0D4* usb:v0FCEpD0E1* ID_MODEL_FROM_DATABASE=MD400 Mobile Broadband Modem +usb:v0FCEpD12A* + ID_MODEL_FROM_DATABASE=U100i Yari Phone + usb:v0FCEpD12E* ID_MODEL_FROM_DATABASE=Xperia X10 +usb:v0FCEpD14E* + ID_MODEL_FROM_DATABASE=J108i Cedar + usb:v0FCEpE000* ID_MODEL_FROM_DATABASE=K810 (PictBridge mode) @@ -39188,6 +39623,9 @@ usb:v0FCEpE166* usb:v0FCEpE167* ID_MODEL_FROM_DATABASE=XPERIA mini +usb:v0FCEpE19B* + ID_MODEL_FROM_DATABASE=C2005 [Xperia M dual] (Mass Storage) + usb:v0FCEpF0FA* ID_MODEL_FROM_DATABASE=Liveview micro display MN800 in DFU mode @@ -39269,6 +39707,9 @@ usb:v0FDE* usb:v0FDEpCA01* ID_MODEL_FROM_DATABASE=WMRS200 weather station +usb:v0FDEpCA05* + ID_MODEL_FROM_DATABASE=CM160 + usb:v0FE0* ID_VENDOR_FROM_DATABASE=Osterhout Design Group @@ -39462,7 +39903,7 @@ usb:v1005p1006* ID_MODEL_FROM_DATABASE=MP3 Player usb:v1005pB113* - ID_MODEL_FROM_DATABASE=Handy Steno 2.0/HT203 + ID_MODEL_FROM_DATABASE=Handy Steno/AH123 / Handy Steno 2.0/HT203 usb:v1005pB223* ID_MODEL_FROM_DATABASE=CD-RW + 6in1 Card Reader Digital Storage / Converter @@ -39815,6 +40256,9 @@ usb:v1050p0110* usb:v1050p0111* ID_MODEL_FROM_DATABASE=Yubikey NEO OTP+CCID +usb:v1050p0112* + ID_MODEL_FROM_DATABASE=Yubikey NEO CCID + usb:v1050p0200* ID_MODEL_FROM_DATABASE=U2F Gnubby @@ -39854,11 +40298,17 @@ usb:v1058p0400* usb:v1058p0500* ID_MODEL_FROM_DATABASE=hub +usb:v1058p0701* + ID_MODEL_FROM_DATABASE=WD Passport (WDXMS) + usb:v1058p0702* - ID_MODEL_FROM_DATABASE=Passport External HDD + ID_MODEL_FROM_DATABASE=WD Passport (WDXMS) usb:v1058p0704* - ID_MODEL_FROM_DATABASE=Passport External HDD + ID_MODEL_FROM_DATABASE=My Passport Essential (WDME) + +usb:v1058p0705* + ID_MODEL_FROM_DATABASE=My Passport Elite (WDML) usb:v1058p070A* ID_MODEL_FROM_DATABASE=My Passport Essential (WDBAAA), My Passport for Mac (WDBAAB), My Passport Essential SE (WDBABM), My Passport SE for Mac (WDBABW) @@ -39878,6 +40328,9 @@ usb:v1058p071D* usb:v1058p0730* ID_MODEL_FROM_DATABASE=My Passport Essential (WDBACY) +usb:v1058p0732* + ID_MODEL_FROM_DATABASE=My Passport Essential SE (WDBGYS) + usb:v1058p0740* ID_MODEL_FROM_DATABASE=My Passport Essential (WDBACY) @@ -39885,14 +40338,20 @@ usb:v1058p0741* ID_MODEL_FROM_DATABASE=My Passport Ultra usb:v1058p0742* - ID_MODEL_FROM_DATABASE=My Passport Essential SE + ID_MODEL_FROM_DATABASE=My Passport Essential SE (WDBGYS) usb:v1058p0748* - ID_MODEL_FROM_DATABASE=My Passport (WDBKXH) + ID_MODEL_FROM_DATABASE=My Passport (WDBKXH, WDBY8L) + +usb:v1058p07A8* + ID_MODEL_FROM_DATABASE=My Passport (WDBBEP), My Passport for Mac (WDBLUZ) usb:v1058p0810* ID_MODEL_FROM_DATABASE=My Passport Ultra (WDBZFP) +usb:v1058p0820* + ID_MODEL_FROM_DATABASE=My Passport Ultra (WDBMWV, WDBZFP) + usb:v1058p0900* ID_MODEL_FROM_DATABASE=MyBook Essential External HDD @@ -39912,7 +40371,7 @@ usb:v1058p1001* ID_MODEL_FROM_DATABASE=Elements Desktop (WDE1U) usb:v1058p1003* - ID_MODEL_FROM_DATABASE=Elements 1000 GB + ID_MODEL_FROM_DATABASE=WD Elements Desktop (WDE1UBK) usb:v1058p1010* ID_MODEL_FROM_DATABASE=Elements Portable (WDBAAR) @@ -39923,23 +40382,35 @@ usb:v1058p1021* usb:v1058p1023* ID_MODEL_FROM_DATABASE=Elements SE Portable (WDBABV) +usb:v1058p1042* + ID_MODEL_FROM_DATABASE=Elements SE Portable (WDBPCK) + usb:v1058p1048* ID_MODEL_FROM_DATABASE=Elements Portable (WDBU6Y) +usb:v1058p107C* + ID_MODEL_FROM_DATABASE=Elements Desktop (WDBWLG) + usb:v1058p10A2* ID_MODEL_FROM_DATABASE=Elements SE Portable (WDBPCK) usb:v1058p10A8* ID_MODEL_FROM_DATABASE=Elements Portable (WDBUZG) +usb:v1058p10B8* + ID_MODEL_FROM_DATABASE=Elements Portable (WDBU6Y, WDBUZG) + usb:v1058p1100* ID_MODEL_FROM_DATABASE=My Book Essential Edition 2.0 (WDH1U) +usb:v1058p1102* + ID_MODEL_FROM_DATABASE=My Book Home Edition (WDH1CS) + usb:v1058p1103* ID_MODEL_FROM_DATABASE=My Book Studio usb:v1058p1104* - ID_MODEL_FROM_DATABASE=MyBook Mirror Edition External HDD + ID_MODEL_FROM_DATABASE=My Book Mirror Edition (WDH2U) usb:v1058p1105* ID_MODEL_FROM_DATABASE=My Book Studio II @@ -39962,6 +40433,9 @@ usb:v1058p1130* usb:v1058p1140* ID_MODEL_FROM_DATABASE=My Book Essential (WDBACW) +usb:v1058p1230* + ID_MODEL_FROM_DATABASE=My Book (WDBFJK0030HBK) + usb:v1059* ID_VENDOR_FROM_DATABASE=Giesecke & Devrient GmbH @@ -40325,9 +40799,102 @@ usb:v10A9p1102* usb:v10A9p1104* ID_MODEL_FROM_DATABASE=Sky Vega IM-A650S +usb:v10A9p1105* + ID_MODEL_FROM_DATABASE=VEGA Android composite + +usb:v10A9p1106* + ID_MODEL_FROM_DATABASE=VEGA Android composite + +usb:v10A9p1107* + ID_MODEL_FROM_DATABASE=VEGA Android composite + +usb:v10A9p1108* + ID_MODEL_FROM_DATABASE=VEGA Android composite + +usb:v10A9p1109* + ID_MODEL_FROM_DATABASE=VEGA Android composite + usb:v10A9p6021* ID_MODEL_FROM_DATABASE=SIRIUS alpha +usb:v10A9p6031* + ID_MODEL_FROM_DATABASE=Pantech Android composite + +usb:v10A9p6032* + ID_MODEL_FROM_DATABASE=Pantech Android composite + +usb:v10A9p6033* + ID_MODEL_FROM_DATABASE=Pantech Android composite + +usb:v10A9p6034* + ID_MODEL_FROM_DATABASE=Pantech Android composite + +usb:v10A9p6035* + ID_MODEL_FROM_DATABASE=Pantech Android composite + +usb:v10A9p6036* + ID_MODEL_FROM_DATABASE=Pantech Android composite + +usb:v10A9p6037* + ID_MODEL_FROM_DATABASE=Pantech Android composite + +usb:v10A9p6050* + ID_MODEL_FROM_DATABASE=Pantech Android composite + +usb:v10A9p6051* + ID_MODEL_FROM_DATABASE=Pantech Android composite + +usb:v10A9p6052* + ID_MODEL_FROM_DATABASE=Pantech Android composite + +usb:v10A9p6053* + ID_MODEL_FROM_DATABASE=Pantech Android composite + +usb:v10A9p6054* + ID_MODEL_FROM_DATABASE=Pantech Android composite + +usb:v10A9p6055* + ID_MODEL_FROM_DATABASE=Pantech Android composite + +usb:v10A9p6056* + ID_MODEL_FROM_DATABASE=Pantech Android composite + +usb:v10A9p6057* + ID_MODEL_FROM_DATABASE=Pantech Android composite + +usb:v10A9p6058* + ID_MODEL_FROM_DATABASE=Pantech Android composite + +usb:v10A9p6059* + ID_MODEL_FROM_DATABASE=Pantech Android composite + +usb:v10A9p6080* + ID_MODEL_FROM_DATABASE=MHS291LVW LTE Modem [Verizon Jetpack 4G LTE Mobile Hotspot MHS291L] (Zero CD Mode) + +usb:v10A9p6085* + ID_MODEL_FROM_DATABASE=MHS291LVW LTE Modem [Verizon Jetpack 4G LTE Mobile Hotspot MHS291L] (Modem Mode) + +usb:v10A9p7031* + ID_MODEL_FROM_DATABASE=Pantech Android composite + +usb:v10A9p7032* + ID_MODEL_FROM_DATABASE=Pantech Android composite + +usb:v10A9p7033* + ID_MODEL_FROM_DATABASE=Pantech Android composite + +usb:v10A9p7034* + ID_MODEL_FROM_DATABASE=Pantech Android composite + +usb:v10A9p7035* + ID_MODEL_FROM_DATABASE=Pantech Android composite + +usb:v10A9p7036* + ID_MODEL_FROM_DATABASE=Pantech Android composite + +usb:v10A9p7037* + ID_MODEL_FROM_DATABASE=Pantech Android composite + usb:v10AA* ID_VENDOR_FROM_DATABASE=Cables To Go @@ -40511,6 +41078,9 @@ usb:v10C4p8897* usb:v10C4p8918* ID_MODEL_FROM_DATABASE=C8051F38x HDMI Audio Extractor [VSA-HA-DP] +usb:v10C4p8973* + ID_MODEL_FROM_DATABASE=C8051F38x HDMI Splitter [UHBX-8X] + usb:v10C4pEA60* ID_MODEL_FROM_DATABASE=CP210x UART Bridge / myAVR mySmartUSB light @@ -41514,7 +42084,7 @@ usb:v1241p1122* ID_MODEL_FROM_DATABASE=Typhoon Stream Optical Mouse USB+PS/2 usb:v1241p1155* - ID_MODEL_FROM_DATABASE=PS2/USB Browser Combo Mouse + ID_MODEL_FROM_DATABASE=Memorex Optical ScrollPro Mouse SE MX4600 usb:v1241p1166* ID_MODEL_FROM_DATABASE=MI-2150 Trust Mouse @@ -41573,6 +42143,9 @@ usb:v125Fp312A* usb:v125Fp312B* ID_MODEL_FROM_DATABASE=Superior S102 Pro +usb:v125FpA15A* + ID_MODEL_FROM_DATABASE=DashDrive Durable HD710 portable HDD various size + usb:v125FpA22A* ID_MODEL_FROM_DATABASE=DashDrive Elite HE720 500GB @@ -41795,6 +42368,9 @@ usb:v1293p2101* usb:v1294* ID_VENDOR_FROM_DATABASE=RISO KAGAKU CORP. +usb:v1294p1320* + ID_MODEL_FROM_DATABASE=Webmail Notifier + usb:v129B* ID_VENDOR_FROM_DATABASE=CyberTAN Technology @@ -41843,6 +42419,12 @@ usb:v12BAp0200* usb:v12BAp0210* ID_MODEL_FROM_DATABASE=Harmonix Drum Kit for PlayStation(R)3 +usb:v12BD* + ID_VENDOR_FROM_DATABASE=Gembird + +usb:v12BDpD012* + ID_MODEL_FROM_DATABASE=JPD Shockforce gamepad + usb:v12C4* ID_VENDOR_FROM_DATABASE=Autocue Group Ltd @@ -41891,6 +42473,9 @@ usb:v12D1p1038* usb:v12D1p1039* ID_MODEL_FROM_DATABASE=Ideos (tethering mode) +usb:v12D1p1404* + ID_MODEL_FROM_DATABASE=EM770W miniPCI WCDMA Modem + usb:v12D1p1406* ID_MODEL_FROM_DATABASE=E1750 @@ -42365,6 +42950,24 @@ usb:v1357p0503* usb:v1357p0504* ID_MODEL_FROM_DATABASE=DEMOJM +usb:v135F* + ID_VENDOR_FROM_DATABASE=Control Development Inc. + +usb:v135Fp0110* + ID_MODEL_FROM_DATABASE=Linear Spectrograph + +usb:v135Fp0111* + ID_MODEL_FROM_DATABASE=Spectrograph - Renumerated + +usb:v135Fp0200* + ID_MODEL_FROM_DATABASE=Linear Spectrograph + +usb:v135Fp0201* + ID_MODEL_FROM_DATABASE=Spectrograph - Renumerated + +usb:v135Fp0240* + ID_MODEL_FROM_DATABASE=MPP Spectrograph + usb:v1366* ID_VENDOR_FROM_DATABASE=SEGGER @@ -42374,6 +42977,12 @@ usb:v1366p0101* usb:v136B* ID_VENDOR_FROM_DATABASE=STEC +usb:v136E* + ID_VENDOR_FROM_DATABASE=Andor Technology Ltd. + +usb:v136Ep0014* + ID_MODEL_FROM_DATABASE=Zyla 5.5 sCMOS camera + usb:v1370* ID_VENDOR_FROM_DATABASE=Swissbit @@ -42455,9 +43064,15 @@ usb:v138Ap0007* usb:v138Ap0008* ID_MODEL_FROM_DATABASE=VFS300 Fingerprint Reader +usb:v138Ap0010* + ID_MODEL_FROM_DATABASE=VFS Fingerprint sensor + usb:v138Ap0011* ID_MODEL_FROM_DATABASE=VFS5011 Fingerprint Reader +usb:v138Ap0017* + ID_MODEL_FROM_DATABASE=Fingerprint Reader + usb:v138Ap0018* ID_MODEL_FROM_DATABASE=Fingerprint scanner @@ -42824,6 +43439,12 @@ usb:v13D3p7020* usb:v13D3p7022* ID_MODEL_FROM_DATABASE=DTV-DVB UDST7022BDA DVB-S Box(Without HID) +usb:v13D7* + ID_VENDOR_FROM_DATABASE=Guidance Software, Inc. + +usb:v13D7p0001* + ID_MODEL_FROM_DATABASE=T5 PATA forensic bridge + usb:v13DC* ID_VENDOR_FROM_DATABASE=ALEREON, INC. @@ -42860,6 +43481,9 @@ usb:v13ECp0006* usb:v13EE* ID_VENDOR_FROM_DATABASE=MosArt +usb:v13EEp0001* + ID_MODEL_FROM_DATABASE=Optical Mouse + usb:v13EEp0003* ID_MODEL_FROM_DATABASE=Optical Mouse @@ -42935,6 +43559,9 @@ usb:v13FEp3800* usb:v13FEp3E00* ID_MODEL_FROM_DATABASE=Flash Drive +usb:v13FEp4100* + ID_MODEL_FROM_DATABASE=Flash drive + usb:v13FEp5000* ID_MODEL_FROM_DATABASE=USB flash drive (32 GB SHARKOON Accelerate) @@ -43370,6 +43997,9 @@ usb:v148Fp5572* usb:v148Fp7601* ID_MODEL_FROM_DATABASE=MT7601U Wireless Adapter +usb:v148Fp760B* + ID_MODEL_FROM_DATABASE=MT7601U Wireless Adapter + usb:v148Fp9020* ID_MODEL_FROM_DATABASE=RT2500USB Wireless Adapter @@ -43394,6 +44024,12 @@ usb:v1493p0019* usb:v1493p001A* ID_MODEL_FROM_DATABASE=Colibri [Ambit2 S] +usb:v1493p001B* + ID_MODEL_FROM_DATABASE=Emu [Ambit3 Peak] + +usb:v1493p001C* + ID_MODEL_FROM_DATABASE=Finch [Ambit3 Sport] + usb:v1493p001D* ID_MODEL_FROM_DATABASE=Greentit [Ambit2 R] @@ -43514,6 +44150,9 @@ usb:v14C8* usb:v14CD* ID_VENDOR_FROM_DATABASE=Super Top +usb:v14CDp1212* + ID_MODEL_FROM_DATABASE=microSD card reader (SY-T18) + usb:v14CDp121C* ID_MODEL_FROM_DATABASE=microSD card reader @@ -50036,6 +50675,12 @@ usb:v2770p930B* usb:v2770p930C* ID_MODEL_FROM_DATABASE=CCD Webcam(PC370R) +usb:v27B8* + ID_VENDOR_FROM_DATABASE=ThingM + +usb:v27B8p01ED* + ID_MODEL_FROM_DATABASE=blink(1) + usb:v2821* ID_VENDOR_FROM_DATABASE=ASUSTek Computer Inc. @@ -50054,6 +50699,21 @@ usb:v2899* usb:v2899p012C* ID_MODEL_FROM_DATABASE=Camera Device +usb:v2931* + ID_VENDOR_FROM_DATABASE=Jolla Oy + +usb:v2931p0A01* + ID_MODEL_FROM_DATABASE=Jolla Phone MTP + +usb:v2931p0A02* + ID_MODEL_FROM_DATABASE=Jolla Phone Developer + +usb:v2931p0A05* + ID_MODEL_FROM_DATABASE=Jolla PC connection + +usb:v2931p0AFE* + ID_MODEL_FROM_DATABASE=Jolla charging only + usb:v2C02* ID_VENDOR_FROM_DATABASE=Planex Communications diff --git a/hwdb/60-keyboard.hwdb b/hwdb/60-keyboard.hwdb index 06caba9791..af0917ee8e 100644 --- a/hwdb/60-keyboard.hwdb +++ b/hwdb/60-keyboard.hwdb @@ -42,7 +42,7 @@ # an input device use the commonly available tool: evtest(1). # # To update this file, create a new file -# /etc/udev/hwdb.d/70-keyboad.hwdb +# /etc/udev/hwdb.d/70-keyboard.hwdb # and add your rules there. To load the new rules execute (as root): # udevadm hwdb --update # udevadm trigger /dev/input/eventXX @@ -230,6 +230,11 @@ keyboard:dmi:bvn*:bvr*:bd*:svnDell*:pnInspiron*1110:pvr* keyboard:dmi:bvn*:bvr*:bd*:svnDell*:pnInspiron*1210:pvr* KEYBOARD_KEY_84=wlan +# Dell Inspiron 1520 +keyboard:dmi:bvn*:bvr*:bd*:svnDell*:pnInspiron*1520:pvr* + KEYBOARD_KEY_85=unknown # Brightness Down, also emitted by acpi-video, ignore + KEYBOARD_KEY_86=unknown # Brightness Up, also emitted by acpi-video, ignore + # Latitude XT2 keyboard:dmi:bvn*:bvr*:bd*:svnDell*:pnLatitude*XT2:pvr* KEYBOARD_KEY_9b=up # tablet rocker up @@ -557,6 +562,10 @@ keyboard:dmi:bvn*:bvr*:bd*:svnLENOVO*:pn*3000*:pvr* KEYBOARD_KEY_98=suspend # Fn+F12 hibernate KEYBOARD_KEY_b4=prog1 # Lenovo Care +# "Lenovo Care" Key of the 3000 N200 +keyboard:dmi:bvn*:bvr*:bd*:svnLENOVO:pn0769AP2:pvr3000N200:* + KEYBOARD_KEY_b4=prog1 + # lenovo-ideapad keyboard:dmi:bvn*:bvr*:bd*:svnLENOVO*:pn*IdeaPad*:pvr* keyboard:dmi:bvn*:bvr*:bd*:svnLENOVO*:pnS10-*:pvr* @@ -580,8 +589,8 @@ keyboard:dmi:bvn*:bvr*:bd*:svnLENOVO*:pn*:pvrThinkPad*X2*Tablet* # ThinkPad X6 Tablet keyboard:dmi:bvn*:bvr*:bd*:svnLENOVO*:pnThinkPad*X6*:pvr* - KEYBOARD_KEY_6c=f21 # rotate - KEYBOARD_KEY_68=screenlock # screenlock + KEYBOARD_KEY_6c=direction # rotate + KEYBOARD_KEY_68=f13 # toolbox KEYBOARD_KEY_6b=esc # escape KEYBOARD_KEY_6d=right # right on d-pad KEYBOARD_KEY_6e=left # left on d-pad @@ -589,6 +598,13 @@ keyboard:dmi:bvn*:bvr*:bd*:svnLENOVO*:pnThinkPad*X6*:pvr* KEYBOARD_KEY_6f=down # down on d-pad KEYBOARD_KEY_69=enter # enter on d-pad +# ThinkPad X41 Tablet +keyboard:dmi:bvn*:bvr*:bd*:svnIBM*:pn18666TU:pvr* + KEYBOARD_KEY_6c=direction # rotate + KEYBOARD_KEY_68=f13 # toolbox + KEYBOARD_KEY_6b=esc # escape + KEYBOARD_KEY_69=enter # enter on d-pad + # IdeaPad keyboard:name:Ideapad extra buttons:dmi:bvn*:bvr*:bd*:svnLENOVO*:pn* KEYBOARD_KEY_42=f23 diff --git a/hwdb/70-mouse.hwdb b/hwdb/70-mouse.hwdb new file mode 100644 index 0000000000..e23e4f6618 --- /dev/null +++ b/hwdb/70-mouse.hwdb @@ -0,0 +1,280 @@ +# This file is part of systemd. +# +# Database for the DPI setting of mice, trackballs, other pointer devices that +# cannot be queried directly. +# +# The lookup keys are composed in: +# 70-mouse.rules +# +# Note: The format of the "mouse:" prefix match key is a +# contract between the rules file and the hardware data, it might +# change in later revisions to support more or better matches, it +# is not necessarily expected to be a stable ABI. +# +# Match string format: +# mouse:<subsystem>:v<vid>p<pid>:name:<name>: +# +# Supported subsystems: usb, bluetooth +# vid/pid as 4-digit hex lowercase vendor/product +# +# if vid/pid is unavailable, use +# mouse:*:name:<name>: +# if name is unavailable, use +# mouse:<subsystem>:v<vid>p<pid>:* +# +# For example, the following 5 matches all match the same mouse: +# mouse:usb:v17efp6019:name:Lenovo Optical USB Mouse: +# mouse:usb:*:name:Lenovo Optical USB Mouse: +# mouse:usb:v17efp6019:* +# mouse:*:name:Lenovo Optical USB Mouse: +# +# To add local entries, create a new file +# /etc/udev/hwdb.d/71-mouse-local.hwdb +# and add your rules there. To load the new rules execute (as root): +# udevadm hwdb --update +# udevadm trigger /dev/input/eventXX +# where /dev/input/eventXX is the mouse in question. If in +# doubt, simply use /dev/input/event* to reload all input rules. +# +# If your changes are generally applicable, open a bug report on +# http://bugs.freedesktop.org/enter_bug.cgi?product=systemd +# and include your new rules, a description of the device, and the +# output of +# udevadm info /dev/input/eventXX +# (or /dev/input/event*). +# +# Allowed properties are: +# MOUSE_DPI +# MOUSE_WHEEL_CLICK_ANGLE +# +######################################### +# MOUSE_DPI # +######################################### +# +# DPI settings are specified as +# MOUSE_DPI=<dpi>[@<frequency>] +# +# Where <dpi> is the resolution in dots per inch, and <frequency> the +# sampling frequency in Hz (optional). If a device supports dynamic +# frequency scaling, the maximum frequency should be used. For devices +# supporting multiple fixed frequencies, see below. +# +# The value of MOUSE_DPI is: +# - a single integer for single-resolution mice, e.g. +# MOUSE_DPI=800 +# or, if the frequency is known: +# MOUSE_DPI=800@120 +# - a space-separated list of resolutions for multi-resolution mice. +# The default resolution must be prefixed by an asterisk, the resolutions +# in the database must be as shipped by the manufacturer. e.g. +# MOUSE_DPI=400 *800 2000 +# +# The order of resolutions is as configured by the HW manufacturer or in +# ascending order, whichever appropriate. +# +# The frequency must be given to either none or all resolutions. If the +# device supports multiple fixed frequencies, the order of items is +# MOUSE_DPI=r1@f1 r2@f1 r3@f1 r1@f2 r2@f2 r3@f2 +# +# If the default manufacturer-set resolution is unclear, a resolution of +# 800 or 1000 should be set as default, if available. If neither is +# available, choose the "middle" resolution value of those available. +# +# The list may contain a single item which must be marked with an +# asterisk. +# +# Local changes to the a non-default resolution of the mouse (e.g. through +# third-party software) must not be entered into this file, use a local +# hwdb instead. +# +######################################### +# MOUSE_WHEEL_CLICK_ANGLE # +######################################### +# +# The angle in degrees per mouse wheel 'click', specified as +# MOUSE_WHEEL_CLICK_ANGLE=<degrees> +# +# Most mice have a 15 degree click stop (24 clicks per full rotation). +# + +# +# Sort by by brand, type (usb, bluetooth), DPI, frequency. +# For mice with switchable resolution, sort by the starred entry. + +########################################## +# Chicony +########################################## + +# Chicony 2.4G Multimedia Wireless Kit MG-0919 +mouse:usb:v04f2p0963:name:Chicony 2.4G Multimedia Wireless Kit: + MOUSE_DPI=1000@142 + +########################################## +# Dell +########################################## + +# Dell USB Laser Mouse +mouse:usb:v046dpc063:name:DELL DELL USB Laser Mouse: + MOUSE_DPI=1000@125 + +########################################## +# Fujitsu Siemens +########################################## + +mouse:usb:v0461p4d16:name:USB Optical Mouse: + MOUSE_DPI=500@125 + +########################################## +# Lenovo +########################################## + +# Lenovo Optical USB Mouse +mouse:usb:v17efp6019:name:Lenovo Optical USB Mouse: + MOUSE_DPI=1000@125 + +# ThinkPad USB Laser Mouse +mouse:usb:v17efp6044:name:ThinkPad USB Laser Mouse: + MOUSE_DPI=1200@125 + +########################################## +# Logitech +########################################## + +# Note: devices using the Logitech Unifying receiver will need two entries, +# one for pre 3.19 with the wireless PID in the name, one for 3.19 with the +# model name. The usb vid/pid is the same for all those devices. +# Until 3.19 is available, this list just has the Wireless PID entry. + +# Logitech M-BJ58 Optical Mouse +mouse:usb:v046dpc00e:name:Logitech USB-PS/2 Optical Mouse: +# Logitech MX310 Optical Mouse +mouse:usb:v046dpc01b:name:Logitech USB-PS/2 Optical Mouse: +# Logitech USB-PS/2 M-BT58 +mouse:usb:v046dpc03e:name:Logitech USB-PS/2 Optical Mouse: + MOUSE_DPI=400@125 + +# Lenovo USB mouse model MO28UOL +mouse:usb:v04b3p310c:name:USB Optical Mouse: + MOUSE_DPI=400@142 + +# Logitech USB-PS/2 M-BZ96C +mouse:usb:v046dpc045:name:Logitech USB-PS/2 Optical Mouse: + MOUSE_DPI=600@125 + +# Logitech Wireless Mouse M325 +mouse:usb:v046dpc52b:name:Logitech Unifying Device. Wireless PID:400a: + MOUSE_DPI=600@166 + MOUSE_WHEEL_CLICK_ANGLE=20 + +# Logitech MX1000 Laser Cordless Mouse +mouse:usb:v046dpc50e:name:Logitech USB RECEIVER: +# Logitech Cordless Click! Plus +mouse:usb:v046dpc50e:name:Logitech USB Receiver: +# Logitech, Inc. RX 300 Optical Mouse +mouse:usb:v046dpc040:name:Logitech USB-PS/2 Optical Mouse: + MOUSE_DPI=800@125 + +# Logitech MX 518 +mouse:usb:v046dpc01e:name:Logitech USB-PS/2 Optical Mouse: + MOUSE_DPI=400@125 *800@125 1600@125 + +# Logitech, Inc. RX 250 Optical Mouse +mouse:usb:v046dpc050:name:Logitech USB-PS/2 Optical Mouse: + MOUSE_DPI=800@142 + +# Logitech G400 (Wired) +mouse:usb:v046dpc245:name:Logitech Gaming Mouse G400: + MOUSE_DPI=400@1000 *800@1000 1800@1000 3600@1000 + +# Logitech G400s (Wired) +mouse:usb:v046dpc24c:name:Logitech G400s Optical Gaming Mouse: + MOUSE_DPI=400@1000 *800@1000 2000@1000 4000@1000 + +# Logitech Wireless Mouse M185 +mouse:usb:v046dpc52b:name:Logitech Unifying Device. Wireless PID:4008: +# Logitech M705 (marathon mouse) +mouse:usb:v046dpc52b:name:Logitech Unifying Device. Wireless PID:101b: + MOUSE_DPI=800@166 + +# Logitech G500s Laser Gaming Mouse +mouse:usb:v046dpc24e:name:Logitech G500s Laser Gaming Mouse: + MOUSE_DPI=400@500 *800@500 2000@500 + +# Logitech B605 Wireless Mouse (also M505) +mouse:usb:v046dpc52b:name:Logitech Unifying Device. Wireless PID:101d: + MOUSE_DPI=900@166 + +# Logitech RX1000 Laser Mouse +mouse:usb:v046dpc046:name:Logitech USB Optical Mouse: +# Logitech M100 Optical Mouse +mouse:usb:v046dpc05a:name:Logitech USB Optical Mouse: +# Logitech USB Laser Mouse M-U0011-O rebranded as "terra Laser" +mouse:usb:v046dpc065:name:Logitech USB Laser Mouse: + MOUSE_DPI=1000@125 + +# Logitech MK260 Wireless Combo Receiver aka M-R0011 +mouse:usb:v046dpc52e:name:Logitech USB Receiver: + MOUSE_DPI=1000@200 + +# Logitech G700 Laser Mouse (Wired) +mouse:usb:v046dpc06b:name:Logitech G700 Laser Mouse: +# Logitech G700 Laser Mouse (Wireless) +mouse:usb:v046dpc531:name:Logitech USB Receiver: + MOUSE_DPI=*1000@500 3800@500 500@1000 1500@1000 2000@1000 + +# Logitech USB Laser Mouse M-UAS144 [LS1 Laser Mouse] +mouse:usb:v046dpc062:name:Logitech USB Laser Mouse: +# Logitech USB Laser Mouse M-U0007 +mouse:usb:v046dpc069:name:Logitech USB Laser Mouse: + MOUSE_DPI=1200@125 + +# Logitech T620 (or, the soap) +mouse:usb:v046dpc52b:name:Logitech Unifying Device. Wireless PID:4027: + MOUSE_DPI=1200@250 + +# Logitech ZoneTouch Mouse T400 +mouse:usb:v046dpc52b:name:Logitech Unifying Device. Wireless PID:4026: + MOUSE_DPI=1300@166 + +# Logitech Ultrathin Touch Mouse +mouse:bluetooth:v046dpb00d:name:Ultrathin Touch Mouse: + MOUSE_DPI=1000@1000 + +# ImExPS/2 Logitech Wheel Mouse +mouse:ps2:*:name:ImExPS/2 Logitech Wheel Mouse: + MOUSE_DPI=400@250 + +########################################## +# Microsoft +########################################## + +# Note: unsure that these work, it's likely that all devices on these +# receivers show up with the same vid/pid/name + +# Microsoft Sculpt Ergonomic Mouse +mouse:usb:v045ep07a5:name:Microsoft Microsoft® 2.4GHz Transceiver v9.0: + MOUSE_DPI=1000@142 + +# Microsoft Arc Touch Mouse USB +mouse:usb:v045ep07b1:name:Microsoft Microsoft® Nano Transceiver v1.0: + MOUSE_DPI=1400@142 + +# Microsoft Wireless Laser Mouse 8000 +mouse:bluetooth:v045ep0702:name:Microsoft Wireless Laser Mouse 8000: + MOUSE_DPI=1000@1000 + +########################################## +# Oklick +########################################## + +# Oklick 406S Bluetooth Laser Mouse +mouse:bluetooth:v056ep0061:name:Laser BTmouse: + MOUSE_DPI=*800@333 1600@333 + +########################################## +# Razer +########################################## + +# Razer Abyssus +mouse:usb:v1532p0042:name:Razer Razer Abyssus: + MOUSE_DPI=3500@1000 diff --git a/hwdb/Makefile.am b/hwdb/Makefile.am index daa9d72c79..c00cfe1335 100644 --- a/hwdb/Makefile.am +++ b/hwdb/Makefile.am @@ -9,7 +9,8 @@ dist_udevhwdb_DATA = \ 20-sdio-classes.hwdb \ 20-sdio-vendor-model.hwdb \ 20-usb-classes.hwdb \ - 20-usb-vendor-model.hwdb + 20-usb-vendor-model.hwdb \ + 70-mouse.hwdb if ENABLE_KEYMAP dist_udevhwdb_DATA += \ diff --git a/man/Makefile.am b/man/Makefile.am index ea8d982378..4d7b45f19e 100644 --- a/man/Makefile.am +++ b/man/Makefile.am @@ -18,30 +18,5 @@ MANPAGES = \ udevd.8 \ udevadm.8 -man_MANS = \ +dist_man_MANS = \ $(MANPAGES) - -CLEANFILES = \ - $(MANPAGES) - -XSLTPROC_FLAGS += \ - --stringparam man.output.quietly 1 \ - --stringparam funcsynopsis.style ansi \ - --stringparam man.th.extra1.suppress 1 \ - --stringparam man.authors.section.enabled 0 \ - --stringparam man.copyright.section.enabled 0 - -XSLTPROC_PROCESS_MAN = \ - $(XSLTPROC) -o $@ $(XSLTPROC_FLAGS) http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $< - -udev.7: udev.xml - $(XSLTPROC_PROCESS_MAN) - -udev.conf.5: udev.conf.xml - $(XSLTPROC_PROCESS_MAN) - -udevd.8: udevd.xml - $(XSLTPROC_PROCESS_MAN) - -udevadm.8: udevadm.xml - $(XSLTPROC_PROCESS_MAN) diff --git a/man/make.sh b/man/make.sh new file mode 100755 index 0000000000..ca98f60585 --- /dev/null +++ b/man/make.sh @@ -0,0 +1,20 @@ +#/bin/sh + +set -e + +XSLTPROC="/usr/bin/xsltproc" + +XSLTPROC_FLAGS="--stringparam man.output.quietly 1 \ +--stringparam funcsynopsis.style ansi \ +--stringparam man.th.extra1.suppress 1 \ +--stringparam man.authors.section.enabled 0 \ +--stringparam man.copyright.section.enabled 0" + +xslt_proc() { + $XSLTPROC -o $1.$2 $XSLTPROC_FLAGS http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $1.xml +} + +xslt_proc udev 7 +xslt_proc udev.conf 5 +xslt_proc udevd 8 +xslt_proc udevadm 8 diff --git a/man/udev.7 b/man/udev.7 new file mode 100644 index 0000000000..7aec25193a --- /dev/null +++ b/man/udev.7 @@ -0,0 +1,573 @@ +'\" t +.\" Title: udev +.\" Author: Greg Kroah-Hartmann <greg@kroah.com> +.\" Generator: DocBook XSL Stylesheets v1.78.0 <http://docbook.sf.net/> +.\" Date: 11/07/2014 +.\" Manual: udev +.\" Source: udev +.\" Language: English +.\" +.TH "UDEV" "7" "" "udev" "udev" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +udev \- Dynamic device management +.SH "DESCRIPTION" +.PP +udev supplies the system software with device events, manages permissions of device nodes and may create additional symlinks in the +/dev +directory, or renames network interfaces\&. The kernel usually just assigns unpredictable device names based on the order of discovery\&. Meaningful symlinks or network device names provide a way to reliably identify devices based on their properties or current configuration\&. +.PP +The udev daemon, +\fBudevd\fR(8), receives device uevents directly from the kernel whenever a device is added or removed from the system, or it changes its state\&. When udev receives a device event, it matches its configured set of rules against various device attributes to identify the device\&. Rules that match may provide additional device information to be stored in the udev database or to be used to create meaningful symlink names\&. +.PP +All device information udev processes is stored in the udev database and sent out to possible event subscribers\&. Access to all stored data and the event sources is provided by the library libudev\&. +.SH "RULES FILES" +.PP +The udev rules are read from the files located in the system rules directory +/lib/udev/rules\&.d, the volatile runtime directory +/run/udev/rules\&.d +and the local administration directory +/etc/udev/rules\&.d\&. All rules files are collectively sorted and processed in lexical order, regardless of the directories in which they live\&. However, files with identical filenames replace each other\&. Files in +/etc +have the highest priority, files in +/run +take precedence over files with the same name in +/lib\&. This can be used to override a system\-supplied rules file with a local file if needed; a symlink in +/etc +with the same name as a rules file in +/lib, pointing to +/dev/null, disables the rules file entirely\&. Rule files must have the extension +\&.rules; other extensions are ignored\&. +.PP +Every line in the rules file contains at least one key\-value pair\&. Except for empty lines or lines beginning with +#, which are ignored\&. There are two kinds of keys: match and assignment\&. If all match keys match against their values, the rule gets applied and the assignment keys get the specified values assigned\&. +.PP +A matching rule may rename a network interface, add symlinks pointing to the device node, or run a specified program as part of the event handling\&. +.PP +A rule consists of a comma\-separated list of one or more key\-value pairs\&. Each key has a distinct operation, depending on the used operator\&. Valid operators are: +.PP +== +.RS 4 +Compare for equality\&. +.RE +.PP +!= +.RS 4 +Compare for inequality\&. +.RE +.PP += +.RS 4 +Assign a value to a key\&. Keys that represent a list are reset and only this single value is assigned\&. +.RE +.PP ++= +.RS 4 +Add the value to a key that holds a list of entries\&. +.RE +.PP +\-= +.RS 4 +Remove the value from a key that holds a list of entries\&. +.RE +.PP +:= +.RS 4 +Assign a value to a key finally; disallow any later changes\&. +.RE +.PP +The following key names can be used to match against device properties\&. Some of the keys also match against properties of the parent devices in sysfs, not only the device that has generated the event\&. If multiple keys that match a parent device are specified in a single rule, all these keys must match at one and the same parent device\&. +.PP +\fIACTION\fR +.RS 4 +Match the name of the event action\&. +.RE +.PP +\fIDEVPATH\fR +.RS 4 +Match the devpath of the event device\&. +.RE +.PP +\fIKERNEL\fR +.RS 4 +Match the name of the event device\&. +.RE +.PP +\fINAME\fR +.RS 4 +Match the name of a network interface\&. It can be used once the NAME key has been set in one of the preceding rules\&. +.RE +.PP +\fISYMLINK\fR +.RS 4 +Match the name of a symlink targeting the node\&. It can be used once a SYMLINK key has been set in one of the preceding rules\&. There may be multiple symlinks; only one needs to match\&. +.RE +.PP +\fISUBSYSTEM\fR +.RS 4 +Match the subsystem of the event device\&. +.RE +.PP +\fIDRIVER\fR +.RS 4 +Match the driver name of the event device\&. Only set this key for devices which are bound to a driver at the time the event is generated\&. +.RE +.PP +\fIATTR{\fR\fI\fIfilename\fR\fR\fI}\fR +.RS 4 +Match sysfs attribute values of the event device\&. Trailing whitespace in the attribute values is ignored unless the specified match value itself contains trailing whitespace\&. +.RE +.PP +\fIKERNELS\fR +.RS 4 +Search the devpath upwards for a matching device name\&. +.RE +.PP +\fISUBSYSTEMS\fR +.RS 4 +Search the devpath upwards for a matching device subsystem name\&. +.RE +.PP +\fIDRIVERS\fR +.RS 4 +Search the devpath upwards for a matching device driver name\&. +.RE +.PP +\fIATTRS{\fR\fI\fIfilename\fR\fR\fI}\fR +.RS 4 +Search the devpath upwards for a device with matching sysfs attribute values\&. If multiple +\fIATTRS\fR +matches are specified, all of them must match on the same device\&. Trailing whitespace in the attribute values is ignored unless the specified match value itself contains trailing whitespace\&. +.RE +.PP +\fITAGS\fR +.RS 4 +Search the devpath upwards for a device with matching tag\&. +.RE +.PP +\fIENV{\fR\fI\fIkey\fR\fR\fI}\fR +.RS 4 +Match against a device property value\&. +.RE +.PP +\fITAG\fR +.RS 4 +Match against a device tag\&. +.RE +.PP +\fITEST{\fR\fI\fIoctal mode mask\fR\fR\fI}\fR +.RS 4 +Test the existence of a file\&. An octal mode mask can be specified if needed\&. +.RE +.PP +\fIPROGRAM\fR +.RS 4 +Execute a program to determine whether there is a match; the key is true if the program returns successfully\&. The device properties are made available to the executed program in the environment\&. The program\*(Aqs standard output is available in the +\fIRESULT\fR +key\&. +.sp +This can only be used for very short\-running foreground tasks\&. For details, see +\fIRUN\fR\&. +.RE +.PP +\fIRESULT\fR +.RS 4 +Match the returned string of the last +\fIPROGRAM\fR +call\&. This key can be used in the same or in any later rule after a +\fIPROGRAM\fR +call\&. +.RE +.PP +Most of the fields support shell glob pattern matching and alternate patterns\&. The following special characters are supported: +.PP +* +.RS 4 +Matches zero or more characters\&. +.RE +.PP +? +.RS 4 +Matches any single character\&. +.RE +.PP +[] +.RS 4 +Matches any single character specified within the brackets\&. For example, the pattern string +tty[SR] +would match either +ttyS +or +ttyR\&. Ranges are also supported via the +\- +character\&. For example, to match on the range of all digits, the pattern +[0\-9] +could be used\&. If the first character following the +[ +is a +!, any characters not enclosed are matched\&. +.RE +.PP +| +.RS 4 +Separates alternative patterns\&. For example, the pattern string +abc|x* +would match either +abc +or +x*\&. +.RE +.PP +The following keys can get values assigned: +.PP +\fINAME\fR +.RS 4 +The name to use for a network interface\&. The name of a device node cannot be changed by udev, only additional symlinks can be created\&. +.RE +.PP +\fISYMLINK\fR +.RS 4 +The name of a symlink targeting the node\&. Every matching rule adds this value to the list of symlinks to be created\&. +.sp +The set of characters to name a symlink is limited\&. Allowed characters are +0\-9A\-Za\-z#+\-\&.:=@_/, valid UTF\-8 character sequences, and +\ex00 +hex encoding\&. All other characters are replaced by a +_ +character\&. +.sp +Multiple symlinks may be specified by separating the names by the space character\&. In case multiple devices claim the same name, the link always points to the device with the highest link_priority\&. If the current device goes away, the links are re\-evaluated and the device with the next highest link_priority becomes the owner of the link\&. If no link_priority is specified, the order of the devices (and which one of them owns the link) is undefined\&. +.sp +Symlink names must never conflict with the kernel\*(Aqs default device node names, as that would result in unpredictable behavior\&. +.RE +.PP +\fIOWNER\fR, \fIGROUP\fR, \fIMODE\fR +.RS 4 +The permissions for the device node\&. Every specified value overrides the compiled\-in default value\&. +.RE +.PP +\fISECLABEL{\fR\fI\fImodule\fR\fR\fI}\fR +.RS 4 +Applies the specified Linux Security Module label to the device node\&. +.RE +.PP +\fIATTR{\fR\fI\fIkey\fR\fR\fI}\fR +.RS 4 +The value that should be written to a sysfs attribute of the event device\&. +.RE +.PP +\fIENV{\fR\fI\fIkey\fR\fR\fI}\fR +.RS 4 +Set a device property value\&. Property names with a leading +\&. +are neither stored in the database nor exported to events or external tools (run by, for example, the +\fIPROGRAM\fR +match key)\&. +.RE +.PP +\fITAG\fR +.RS 4 +Attach a tag to a device\&. This is used to filter events for users of libudev\*(Aqs monitor functionality, or to enumerate a group of tagged devices\&. The implementation can only work efficiently if only a few tags are attached to a device\&. It is only meant to be used in contexts with specific device filter requirements, and not as a general\-purpose flag\&. Excessive use might result in inefficient event handling\&. +.RE +.PP +\fIRUN{\fR\fI\fItype\fR\fR\fI}\fR +.RS 4 +Add a program to the list of programs to be executed after processing all the rules for a specific event, depending on +type: +.PP +program +.RS 4 +Execute an external program specified as the assigned value\&. If no absolute path is given, the program is expected to live in +/lib/udev, otherwise, the absolute path must be specified\&. +.sp +This is the default if no +\fItype\fR +is specified\&. +.RE +.PP +builtin +.RS 4 +As +\fIprogram\fR, but use one of the built\-in programs rather than an external one\&. +.RE +.sp +The program name and following arguments are separated by spaces\&. Single quotes can be used to specify arguments with spaces\&. +.sp +This can only be used for very short\-running foreground tasks\&. Running an event process for a long period of time may block all further events for this or a dependent device\&. +.sp +Starting daemons or other long\-running processes is not appropriate for udev; the forked processes, detached or not, will be unconditionally killed after the event handling has finished\&. +.RE +.PP +\fILABEL\fR +.RS 4 +A named label to which a +\fIGOTO\fR +may jump\&. +.RE +.PP +\fIGOTO\fR +.RS 4 +Jumps to the next +\fILABEL\fR +with a matching name\&. +.RE +.PP +\fIIMPORT{\fR\fI\fItype\fR\fR\fI}\fR +.RS 4 +Import a set of variables as device properties, depending on +type: +.PP +program +.RS 4 +Execute an external program specified as the assigned value and import its output, which must be in environment key format\&. Path specification, command/argument separation, and quoting work like in +\fIRUN\fR\&. +.RE +.PP +builtin +.RS 4 +Similar to +program, but use one of the built\-in programs rather than an external one\&. +.RE +.PP +file +.RS 4 +Import a text file specified as the assigned value, the content of which must be in environment key format\&. +.RE +.PP +db +.RS 4 +Import a single property specified as the assigned value from the current device database\&. This works only if the database is already populated by an earlier event\&. +.RE +.PP +cmdline +.RS 4 +Import a single property from the kernel command line\&. For simple flags the value of the property is set to +1\&. +.RE +.PP +parent +.RS 4 +Import the stored keys from the parent device by reading the database entry of the parent device\&. The value assigned to +\fBIMPORT{parent}\fR +is used as a filter of key names to import (with the same shell glob pattern matching used for comparisons)\&. +.RE +.sp +This can only be used for very short\-running foreground tasks\&. For details see +\fBRUN\fR\&. +.RE +.PP +\fIWAIT_FOR\fR +.RS 4 +Wait for a file to become available or until a timeout of 10 seconds expires\&. The path is relative to the sysfs device; if no path is specified, this waits for an attribute to appear\&. +.RE +.PP +\fIOPTIONS\fR +.RS 4 +Rule and device options: +.PP +\fBlink_priority=\fR\fB\fIvalue\fR\fR +.RS 4 +Specify the priority of the created symlinks\&. Devices with higher priorities overwrite existing symlinks of other devices\&. The default is 0\&. +.RE +.PP +\fBstring_escape=\fR\fB\fInone|replace\fR\fR +.RS 4 +Usually control and other possibly unsafe characters are replaced in strings used for device naming\&. The mode of replacement can be specified with this option\&. +.RE +.PP +\fBstatic_node=\fR +.RS 4 +Apply the permissions specified in this rule to the static device node with the specified name\&. Static device node creation can be requested by kernel modules\&. These nodes might not have a corresponding kernel device at the time udevd is started; they can trigger automatic kernel module loading\&. +.RE +.PP +\fBwatch\fR +.RS 4 +Watch the device node with inotify; when the node is closed after being opened for writing, a change uevent is synthesized\&. +.RE +.PP +\fBnowatch\fR +.RS 4 +Disable the watching of a device node with inotify\&. +.RE +.RE +.PP +The +\fINAME\fR, +\fISYMLINK\fR, +\fIPROGRAM\fR, +\fIOWNER\fR, +\fIGROUP\fR, +\fIMODE\fR, and +\fIRUN\fR +fields support simple string substitutions\&. The +\fIRUN\fR +substitutions are performed after all rules have been processed, right before the program is executed, allowing for the use of device properties set by earlier matching rules\&. For all other fields, substitutions are performed while the individual rule is being processed\&. The available substitutions are: +.PP +\fB$kernel\fR, \fB%k\fR +.RS 4 +The kernel name for this device\&. +.RE +.PP +\fB$number\fR, \fB%n\fR +.RS 4 +The kernel number for this device\&. For example, +sda3 +has kernel number +3\&. +.RE +.PP +\fB$devpath\fR, \fB%p\fR +.RS 4 +The devpath of the device\&. +.RE +.PP +\fB$id\fR, \fB%b\fR +.RS 4 +The name of the device matched while searching the devpath upwards for +\fBSUBSYSTEMS\fR, +\fBKERNELS\fR, +\fBDRIVERS\fR, and +\fBATTRS\fR\&. +.RE +.PP +\fB$driver\fR +.RS 4 +The driver name of the device matched while searching the devpath upwards for +\fBSUBSYSTEMS\fR, +\fBKERNELS\fR, +\fBDRIVERS\fR, and +\fBATTRS\fR\&. +.RE +.PP +\fB$attr{\fR\fB\fIfile\fR\fR\fB}\fR, \fB%s{\fR\fB\fIfile\fR\fR\fB}\fR +.RS 4 +The value of a sysfs attribute found at the device where all keys of the rule have matched\&. If the matching device does not have such an attribute, and a previous +\fBKERNELS\fR, +\fBSUBSYSTEMS\fR, +\fBDRIVERS\fR, or +\fBATTRS\fR +test selected a parent device, then the attribute from that parent device is used\&. +.sp +If the attribute is a symlink, the last element of the symlink target is returned as the value\&. +.RE +.PP +\fB$env{\fR\fB\fIkey\fR\fR\fB}\fR, \fB%E{\fR\fB\fIkey\fR\fR\fB}\fR +.RS 4 +A device property value\&. +.RE +.PP +\fB$major\fR, \fB%M\fR +.RS 4 +The kernel major number for the device\&. +.RE +.PP +\fB$minor\fR, \fB%m\fR +.RS 4 +The kernel minor number for the device\&. +.RE +.PP +\fB$result\fR, \fB%c\fR +.RS 4 +The string returned by the external program requested with +\fIPROGRAM\fR\&. A single part of the string, separated by a space character, may be selected by specifying the part number as an attribute: +%c{N}\&. If the number is followed by the ++ +character, this part plus all remaining parts of the result string are substituted: +%c{N+}\&. +.RE +.PP +\fB$parent\fR, \fB%P\fR +.RS 4 +The node name of the parent device\&. +.RE +.PP +\fB$name\fR +.RS 4 +The current name of the device\&. If not changed by a rule, it is the name of the kernel device\&. +.RE +.PP +\fB$links\fR +.RS 4 +A space\-separated list of the current symlinks\&. The value is only set during a remove event or if an earlier rule assigned a value\&. +.RE +.PP +\fB$root\fR, \fB%r\fR +.RS 4 +The udev_root value\&. +.RE +.PP +\fB$sys\fR, \fB%S\fR +.RS 4 +The sysfs mount point\&. +.RE +.PP +\fB$devnode\fR, \fB%N\fR +.RS 4 +The name of the device node\&. +.RE +.PP +\fB%%\fR +.RS 4 +The +% +character itself\&. +.RE +.PP +\fB$$\fR +.RS 4 +The +$ +character itself\&. +.RE +.SH "HARDWARE DATABASE FILES" +.PP +The hwdb files are read from the files located in the system hwdb directory +/lib/udev/hwdb\&.d, the volatile runtime directory +/run/udev/hwdb\&.d +and the local administration directory +/etc/udev/hwdb\&.d\&. All hwdb files are collectively sorted and processed in lexical order, regardless of the directories in which they live\&. However, files with identical filenames replace each other\&. Files in +/etc +have the highest priority, files in +/run +take precedence over files with the same name in +/lib\&. This can be used to override an hwdb file with a local file if needed; a symlink in +/etc +with the same name as a hwdb file in +/lib, pointing to +/dev/null, disables the hwdb file entirely\&. hwdb files must have the extension +\&.hwdb; other extensions are ignored\&. +.PP +The hwdb file contains data records consisting of matches and associated key\-value pairs\&. Every record in the hwdb starts with one or more match string, specifying a shell glob to compare the database lookup string against\&. Multiple match lines are specified in additional consecutive lines\&. Every match line is compared indivdually, they are combined by OR\&. Every match line must start at the first character of the line\&. +.PP +The match lines are followed by one or more key\-value pair lines, which are recognized by a leading space character\&. The key name and value are separated by +=\&. An empty line signifies the end of a record\&. Lines beginning with +# +are ignored\&. +.PP +The content of all hwdb files is read by +\fBudevadm\fR(8) +and compiled to a binary database located at +/etc/udev/hwdb\&.bin\&. During runtime only the binary database is used\&. +.SH "SEE ALSO" +.PP + +\fBudevd\fR(8), +\fBudevadm\fR(8) diff --git a/man/udev.conf.5 b/man/udev.conf.5 new file mode 100644 index 0000000000..be1bba7f0a --- /dev/null +++ b/man/udev.conf.5 @@ -0,0 +1,60 @@ +'\" t +.\" Title: udev.conf +.\" Author: Kay Sievers <kay@vrfy.org> +.\" Generator: DocBook XSL Stylesheets v1.78.0 <http://docbook.sf.net/> +.\" Date: 11/07/2014 +.\" Manual: udev.conf +.\" Source: eudev +.\" Language: English +.\" +.TH "UDEV\&.CONF" "5" "" "eudev" "udev.conf" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +udev.conf \- Configuration for device event managing daemon +.SH "SYNOPSIS" +.PP +/etc/udev/udev\&.conf +.SH "DESCRIPTION" +.PP + +\fBudevd\fR(8) +expects its main configuration file at +/etc/udev/udev\&.conf\&. It consists of a set of variables allowing the user to override default udev values\&. All empty lines or lines beginning with \*(Aq#\*(Aq are ignored\&. The following variables can be set: +.PP +\fIudev_log\fR +.RS 4 +The log level\&. Valid values are the numerical syslog priorities or their textual representations: +\fBerr\fR, +\fBinfo\fR +and +\fBdebug\fR\&. +.RE +.PP +In addition, +udevd +can be configured by command\-line options and the kernel command line (see +\fBudevd\fR(8))\&. +.SH "SEE ALSO" +.PP + +\fBudevd\fR(8), +\fBudev\fR(7), +\fBudevadm\fR(8) diff --git a/man/udev.conf.xml b/man/udev.conf.xml index 16ad41e80e..8b48c8223d 100644 --- a/man/udev.conf.xml +++ b/man/udev.conf.xml @@ -4,7 +4,7 @@ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"> <!-- - This file is part of systemd. + This file is part of eudev, forked from systemd. Copyright 2014 Zbigniew Jędrzejewski-Szmek @@ -27,7 +27,7 @@ <refentryinfo> <title>udev.conf</title> - <productname>systemd</productname> + <productname>eudev</productname> <authorgroup> <author> <contrib>Developer</contrib> @@ -56,7 +56,7 @@ <title>Description</title> <para> - <citerefentry><refentrytitle>systemd-udevd</refentrytitle><manvolnum>8</manvolnum></citerefentry> + <citerefentry><refentrytitle>udevd</refentrytitle><manvolnum>8</manvolnum></citerefentry> expects its main configuration file at <filename>/etc/udev/udev.conf</filename>. It consists of a set of variables allowing the user to override default udev @@ -69,7 +69,7 @@ <term><varname>udev_log</varname></term> <listitem> - <para>The logging priority. Valid values are the numerical + <para>The log level. Valid values are the numerical syslog priorities or their textual representations: <option>err</option>, <option>info</option> and <option>debug</option>.</para> @@ -78,16 +78,16 @@ </variablelist> <para> - In addition, <filename>systemd-udevd</filename> can be configured - by command-line options and the kernel commandline (see - <citerefentry><refentrytitle>systemd-udevd</refentrytitle><manvolnum>8</manvolnum></citerefentry>). + In addition, <filename>udevd</filename> can be configured + by command-line options and the kernel command line (see + <citerefentry><refentrytitle>udevd</refentrytitle><manvolnum>8</manvolnum></citerefentry>). </para> </refsect1> <refsect1> <title>See Also</title> <para> - <citerefentry><refentrytitle>systemd-udevd</refentrytitle><manvolnum>8</manvolnum></citerefentry>, + <citerefentry><refentrytitle>udevd</refentrytitle><manvolnum>8</manvolnum></citerefentry>, <citerefentry><refentrytitle>udev</refentrytitle><manvolnum>7</manvolnum></citerefentry>, <citerefentry><refentrytitle>udevadm</refentrytitle><manvolnum>8</manvolnum></citerefentry> </para> diff --git a/man/udev.xml b/man/udev.xml index 0ecf683a28..69be5d19c5 100644 --- a/man/udev.xml +++ b/man/udev.xml @@ -1,4 +1,4 @@ -<?xml version='1.0'?> +<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*--> <?xml-stylesheet type="text/xsl" href="http://docbook.sourceforge.net/release/xsl/current/xhtml/docbook.xsl"?> <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"> @@ -30,7 +30,7 @@ <refnamediv> <refname>udev</refname> - <refpurpose>Linux dynamic device management</refpurpose> + <refpurpose>Dynamic device management</refpurpose> </refnamediv> <refsect1><title>Description</title> @@ -54,23 +54,21 @@ sources is provided by the library libudev.</para> </refsect1> - <refsect1><title>Rules files</title> + <refsect1><title>Rules Files</title> <para>The udev rules are read from the files located in the system rules directory <filename>/lib/udev/rules.d</filename>, the volatile runtime directory <filename>/run/udev/rules.d</filename> and the local administration directory <filename>/etc/udev/rules.d</filename>. All rules files are collectively sorted and processed in lexical order, regardless of the directories in which they live. However, files with - identical file names replace each other. Files in <filename>/etc</filename> + identical filenames replace each other. Files in <filename>/etc</filename> have the highest priority, files in <filename>/run</filename> take precedence over files with the same name in <filename>/lib</filename>. This can be used to override a system-supplied rules file with a local file if needed; a symlink in <filename>/etc</filename> with the same name as a rules file in <filename>/lib</filename>, pointing to <filename>/dev/null</filename>, - disables the rules file entirely.</para> - - <para>Rule files must have the extension <filename>.rules</filename>; other - extensions are ignored.</para> + disables the rules file entirely. Rule files must have the extension + <filename>.rules</filename>; other extensions are ignored.</para> <para>Every line in the rules file contains at least one key-value pair. Except for empty lines or lines beginning with <literal>#</literal>, which are ignored. @@ -264,9 +262,9 @@ <para>Execute a program to determine whether there is a match; the key is true if the program returns successfully. The device properties are made available to the - executed program in the environment. The program's stdout - is available in the RESULT key.</para> - <para>This can only be used for very short-running foreground tasks. For details + executed program in the environment. The program's standard output + is available in the <varname>RESULT</varname> key.</para> + <para>This can only be used for very short-running foreground tasks. For details, see <varname>RUN</varname>.</para> </listitem> </varlistentry> @@ -274,15 +272,15 @@ <varlistentry> <term><varname>RESULT</varname></term> <listitem> - <para>Match the returned string of the last PROGRAM call. This key can - be used in the same or in any later rule after a PROGRAM call.</para> + <para>Match the returned string of the last <varname>PROGRAM</varname> call. + This key can be used in the same or in any later rule after a + <varname>PROGRAM</varname> call.</para> </listitem> </varlistentry> </variablelist> <para>Most of the fields support shell glob pattern matching and alternate patterns. The following special characters are supported:</para> - <variablelist> <varlistentry> <term><literal>*</literal></term> @@ -303,9 +301,10 @@ example, the pattern string <literal>tty[SR]</literal> would match either <literal>ttyS</literal> or <literal>ttyR</literal>. Ranges are also supported via the <literal>-</literal> character. - For example, to match on the range of all digits, the pattern [0-9] could - be used. If the first character following the <literal>[</literal> is a - <literal>!</literal>, any characters not enclosed are matched.</para> + For example, to match on the range of all digits, the pattern + <literal>[0-9]</literal> could be used. If the first character + following the <literal>[</literal> is a <literal>!</literal>, + any characters not enclosed are matched.</para> </listitem> </varlistentry> <varlistentry> @@ -378,7 +377,8 @@ <listitem> <para>Set a device property value. Property names with a leading <literal>.</literal> are neither stored in the database nor exported to events or - external tools (run by, say, the PROGRAM match key).</para> + external tools (run by, for example, the <varname>PROGRAM</varname> + match key).</para> </listitem> </varlistentry> @@ -398,24 +398,26 @@ <varlistentry> <term><varname>RUN{<replaceable>type</replaceable>}</varname></term> <listitem> - <para>Add a program to the list of programs to be executed after processing all the - rules for a specific event, depending on <literal>type</literal>:</para> + <para>Add a program to the list of programs to be executed after + processing all the rules for a specific event, depending on + <literal>type</literal>:</para> <variablelist> <varlistentry> <term><literal>program</literal></term> <listitem> <para>Execute an external program specified as the assigned - value. If no absolute path is given, the program is expected to live in - /lib/udev, otherwise the absolute path must be specified.</para> - <para>This is the default if no <replaceable>type</replaceable> is - specified.</para> + value. If no absolute path is given, the program is expected + to live in <filename>/lib/udev</filename>, otherwise, the + absolute path must be specified.</para> + <para>This is the default if no <replaceable>type</replaceable> + is specified.</para> </listitem> </varlistentry> <varlistentry> <term><literal>builtin</literal></term> <listitem> - <para>As <varname>program</varname>, but use one of the built-in programs rather - than an external one.</para> + <para>As <varname>program</varname>, but use one of the + built-in programs rather than an external one.</para> </listitem> </varlistentry> </variablelist> @@ -424,7 +426,7 @@ <para>This can only be used for very short-running foreground tasks. Running an event process for a long period of time may block all further events for this or a dependent device.</para> - <para>Starting daemons or other long running processes is not appropriate + <para>Starting daemons or other long-running processes is not appropriate for udev; the forked processes, detached or not, will be unconditionally killed after the event handling has finished.</para> </listitem> @@ -433,14 +435,14 @@ <varlistentry> <term><varname>LABEL</varname></term> <listitem> - <para>A named label to which a GOTO may jump.</para> + <para>A named label to which a <varname>GOTO</varname> may jump.</para> </listitem> </varlistentry> <varlistentry> <term><varname>GOTO</varname></term> <listitem> - <para>Jumps to the next LABEL with a matching name.</para> + <para>Jumps to the next <varname>LABEL</varname> with a matching name.</para> </listitem> </varlistentry> @@ -494,7 +496,7 @@ <para>Import the stored keys from the parent device by reading the database entry of the parent device. The value assigned to <option>IMPORT{parent}</option> is used as a filter of key names - to import (with the same shell-style pattern matching used for + to import (with the same shell glob pattern matching used for comparisons).</para> </listitem> </varlistentry> @@ -536,17 +538,19 @@ <varlistentry> <term><option>static_node=</option></term> <listitem> - <para>Apply the permissions specified in this rule to the static device node with - the specified name. Static device node creation can be requested by kernel modules. - These nodes might not have a corresponding kernel device at the time udevd is - started; they can trigger automatic kernel module loading.</para> + <para>Apply the permissions specified in this rule to the + static device node with the specified name. Static device node + creation can be requested by kernel modules. These nodes might + not have a corresponding kernel device at the time udevd is started; + they can trigger automatic kernel module loading.</para> </listitem> </varlistentry> <varlistentry> <term><option>watch</option></term> <listitem> - <para>Watch the device node with inotify; when the node is closed after being opened for - writing, a change uevent is synthesized.</para> + <para>Watch the device node with inotify; when the node is + closed after being opened for writing, a change uevent is + synthesized.</para> </listitem> </varlistentry> <varlistentry> @@ -560,13 +564,15 @@ </varlistentry> </variablelist> - <para>The <varname>NAME</varname>, <varname>SYMLINK</varname>, <varname>PROGRAM</varname>, - <varname>OWNER</varname>, <varname>GROUP</varname>, <varname>MODE</varname> and <varname>RUN</varname> - fields support simple string substitutions. The <varname>RUN</varname> - substitutions are performed after all rules have been processed, right before the program - is executed, allowing for the use of device properties set by earlier matching - rules. For all other fields, substitutions are performed while the individual rule is - being processed. The available substitutions are:</para> + <para>The <varname>NAME</varname>, <varname>SYMLINK</varname>, + <varname>PROGRAM</varname>, <varname>OWNER</varname>, + <varname>GROUP</varname>, <varname>MODE</varname>, and + <varname>RUN</varname> fields support simple string substitutions. + The <varname>RUN</varname> substitutions are performed after all rules + have been processed, right before the program is executed, allowing for + the use of device properties set by earlier matching rules. For all other + fields, substitutions are performed while the individual rule is being + processed. The available substitutions are:</para> <variablelist class='udev-directives'> <varlistentry> <term><option>$kernel</option>, <option>%k</option></term> @@ -579,7 +585,8 @@ <term><option>$number</option>, <option>%n</option></term> <listitem> <para>The kernel number for this device. For example, - <literal>sda3</literal> has kernel number <literal>3</literal>.</para> + <literal>sda3</literal> has kernel number <literal>3</literal>. + </para> </listitem> </varlistentry> @@ -593,8 +600,9 @@ <varlistentry> <term><option>$id</option>, <option>%b</option></term> <listitem> - <para>The name of the device matched while searching the devpath upwards for - <option>SUBSYSTEMS</option>, <option>KERNELS</option>, <option>DRIVERS</option> and <option>ATTRS</option>. + <para>The name of the device matched while searching the devpath + upwards for <option>SUBSYSTEMS</option>, <option>KERNELS</option>, + <option>DRIVERS</option>, and <option>ATTRS</option>. </para> </listitem> </varlistentry> @@ -602,8 +610,10 @@ <varlistentry> <term><option>$driver</option></term> <listitem> - <para>The driver name of the device matched while searching the devpath upwards for - <option>SUBSYSTEMS</option>, <option>KERNELS</option>, <option>DRIVERS</option> and <option>ATTRS</option>. + <para>The driver name of the device matched while searching the + devpath upwards for <option>SUBSYSTEMS</option>, + <option>KERNELS</option>, <option>DRIVERS</option>, and + <option>ATTRS</option>. </para> </listitem> </varlistentry> @@ -612,12 +622,15 @@ <term><option>$attr{<replaceable>file</replaceable>}</option>, <option>%s{<replaceable>file</replaceable>}</option></term> <listitem> <para>The value of a sysfs attribute found at the device where - all keys of the rule have matched. If the matching device does not have - such an attribute, and a previous KERNELS, SUBSYSTEMS, DRIVERS, or - ATTRS test selected a parent device, then the attribute from that - parent device is used.</para> - <para>If the attribute is a symlink, the last element of the symlink target is - returned as the value.</para> + all keys of the rule have matched. If the matching device does not + have such an attribute, and a previous <option>KERNELS</option>, + <option>SUBSYSTEMS</option>, <option>DRIVERS</option>, or + <option>ATTRS</option> test selected a parent device, then the + attribute from that parent device is used. + </para> + <para>If the attribute is a symlink, the last element of the + symlink target is returned as the value. + </para> </listitem> </varlistentry> @@ -645,7 +658,8 @@ <varlistentry> <term><option>$result</option>, <option>%c</option></term> <listitem> - <para>The string returned by the external program requested with PROGRAM. + <para>The string returned by the external program requested with + <varname>PROGRAM</varname>. A single part of the string, separated by a space character, may be selected by specifying the part number as an attribute: <literal>%c{N}</literal>. If the number is followed by the <literal>+</literal> character, this part plus all remaining parts @@ -748,9 +762,47 @@ During runtime only the binary database is used.</para> </refsect1> + <refsect1><title>Hardware Database Files</title> + <para>The hwdb files are read from the files located in the + system hwdb directory <filename>/usr/lib/udev/hwdb.d</filename>, + the volatile runtime directory <filename>/run/udev/hwdb.d</filename> + and the local administration directory <filename>/etc/udev/hwdb.d</filename>. + All hwdb files are collectively sorted and processed in lexical order, + regardless of the directories in which they live. However, files with + identical filenames replace each other. Files in <filename>/etc</filename> + have the highest priority, files in <filename>/run</filename> take precedence + over files with the same name in <filename>/usr/lib</filename>. This can be + used to override a system-supplied hwdb file with a local file if needed; + a symlink in <filename>/etc</filename> with the same name as a hwdb file in + <filename>/usr/lib</filename>, pointing to <filename>/dev/null</filename>, + disables the hwdb file entirely. hwdb files must have the extension + <filename>.hwdb</filename>; other extensions are ignored.</para> + + <para>The hwdb file contains data records consisting of matches and + associated key-value pairs. Every record in the hwdb starts with one or + more match string, specifying a shell glob to compare the database + lookup string against. Multiple match lines are specified in additional + consecutive lines. Every match line is compared indivdually, they are + combined by OR. Every match line must start at the first character of + the line.</para> + + <para>The match lines are followed by one or more key-value pair lines, which + are recognized by a leading space character. The key name and value are separated + by <literal>=</literal>. An empty line signifies the end + of a record. Lines beginning with <literal>#</literal> are ignored.</para> + + <para>The content of all hwdb files is read by + <citerefentry><refentrytitle>udevadm</refentrytitle><manvolnum>8</manvolnum></citerefentry> + and compiled to a binary database located at <filename>/etc/udev/hwdb.bin</filename>, + or alternatively <filename>/usr/lib/udev/hwdb.bin</filename> if you want ship the compiled + database in an immutable image. + During runtime only the binary database is used.</para> + </refsect1> + <refsect1> <title>See Also</title> - <para><citerefentry> + <para> + <citerefentry> <refentrytitle>udevd</refentrytitle><manvolnum>8</manvolnum> </citerefentry>, <citerefentry> diff --git a/man/udevadm.8 b/man/udevadm.8 new file mode 100644 index 0000000000..828830be51 --- /dev/null +++ b/man/udevadm.8 @@ -0,0 +1,404 @@ +'\" t +.\" Title: udevadm +.\" Author: Kay Sievers <kay@vrfy.org> +.\" Generator: DocBook XSL Stylesheets v1.78.0 <http://docbook.sf.net/> +.\" Date: 11/07/2014 +.\" Manual: udevadm +.\" Source: eudev +.\" Language: English +.\" +.TH "UDEVADM" "8" "" "eudev" "udevadm" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +udevadm \- udev management tool +.SH "SYNOPSIS" +.HP \w'\fBudevadm\fR\ 'u +\fBudevadm\fR [\fB\-\-debug\fR] [\fB\-\-version\fR] [\fB\-\-help\fR] +.HP \w'\fBudevadm\ info\ \fR\fB\fIoptions\fR\fR\ 'u +\fBudevadm info \fR\fB\fIoptions\fR\fR +.HP \w'\fBudevadm\ trigger\ \fR\fB[options]\fR\ 'u +\fBudevadm trigger \fR\fB[options]\fR +.HP \w'\fBudevadm\ settle\ \fR\fB[options]\fR\ 'u +\fBudevadm settle \fR\fB[options]\fR +.HP \w'\fBudevadm\ control\ \fR\fB\fIcommand\fR\fR\ 'u +\fBudevadm control \fR\fB\fIcommand\fR\fR +.HP \w'\fBudevadm\ monitor\ \fR\fB[options]\fR\ 'u +\fBudevadm monitor \fR\fB[options]\fR +.HP \w'\fBudevadm\ hwdb\ \fR\fB[options]\fR\ 'u +\fBudevadm hwdb \fR\fB[options]\fR +.HP \w'\fBudevadm\ test\ \fR\fB[options]\fR\fB\ \fR\fB\fIdevpath\fR\fR\ 'u +\fBudevadm test \fR\fB[options]\fR\fB \fR\fB\fIdevpath\fR\fR +.HP \w'\fBudevadm\ test\-builtin\ \fR\fB[options]\fR\fB\ \fR\fB\fIcommand\fR\fR\fB\ \fR\fB\fIdevpath\fR\fR\ 'u +\fBudevadm test\-builtin \fR\fB[options]\fR\fB \fR\fB\fIcommand\fR\fR\fB \fR\fB\fIdevpath\fR\fR +.SH "DESCRIPTION" +.PP +\fBudevadm\fR +expects a command and command specific options\&. It controls the runtime behavior of +\fBudev\fR, requests kernel events, manages the event queue, and provides simple debugging mechanisms\&. +.SH "OPTIONS" +.PP +\fB\-\-debug\fR +.RS 4 +Print debug messages to standard error\&. +.RE +.PP +\fB\-\-version\fR +.RS 4 +Print version number\&. +.RE +.PP +\fB\-h\fR, \fB\-\-help\fR +.RS 4 +Print help text\&. +.RE +.SS "udevadm info [\fIOPTIONS\fR] [\fIDEVPATH\fR|\fIFILE\fR]" +.PP +Queries the udev database for device information stored in the udev database\&. It can also query the properties of a device from its sysfs representation to help creating udev rules that match this device\&. +.PP +\fB\-q\fR, \fB\-\-query=\fR\fB\fITYPE\fR\fR +.RS 4 +Query the database for the specified type of device data\&. It needs the +\fB\-\-path\fR +or +\fB\-\-name\fR +to identify the specified device\&. Valid +\fITYPE\fRs are: +\fBname\fR, +\fBsymlink\fR, +\fBpath\fR, +\fBproperty\fR, +\fBall\fR\&. +.RE +.PP +\fB\-p\fR, \fB\-\-path=\fR\fB\fIDEVPATH\fR\fR +.RS 4 +The +/sys +path of the device to query, e\&.g\&. +[/sys]/class/block/sda\&. Note that this option usually is not very useful, since +\fBudev\fR +can guess the type of the argument, so +\fBudevadm \-\-devpath=/class/block/sda\fR +is equivalent to +\fBudevadm /sys/class/block/sda\fR\&. +.RE +.PP +\fB\-n\fR, \fB\-\-name=\fR\fB\fIFILE\fR\fR +.RS 4 +The name of the device node or a symlink to query, e\&.g\&. +[/dev]/sda\&. Note that this option usually is not very useful, since +\fBudev\fR +can guess the type of the argument, so +\fBudevadm \-\-name=sda\fR +is equivalent to +\fBudevadm /dev/sda\fR\&. +.RE +.PP +\fB\-r\fR, \fB\-\-root\fR +.RS 4 +Print absolute paths in +\fBname\fR +or +\fBsymlink\fR +query\&. +.RE +.PP +\fB\-a\fR, \fB\-\-attribute\-walk\fR +.RS 4 +Print all sysfs properties of the specified device that can be used in udev rules to match the specified device\&. It prints all devices along the chain, up to the root of sysfs that can be used in udev rules\&. +.RE +.PP +\fB\-x\fR, \fB\-\-export\fR +.RS 4 +Print output as key/value pairs\&. Values are enclosed in single quotes\&. +.RE +.PP +\fB\-P\fR, \fB\-\-export\-prefix=\fR\fB\fINAME\fR\fR +.RS 4 +Add a prefix to the key name of exported values\&. +.RE +.PP +\fB\-d\fR, \fB\-\-device\-id\-of\-file=\fR\fB\fIFILE\fR\fR +.RS 4 +Print major/minor numbers of the underlying device, where the file lives on\&. +.RE +.PP +\fB\-e\fR, \fB\-\-export\-db\fR +.RS 4 +Export the content of the udev database\&. +.RE +.PP +\fB\-c\fR, \fB\-\-cleanup\-db\fR +.RS 4 +Cleanup the udev database\&. +.RE +.PP +\fB\-\-version\fR +.RS 4 +Print version\&. +.RE +.PP +\fB\-h\fR, \fB\-\-help\fR +.RS 4 +Print help text\&. +.RE +.SS "udevadm trigger [options]" +.PP +Request device events from the kernel\&. Primarily used to replay events at system coldplug time\&. +.PP +\fB\-v\fR, \fB\-\-verbose\fR +.RS 4 +Print the list of devices which will be triggered\&. +.RE +.PP +\fB\-n\fR, \fB\-\-dry\-run\fR +.RS 4 +Do not actually trigger the event\&. +.RE +.PP +\fB\-t\fR, \fB\-\-type=\fR\fB\fITYPE\fR\fR +.RS 4 +Trigger a specific type of devices\&. Valid types are: +\fBdevices\fR, +\fBsubsystems\fR\&. The default value is +\fBdevices\fR\&. +.RE +.PP +\fB\-c\fR, \fB\-\-action=\fR\fB\fIACTION\fR\fR +.RS 4 +Type of event to be triggered\&. The default value is +\fBchange\fR\&. +.RE +.PP +\fB\-s\fR, \fB\-\-subsystem\-match=\fR\fB\fISUBSYSTEM\fR\fR +.RS 4 +Trigger events for devices which belong to a matching subsystem\&. This option can be specified multiple times and supports shell style pattern matching\&. +.RE +.PP +\fB\-S\fR, \fB\-\-subsystem\-nomatch=\fR\fB\fISUBSYSTEM\fR\fR +.RS 4 +Do not trigger events for devices which belong to a matching subsystem\&. This option can be specified multiple times and supports shell style pattern matching\&. +.RE +.PP +\fB\-a\fR, \fB\-\-attr\-match=\fR\fB\fIATTRIBUTE\fR\fR\fB=\fR\fB\fIVALUE\fR\fR +.RS 4 +Trigger events for devices with a matching sysfs attribute\&. If a value is specified along with the attribute name, the content of the attribute is matched against the given value using shell style pattern matching\&. If no value is specified, the existence of the sysfs attribute is checked\&. This option can be specified multiple times\&. +.RE +.PP +\fB\-A\fR, \fB\-\-attr\-nomatch=\fR\fB\fIATTRIBUTE\fR\fR\fB=\fR\fB\fIVALUE\fR\fR +.RS 4 +Do not trigger events for devices with a matching sysfs attribute\&. If a value is specified along with the attribute name, the content of the attribute is matched against the given value using shell style pattern matching\&. If no value is specified, the existence of the sysfs attribute is checked\&. This option can be specified multiple times\&. +.RE +.PP +\fB\-p\fR, \fB\-\-property\-match=\fR\fB\fIPROPERTY\fR\fR\fB=\fR\fB\fIVALUE\fR\fR +.RS 4 +Trigger events for devices with a matching property value\&. This option can be specified multiple times and supports shell style pattern matching\&. +.RE +.PP +\fB\-g\fR, \fB\-\-tag\-match=\fR\fB\fIPROPERTY\fR\fR +.RS 4 +Trigger events for devices with a matching tag\&. This option can be specified multiple times\&. +.RE +.PP +\fB\-y\fR, \fB\-\-sysname\-match=\fR\fB\fINAME\fR\fR +.RS 4 +Trigger events for devices with a matching sys device name\&. This option can be specified multiple times and supports shell style pattern matching\&. +.RE +.PP +\fB\-b\fR, \fB\-\-parent\-match=\fR\fB\fISYSPATH\fR\fR +.RS 4 +Trigger events for all children of a given device\&. +.RE +.PP +\fB\-h\fR, \fB\-\-help\fR +.RS 4 +Print help text\&. +.RE +.SS "udevadm settle [options]" +.PP +Watches the udev event queue, and exits if all current events are handled\&. +.PP +\fB\-t\fR, \fB\-\-timeout=\fR\fB\fISECONDS\fR\fR +.RS 4 +Maximum number of seconds to wait for the event queue to become empty\&. The default value is 120 seconds\&. A value of 0 will check if the queue is empty and always return immediately\&. +.RE +.PP +\fB\-E\fR, \fB\-\-exit\-if\-exists=\fR\fB\fIFILE\fR\fR +.RS 4 +Stop waiting if file exists\&. +.RE +.PP +\fB\-h\fR, \fB\-\-help\fR +.RS 4 +Print help text\&. +.RE +.SS "udevadm control \fIcommand\fR" +.PP +Modify the internal state of the running udev daemon\&. +.PP +\fB\-x\fR, \fB\-\-exit\fR +.RS 4 +Signal and wait for udevd to exit\&. +.RE +.PP +\fB\-l\fR, \fB\-\-log\-priority=\fR\fB\fIvalue\fR\fR +.RS 4 +Set the internal log level of +udevd\&. Valid values are the numerical syslog priorities or their textual representations: +\fBemerg\fR, +\fBalert\fR, +\fBcrit\fR, +\fBerr\fR, +\fBwarning\fR, +\fBnotice\fR, +\fBinfo\fR, and +\fBdebug\fR\&. +.RE +.PP +\fB\-s\fR, \fB\-\-stop\-exec\-queue\fR +.RS 4 +Signal udevd to stop executing new events\&. Incoming events will be queued\&. +.RE +.PP +\fB\-S\fR, \fB\-\-start\-exec\-queue\fR +.RS 4 +Signal udevd to enable the execution of events\&. +.RE +.PP +\fB\-R\fR, \fB\-\-reload\fR +.RS 4 +Signal udevd to reload the rules files and other databases like the kernel module index\&. Reloading rules and databases does not apply any changes to already existing devices; the new configuration will only be applied to new events\&. +.RE +.PP +\fB\-p\fR, \fB\-\-property=\fR\fB\fIKEY\fR\fR\fB=\fR\fB\fIvalue\fR\fR +.RS 4 +Set a global property for all events\&. +.RE +.PP +\fB\-m\fR, \fB\-\-children\-max=\fR\fIvalue\fR +.RS 4 +Set the maximum number of events, udevd will handle at the same time\&. +.RE +.PP +\fB\-\-timeout=\fR\fIseconds\fR +.RS 4 +The maximum number of seconds to wait for a reply from udevd\&. +.RE +.PP +\fB\-h\fR, \fB\-\-help\fR +.RS 4 +Print help text\&. +.RE +.SS "udevadm monitor [options]" +.PP +Listens to the kernel uevents and events sent out by a udev rule and prints the devpath of the event to the console\&. It can be used to analyze the event timing, by comparing the timestamps of the kernel uevent and the udev event\&. +.PP +\fB\-k\fR, \fB\-\-kernel\fR +.RS 4 +Print the kernel uevents\&. +.RE +.PP +\fB\-u\fR, \fB\-\-udev\fR +.RS 4 +Print the udev event after the rule processing\&. +.RE +.PP +\fB\-p\fR, \fB\-\-property\fR +.RS 4 +Also print the properties of the event\&. +.RE +.PP +\fB\-s\fR, \fB\-\-subsystem\-match=\fR\fB\fIstring[/string]\fR\fR +.RS 4 +Filter events by subsystem[/devtype]\&. Only udev events with a matching subsystem value will pass\&. +.RE +.PP +\fB\-t\fR, \fB\-\-tag\-match=\fR\fB\fIstring\fR\fR +.RS 4 +Filter events by property\&. Only udev events with a given tag attached will pass\&. +.RE +.PP +\fB\-h\fR, \fB\-\-help\fR +.RS 4 +Print help text\&. +.RE +.SS "udevadm hwdb [options]" +.PP +Maintain the hardware database index in +/etc/udev/hwdb\&.bin\&. +.PP +\fB\-u\fR, \fB\-\-update\fR +.RS 4 +Compile the hardware database information located in /usr/lib/udev/hwdb\&.d/, /etc/udev/hwdb\&.d/ and store it in +/etc/udev/hwdb\&.bin\&. This should be done after any update to the source files; it will not be called automatically\&. The running udev daemon will detect a new database on its own and does not need to be notified about it\&. +.RE +.PP +\fB\-t\fR, \fB\-\-test=\fR\fB\fIstring\fR\fR +.RS 4 +Query the database with a modalias string, and print the retrieved properties\&. +.RE +.PP +\fB\-r\fR, \fB\-\-root=\fR\fB\fIstring\fR\fR +.RS 4 +Alternative root path in the file system for reading and writing files\&. +.RE +.PP +\fB\-h\fR, \fB\-\-help\fR +.RS 4 +Print help text\&. +.RE +.SS "udevadm test [options] \fIdevpath\fR" +.PP +Simulate a udev event run for the given device, and print debug output\&. +.PP +\fB\-a\fR, \fB\-\-action=\fR\fB\fIstring\fR\fR +.RS 4 +The action string\&. +.RE +.PP +\fB\-N\fR, \fB\-\-resolve\-names=\fR\fB\fBearly\fR\fR\fB|\fR\fB\fBlate\fR\fR\fB|\fR\fB\fBnever\fR\fR +.RS 4 +Specify when udevadm should resolve names of users and groups\&. When set to +\fBearly\fR +(the default), names will be resolved when the rules are parsed\&. When set to +\fBlate\fR, names will be resolved for every event\&. When set to +\fBnever\fR, names will never be resolved and all devices will be owned by root\&. +.RE +.PP +\fB\-h\fR, \fB\-\-help\fR +.RS 4 +Print help text\&. +.RE +.SS "udevadm test\-builtin [options] \fICOMMAND\fR \fIDEVPATH\fR" +.PP +Run a built\-in command +\fICOMMAND\fR +for device +\fIDEVPATH\fR, and print debug output\&. +.PP +\fB\-h\fR, \fB\-\-help\fR +.RS 4 +Print help text\&. +.RE +.SH "SEE ALSO" +.PP +\fBudev\fR(7), +\fBudevd.service\fR(8) diff --git a/man/udevadm.xml b/man/udevadm.xml index 51afbf3028..649d808c87 100644 --- a/man/udevadm.xml +++ b/man/udevadm.xml @@ -1,4 +1,4 @@ -<?xml version='1.0'?> +<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*--> <?xml-stylesheet type="text/xsl" href="http://docbook.sourceforge.net/release/xsl/current/xhtml/docbook.xsl"?> <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"> @@ -6,7 +6,7 @@ <refentry id="udevadm"> <refentryinfo> <title>udevadm</title> - <productname>systemd</productname> + <productname>eudev</productname> <authorgroup> <author> <contrib>Developer</contrib> @@ -66,7 +66,7 @@ the event queue, and provides simple debugging mechanisms.</para> </refsect1> - <refsect1><title>OPTIONS</title> + <refsect1><title>Options</title> <variablelist> <varlistentry> <term><option>--debug</option></term> @@ -89,7 +89,11 @@ </varlistentry> </variablelist> - <refsect2><title>udevadm info <optional><replaceable>OPTIONS</replaceable></optional> <optional><replaceable>DEVPATH</replaceable>|<replaceable>FILE</replaceable></optional></title> + <refsect2><title>udevadm info + <arg choice="opt"><replaceable>options</replaceable></arg> + <arg choice="opt"><replaceable>devpath</replaceable>|<replaceable>file</replaceable></arg> + </title> + <para>Queries the udev database for device information stored in the udev database. It can also query the properties of a device from its sysfs representation to help creating udev @@ -201,9 +205,16 @@ </listitem> </varlistentry> </variablelist> + + <para>In addition an optional positional argument can be used + to specify a device name or a sys path. It must start with + <filename>/dev</filename> or <filename>/sys</filename> + respectively.</para> </refsect2> - <refsect2><title>udevadm trigger <optional>options</optional></title> + <refsect2><title>udevadm trigger + <arg choice="opt"><replaceable>options</replaceable></arg> + <arg choice="opt" rep="repeat"><replaceable>devpath</replaceable>|<replaceable>file</replaceable></arg></title> <para>Request device events from the kernel. Primarily used to replay events at system coldplug time.</para> <variablelist> <varlistentry> @@ -299,14 +310,22 @@ </varlistentry> <varlistentry> <term><option>-y</option></term> - <term><option>--sysname-match=<replaceable>NAME</replaceable></option></term> + <term><option>--sysname-match=<replaceable>PATH</replaceable></option></term> <listitem> <para>Trigger events for devices with a matching sys - device name. This option can be specified multiple times + device path. This option can be specified multiple times and supports shell style pattern matching.</para> </listitem> </varlistentry> <varlistentry> + <term><option>--name-match=<replaceable>NAME</replaceable></option></term> + <listitem> + <para>Trigger events for devices with a matching + device path. This options can be specified multiple + times.</para> + </listitem> + </varlistentry> + <varlistentry> <term><option>-b</option></term> <term><option>--parent-match=<replaceable>SYSPATH</replaceable></option></term> <listitem> @@ -322,9 +341,16 @@ </listitem> </varlistentry> </variablelist> + + <para>In addition optional positional arguments can be used + to specify device names or sys paths. They must start with + <filename>/dev</filename> or <filename>/sys</filename> + respectively.</para> </refsect2> - <refsect2><title>udevadm settle <optional>options</optional></title> + <refsect2><title>udevadm settle + <arg choice="opt"><replaceable>options</replaceable></arg> + </title> <para>Watches the udev event queue, and exits if all current events are handled.</para> <variablelist> <varlistentry> @@ -368,9 +394,14 @@ <term><option>-l</option></term> <term><option>--log-priority=<replaceable>value</replaceable></option></term> <listitem> - <para>Set the internal log level of udevd. Valid values are the numerical - syslog priorities or their textual representations: <option>err</option>, - <option>info</option> and <option>debug</option>.</para> + <para>Set the internal log level of + <filename>udevd</filename>. Valid values are the + numerical syslog priorities or their textual + representations: <option>emerg</option>, + <option>alert</option>, <option>crit</option>, + <option>err</option>, <option>warning</option>, + <option>notice</option>, <option>info</option>, and + <option>debug</option>.</para> </listitem> </varlistentry> <varlistentry> @@ -428,7 +459,9 @@ </variablelist> </refsect2> - <refsect2><title>udevadm monitor <optional>options</optional></title> + <refsect2><title>udevadm monitor + <arg choice="opt"><replaceable>options</replaceable></arg> + </title> <para>Listens to the kernel uevents and events sent out by a udev rule and prints the devpath of the event to the console. It can be used to analyze the event timing, by comparing the timestamps of the kernel uevent and the udev event. @@ -479,7 +512,9 @@ </variablelist> </refsect2> - <refsect2><title>udevadm hwdb <optional>options</optional></title> + <refsect2><title>udevadm hwdb + <arg choice="opt"><replaceable>options</replaceable></arg> + </title> <para>Maintain the hardware database index in <filename>/etc/udev/hwdb.bin</filename>.</para> <variablelist> <varlistentry> @@ -518,7 +553,10 @@ </variablelist> </refsect2> - <refsect2><title>udevadm test <optional>options</optional> <replaceable>devpath</replaceable></title> + <refsect2><title>udevadm test + <arg choice="opt"><replaceable>options</replaceable></arg> + <arg><replaceable>devpath</replaceable></arg> + </title> <para>Simulate a udev event run for the given device, and print debug output.</para> <variablelist> <varlistentry> @@ -551,7 +589,11 @@ </variablelist> </refsect2> - <refsect2><title>udevadm test-builtin <optional>options</optional> <replaceable>COMMAND</replaceable> <replaceable>DEVPATH</replaceable></title> + <refsect2><title>udevadm test-builtin + <arg choice="opt"><replaceable>options</replaceable></arg> + <arg><replaceable>command</replaceable></arg> + <arg><replaceable>devpath</replaceable></arg> + </title> <para>Run a built-in command <replaceable>COMMAND</replaceable> for device <replaceable>DEVPATH</replaceable>, and print debug output.</para> diff --git a/man/udevd.8 b/man/udevd.8 new file mode 100644 index 0000000000..73aba7576f --- /dev/null +++ b/man/udevd.8 @@ -0,0 +1,130 @@ +'\" t +.\" Title: udevd +.\" Author: Kay Sievers <kay@vrfy.org> +.\" Generator: DocBook XSL Stylesheets v1.78.0 <http://docbook.sf.net/> +.\" Date: 11/07/2014 +.\" Manual: udevd +.\" Source: eudev +.\" Language: English +.\" +.TH "UDEVD" "8" "" "eudev" "udevd" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +udevd \- Device event managing daemon +.SH "SYNOPSIS" +.PP +udevd +.HP \w'\fB/sbin/udevd\fR\ 'u +\fB/sbin/udevd\fR [\fB\-\-daemon\fR] [\fB\-\-debug\fR] [\fB\-\-children\-max=\fR] [\fB\-\-exec\-delay=\fR] [\fB\-\-event\-timeout=\fR] [\fB\-\-resolve\-names=early|late|never\fR] [\fB\-\-version\fR] [\fB\-\-help\fR] +.SH "DESCRIPTION" +.PP +\fBudevd\fR +listens to kernel uevents\&. For every event, udevd executes matching instructions specified in udev rules\&. See +\fBudev\fR(7)\&. +.PP +The behavior of the daemon can be configured using +\fBudev.conf\fR(5), its command\-line options, environment variables, and on the kernel command\-line, or changed dynamically with +\fBudevadm control\fR\&. +.SH "OPTIONS" +.PP +\fB\-\-daemon\fR +.RS 4 +Detach and run in the background\&. +.RE +.PP +\fB\-\-debug\fR +.RS 4 +Print debug messages to standard error\&. +.RE +.PP +\fB\-\-children\-max=\fR +.RS 4 +Limit the number of events executed in parallel\&. +.RE +.PP +\fB\-\-exec\-delay=\fR +.RS 4 +Delay the execution of +\fIRUN\fR +instructions by the given number of seconds\&. This option might be useful when debugging system crashes during coldplug caused by loading non\-working kernel modules\&. +.RE +.PP +\fB\-\-event\-timeout=\fR +.RS 4 +Set the number of seconds to wait for events to finish\&. After this time the event will be terminated\&. The default is 30 seconds\&. +.RE +.PP +\fB\-\-resolve\-names=\fR +.RS 4 +Specify when udevd should resolve names of users and groups\&. When set to +\fBearly\fR +(the default), names will be resolved when the rules are parsed\&. When set to +\fBlate\fR, names will be resolved for every event\&. When set to +\fBnever\fR, names will never be resolved and all devices will be owned by root\&. +.RE +.PP +\fB\-\-help\fR +.RS 4 +.RE +.SH "ENVIRONMENT" +.PP +\fI$UDEV_LOG=\fR +.RS 4 +Set the log level\&. +.RE +.SH "KERNEL COMMAND LINE" +.PP +Parameters starting with "rd\&." will be read when +\fBudevd\fR +is used in an initrd\&. +.PP +\fIudev\&.log\-priority=\fR, \fIrd\&.udev\&.log\-priority=\fR +.RS 4 +Set the log level\&. +.RE +.PP +\fIudev\&.children\-max=\fR, \fIrd\&.udev\&.children\-max=\fR +.RS 4 +Limit the number of events executed in parallel\&. +.RE +.PP +\fIudev\&.exec\-delay=\fR, \fIrd\&.udev\&.exec\-delay=\fR +.RS 4 +Delay the execution of +\fIRUN\fR +instructions by the given number of seconds\&. This option might be useful when debugging system crashes during coldplug caused by loading non\-working kernel modules\&. +.RE +.PP +\fIudev\&.event\-timeout=\fR, \fIrd\&.udev\&.event\-timeout=\fR +.RS 4 +Wait for events to finish up to the given number of seconds\&. This option might be useful if events are terminated due to kernel drivers taking too long to initialize\&. +.RE +.PP +\fInet\&.ifnames=\fR +.RS 4 +Network interfaces are renamed to give them predictable names when possible\&. It is enabled by default; specifying 0 disables it\&. +.RE +.SH "SEE ALSO" +.PP + +\fBudev.conf\fR(5), +\fBudev\fR(7), +\fBudevadm\fR(8) diff --git a/man/udevd.xml b/man/udevd.xml index 89722050a4..cfbb798428 100644 --- a/man/udevd.xml +++ b/man/udevd.xml @@ -6,7 +6,7 @@ <refentry id="udevd"> <refentryinfo> <title>udevd</title> - <productname>udev</productname> + <productname>eudev</productname> <authorgroup> <author> <contrib>Developer</contrib> @@ -36,6 +36,7 @@ <arg><option>--debug</option></arg> <arg><option>--children-max=</option></arg> <arg><option>--exec-delay=</option></arg> + <arg><option>--event-timeout=</option></arg> <arg><option>--resolve-names=early|late|never</option></arg> <arg><option>--version</option></arg> <arg><option>--help</option></arg> @@ -50,10 +51,11 @@ <refentrytitle>udev</refentrytitle><manvolnum>7</manvolnum> </citerefentry>.</para> - <para>The behavior of the running daemon can be changed - dynamically with <command>udevadm control</command>, or - configured using - <citerefentry><refentrytitle>udev.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>. + <para>The behavior of the daemon can be configured using + <citerefentry><refentrytitle>udev.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>, + its command-line options, environment variables, and on the kernel + command-line, or changed dynamically with <command>udevadm + control</command>. </para> </refsect1> @@ -65,50 +67,55 @@ <para>Detach and run in the background.</para> </listitem> </varlistentry> + <varlistentry> <term><option>--debug</option></term> <listitem> - <para>Print debug messages to stderr.</para> + <para>Print debug messages to standard error.</para> </listitem> </varlistentry> + <varlistentry> <term><option>--children-max=</option></term> <listitem> <para>Limit the number of events executed in parallel.</para> </listitem> </varlistentry> + <varlistentry> <term><option>--exec-delay=</option></term> <listitem> + <para>Delay the execution of <varname>RUN</varname> + instructions by the given number of seconds. This option + might be useful when debugging system crashes during + coldplug caused by loading non-working kernel + modules.</para> + </listitem> + </varlistentry> - <para>Delay the execution of RUN instruction by the given - number of seconds. This option might be useful when - debugging system crashes during coldplug caused by loading - non-working kernel modules.</para> + <varlistentry> + <term><option>--event-timeout=</option></term> + <listitem> + <para>Set the number of seconds to wait for events to finish. After + this time the event will be terminated. The default is 30 seconds.</para> </listitem> </varlistentry> + <varlistentry> <term><option>--resolve-names=</option></term> <listitem> <para>Specify when udevd should resolve names of users and groups. - When set to <option>early</option> (the default) names will be + When set to <option>early</option> (the default), names will be resolved when the rules are parsed. When set to - <option>late</option> names will be resolved for every event. - When set to <option>never</option> names will never be resolved + <option>late</option>, names will be resolved for every event. + When set to <option>never</option>, names will never be resolved and all devices will be owned by root.</para> </listitem> </varlistentry> - <varlistentry> - <term><option>--version</option></term> - <listitem> - <para>Print version number.</para> - </listitem> - </varlistentry> + <varlistentry> <term><option>--help</option></term> - <listitem> - <para>Print help text.</para> - </listitem> + </varlistentry> </variablelist> </refsect1> @@ -118,7 +125,7 @@ <varlistentry> <term><varname>$UDEV_LOG=</varname></term> <listitem> - <para>Set the logging priority.</para> + <para>Set the log level.</para> </listitem> </varlistentry> </variablelist> @@ -132,7 +139,7 @@ <term><varname>udev.log-priority=</varname></term> <term><varname>rd.udev.log-priority=</varname></term> <listitem> - <para>Set the logging priority.</para> + <para>Set the log level.</para> </listitem> </varlistentry> <varlistentry> @@ -146,20 +153,31 @@ <term><varname>udev.exec-delay=</varname></term> <term><varname>rd.udev.exec-delay=</varname></term> <listitem> - <para>Delay the execution of RUN instruction by the given + <para>Delay the execution of <varname>RUN</varname> instructions by the given number of seconds. This option might be useful when debugging system crashes during coldplug caused by loading non-working kernel modules.</para> </listitem> </varlistentry> <varlistentry> + <term><varname>udev.event-timeout=</varname></term> + <term><varname>rd.udev.event-timeout=</varname></term> + <listitem> + <para>Wait for events to finish up to the given number + of seconds. This option might be useful if events are + terminated due to kernel drivers taking too long to initialize.</para> + </listitem> + </varlistentry> + <varlistentry> <term><varname>net.ifnames=</varname></term> <listitem> <para>Network interfaces are renamed to give them predictable names - when possible. It is enabled by default, specifying 0 disables it.</para> + when possible. It is enabled by default; specifying 0 disables it.</para> </listitem> </varlistentry> </variablelist> + <!-- when adding entries here, consider also adding them + in kernel-command-line.xml --> </refsect1> <refsect1> diff --git a/rules/50-firmware.rules b/rules/50-firmware.rules deleted file mode 100644 index f0ae684518..0000000000 --- a/rules/50-firmware.rules +++ /dev/null @@ -1,3 +0,0 @@ -# do not edit this file, it will be overwritten on update - -SUBSYSTEM=="firmware", ACTION=="add", RUN{builtin}="firmware" diff --git a/rules/70-mouse.rules b/rules/70-mouse.rules new file mode 100644 index 0000000000..3ea743aff9 --- /dev/null +++ b/rules/70-mouse.rules @@ -0,0 +1,18 @@ +# do not edit this file, it will be overwritten on update + +ACTION=="remove", GOTO="mouse_end" +KERNEL!="event*", GOTO="mouse_end" +ENV{ID_INPUT_MOUSE}=="", GOTO="mouse_end" + +# mouse:<subsystem>:v<vid>p<pid>:name:<name>:* +KERNELS=="input*", ENV{ID_BUS}=="usb", \ + IMPORT{builtin}="hwdb 'mouse:$env{ID_BUS}:v$attr{id/vendor}p$attr{id/product}:name:$attr{name}:'", \ + GOTO="mouse_end" +KERNELS=="input*", ENV{ID_BUS}=="bluetooth", \ + IMPORT{builtin}="hwdb 'mouse:$env{ID_BUS}:v$attr{id/vendor}p$attr{id/product}:name:$attr{name}:'", \ + GOTO="mouse_end" +DRIVERS=="psmouse", SUBSYSTEMS=="serio", \ + IMPORT{builtin}="hwdb 'mouse:ps2::name:$attr{device/name}:'", \ + GOTO="mouse_end" + +LABEL="mouse_end" diff --git a/rules/Makefile.am b/rules/Makefile.am index ae950a9546..dfbda04684 100644 --- a/rules/Makefile.am +++ b/rules/Makefile.am @@ -12,6 +12,7 @@ dist_udevrules_DATA = \ 60-persistent-v4l.rules \ 61-accelerometer.rules \ 64-btrfs.rules \ + 70-mouse.rules \ 75-net-description.rules \ 75-probe_mtd.rules \ 75-tty-description.rules \ diff --git a/src/accelerometer/accelerometer.c b/src/accelerometer/accelerometer.c index 71c5b0c199..862224b7aa 100644 --- a/src/accelerometer/accelerometer.c +++ b/src/accelerometer/accelerometer.c @@ -73,14 +73,6 @@ #define LONG(x) ((x)/BITS_PER_LONG) #define test_bit(bit, array) ((array[LONG(bit)] >> OFF(bit)) & 1) -_printf_(6,0) -static void log_fn(struct udev *udev, int priority, - const char *file, int line, const char *fn, - const char *format, va_list args) -{ - log_metav(priority, file, line, fn, format, args); -} - typedef enum { ORIENTATION_UNDEFINED, ORIENTATION_NORMAL, @@ -207,11 +199,13 @@ static void test_orientation(struct udev *udev, puts(text); } -static void help(void) -{ - printf("Usage: accelerometer [options] <device path>\n" - " --debug debug to stderr\n" - " --help print this help text\n\n"); +static void help(void) { + + printf("%s [options] <device path>\n\n" + "Accelerometer device identification.\n\n" + " -h --help Print this message\n" + " -d --debug Debug to stderr\n" + , program_invocation_short_name); } int main (int argc, char** argv) @@ -236,13 +230,11 @@ int main (int argc, char** argv) if (udev == NULL) return 1; - udev_set_log_fn(udev, log_fn); - /* CLI argument parsing */ while (1) { int option; - option = getopt_long(argc, argv, "dxh", options, NULL); + option = getopt_long(argc, argv, "dh", options, NULL); if (option == -1) break; @@ -250,7 +242,6 @@ int main (int argc, char** argv) case 'd': log_set_target(LOG_TARGET_CONSOLE); log_set_max_level(LOG_DEBUG); - udev_set_log_priority(udev, LOG_DEBUG); log_open(); break; case 'h': diff --git a/src/ata_id/ata_id.c b/src/ata_id/ata_id.c index 8ead84cf27..175e619a70 100644 --- a/src/ata_id/ata_id.c +++ b/src/ata_id/ata_id.c @@ -47,6 +47,7 @@ #include "libudev.h" #include "libudev-private.h" +#include "udev-util.h" #include "log.h" #define COMMAND_TIMEOUT_MSEC (30 * 1000) @@ -409,29 +410,23 @@ out: return ret; } -_printf_(6,0) -static void log_fn(struct udev *udev, int priority, - const char *file, int line, const char *fn, - const char *format, va_list args) -{ - log_metav(priority, file, line, fn, format, args); -} - int main(int argc, char *argv[]) { - struct udev *udev; + _cleanup_udev_unref_ struct udev *udev = NULL; struct hd_driveid id; - uint8_t identify[512]; - uint16_t *identify_words; + union { + uint8_t byte[512]; + uint16_t wyde[256]; + uint64_t octa[64]; + } identify; char model[41]; char model_enc[256]; char serial[21]; char revision[9]; const char *node = NULL; int export = 0; - int fd; + _cleanup_close_ int fd = -1; uint16_t word; - int rc = 0; int is_packet_device = 0; static const struct option options[] = { { "export", no_argument, NULL, 'x' }, @@ -443,9 +438,7 @@ int main(int argc, char *argv[]) udev = udev_new(); if (udev == NULL) - goto exit; - - udev_set_log_fn(udev, log_fn); + return 0; while (1) { int option; @@ -460,59 +453,55 @@ int main(int argc, char *argv[]) break; case 'h': printf("Usage: ata_id [--export] [--help] <device>\n" - " --export print values as environment keys\n" - " --help print this help text\n\n"); - goto exit; + " -x,--export print values as environment keys\n" + " -h,--help print this help text\n\n"); + return 0; } } node = argv[optind]; if (node == NULL) { log_error("no node specified"); - rc = 1; - goto exit; + return 1; } fd = open(node, O_RDONLY|O_NONBLOCK|O_CLOEXEC); if (fd < 0) { log_error("unable to open '%s'", node); - rc = 1; - goto exit; + return 1; } - if (disk_identify(udev, fd, identify, &is_packet_device) == 0) { + if (disk_identify(udev, fd, identify.byte, &is_packet_device) == 0) { /* * fix up only the fields from the IDENTIFY data that we are going to * use and copy it into the hd_driveid struct for convenience */ - disk_identify_fixup_string(identify, 10, 20); /* serial */ - disk_identify_fixup_string(identify, 23, 8); /* fwrev */ - disk_identify_fixup_string(identify, 27, 40); /* model */ - disk_identify_fixup_uint16(identify, 0); /* configuration */ - disk_identify_fixup_uint16(identify, 75); /* queue depth */ - disk_identify_fixup_uint16(identify, 75); /* SATA capabilities */ - disk_identify_fixup_uint16(identify, 82); /* command set supported */ - disk_identify_fixup_uint16(identify, 83); /* command set supported */ - disk_identify_fixup_uint16(identify, 84); /* command set supported */ - disk_identify_fixup_uint16(identify, 85); /* command set supported */ - disk_identify_fixup_uint16(identify, 86); /* command set supported */ - disk_identify_fixup_uint16(identify, 87); /* command set supported */ - disk_identify_fixup_uint16(identify, 89); /* time required for SECURITY ERASE UNIT */ - disk_identify_fixup_uint16(identify, 90); /* time required for enhanced SECURITY ERASE UNIT */ - disk_identify_fixup_uint16(identify, 91); /* current APM values */ - disk_identify_fixup_uint16(identify, 94); /* current AAM value */ - disk_identify_fixup_uint16(identify, 128); /* device lock function */ - disk_identify_fixup_uint16(identify, 217); /* nominal media rotation rate */ - memcpy(&id, identify, sizeof id); + disk_identify_fixup_string(identify.byte, 10, 20); /* serial */ + disk_identify_fixup_string(identify.byte, 23, 8); /* fwrev */ + disk_identify_fixup_string(identify.byte, 27, 40); /* model */ + disk_identify_fixup_uint16(identify.byte, 0); /* configuration */ + disk_identify_fixup_uint16(identify.byte, 75); /* queue depth */ + disk_identify_fixup_uint16(identify.byte, 75); /* SATA capabilities */ + disk_identify_fixup_uint16(identify.byte, 82); /* command set supported */ + disk_identify_fixup_uint16(identify.byte, 83); /* command set supported */ + disk_identify_fixup_uint16(identify.byte, 84); /* command set supported */ + disk_identify_fixup_uint16(identify.byte, 85); /* command set supported */ + disk_identify_fixup_uint16(identify.byte, 86); /* command set supported */ + disk_identify_fixup_uint16(identify.byte, 87); /* command set supported */ + disk_identify_fixup_uint16(identify.byte, 89); /* time required for SECURITY ERASE UNIT */ + disk_identify_fixup_uint16(identify.byte, 90); /* time required for enhanced SECURITY ERASE UNIT */ + disk_identify_fixup_uint16(identify.byte, 91); /* current APM values */ + disk_identify_fixup_uint16(identify.byte, 94); /* current AAM value */ + disk_identify_fixup_uint16(identify.byte, 128); /* device lock function */ + disk_identify_fixup_uint16(identify.byte, 217); /* nominal media rotation rate */ + memcpy(&id, identify.byte, sizeof id); } else { /* If this fails, then try HDIO_GET_IDENTITY */ if (ioctl(fd, HDIO_GET_IDENTITY, &id) != 0) { - log_debug("HDIO_GET_IDENTITY failed for '%s': %m", node); - rc = 2; - goto close; + log_debug_errno(errno, "HDIO_GET_IDENTITY failed for '%s': %m", node); + return 2; } } - identify_words = (uint16_t *) identify; memcpy (model, id.model, 40); model[40] = '\0'; @@ -562,8 +551,8 @@ int main(int argc, char *argv[]) } if (id.command_set_1 & (1<<5)) { - printf ("ID_ATA_WRITE_CACHE=1\n"); - printf ("ID_ATA_WRITE_CACHE_ENABLED=%d\n", (id.cfs_enable_1 & (1<<5)) ? 1 : 0); + printf("ID_ATA_WRITE_CACHE=1\n"); + printf("ID_ATA_WRITE_CACHE_ENABLED=%d\n", (id.cfs_enable_1 & (1<<5)) ? 1 : 0); } if (id.command_set_1 & (1<<10)) { printf("ID_ATA_FEATURE_SET_HPA=1\n"); @@ -626,7 +615,8 @@ int main(int argc, char *argv[]) * the device does not claim compliance with the Serial ATA specification and words * 76 through 79 are not valid and shall be ignored. */ - word = *((uint16_t *) identify + 76); + + word = identify.wyde[76]; if (word != 0x0000 && word != 0xffff) { printf("ID_ATA_SATA=1\n"); /* @@ -643,54 +633,34 @@ int main(int argc, char *argv[]) } /* Word 217 indicates the nominal media rotation rate of the device */ - word = *((uint16_t *) identify + 217); - if (word != 0x0000) { - if (word == 0x0001) { - printf ("ID_ATA_ROTATION_RATE_RPM=0\n"); /* non-rotating e.g. SSD */ - } else if (word >= 0x0401 && word <= 0xfffe) { - printf ("ID_ATA_ROTATION_RATE_RPM=%d\n", word); - } - } + word = identify.wyde[217]; + if (word == 0x0001) + printf ("ID_ATA_ROTATION_RATE_RPM=0\n"); /* non-rotating e.g. SSD */ + else if (word >= 0x0401 && word <= 0xfffe) + printf ("ID_ATA_ROTATION_RATE_RPM=%d\n", word); /* * Words 108-111 contain a mandatory World Wide Name (WWN) in the NAA IEEE Registered identifier * format. Word 108 bits (15:12) shall contain 5h, indicating that the naming authority is IEEE. * All other values are reserved. */ - word = *((uint16_t *) identify + 108); - if ((word & 0xf000) == 0x5000) { - uint64_t wwwn; - - wwwn = *((uint16_t *) identify + 108); - wwwn <<= 16; - wwwn |= *((uint16_t *) identify + 109); - wwwn <<= 16; - wwwn |= *((uint16_t *) identify + 110); - wwwn <<= 16; - wwwn |= *((uint16_t *) identify + 111); - printf("ID_WWN=0x%llx\n", (unsigned long long int) wwwn); - /* ATA devices have no vendor extension */ - printf("ID_WWN_WITH_EXTENSION=0x%llx\n", (unsigned long long int) wwwn); - } + word = identify.wyde[108]; + if ((word & 0xf000) == 0x5000) + printf("ID_WWN=0x%1$"PRIu64"x\n" + "ID_WWN_WITH_EXTENSION=0x%1$"PRIu64"x\n", + identify.octa[108/4]); /* from Linux's include/linux/ata.h */ - if (identify_words[0] == 0x848a || identify_words[0] == 0x844a) { + if (identify.wyde[0] == 0x848a || + identify.wyde[0] == 0x844a || + (identify.wyde[83] & 0xc004) == 0x4004) printf("ID_ATA_CFA=1\n"); - } else { - if ((identify_words[83] & 0xc004) == 0x4004) { - printf("ID_ATA_CFA=1\n"); - } - } } else { if (serial[0] != '\0') printf("%s_%s\n", model, serial); else printf("%s\n", model); } -close: - close(fd); -exit: - udev_unref(udev); - log_close(); - return rc; + + return 0; } diff --git a/src/cdrom_id/cdrom_id.c b/src/cdrom_id/cdrom_id.c index 9b3ab7021e..7bafd62809 100644 --- a/src/cdrom_id/cdrom_id.c +++ b/src/cdrom_id/cdrom_id.c @@ -41,14 +41,6 @@ #include "libudev.h" #include "libudev-private.h" -_printf_(6,0) -static void log_fn(struct udev *udev, int priority, - const char *file, int line, const char *fn, - const char *format, va_list args) -{ - log_metav(priority, file, line, fn, format, args); -} - /* device info */ static unsigned int cd_cd_rom; static unsigned int cd_cd_r; @@ -878,8 +870,6 @@ int main(int argc, char *argv[]) if (udev == NULL) goto exit; - udev_set_log_fn(udev, log_fn); - while (1) { int option; @@ -900,16 +890,15 @@ int main(int argc, char *argv[]) case 'd': log_set_target(LOG_TARGET_CONSOLE); log_set_max_level(LOG_DEBUG); - udev_set_log_priority(udev, LOG_DEBUG); log_open(); break; case 'h': printf("Usage: cdrom_id [options] <device>\n" - " --lock-media lock the media (to enable eject request events)\n" - " --unlock-media unlock the media\n" - " --eject-media eject the media\n" - " --debug debug to stderr\n" - " --help print this help text\n\n"); + " -l,--lock-media lock the media (to enable eject request events)\n" + " -u,--unlock-media unlock the media\n" + " -e,--eject-media eject the media\n" + " -d,--debug debug to stderr\n" + " -h,--help print this help text\n\n"); goto exit; default: rc = 1; @@ -925,7 +914,7 @@ int main(int argc, char *argv[]) goto exit; } - srand((unsigned int)getpid()); + initialize_srand(); for (cnt = 20; cnt > 0; cnt--) { struct timespec duration; @@ -1077,17 +1066,17 @@ work: if (cd_media_state != NULL) printf("ID_CDROM_MEDIA_STATE=%s\n", cd_media_state); if (cd_media_session_next > 0) - printf("ID_CDROM_MEDIA_SESSION_NEXT=%d\n", cd_media_session_next); + printf("ID_CDROM_MEDIA_SESSION_NEXT=%u\n", cd_media_session_next); if (cd_media_session_count > 0) - printf("ID_CDROM_MEDIA_SESSION_COUNT=%d\n", cd_media_session_count); + printf("ID_CDROM_MEDIA_SESSION_COUNT=%u\n", cd_media_session_count); if (cd_media_session_count > 1 && cd_media_session_last_offset > 0) printf("ID_CDROM_MEDIA_SESSION_LAST_OFFSET=%llu\n", cd_media_session_last_offset); if (cd_media_track_count > 0) - printf("ID_CDROM_MEDIA_TRACK_COUNT=%d\n", cd_media_track_count); + printf("ID_CDROM_MEDIA_TRACK_COUNT=%u\n", cd_media_track_count); if (cd_media_track_count_audio > 0) - printf("ID_CDROM_MEDIA_TRACK_COUNT_AUDIO=%d\n", cd_media_track_count_audio); + printf("ID_CDROM_MEDIA_TRACK_COUNT_AUDIO=%u\n", cd_media_track_count_audio); if (cd_media_track_count_data > 0) - printf("ID_CDROM_MEDIA_TRACK_COUNT_DATA=%d\n", cd_media_track_count_data); + printf("ID_CDROM_MEDIA_TRACK_COUNT_DATA=%u\n", cd_media_track_count_data); exit: if (fd >= 0) close(fd); diff --git a/src/collect/collect.c b/src/collect/collect.c index 323d56a82d..f309f3b98e 100644 --- a/src/collect/collect.c +++ b/src/collect/collect.c @@ -72,15 +72,19 @@ noreturn static void sig_alrm(int signo) static void usage(void) { - printf("usage: collect [--add|--remove] [--debug] <checkpoint> <id> <idlist>\n" - "\n" + printf("%s [options] <checkpoint> <id> <idlist>\n\n" + "Collect variables across events.\n\n" + " -h --help Print this message\n" + " -a --add Add ID <id> to the list <idlist>\n" + " -r --remove Remove ID <id> from the list <idlist>\n" + " -d --debug Debug to stderr\n\n" " Adds ID <id> to the list governed by <checkpoint>.\n" " <id> must be part of the list <idlist>.\n" " If all IDs given by <idlist> are listed (ie collect has been\n" " invoked for each ID in <idlist>) collect returns 0, the\n" " number of missing IDs otherwise.\n" - " On error a negative number is returned.\n" - "\n"); + " On error a negative number is returned.\n\n" + , program_invocation_short_name); } /* @@ -90,12 +94,12 @@ static void usage(void) */ static int prepare(char *dir, char *filename) { - struct stat statbuf; char buf[512]; - int fd; + int r, fd; - if (stat(dir, &statbuf) < 0) - mkdir(dir, 0700); + r = mkdir(dir, 0700); + if (r < 0 && errno != EEXIST) + return -errno; snprintf(buf, sizeof(buf), "%s/%s", dir, filename); @@ -157,7 +161,7 @@ static int checkout(int fd) if (!ptr && word < (buf + len)) { bufsize = bufsize << 1; if (debug) - fprintf(stderr, "ID overflow, restarting with size %zi\n", bufsize); + fprintf(stderr, "ID overflow, restarting with size %zu\n", bufsize); free(buf); lseek(fd, 0, SEEK_SET); goto restart; @@ -258,7 +262,7 @@ static void reject(char *us) * kickout * * Remove all IDs in the internal list which are not part - * of the list passed via the commandline. + * of the list passed via the command line. */ static void kickout(void) { diff --git a/src/libudev/libudev-device-private.c b/src/libudev/libudev-device-private.c index 637d064819..fb4c6e2940 100644 --- a/src/libudev/libudev-device-private.c +++ b/src/libudev/libudev-device-private.c @@ -102,7 +102,6 @@ static bool device_has_info(struct udev_device *udev_device) int udev_device_update_db(struct udev_device *udev_device) { - struct udev *udev = udev_device_get_udev(udev_device); bool has_info; const char *id; char filename[UTIL_PATH_SIZE]; @@ -129,10 +128,8 @@ int udev_device_update_db(struct udev_device *udev_device) strscpyl(filename_tmp, sizeof(filename_tmp), filename, ".tmp", NULL); mkdir_parents(filename_tmp, 0755); f = fopen(filename_tmp, "we"); - if (f == NULL) { - udev_err(udev, "unable to create temporary db file '%s': %m\n", filename_tmp); - return -1; - } + if (f == NULL) + return log_debug_errno(errno, "unable to create temporary db file '%s': %m", filename_tmp); /* * set 'sticky' bit to indicate that we should not clean the @@ -172,7 +169,7 @@ int udev_device_update_db(struct udev_device *udev_device) r = rename(filename_tmp, filename); if (r < 0) return -1; - udev_dbg(udev, "created %s file '%s' for '%s'\n", has_info ? "db" : "empty", + log_debug("created %s file '%s' for '%s'", has_info ? "db" : "empty", filename, udev_device_get_devpath(udev_device)); return 0; } diff --git a/src/libudev/libudev-device.c b/src/libudev/libudev-device.c index 2699374072..825a0e10f4 100644 --- a/src/libudev/libudev-device.c +++ b/src/libudev/libudev-device.c @@ -139,7 +139,7 @@ static int udev_device_set_ifindex(struct udev_device *udev_device, int ifindex) char num[32]; udev_device->ifindex = ifindex; - snprintf(num, sizeof(num), "%u", ifindex); + snprintf(num, sizeof(num), "%d", ifindex); udev_device_add_property(udev_device, "IFINDEX", num); return 0; } @@ -534,10 +534,8 @@ int udev_device_read_db(struct udev_device *udev_device, const char *dbfile) } f = fopen(dbfile, "re"); - if (f == NULL) { - udev_dbg(udev_device->udev, "no db file to read %s: %m\n", dbfile); - return -errno; - } + if (f == NULL) + return log_debug_errno(errno, "no db file to read %s: %m", dbfile); /* devices with a database entry are initialized */ udev_device->is_initialized = true; @@ -577,7 +575,7 @@ int udev_device_read_db(struct udev_device *udev_device, const char *dbfile) } fclose(f); - udev_dbg(udev_device->udev, "device %p filled with db file data\n", udev_device); + log_debug("device %p filled with db file data", udev_device); return 0; } @@ -642,7 +640,6 @@ void udev_device_set_info_loaded(struct udev_device *device) struct udev_device *udev_device_new(struct udev *udev) { struct udev_device *udev_device; - struct udev_list_entry *list_entry; if (udev == NULL) { errno = EINVAL; @@ -662,11 +659,7 @@ struct udev_device *udev_device_new(struct udev *udev) udev_list_init(udev, &udev_device->sysattr_list, false); udev_list_init(udev, &udev_device->tags_list, true); udev_device->watch_handle = -1; - /* copy global properties */ - udev_list_entry_foreach(list_entry, udev_get_properties_list_entry(udev)) - udev_device_add_property(udev_device, - udev_list_entry_get_name(list_entry), - udev_list_entry_get_value(list_entry)); + return udev_device; } @@ -704,7 +697,7 @@ _public_ struct udev_device *udev_device_new_from_syspath(struct udev *udev, con /* path starts in sys */ if (!startswith(syspath, "/sys")) { - udev_dbg(udev, "not in sys :%s\n", syspath); + log_debug("not in sys :%s", syspath); errno = EINVAL; return NULL; } @@ -730,8 +723,13 @@ _public_ struct udev_device *udev_device_new_from_syspath(struct udev *udev, con return NULL; } else { /* everything else just needs to be a directory */ - if (stat(path, &statbuf) != 0 || !S_ISDIR(statbuf.st_mode)) + if (stat(path, &statbuf) != 0) + return NULL; + + if (!S_ISDIR(statbuf.st_mode)) { + errno = EISDIR; return NULL; + } } udev_device = udev_device_new(udev); @@ -739,7 +737,7 @@ _public_ struct udev_device *udev_device_new_from_syspath(struct udev *udev, con return NULL; udev_device_set_syspath(udev_device, path); - udev_dbg(udev, "device %p has devpath '%s'\n", udev_device, udev_device_get_devpath(udev_device)); + log_debug("device %p has devpath '%s'", udev_device, udev_device_get_devpath(udev_device)); return udev_device; } @@ -971,7 +969,7 @@ _public_ struct udev_device *udev_device_new_from_environment(struct udev *udev) udev_device_add_property_from_string_parse(udev_device, environ[i]); if (udev_device_add_property_from_string_parse_finish(udev_device) < 0) { - udev_dbg(udev, "missing values, invalid device\n"); + log_debug("missing values, invalid device"); udev_device_unref(udev_device); udev_device = NULL; } diff --git a/src/libudev/libudev-hwdb.c b/src/libudev/libudev-hwdb.c index 5582f71c68..d457604a07 100644 --- a/src/libudev/libudev-hwdb.c +++ b/src/libudev/libudev-hwdb.c @@ -277,38 +277,38 @@ _public_ struct udev_hwdb *udev_hwdb_new(struct udev *udev) { hwdb->f = fopen(UDEV_HWDB_BIN, "re"); if (!hwdb->f) { - udev_dbg(udev, "error reading " UDEV_HWDB_BIN ": %m"); + log_debug(UDEV_HWDB_BIN "does not exist, please run udevadm hwdb --update"); udev_hwdb_unref(hwdb); return NULL; } if (fstat(fileno(hwdb->f), &hwdb->st) < 0 || (size_t)hwdb->st.st_size < offsetof(struct trie_header_f, strings_len) + 8) { - udev_dbg(udev, "error reading " UDEV_HWDB_BIN ": %m"); + log_debug_errno(errno, "error reading " UDEV_HWDB_BIN ": %m"); udev_hwdb_unref(hwdb); return NULL; } hwdb->map = mmap(0, hwdb->st.st_size, PROT_READ, MAP_SHARED, fileno(hwdb->f), 0); if (hwdb->map == MAP_FAILED) { - udev_dbg(udev, "error mapping " UDEV_HWDB_BIN ": %m"); + log_debug_errno(errno, "error mapping " UDEV_HWDB_BIN ": %m"); udev_hwdb_unref(hwdb); return NULL; } if (memcmp(hwdb->map, sig, sizeof(hwdb->head->signature)) != 0 || (size_t)hwdb->st.st_size != le64toh(hwdb->head->file_size)) { - udev_dbg(udev, "error recognizing the format of " UDEV_HWDB_BIN); + log_debug("error recognizing the format of " UDEV_HWDB_BIN); udev_hwdb_unref(hwdb); return NULL; } - udev_dbg(udev, "=== trie on-disk ===\n"); - udev_dbg(udev, "tool version: %"PRIu64, le64toh(hwdb->head->tool_version)); - udev_dbg(udev, "file size: %8"PRIu64" bytes\n", hwdb->st.st_size); - udev_dbg(udev, "header size %8"PRIu64" bytes\n", le64toh(hwdb->head->header_size)); - udev_dbg(udev, "strings %8"PRIu64" bytes\n", le64toh(hwdb->head->strings_len)); - udev_dbg(udev, "nodes %8"PRIu64" bytes\n", le64toh(hwdb->head->nodes_len)); + log_debug("=== trie on-disk ==="); + log_debug("tool version: %"PRIu64, le64toh(hwdb->head->tool_version)); + log_debug("file size: %8"PRIu64" bytes", hwdb->st.st_size); + log_debug("header size %8"PRIu64" bytes", le64toh(hwdb->head->header_size)); + log_debug("strings %8"PRIu64" bytes", le64toh(hwdb->head->strings_len)); + log_debug("nodes %8"PRIu64" bytes", le64toh(hwdb->head->nodes_len)); return hwdb; } @@ -360,6 +360,7 @@ bool udev_hwdb_validate(struct udev_hwdb *hwdb) { return false; if (stat("/etc/udev/hwdb.bin", &st) < 0) return true; + if (timespec_load(&hwdb->st.st_mtim) != timespec_load(&st.st_mtim)) return true; return false; diff --git a/src/libudev/libudev-monitor.c b/src/libudev/libudev-monitor.c index 137ea148d7..ae1b95b0b3 100644 --- a/src/libudev/libudev-monitor.c +++ b/src/libudev/libudev-monitor.c @@ -121,7 +121,7 @@ static bool udev_has_devtmpfs(struct udev *udev) { r = name_to_handle_at(AT_FDCWD, "/dev", &h.handle, &mount_id, 0); if (r < 0) { if (errno != EOPNOTSUPP) - udev_err(udev, "name_to_handle_at on /dev: %m\n"); + log_debug_errno(errno, "name_to_handle_at on /dev: %m"); return false; } @@ -174,7 +174,7 @@ struct udev_monitor *udev_monitor_new_from_netlink_fd(struct udev *udev, const c * will not receive any messages. */ if (access("/run/udev/control", F_OK) < 0 && !udev_has_devtmpfs(udev)) { - udev_dbg(udev, "the udev service seems not to be active, disable the monitor\n"); + log_debug("the udev service seems not to be active, disable the monitor"); group = UDEV_MONITOR_NONE; } else group = UDEV_MONITOR_UDEV; @@ -190,7 +190,7 @@ struct udev_monitor *udev_monitor_new_from_netlink_fd(struct udev *udev, const c if (fd < 0) { udev_monitor->sock = socket(PF_NETLINK, SOCK_RAW|SOCK_CLOEXEC|SOCK_NONBLOCK, NETLINK_KOBJECT_UEVENT); if (udev_monitor->sock == -1) { - udev_err(udev, "error getting socket: %m\n"); + log_debug_errno(errno, "error getting socket: %m"); free(udev_monitor); return NULL; } @@ -407,14 +407,14 @@ _public_ int udev_monitor_enable_receiving(struct udev_monitor *udev_monitor) if (err == 0) udev_monitor->snl.nl.nl_pid = snl.nl.nl_pid; } else { - udev_err(udev_monitor->udev, "bind failed: %m\n"); + log_debug_errno(errno, "bind failed: %m"); return -errno; } /* enable receiving of sender credentials */ err = setsockopt(udev_monitor->sock, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on)); if (err < 0) - udev_err(udev_monitor->udev, "setting SO_PASSCRED failed: %m\n"); + log_debug_errno(errno, "setting SO_PASSCRED failed: %m"); return 0; } @@ -582,7 +582,10 @@ _public_ struct udev_device *udev_monitor_receive_device(struct udev_monitor *ud struct cmsghdr *cmsg; union sockaddr_union snl; struct ucred *cred; - char buf[8192]; + union { + struct udev_monitor_netlink_header nlh; + char raw[8192]; + } buf; ssize_t buflen; ssize_t bufpos; @@ -602,12 +605,12 @@ retry: buflen = recvmsg(udev_monitor->sock, &smsg, 0); if (buflen < 0) { if (errno != EINTR) - udev_dbg(udev_monitor->udev, "unable to receive message\n"); + log_debug("unable to receive message"); return NULL; } if (buflen < 32 || (size_t)buflen >= sizeof(buf)) { - udev_dbg(udev_monitor->udev, "invalid message length\n"); + log_debug("invalid message length"); return NULL; } @@ -615,12 +618,12 @@ retry: /* unicast message, check if we trust the sender */ if (udev_monitor->snl_trusted_sender.nl.nl_pid == 0 || snl.nl.nl_pid != udev_monitor->snl_trusted_sender.nl.nl_pid) { - udev_dbg(udev_monitor->udev, "unicast netlink message ignored\n"); + log_debug("unicast netlink message ignored"); return NULL; } } else if (snl.nl.nl_groups == UDEV_MONITOR_KERNEL) { if (snl.nl.nl_pid > 0) { - udev_dbg(udev_monitor->udev, "multicast kernel netlink message from pid %d ignored\n", + log_debug("multicast kernel netlink message from pid %d ignored", snl.nl.nl_pid); return NULL; } @@ -628,13 +631,13 @@ retry: cmsg = CMSG_FIRSTHDR(&smsg); if (cmsg == NULL || cmsg->cmsg_type != SCM_CREDENTIALS) { - udev_dbg(udev_monitor->udev, "no sender credentials received, message ignored\n"); + log_debug("no sender credentials received, message ignored"); return NULL; } cred = (struct ucred *)CMSG_DATA(cmsg); if (cred->uid != 0) { - udev_dbg(udev_monitor->udev, "sender uid=%d, message ignored\n", cred->uid); + log_debug("sender uid=%d, message ignored", cred->uid); return NULL; } @@ -642,38 +645,35 @@ retry: if (udev_device == NULL) return NULL; - if (memcmp(buf, "libudev", 8) == 0) { - struct udev_monitor_netlink_header *nlh; - + if (memcmp(buf.raw, "libudev", 8) == 0) { /* udev message needs proper version magic */ - nlh = (struct udev_monitor_netlink_header *) buf; - if (nlh->magic != htonl(UDEV_MONITOR_MAGIC)) { - udev_err(udev_monitor->udev, "unrecognized message signature (%x != %x)\n", - nlh->magic, htonl(UDEV_MONITOR_MAGIC)); + if (buf.nlh.magic != htonl(UDEV_MONITOR_MAGIC)) { + log_debug("unrecognized message signature (%x != %x)", + buf.nlh.magic, htonl(UDEV_MONITOR_MAGIC)); udev_device_unref(udev_device); return NULL; } - if (nlh->properties_off+32 > (size_t)buflen) { + if (buf.nlh.properties_off+32 > (size_t)buflen) { udev_device_unref(udev_device); return NULL; } - bufpos = nlh->properties_off; + bufpos = buf.nlh.properties_off; /* devices received from udev are always initialized */ udev_device_set_is_initialized(udev_device); } else { /* kernel message with header */ - bufpos = strlen(buf) + 1; + bufpos = strlen(buf.raw) + 1; if ((size_t)bufpos < sizeof("a@/d") || bufpos >= buflen) { - udev_dbg(udev_monitor->udev, "invalid message length\n"); + log_debug("invalid message length"); udev_device_unref(udev_device); return NULL; } /* check message header */ - if (strstr(buf, "@/") == NULL) { - udev_dbg(udev_monitor->udev, "unrecognized message header\n"); + if (strstr(buf.raw, "@/") == NULL) { + log_debug("unrecognized message header"); udev_device_unref(udev_device); return NULL; } @@ -685,7 +685,7 @@ retry: char *key; size_t keylen; - key = &buf[bufpos]; + key = &buf.raw[bufpos]; keylen = strlen(key); if (keylen == 0) break; @@ -694,7 +694,7 @@ retry: } if (udev_device_add_property_from_string_parse_finish(udev_device) < 0) { - udev_dbg(udev_monitor->udev, "missing values, invalid device\n"); + log_debug("missing values, invalid device"); udev_device_unref(udev_device); return NULL; } @@ -778,7 +778,7 @@ int udev_monitor_send_device(struct udev_monitor *udev_monitor, smsg.msg_name = &udev_monitor->snl_destination; smsg.msg_namelen = sizeof(struct sockaddr_nl); count = sendmsg(udev_monitor->sock, &smsg, 0); - udev_dbg(udev_monitor->udev, "passed %zi bytes to netlink monitor %p\n", count, udev_monitor); + log_debug("passed %zi bytes to netlink monitor %p", count, udev_monitor); return count; } diff --git a/src/libudev/libudev-private.h b/src/libudev/libudev-private.h index 09e786c320..64f132f91d 100644 --- a/src/libudev/libudev-private.h +++ b/src/libudev/libudev-private.h @@ -26,7 +26,6 @@ #include "libudev.h" #include "macro.h" -#include "time-util.h" #include "util.h" #include "mkdir.h" #include "strxcpyx.h" @@ -34,24 +33,8 @@ #define READ_END 0 #define WRITE_END 1 -/* avoid (sometimes expensive) calculations of parameters for debug output */ -#define udev_log_cond(udev, prio, arg...) \ - do { \ - if (udev_get_log_priority(udev) >= prio) \ - udev_log(udev, prio, __FILE__, __LINE__, __FUNCTION__, ## arg); \ - } while (0) - -#define udev_dbg(udev, arg...) udev_log_cond(udev, LOG_DEBUG, ## arg) -#define udev_info(udev, arg...) udev_log_cond(udev, LOG_INFO, ## arg) -#define udev_err(udev, arg...) udev_log_cond(udev, LOG_ERR, ## arg) - /* libudev.c */ -void udev_log(struct udev *udev, - int priority, const char *file, int line, const char *fn, - const char *format, ...) _printf_(6, 7); int udev_get_rules_path(struct udev *udev, char **path[], usec_t *ts_usec[]); -struct udev_list_entry *udev_add_property(struct udev *udev, const char *key, const char *value); -struct udev_list_entry *udev_get_properties_list_entry(struct udev *udev); /* libudev-device.c */ struct udev_device *udev_device_new(struct udev *udev); diff --git a/src/libudev/libudev-util.c b/src/libudev/libudev-util.c index 00dc6e157e..e626aad53e 100644 --- a/src/libudev/libudev-util.c +++ b/src/libudev/libudev-util.c @@ -96,7 +96,7 @@ int util_resolve_subsys_kernel(struct udev *udev, const char *string, strscpy(result, maxsize, val); else result[0] = '\0'; - udev_dbg(udev, "value '[%s/%s]%s' is '%s'\n", subsys, sysname, attr, result); + log_debug("value '[%s/%s]%s' is '%s'", subsys, sysname, attr, result); } else { size_t l; char *s; @@ -105,7 +105,7 @@ int util_resolve_subsys_kernel(struct udev *udev, const char *string, l = strpcpyl(&s, maxsize, udev_device_get_syspath(dev), NULL); if (attr != NULL) strpcpyl(&s, l, "/", attr, NULL); - udev_dbg(udev, "path '[%s/%s]%s' is '%s'\n", subsys, sysname, attr, result); + log_debug("path '[%s/%s]%s' is '%s'", subsys, sysname, attr, result); } udev_device_unref(dev); return 0; @@ -162,9 +162,13 @@ int util_log_priority(const char *priority) char *endptr; int prio; - prio = strtol(priority, &endptr, 10); - if (endptr[0] == '\0' || isspace(endptr[0])) - return prio; + prio = strtoul(priority, &endptr, 10); + if (endptr[0] == '\0' || isspace(endptr[0])) { + if (prio >= 0 && prio <= 7) + return prio; + else + return -ERANGE; + } return log_level_from_string(priority); } diff --git a/src/libudev/libudev.c b/src/libudev/libudev.c index 4373ab4d54..e656b352c6 100644 --- a/src/libudev/libudev.c +++ b/src/libudev/libudev.c @@ -1,7 +1,7 @@ /*** This file is part of systemd. - Copyright 2008-2012 Kay Sievers <kay@vrfy.org> + Copyright 2008-2014 Kay Sievers <kay@vrfy.org> systemd is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -50,41 +50,18 @@ struct udev { int priority, const char *file, int line, const char *fn, const char *format, va_list args); void *userdata; - struct udev_list properties_list; - int log_priority; }; -void udev_log(struct udev *udev, - int priority, const char *file, int line, const char *fn, - const char *format, ...) -{ - va_list args; - - va_start(args, format); - udev->log_fn(udev, priority, file, line, fn, format, args); - va_end(args); -} - -_printf_(6,0) -static void log_stderr(struct udev *udev, - int priority, const char *file, int line, const char *fn, - const char *format, va_list args) -{ - fprintf(stderr, "libudev: %s: ", fn); - vfprintf(stderr, format, args); -} - /** * udev_get_userdata: * @udev: udev library context * * Retrieve stored data pointer from library context. This might be useful - * to access from callbacks like a custom logging function. + * to access from callbacks. * * Returns: stored userdata **/ -_public_ void *udev_get_userdata(struct udev *udev) -{ +_public_ void *udev_get_userdata(struct udev *udev) { if (udev == NULL) return NULL; return udev->userdata; @@ -97,8 +74,7 @@ _public_ void *udev_get_userdata(struct udev *udev) * * Store custom @userdata in the library context. **/ -_public_ void udev_set_userdata(struct udev *udev, void *userdata) -{ +_public_ void udev_set_userdata(struct udev *udev, void *userdata) { if (udev == NULL) return; udev->userdata = userdata; @@ -115,23 +91,19 @@ _public_ void udev_set_userdata(struct udev *udev, void *userdata) * * Returns: a new udev library context **/ -_public_ struct udev *udev_new(void) -{ +_public_ struct udev *udev_new(void) { struct udev *udev; - FILE *f; + _cleanup_fclose_ FILE *f = NULL; udev = new0(struct udev, 1); if (udev == NULL) return NULL; udev->refcount = 1; - udev->log_fn = log_stderr; - udev->log_priority = LOG_INFO; - udev_list_init(udev, &udev->properties_list, true); f = fopen( UDEV_CONF_FILE, "re"); if (f != NULL) { char line[UTIL_LINE_SIZE]; - int line_nr = 0; + unsigned line_nr = 0; while (fgets(line, sizeof(line), f)) { size_t len; @@ -152,7 +124,7 @@ _public_ struct udev *udev_new(void) /* split key/value */ val = strchr(key, '='); if (val == NULL) { - udev_err(udev, "missing <key>=<value> in " UDEV_CONF_FILE "[%i]; skip line\n", line_nr); + log_debug(UDEV_CONF_FILE ":%u: missing assignment, skipping line.", line_nr); continue; } val[0] = '\0'; @@ -184,7 +156,7 @@ _public_ struct udev *udev_new(void) /* unquote */ if (val[0] == '"' || val[0] == '\'') { if (val[len-1] != val[0]) { - udev_err(udev, "inconsistent quoting in " UDEV_CONF_FILE"[%i]; skip line\n", line_nr); + log_debug(UDEV_CONF_FILE ":%u: inconsistent quoting, skipping line.", line_nr); continue; } val[len-1] = '\0'; @@ -192,11 +164,16 @@ _public_ struct udev *udev_new(void) } if (streq(key, "udev_log")) { - udev_set_log_priority(udev, util_log_priority(val)); + int prio; + + prio = util_log_priority(val); + if (prio < 0) + log_debug("/etc/udev/udev.conf:%u: invalid log level '%s', ignoring.", line_nr, val); + else + log_set_max_level(prio); continue; } } - fclose(f); } return udev; @@ -210,8 +187,7 @@ _public_ struct udev *udev_new(void) * * Returns: the passed udev library context **/ -_public_ struct udev *udev_ref(struct udev *udev) -{ +_public_ struct udev *udev_ref(struct udev *udev) { if (udev == NULL) return NULL; udev->refcount++; @@ -227,14 +203,12 @@ _public_ struct udev *udev_ref(struct udev *udev) * * Returns: the passed udev library context if it has still an active reference, or #NULL otherwise. **/ -_public_ struct udev *udev_unref(struct udev *udev) -{ +_public_ struct udev *udev_unref(struct udev *udev) { if (udev == NULL) return NULL; udev->refcount--; if (udev->refcount > 0) return udev; - udev_list_cleanup(&udev->properties_list); free(udev); return NULL; } @@ -242,68 +216,37 @@ _public_ struct udev *udev_unref(struct udev *udev) /** * udev_set_log_fn: * @udev: udev library context - * @log_fn: function to be called for logging messages + * @log_fn: function to be called for log messages * - * The built-in logging writes to stderr. It can be - * overridden by a custom function, to plug log messages - * into the users' logging functionality. + * This function is deprecated. * **/ _public_ void udev_set_log_fn(struct udev *udev, void (*log_fn)(struct udev *udev, int priority, const char *file, int line, const char *fn, - const char *format, va_list args)) -{ - udev->log_fn = log_fn; - udev_dbg(udev, "custom logging function %p registered\n", log_fn); + const char *format, va_list args)) { + return; } /** * udev_get_log_priority: * @udev: udev library context * - * The initial logging priority is read from the udev config file - * at startup. + * This function is deprecated. * - * Returns: the current logging priority **/ -_public_ int udev_get_log_priority(struct udev *udev) -{ - return udev->log_priority; +_public_ int udev_get_log_priority(struct udev *udev) { + return log_get_max_level(); } /** * udev_set_log_priority: * @udev: udev library context - * @priority: the new logging priority + * @priority: the new log priority + * + * This function is deprecated. * - * Set the current logging priority. The value controls which messages - * are logged. **/ -_public_ void udev_set_log_priority(struct udev *udev, int priority) -{ - char num[32]; - - udev->log_priority = priority; - snprintf(num, sizeof(num), "%u", udev->log_priority); - udev_add_property(udev, "UDEV_LOG", num); -} - -struct udev_list_entry *udev_add_property(struct udev *udev, const char *key, const char *value) -{ - if (value == NULL) { - struct udev_list_entry *list_entry; - - list_entry = udev_get_properties_list_entry(udev); - list_entry = udev_list_entry_get_by_name(list_entry, key); - if (list_entry != NULL) - udev_list_entry_delete(list_entry); - return NULL; - } - return udev_list_entry_add(&udev->properties_list, key, value); -} - -struct udev_list_entry *udev_get_properties_list_entry(struct udev *udev) -{ - return udev_list_get_entry(&udev->properties_list); +_public_ void udev_set_log_priority(struct udev *udev, int priority) { + log_set_max_level(priority); } diff --git a/src/libudev/libudev.h b/src/libudev/libudev.h index 4f2f11502c..a94505c09e 100644 --- a/src/libudev/libudev.h +++ b/src/libudev/libudev.h @@ -41,9 +41,9 @@ struct udev *udev_new(void); void udev_set_log_fn(struct udev *udev, void (*log_fn)(struct udev *udev, int priority, const char *file, int line, const char *fn, - const char *format, va_list args)); -int udev_get_log_priority(struct udev *udev); -void udev_set_log_priority(struct udev *udev, int priority); + const char *format, va_list args)) __attribute__ ((deprecated)); +int udev_get_log_priority(struct udev *udev) __attribute__ ((deprecated)); +void udev_set_log_priority(struct udev *udev, int priority) __attribute__ ((deprecated)); void *udev_get_userdata(struct udev *udev); void udev_set_userdata(struct udev *udev, void *userdata); diff --git a/src/scsi_id/scsi_id.c b/src/scsi_id/scsi_id.c index ad190552f7..8b76d87fbe 100644 --- a/src/scsi_id/scsi_id.c +++ b/src/scsi_id/scsi_id.c @@ -67,14 +67,6 @@ static char model_enc_str[256]; static char revision_str[16]; static char type_str[16]; -_printf_(6,0) -static void log_fn(struct udev *udev, int priority, - const char *file, int line, const char *fn, - const char *format, va_list args) -{ - log_metav(priority, file, line, fn, format, args); -} - static void set_type(const char *from, char *to, size_t len) { int type_num; @@ -186,7 +178,7 @@ static int get_file_options(struct udev *udev, if (errno == ENOENT) return 1; else { - log_error("can't open %s: %m", config_file); + log_error_errno(errno, "can't open %s: %m", config_file); return -1; } } @@ -316,18 +308,20 @@ static int get_file_options(struct udev *udev, } static void help(void) { - printf("Usage: scsi_id [OPTION...] DEVICE\n" - " -d,--device= device node for SG_IO commands\n" - " -f,--config= location of config file\n" - " -p,--page=0x80|0x83|pre-spc3-83 SCSI page (0x80, 0x83, pre-spc3-83)\n" - " -s,--sg-version=3|4 use SGv3 or SGv4\n" - " -b,--blacklisted threat device as blacklisted\n" - " -g,--whitelisted threat device as whitelisted\n" - " -u,--replace-whitespace replace all whitespace by underscores\n" - " -v,--verbose verbose logging\n" - " --version print version\n" - " -x,--export print values as environment keys\n" - " -h,--help print this help text\n\n"); + printf("Usage: %s [OPTION...] DEVICE\n\n" + "SCSI device identification.\n\n" + " -h --help Print this message\n" + " --version Print version of the program\n\n" + " -d --device= Device node for SG_IO commands\n" + " -f --config= Location of config file\n" + " -p --page=0x80|0x83|pre-spc3-83 SCSI page (0x80, 0x83, pre-spc3-83)\n" + " -s --sg-version=3|4 Use SGv3 or SGv4\n" + " -b --blacklisted Treat device as blacklisted\n" + " -g --whitelisted Treat device as whitelisted\n" + " -u --replace-whitespace Replace all whitespace by underscores\n" + " -v --verbose Verbose logging\n" + " -x --export Print values as environment keys\n" + , program_invocation_short_name); } @@ -394,7 +388,6 @@ static int set_options(struct udev *udev, case 'v': log_set_target(LOG_TARGET_CONSOLE); log_set_max_level(LOG_DEBUG); - udev_set_log_priority(udev, LOG_DEBUG); log_open(); break; @@ -594,8 +587,6 @@ int main(int argc, char **argv) if (udev == NULL) goto exit; - udev_set_log_fn(udev, log_fn); - /* * Get config file options. */ @@ -620,7 +611,7 @@ int main(int argc, char **argv) exit(1); if (!dev_specified) { - log_error("no device specified"); + log_error("No device specified."); retval = 1; goto exit; } diff --git a/src/scsi_id/scsi_serial.c b/src/scsi_id/scsi_serial.c index 1806498503..37081adc1f 100644 --- a/src/scsi_id/scsi_serial.c +++ b/src/scsi_id/scsi_serial.c @@ -365,7 +365,7 @@ resend: dev_scsi->use_sg = 3; goto resend; } - log_debug("%s: ioctl failed: %m", dev_scsi->kernel); + log_debug_errno(errno, "%s: ioctl failed: %m", dev_scsi->kernel); goto error; } @@ -823,12 +823,12 @@ int scsi_std_inquiry(struct udev *udev, fd = open(devname, O_RDONLY | O_NONBLOCK | O_CLOEXEC); if (fd < 0) { - log_debug("scsi_id: cannot open %s: %m", devname); + log_debug_errno(errno, "scsi_id: cannot open %s: %m", devname); return 1; } if (fstat(fd, &statbuf) < 0) { - log_debug("scsi_id: cannot stat %s: %m", devname); + log_debug_errno(errno, "scsi_id: cannot stat %s: %m", devname); err = 2; goto out; } @@ -865,7 +865,7 @@ int scsi_get_serial(struct udev *udev, int retval; memzero(dev_scsi->serial, len); - srand((unsigned int)getpid()); + initialize_srand(); for (cnt = 20; cnt > 0; cnt--) { struct timespec duration; diff --git a/src/shared/Makefile.am b/src/shared/Makefile.am index 3862d31910..bb695f8720 100644 --- a/src/shared/Makefile.am +++ b/src/shared/Makefile.am @@ -19,7 +19,6 @@ libudev_shared_la_SOURCES=\ MurmurHash2.c \ path-util.c \ selinux-util.c \ - set.c \ siphash24.c \ smack-util.c \ strbuf.c \ @@ -41,6 +40,7 @@ noinst_HEADERS = \ hashmap.h \ ioprio.h \ label.h \ + list.h \ log.h \ macro.h \ mempool.h \ diff --git a/src/shared/cgroup-util.c b/src/shared/cgroup-util.c index 3f9018cf1f..f1dad13656 100644 --- a/src/shared/cgroup-util.c +++ b/src/shared/cgroup-util.c @@ -118,7 +118,7 @@ int cg_kill(const char *controller, const char *path, int sig, bool sigcont, boo if (ret >= 0 && errno != ESRCH) ret = -errno; } else { - if (sigcont) + if (sigcont && sig != SIGKILL) kill(pid, SIGCONT); if (ret == 0) diff --git a/src/shared/hashmap.c b/src/shared/hashmap.c index fa4edf11c6..9cfdc60930 100644 --- a/src/shared/hashmap.c +++ b/src/shared/hashmap.c @@ -1,7 +1,10 @@ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ + /*** - This file is part of eudev, forked from systemd. + This file is part of systemd. Copyright 2010 Lennart Poettering + Copyright 2014 Michal Schmidt systemd is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -24,38 +27,250 @@ #include "util.h" #include "hashmap.h" +#include "set.h" #include "macro.h" #include "siphash24.h" +#include "strv.h" +#include "list.h" #include "mempool.h" -#define INITIAL_N_BUCKETS 31 - -struct hashmap_entry { +/* + * Implementation of hashmaps. + * Addressing: open + * - uses less RAM compared to closed addressing (chaining), because + * our entries are small (especially in Sets, which tend to contain + * the majority of entries in systemd). + * Collision resolution: Robin Hood + * - tends to equalize displacement of entries from their optimal buckets. + * Probe sequence: linear + * - though theoretically worse than random probing/uniform hashing/double + * hashing, it is good for cache locality. + * + * References: + * Celis, P. 1986. Robin Hood Hashing. + * Ph.D. Dissertation. University of Waterloo, Waterloo, Ont., Canada, Canada. + * https://cs.uwaterloo.ca/research/tr/1986/CS-86-14.pdf + * - The results are derived for random probing. Suggests deletion with + * tombstones and two mean-centered search methods. None of that works + * well for linear probing. + * + * Janson, S. 2005. Individual displacements for linear probing hashing with different insertion policies. + * ACM Trans. Algorithms 1, 2 (October 2005), 177-213. + * DOI=10.1145/1103963.1103964 http://doi.acm.org/10.1145/1103963.1103964 + * http://www.math.uu.se/~svante/papers/sj157.pdf + * - Applies to Robin Hood with linear probing. Contains remarks on + * the unsuitability of mean-centered search with linear probing. + * + * Viola, A. 2005. Exact distribution of individual displacements in linear probing hashing. + * ACM Trans. Algorithms 1, 2 (October 2005), 214-242. + * DOI=10.1145/1103963.1103965 http://doi.acm.org/10.1145/1103963.1103965 + * - Similar to Janson. Note that Viola writes about C_{m,n} (number of probes + * in a successful search), and Janson writes about displacement. C = d + 1. + * + * Goossaert, E. 2013. Robin Hood hashing: backward shift deletion. + * http://codecapsule.com/2013/11/17/robin-hood-hashing-backward-shift-deletion/ + * - Explanation of backward shift deletion with pictures. + * + * Khuong, P. 2013. The Other Robin Hood Hashing. + * http://www.pvk.ca/Blog/2013/11/26/the-other-robin-hood-hashing/ + * - Short summary of random vs. linear probing, and tombstones vs. backward shift. + */ + +/* + * XXX Ideas for improvement: + * For unordered hashmaps, randomize iteration order, similarly to Perl: + * http://blog.booking.com/hardening-perls-hash-function.html + */ + +/* INV_KEEP_FREE = 1 / (1 - max_load_factor) + * e.g. 1 / (1 - 0.8) = 5 ... keep one fifth of the buckets free. */ +#define INV_KEEP_FREE 5U + +/* Fields common to entries of all hashmap/set types */ +struct hashmap_base_entry { const void *key; +}; + +/* Entry types for specific hashmap/set types + * hashmap_base_entry must be at the beginning of each entry struct. */ + +struct plain_hashmap_entry { + struct hashmap_base_entry b; void *value; - struct hashmap_entry *bucket_next, *bucket_previous; - struct hashmap_entry *iterate_next, *iterate_previous; }; -struct Hashmap { - const struct hash_ops *hash_ops; +struct ordered_hashmap_entry { + struct plain_hashmap_entry p; + unsigned iterate_next, iterate_previous; +}; + +struct set_entry { + struct hashmap_base_entry b; +}; + +/* In several functions it is advantageous to have the hash table extended + * virtually by a couple of additional buckets. We reserve special index values + * for these "swap" buckets. */ +#define _IDX_SWAP_BEGIN (UINT_MAX - 3) +#define IDX_PUT (_IDX_SWAP_BEGIN + 0) +#define IDX_TMP (_IDX_SWAP_BEGIN + 1) +#define _IDX_SWAP_END (_IDX_SWAP_BEGIN + 2) + +#define IDX_FIRST (UINT_MAX - 1) /* special index for freshly initialized iterators */ +#define IDX_NIL UINT_MAX /* special index value meaning "none" or "end" */ + +assert_cc(IDX_FIRST == _IDX_SWAP_END); +assert_cc(IDX_FIRST == _IDX_ITERATOR_FIRST); + +/* Storage space for the "swap" buckets. + * All entry types can fit into a ordered_hashmap_entry. */ +struct swap_entries { + struct ordered_hashmap_entry e[_IDX_SWAP_END - _IDX_SWAP_BEGIN]; +}; + +/* Distance from Initial Bucket */ +typedef uint8_t dib_raw_t; +#define DIB_RAW_OVERFLOW ((dib_raw_t)0xfdU) /* indicates DIB value is greater than representable */ +#define DIB_RAW_REHASH ((dib_raw_t)0xfeU) /* entry yet to be rehashed during in-place resize */ +#define DIB_RAW_FREE ((dib_raw_t)0xffU) /* a free bucket */ +#define DIB_RAW_INIT ((char)DIB_RAW_FREE) /* a byte to memset a DIB store with when initializing */ + +#define DIB_FREE UINT_MAX + +#ifdef ENABLE_DEBUG_HASHMAP +struct hashmap_debug_info { + LIST_FIELDS(struct hashmap_debug_info, debug_list); + unsigned max_entries; /* high watermark of n_entries */ + + /* who allocated this hashmap */ + int line; + const char *file; + const char *func; + + /* fields to detect modification while iterating */ + unsigned put_count; /* counts puts into the hashmap */ + unsigned rem_count; /* counts removals from hashmap */ + unsigned last_rem_idx; /* remembers last removal index */ +}; - struct hashmap_entry *iterate_list_head, *iterate_list_tail; +/* Tracks all existing hashmaps. Get at it from gdb. See sd_dump_hashmaps.py */ +static LIST_HEAD(struct hashmap_debug_info, hashmap_debug_list); + +#define HASHMAP_DEBUG_FIELDS struct hashmap_debug_info debug; + +#else /* !ENABLE_DEBUG_HASHMAP */ +#define HASHMAP_DEBUG_FIELDS +#endif /* ENABLE_DEBUG_HASHMAP */ + +enum HashmapType { + HASHMAP_TYPE_PLAIN, + HASHMAP_TYPE_ORDERED, + HASHMAP_TYPE_SET, + _HASHMAP_TYPE_MAX +}; + +struct _packed_ indirect_storage { + char *storage; /* where buckets and DIBs are stored */ + uint8_t hash_key[HASH_KEY_SIZE]; /* hash key; changes during resize */ + + unsigned n_entries; /* number of stored entries */ + unsigned n_buckets; /* number of buckets */ + + unsigned idx_lowest_entry; /* Index below which all buckets are free. + Makes "while(hashmap_steal_first())" loops + O(n) instead of O(n^2) for unordered hashmaps. */ + uint8_t _pad[3]; /* padding for the whole HashmapBase */ + /* The bitfields in HashmapBase complete the alignment of the whole thing. */ +}; + +struct direct_storage { + /* This gives us 39 bytes on 64bit, or 35 bytes on 32bit. + * That's room for 4 set_entries + 4 DIB bytes + 3 unused bytes on 64bit, + * or 7 set_entries + 7 DIB bytes + 0 unused bytes on 32bit. */ + char storage[sizeof(struct indirect_storage)]; +}; + +#define DIRECT_BUCKETS(entry_t) \ + (sizeof(struct direct_storage) / (sizeof(entry_t) + sizeof(dib_raw_t))) + +/* We should be able to store at least one entry directly. */ +assert_cc(DIRECT_BUCKETS(struct ordered_hashmap_entry) >= 1); + +/* We have 3 bits for n_direct_entries. */ +assert_cc(DIRECT_BUCKETS(struct set_entry) < (1 << 3)); + +/* Hashmaps with directly stored entries all use this shared hash key. + * It's no big deal if the key is guessed, because there can be only + * a handful of directly stored entries in a hashmap. When a hashmap + * outgrows direct storage, it gets its own key for indirect storage. */ +static uint8_t shared_hash_key[HASH_KEY_SIZE]; +static bool shared_hash_key_initialized; + +/* Fields that all hashmap/set types must have */ +struct HashmapBase { + const struct hash_ops *hash_ops; /* hash and compare ops to use */ + + union _packed_ { + struct indirect_storage indirect; /* if has_indirect */ + struct direct_storage direct; /* if !has_indirect */ + }; + + enum HashmapType type:2; /* HASHMAP_TYPE_* */ + bool has_indirect:1; /* whether indirect storage is used */ + unsigned n_direct_entries:3; /* Number of entries in direct storage. + * Only valid if !has_indirect. */ + bool from_pool:1; /* whether was allocated from mempool */ + HASHMAP_DEBUG_FIELDS /* optional hashmap_debug_info */ +}; + +/* Specific hash types + * HashmapBase must be at the beginning of each hashmap struct. */ + +struct Hashmap { + struct HashmapBase b; +}; - struct hashmap_entry ** buckets; - unsigned n_buckets, n_entries; +struct OrderedHashmap { + struct HashmapBase b; + unsigned iterate_list_head, iterate_list_tail; +}; - uint8_t hash_key[HASH_KEY_SIZE]; - bool from_pool:1; +struct Set { + struct HashmapBase b; }; -struct hashmap_tile { - Hashmap h; - struct hashmap_entry *initial_buckets[INITIAL_N_BUCKETS]; +DEFINE_MEMPOOL(hashmap_pool, Hashmap, 8); +DEFINE_MEMPOOL(ordered_hashmap_pool, OrderedHashmap, 8); +/* No need for a separate Set pool */ +assert_cc(sizeof(Hashmap) == sizeof(Set)); + +struct hashmap_type_info { + size_t head_size; + size_t entry_size; + struct mempool *mempool; + unsigned n_direct_buckets; }; -static DEFINE_MEMPOOL(hashmap_pool, struct hashmap_tile, 8); -static DEFINE_MEMPOOL(hashmap_entry_pool, struct hashmap_entry, 64); +static const struct hashmap_type_info hashmap_type_info[_HASHMAP_TYPE_MAX] = { + [HASHMAP_TYPE_PLAIN] = { + .head_size = sizeof(Hashmap), + .entry_size = sizeof(struct plain_hashmap_entry), + .mempool = &hashmap_pool, + .n_direct_buckets = DIRECT_BUCKETS(struct plain_hashmap_entry), + }, + [HASHMAP_TYPE_ORDERED] = { + .head_size = sizeof(OrderedHashmap), + .entry_size = sizeof(struct ordered_hashmap_entry), + .mempool = &ordered_hashmap_pool, + .n_direct_buckets = DIRECT_BUCKETS(struct ordered_hashmap_entry), + }, + [HASHMAP_TYPE_SET] = { + .head_size = sizeof(Set), + .entry_size = sizeof(struct set_entry), + .mempool = &hashmap_pool, + .n_direct_buckets = DIRECT_BUCKETS(struct set_entry), + }, +}; unsigned long string_hash_func(const void *p, const uint8_t hash_key[HASH_KEY_SIZE]) { uint64_t u; @@ -87,9 +302,82 @@ const struct hash_ops trivial_hash_ops = { .compare = trivial_compare_func }; -static unsigned bucket_hash(Hashmap *h, const void *p) { - return (unsigned) (h->hash_ops->hash(p, h->hash_key) % h->n_buckets); +unsigned long uint64_hash_func(const void *p, const uint8_t hash_key[HASH_KEY_SIZE]) { + uint64_t u; + siphash24((uint8_t*) &u, p, sizeof(uint64_t), hash_key); + return (unsigned long) u; +} + +int uint64_compare_func(const void *_a, const void *_b) { + uint64_t a, b; + a = *(const uint64_t*) _a; + b = *(const uint64_t*) _b; + return a < b ? -1 : (a > b ? 1 : 0); +} + +const struct hash_ops uint64_hash_ops = { + .hash = uint64_hash_func, + .compare = uint64_compare_func +}; + +#if SIZEOF_DEV_T != 8 +unsigned long devt_hash_func(const void *p, const uint8_t hash_key[HASH_KEY_SIZE]) { + uint64_t u; + siphash24((uint8_t*) &u, p, sizeof(dev_t), hash_key); + return (unsigned long) u; +} + +int devt_compare_func(const void *_a, const void *_b) { + dev_t a, b; + a = *(const dev_t*) _a; + b = *(const dev_t*) _b; + return a < b ? -1 : (a > b ? 1 : 0); +} + +const struct hash_ops devt_hash_ops = { + .hash = devt_hash_func, + .compare = devt_compare_func +}; +#endif + +static unsigned n_buckets(HashmapBase *h) { + return h->has_indirect ? h->indirect.n_buckets + : hashmap_type_info[h->type].n_direct_buckets; +} + +static unsigned n_entries(HashmapBase *h) { + return h->has_indirect ? h->indirect.n_entries + : h->n_direct_entries; +} + +static void n_entries_inc(HashmapBase *h) { + if (h->has_indirect) + h->indirect.n_entries++; + else + h->n_direct_entries++; +} + +static void n_entries_dec(HashmapBase *h) { + if (h->has_indirect) + h->indirect.n_entries--; + else + h->n_direct_entries--; +} + +static char *storage_ptr(HashmapBase *h) { + return h->has_indirect ? h->indirect.storage + : h->direct.storage; +} + +static uint8_t *hash_key(HashmapBase *h) { + return h->has_indirect ? h->indirect.hash_key + : shared_hash_key; +} + +static unsigned base_bucket_hash(HashmapBase *h, const void *p) { + return (unsigned) (h->hash_ops->hash(p, hash_key(h)) % n_buckets(h)); } +#define bucket_hash(h, p) base_bucket_hash(HASHMAP_BASE(h), p) static void get_hash_key(uint8_t hash_key[HASH_KEY_SIZE], bool reuse_is_ok) { static uint8_t current[HASH_KEY_SIZE]; @@ -110,131 +398,484 @@ static void get_hash_key(uint8_t hash_key[HASH_KEY_SIZE], bool reuse_is_ok) { memcpy(hash_key, current, sizeof(current)); } -Hashmap *hashmap_new(const struct hash_ops *hash_ops) { - bool b; - struct hashmap_tile *ht; - Hashmap *h; +static struct hashmap_base_entry *bucket_at(HashmapBase *h, unsigned idx) { + return (struct hashmap_base_entry*) + (storage_ptr(h) + idx * hashmap_type_info[h->type].entry_size); +} + +static struct plain_hashmap_entry *plain_bucket_at(Hashmap *h, unsigned idx) { + return (struct plain_hashmap_entry*) bucket_at(HASHMAP_BASE(h), idx); +} + +static struct ordered_hashmap_entry *ordered_bucket_at(OrderedHashmap *h, unsigned idx) { + return (struct ordered_hashmap_entry*) bucket_at(HASHMAP_BASE(h), idx); +} + +static struct set_entry *set_bucket_at(Set *h, unsigned idx) { + return (struct set_entry*) bucket_at(HASHMAP_BASE(h), idx); +} + +static struct ordered_hashmap_entry *bucket_at_swap(struct swap_entries *swap, unsigned idx) { + return &swap->e[idx - _IDX_SWAP_BEGIN]; +} - b = is_main_thread(); +/* Returns a pointer to the bucket at index idx. + * Understands real indexes and swap indexes, hence "_virtual". */ +static struct hashmap_base_entry *bucket_at_virtual(HashmapBase *h, struct swap_entries *swap, + unsigned idx) { + if (idx < _IDX_SWAP_BEGIN) + return bucket_at(h, idx); - if (b) { - ht = mempool_alloc_tile(&hashmap_pool); - if (!ht) - return NULL; + if (idx < _IDX_SWAP_END) + return &bucket_at_swap(swap, idx)->p.b; - memzero(ht, sizeof(struct hashmap_tile)); - } else { - ht = malloc0(sizeof(struct hashmap_tile)); + assert_not_reached("Invalid index"); +} + +static dib_raw_t *dib_raw_ptr(HashmapBase *h) { + return (dib_raw_t*) + (storage_ptr(h) + hashmap_type_info[h->type].entry_size * n_buckets(h)); +} + +static unsigned bucket_distance(HashmapBase *h, unsigned idx, unsigned from) { + return idx >= from ? idx - from + : n_buckets(h) + idx - from; +} + +static unsigned bucket_calculate_dib(HashmapBase *h, unsigned idx, dib_raw_t raw_dib) { + unsigned initial_bucket; + + if (raw_dib == DIB_RAW_FREE) + return DIB_FREE; + + if (_likely_(raw_dib < DIB_RAW_OVERFLOW)) + return raw_dib; + + /* + * Having an overflow DIB value is very unlikely. The hash function + * would have to be bad. For example, in a table of size 2^24 filled + * to load factor 0.9 the maximum observed DIB is only about 60. + * In theory (assuming I used Maxima correctly), for an infinite size + * hash table with load factor 0.8 the probability of a given entry + * having DIB > 40 is 1.9e-8. + * This returns the correct DIB value by recomputing the hash value in + * the unlikely case. XXX Hitting this case could be a hint to rehash. + */ + initial_bucket = bucket_hash(h, bucket_at(h, idx)->key); + return bucket_distance(h, idx, initial_bucket); +} + +static void bucket_set_dib(HashmapBase *h, unsigned idx, unsigned dib) { + dib_raw_ptr(h)[idx] = dib != DIB_FREE ? MIN(dib, DIB_RAW_OVERFLOW) : DIB_RAW_FREE; +} + +static unsigned skip_free_buckets(HashmapBase *h, unsigned idx) { + dib_raw_t *dibs; + + dibs = dib_raw_ptr(h); + + for ( ; idx < n_buckets(h); idx++) + if (dibs[idx] != DIB_RAW_FREE) + return idx; + + return IDX_NIL; +} + +static void bucket_mark_free(HashmapBase *h, unsigned idx) { + memset(bucket_at(h, idx), 0, hashmap_type_info[h->type].entry_size); + bucket_set_dib(h, idx, DIB_FREE); +} - if (!ht) - return NULL; +static void bucket_move_entry(HashmapBase *h, struct swap_entries *swap, + unsigned from, unsigned to) { + struct hashmap_base_entry *e_from, *e_to; + + assert(from != to); + + e_from = bucket_at_virtual(h, swap, from); + e_to = bucket_at_virtual(h, swap, to); + + memcpy(e_to, e_from, hashmap_type_info[h->type].entry_size); + + if (h->type == HASHMAP_TYPE_ORDERED) { + OrderedHashmap *lh = (OrderedHashmap*) h; + struct ordered_hashmap_entry *le, *le_to; + + le_to = (struct ordered_hashmap_entry*) e_to; + + if (le_to->iterate_next != IDX_NIL) { + le = (struct ordered_hashmap_entry*) + bucket_at_virtual(h, swap, le_to->iterate_next); + le->iterate_previous = to; + } + + if (le_to->iterate_previous != IDX_NIL) { + le = (struct ordered_hashmap_entry*) + bucket_at_virtual(h, swap, le_to->iterate_previous); + le->iterate_next = to; + } + + if (lh->iterate_list_head == from) + lh->iterate_list_head = to; + if (lh->iterate_list_tail == from) + lh->iterate_list_tail = to; } +} - h = &ht->h; - h->hash_ops = hash_ops ? hash_ops : &trivial_hash_ops; +static unsigned next_idx(HashmapBase *h, unsigned idx) { + return (idx + 1U) % n_buckets(h); +} - h->n_buckets = INITIAL_N_BUCKETS; - h->n_entries = 0; - h->iterate_list_head = h->iterate_list_tail = NULL; +static unsigned prev_idx(HashmapBase *h, unsigned idx) { + return (n_buckets(h) + idx - 1U) % n_buckets(h); +} - h->buckets = ht->initial_buckets; +static void *entry_value(HashmapBase *h, struct hashmap_base_entry *e) { + switch (h->type) { - h->from_pool = b; + case HASHMAP_TYPE_PLAIN: + case HASHMAP_TYPE_ORDERED: + return ((struct plain_hashmap_entry*)e)->value; - get_hash_key(h->hash_key, true); + case HASHMAP_TYPE_SET: + return (void*) e->key; - return h; + default: + assert_not_reached("Unknown hashmap type"); + } } -static void link_entry(Hashmap *h, struct hashmap_entry *e, unsigned hash) { +static void base_remove_entry(HashmapBase *h, unsigned idx) { + unsigned left, right, prev, dib; + dib_raw_t raw_dib, *dibs; + + dibs = dib_raw_ptr(h); + assert(dibs[idx] != DIB_RAW_FREE); + +#ifdef ENABLE_DEBUG_HASHMAP + h->debug.rem_count++; + h->debug.last_rem_idx = idx; +#endif + + left = idx; + /* Find the stop bucket ("right"). It is either free or has DIB == 0. */ + for (right = next_idx(h, left); ; right = next_idx(h, right)) { + raw_dib = dibs[right]; + if (raw_dib == 0 || raw_dib == DIB_RAW_FREE) + break; + + /* The buckets are not supposed to be all occupied and with DIB > 0. + * That would mean we could make everyone better off by shifting them + * backward. This scenario is impossible. */ + assert(left != right); + } + + if (h->type == HASHMAP_TYPE_ORDERED) { + OrderedHashmap *lh = (OrderedHashmap*) h; + struct ordered_hashmap_entry *le = ordered_bucket_at(lh, idx); + + if (le->iterate_next != IDX_NIL) + ordered_bucket_at(lh, le->iterate_next)->iterate_previous = le->iterate_previous; + else + lh->iterate_list_tail = le->iterate_previous; + + if (le->iterate_previous != IDX_NIL) + ordered_bucket_at(lh, le->iterate_previous)->iterate_next = le->iterate_next; + else + lh->iterate_list_head = le->iterate_next; + } + + /* Now shift all buckets in the interval (left, right) one step backwards */ + for (prev = left, left = next_idx(h, left); left != right; + prev = left, left = next_idx(h, left)) { + dib = bucket_calculate_dib(h, left, dibs[left]); + assert(dib != 0); + bucket_move_entry(h, NULL, left, prev); + bucket_set_dib(h, prev, dib - 1); + } + + bucket_mark_free(h, prev); + n_entries_dec(h); +} +#define remove_entry(h, idx) base_remove_entry(HASHMAP_BASE(h), idx) + +static unsigned hashmap_iterate_in_insertion_order(OrderedHashmap *h, Iterator *i) { + struct ordered_hashmap_entry *e; + unsigned idx; + assert(h); - assert(e); - - /* Insert into hash table */ - e->bucket_next = h->buckets[hash]; - e->bucket_previous = NULL; - if (h->buckets[hash]) - h->buckets[hash]->bucket_previous = e; - h->buckets[hash] = e; - - /* Insert into iteration list */ - e->iterate_previous = h->iterate_list_tail; - e->iterate_next = NULL; - if (h->iterate_list_tail) { - assert(h->iterate_list_head); - h->iterate_list_tail->iterate_next = e; + assert(i); + + if (i->idx == IDX_NIL) + goto at_end; + + if (i->idx == IDX_FIRST && h->iterate_list_head == IDX_NIL) + goto at_end; + + if (i->idx == IDX_FIRST) { + idx = h->iterate_list_head; + e = ordered_bucket_at(h, idx); } else { - assert(!h->iterate_list_head); - h->iterate_list_head = e; + idx = i->idx; + e = ordered_bucket_at(h, idx); + /* + * We allow removing the current entry while iterating, but removal may cause + * a backward shift. The next entry may thus move one bucket to the left. + * To detect when it happens, we remember the key pointer of the entry we were + * going to iterate next. If it does not match, there was a backward shift. + */ + if (e->p.b.key != i->next_key) { + idx = prev_idx(HASHMAP_BASE(h), idx); + e = ordered_bucket_at(h, idx); + } + assert(e->p.b.key == i->next_key); } - h->iterate_list_tail = e; - h->n_entries++; - assert(h->n_entries >= 1); +#ifdef ENABLE_DEBUG_HASHMAP + i->prev_idx = idx; +#endif + + if (e->iterate_next != IDX_NIL) { + struct ordered_hashmap_entry *n; + i->idx = e->iterate_next; + n = ordered_bucket_at(h, i->idx); + i->next_key = n->p.b.key; + } else + i->idx = IDX_NIL; + + return idx; + +at_end: + i->idx = IDX_NIL; + return IDX_NIL; } -static void unlink_entry(Hashmap *h, struct hashmap_entry *e, unsigned hash) { +static unsigned hashmap_iterate_in_internal_order(HashmapBase *h, Iterator *i) { + unsigned idx; + assert(h); - assert(e); + assert(i); - /* Remove from iteration list */ - if (e->iterate_next) - e->iterate_next->iterate_previous = e->iterate_previous; - else - h->iterate_list_tail = e->iterate_previous; + if (i->idx == IDX_NIL) + goto at_end; - if (e->iterate_previous) - e->iterate_previous->iterate_next = e->iterate_next; - else - h->iterate_list_head = e->iterate_next; + if (i->idx == IDX_FIRST) { + /* fast forward to the first occupied bucket */ + if (h->has_indirect) { + i->idx = skip_free_buckets(h, h->indirect.idx_lowest_entry); + h->indirect.idx_lowest_entry = i->idx; + } else + i->idx = skip_free_buckets(h, 0); + + if (i->idx == IDX_NIL) + goto at_end; + } else { + struct hashmap_base_entry *e; + + assert(i->idx > 0); - /* Remove from hash table bucket list */ - if (e->bucket_next) - e->bucket_next->bucket_previous = e->bucket_previous; + e = bucket_at(h, i->idx); + /* + * We allow removing the current entry while iterating, but removal may cause + * a backward shift. The next entry may thus move one bucket to the left. + * To detect when it happens, we remember the key pointer of the entry we were + * going to iterate next. If it does not match, there was a backward shift. + */ + if (e->key != i->next_key) + e = bucket_at(h, --i->idx); + + assert(e->key == i->next_key); + } - if (e->bucket_previous) - e->bucket_previous->bucket_next = e->bucket_next; + idx = i->idx; +#ifdef ENABLE_DEBUG_HASHMAP + i->prev_idx = idx; +#endif + + i->idx = skip_free_buckets(h, i->idx + 1); + if (i->idx != IDX_NIL) + i->next_key = bucket_at(h, i->idx)->key; else - h->buckets[hash] = e->bucket_next; + i->idx = IDX_NIL; + + return idx; - assert(h->n_entries >= 1); - h->n_entries--; +at_end: + i->idx = IDX_NIL; + return IDX_NIL; } -static void remove_entry(Hashmap *h, struct hashmap_entry *e) { - unsigned hash; +static unsigned hashmap_iterate_entry(HashmapBase *h, Iterator *i) { + if (!h) { + i->idx = IDX_NIL; + return IDX_NIL; + } - assert(h); - assert(e); +#ifdef ENABLE_DEBUG_HASHMAP + if (i->idx == IDX_FIRST) { + i->put_count = h->debug.put_count; + i->rem_count = h->debug.rem_count; + } else { + /* While iterating, must not add any new entries */ + assert(i->put_count == h->debug.put_count); + /* ... or remove entries other than the current one */ + assert(i->rem_count == h->debug.rem_count || + (i->rem_count == h->debug.rem_count - 1 && + i->prev_idx == h->debug.last_rem_idx)); + /* Reset our removals counter */ + i->rem_count = h->debug.rem_count; + } +#endif - hash = bucket_hash(h, e->key); - unlink_entry(h, e, hash); + return h->type == HASHMAP_TYPE_ORDERED ? hashmap_iterate_in_insertion_order((OrderedHashmap*) h, i) + : hashmap_iterate_in_internal_order(h, i); +} - if (h->from_pool) - mempool_free_tile(&hashmap_entry_pool, e); - else - free(e); +void *internal_hashmap_iterate(HashmapBase *h, Iterator *i, const void **key) { + struct hashmap_base_entry *e; + void *data; + unsigned idx; + + idx = hashmap_iterate_entry(h, i); + if (idx == IDX_NIL) { + if (key) + *key = NULL; + + return NULL; + } + + e = bucket_at(h, idx); + data = entry_value(h, e); + if (key) + *key = e->key; + + return data; } -void hashmap_free(Hashmap*h) { +void *set_iterate(Set *s, Iterator *i) { + return internal_hashmap_iterate(HASHMAP_BASE(s), i, NULL); +} - /* Free the hashmap, but nothing in it */ +#define HASHMAP_FOREACH_IDX(idx, h, i) \ + for ((i) = ITERATOR_FIRST, (idx) = hashmap_iterate_entry((h), &(i)); \ + (idx != IDX_NIL); \ + (idx) = hashmap_iterate_entry((h), &(i))) + +static void reset_direct_storage(HashmapBase *h) { + const struct hashmap_type_info *hi = &hashmap_type_info[h->type]; + void *p; + + assert(!h->has_indirect); + + p = mempset(h->direct.storage, 0, hi->entry_size * hi->n_direct_buckets); + memset(p, DIB_RAW_INIT, sizeof(dib_raw_t) * hi->n_direct_buckets); +} + +static struct HashmapBase *hashmap_base_new(const struct hash_ops *hash_ops, enum HashmapType type HASHMAP_DEBUG_PARAMS) { + HashmapBase *h; + const struct hashmap_type_info *hi = &hashmap_type_info[type]; + bool use_pool; + + use_pool = is_main_thread(); + + h = use_pool ? mempool_alloc0_tile(hi->mempool) : malloc0(hi->head_size); if (!h) - return; + return NULL; + + h->type = type; + h->from_pool = use_pool; + h->hash_ops = hash_ops ? hash_ops : &trivial_hash_ops; - hashmap_clear(h); + if (type == HASHMAP_TYPE_ORDERED) { + OrderedHashmap *lh = (OrderedHashmap*)h; + lh->iterate_list_head = lh->iterate_list_tail = IDX_NIL; + } + + reset_direct_storage(h); + + if (!shared_hash_key_initialized) { + random_bytes(shared_hash_key, sizeof(shared_hash_key)); + shared_hash_key_initialized= true; + } - if (h->buckets != (struct hashmap_entry**) ((uint8_t*) h + ALIGN(sizeof(Hashmap)))) - free(h->buckets); +#ifdef ENABLE_DEBUG_HASHMAP + LIST_PREPEND(debug_list, hashmap_debug_list, &h->debug); + h->debug.func = func; + h->debug.file = file; + h->debug.line = line; +#endif + + return h; +} + +Hashmap *internal_hashmap_new(const struct hash_ops *hash_ops HASHMAP_DEBUG_PARAMS) { + return (Hashmap*) hashmap_base_new(hash_ops, HASHMAP_TYPE_PLAIN HASHMAP_DEBUG_PASS_ARGS); +} + +OrderedHashmap *internal_ordered_hashmap_new(const struct hash_ops *hash_ops HASHMAP_DEBUG_PARAMS) { + return (OrderedHashmap*) hashmap_base_new(hash_ops, HASHMAP_TYPE_ORDERED HASHMAP_DEBUG_PASS_ARGS); +} + +Set *internal_set_new(const struct hash_ops *hash_ops HASHMAP_DEBUG_PARAMS) { + return (Set*) hashmap_base_new(hash_ops, HASHMAP_TYPE_SET HASHMAP_DEBUG_PASS_ARGS); +} + +static int hashmap_base_ensure_allocated(HashmapBase **h, const struct hash_ops *hash_ops, + enum HashmapType type HASHMAP_DEBUG_PARAMS) { + HashmapBase *q; + + assert(h); + + if (*h) + return 0; + + q = hashmap_base_new(hash_ops, type HASHMAP_DEBUG_PASS_ARGS); + if (!q) + return -ENOMEM; + + *h = q; + return 0; +} + +int internal_hashmap_ensure_allocated(Hashmap **h, const struct hash_ops *hash_ops HASHMAP_DEBUG_PARAMS) { + return hashmap_base_ensure_allocated((HashmapBase**)h, hash_ops, HASHMAP_TYPE_PLAIN HASHMAP_DEBUG_PASS_ARGS); +} + +int internal_ordered_hashmap_ensure_allocated(OrderedHashmap **h, const struct hash_ops *hash_ops HASHMAP_DEBUG_PARAMS) { + return hashmap_base_ensure_allocated((HashmapBase**)h, hash_ops, HASHMAP_TYPE_ORDERED HASHMAP_DEBUG_PASS_ARGS); +} + +int internal_set_ensure_allocated(Set **s, const struct hash_ops *hash_ops HASHMAP_DEBUG_PARAMS) { + return hashmap_base_ensure_allocated((HashmapBase**)s, hash_ops, HASHMAP_TYPE_SET HASHMAP_DEBUG_PASS_ARGS); +} + +static void hashmap_free_no_clear(HashmapBase *h) { + assert(!h->has_indirect); + assert(!h->n_direct_entries); + +#ifdef ENABLE_DEBUG_HASHMAP + LIST_REMOVE(debug_list, hashmap_debug_list, &h->debug); +#endif if (h->from_pool) - mempool_free_tile(&hashmap_pool, container_of(h, struct hashmap_tile, h)); + mempool_free_tile(hashmap_type_info[h->type].mempool, h); else free(h); } -void hashmap_free_free(Hashmap *h) { +void internal_hashmap_free(HashmapBase *h) { + + /* Free the hashmap, but nothing in it */ + + if (!h) + return; + + internal_hashmap_clear(h); + hashmap_free_no_clear(h); +} + +void internal_hashmap_free_free(HashmapBase *h) { /* Free the hashmap and all data objects in it, but not the * keys */ @@ -242,249 +883,763 @@ void hashmap_free_free(Hashmap *h) { if (!h) return; - hashmap_clear_free(h); - hashmap_free(h); + internal_hashmap_clear_free(h); + hashmap_free_no_clear(h); } -void hashmap_clear(Hashmap *h) { +void hashmap_free_free_free(Hashmap *h) { + + /* Free the hashmap and all data and key objects in it */ + if (!h) return; - while (h->iterate_list_head) - remove_entry(h, h->iterate_list_head); + hashmap_clear_free_free(h); + hashmap_free_no_clear(HASHMAP_BASE(h)); } -void hashmap_clear_free(Hashmap *h) { - void *p; +void internal_hashmap_clear(HashmapBase *h) { + if (!h) + return; + + if (h->has_indirect) { + free(h->indirect.storage); + h->has_indirect = false; + } + + h->n_direct_entries = 0; + reset_direct_storage(h); + + if (h->type == HASHMAP_TYPE_ORDERED) { + OrderedHashmap *lh = (OrderedHashmap*) h; + lh->iterate_list_head = lh->iterate_list_tail = IDX_NIL; + } +} + +void internal_hashmap_clear_free(HashmapBase *h) { + unsigned idx; if (!h) return; - while ((p = hashmap_steal_first(h))) - free(p); + for (idx = skip_free_buckets(h, 0); idx != IDX_NIL; + idx = skip_free_buckets(h, idx + 1)) + free(entry_value(h, bucket_at(h, idx))); + + internal_hashmap_clear(h); } -static struct hashmap_entry *hash_scan(Hashmap *h, unsigned hash, const void *key) { - struct hashmap_entry *e; - assert(h); - assert(hash < h->n_buckets); +void hashmap_clear_free_free(Hashmap *h) { + unsigned idx; - for (e = h->buckets[hash]; e; e = e->bucket_next) - if (h->hash_ops->compare(e->key, key) == 0) - return e; + if (!h) + return; + + for (idx = skip_free_buckets(HASHMAP_BASE(h), 0); idx != IDX_NIL; + idx = skip_free_buckets(HASHMAP_BASE(h), idx + 1)) { + struct plain_hashmap_entry *e = plain_bucket_at(h, idx); + free((void*)e->b.key); + free(e->value); + } - return NULL; + internal_hashmap_clear(HASHMAP_BASE(h)); } -static int resize_buckets(Hashmap *h, unsigned entries_add) { - struct hashmap_entry **n, *i; - unsigned m, new_n_entries, new_n_buckets; - uint8_t nkey[HASH_KEY_SIZE]; +static int resize_buckets(HashmapBase *h, unsigned entries_add); - assert(h); +/* + * Finds an empty bucket to put an entry into, starting the scan at 'idx'. + * Performs Robin Hood swaps as it goes. The entry to put must be placed + * by the caller into swap slot IDX_PUT. + * If used for in-place resizing, may leave a displaced entry in swap slot + * IDX_PUT. Caller must rehash it next. + * Returns: true if it left a displaced entry to rehash next in IDX_PUT, + * false otherwise. + */ +static bool hashmap_put_robin_hood(HashmapBase *h, unsigned idx, + struct swap_entries *swap) { + dib_raw_t raw_dib, *dibs; + unsigned dib, distance; - new_n_entries = h->n_entries + entries_add; +#ifdef ENABLE_DEBUG_HASHMAP + h->debug.put_count++; +#endif - /* overflow? */ - if (_unlikely_(new_n_entries < entries_add || new_n_entries > UINT_MAX / 4)) - return -ENOMEM; + dibs = dib_raw_ptr(h); - new_n_buckets = new_n_entries * 4 / 3; + for (distance = 0; ; distance++) { + raw_dib = dibs[idx]; + if (raw_dib == DIB_RAW_FREE || raw_dib == DIB_RAW_REHASH) { + if (raw_dib == DIB_RAW_REHASH) + bucket_move_entry(h, swap, idx, IDX_TMP); - if (_likely_(new_n_buckets <= h->n_buckets)) - return 0; + if (h->has_indirect && h->indirect.idx_lowest_entry > idx) + h->indirect.idx_lowest_entry = idx; - /* Increase by four at least */ - m = MAX((h->n_entries+1)*4-1, new_n_buckets); + bucket_set_dib(h, idx, distance); + bucket_move_entry(h, swap, IDX_PUT, idx); + if (raw_dib == DIB_RAW_REHASH) { + bucket_move_entry(h, swap, IDX_TMP, IDX_PUT); + return true; + } - /* If we hit OOM we simply risk packed hashmaps... */ - n = new0(struct hashmap_entry*, m); - if (!n) - return -ENOMEM; + return false; + } - /* Let's use a different randomized hash key for the - * extension, so that people cannot guess what we are using - * here forever */ - get_hash_key(nkey, false); + dib = bucket_calculate_dib(h, idx, raw_dib); - for (i = h->iterate_list_head; i; i = i->iterate_next) { - unsigned long old_bucket, new_bucket; + if (dib < distance) { + /* Found a wealthier entry. Go Robin Hood! */ - old_bucket = h->hash_ops->hash(i->key, h->hash_key) % h->n_buckets; + bucket_set_dib(h, idx, distance); - /* First, drop from old bucket table */ - if (i->bucket_next) - i->bucket_next->bucket_previous = i->bucket_previous; + /* swap the entries */ + bucket_move_entry(h, swap, idx, IDX_TMP); + bucket_move_entry(h, swap, IDX_PUT, idx); + bucket_move_entry(h, swap, IDX_TMP, IDX_PUT); - if (i->bucket_previous) - i->bucket_previous->bucket_next = i->bucket_next; - else - h->buckets[old_bucket] = i->bucket_next; + distance = dib; + } - /* Then, add to new backet table */ - new_bucket = h->hash_ops->hash(i->key, nkey) % m; + idx = next_idx(h, idx); + } +} - i->bucket_next = n[new_bucket]; - i->bucket_previous = NULL; - if (n[new_bucket]) - n[new_bucket]->bucket_previous = i; - n[new_bucket] = i; +/* + * Puts an entry into a hashmap, boldly - no check whether key already exists. + * The caller must place the entry (only its key and value, not link indexes) + * in swap slot IDX_PUT. + * Caller must ensure: the key does not exist yet in the hashmap. + * that resize is not needed if !may_resize. + * Returns: 1 if entry was put successfully. + * -ENOMEM if may_resize==true and resize failed with -ENOMEM. + * Cannot return -ENOMEM if !may_resize. + */ +static int hashmap_base_put_boldly(HashmapBase *h, unsigned idx, + struct swap_entries *swap, bool may_resize) { + struct ordered_hashmap_entry *new_entry; + int r; + + assert(idx < n_buckets(h)); + + new_entry = bucket_at_swap(swap, IDX_PUT); + + if (may_resize) { + r = resize_buckets(h, 1); + if (r < 0) + return r; + if (r > 0) + idx = bucket_hash(h, new_entry->p.b.key); } + assert(n_entries(h) < n_buckets(h)); - if (h->buckets != (struct hashmap_entry**) ((uint8_t*) h + ALIGN(sizeof(Hashmap)))) - free(h->buckets); + if (h->type == HASHMAP_TYPE_ORDERED) { + OrderedHashmap *lh = (OrderedHashmap*) h; - h->buckets = n; - h->n_buckets = m; + new_entry->iterate_next = IDX_NIL; + new_entry->iterate_previous = lh->iterate_list_tail; - memcpy(h->hash_key, nkey, HASH_KEY_SIZE); + if (lh->iterate_list_tail != IDX_NIL) { + struct ordered_hashmap_entry *old_tail; + + old_tail = ordered_bucket_at(lh, lh->iterate_list_tail); + assert(old_tail->iterate_next == IDX_NIL); + old_tail->iterate_next = IDX_PUT; + } + + lh->iterate_list_tail = IDX_PUT; + if (lh->iterate_list_head == IDX_NIL) + lh->iterate_list_head = IDX_PUT; + } + + assert_se(hashmap_put_robin_hood(h, idx, swap) == false); + + n_entries_inc(h); +#ifdef ENABLE_DEBUG_HASHMAP + h->debug.max_entries = MAX(h->debug.max_entries, n_entries(h)); +#endif return 1; } +#define hashmap_put_boldly(h, idx, swap, may_resize) \ + hashmap_base_put_boldly(HASHMAP_BASE(h), idx, swap, may_resize) + +/* + * Returns 0 if resize is not needed. + * 1 if successfully resized. + * -ENOMEM on allocation failure. + */ +static int resize_buckets(HashmapBase *h, unsigned entries_add) { + struct swap_entries swap; + char *new_storage; + dib_raw_t *old_dibs, *new_dibs; + const struct hashmap_type_info *hi; + unsigned idx, optimal_idx; + unsigned old_n_buckets, new_n_buckets, n_rehashed, new_n_entries; + uint8_t new_shift; + bool rehash_next; -static int __hashmap_put(Hashmap *h, const void *key, void *value, unsigned hash) { - /* For when we know no such entry exists yet */ + assert(h); - struct hashmap_entry *e; + hi = &hashmap_type_info[h->type]; + new_n_entries = n_entries(h) + entries_add; - if (resize_buckets(h, 1) > 0) - hash = bucket_hash(h, key); + /* overflow? */ + if (_unlikely_(new_n_entries < entries_add)) + return -ENOMEM; - if (h->from_pool) - e = mempool_alloc_tile(&hashmap_entry_pool); - else - e = new(struct hashmap_entry, 1); + /* For direct storage we allow 100% load, because it's tiny. */ + if (!h->has_indirect && new_n_entries <= hi->n_direct_buckets) + return 0; - if (!e) + /* + * Load factor = n/m = 1 - (1/INV_KEEP_FREE). + * From it follows: m = n + n/(INV_KEEP_FREE - 1) + */ + new_n_buckets = new_n_entries + new_n_entries / (INV_KEEP_FREE - 1); + /* overflow? */ + if (_unlikely_(new_n_buckets < new_n_entries)) return -ENOMEM; - e->key = key; - e->value = value; + if (_unlikely_(new_n_buckets > UINT_MAX / (hi->entry_size + sizeof(dib_raw_t)))) + return -ENOMEM; - link_entry(h, e, hash); + old_n_buckets = n_buckets(h); + + if (_likely_(new_n_buckets <= old_n_buckets)) + return 0; + + new_shift = log2u_round_up(MAX( + new_n_buckets * (hi->entry_size + sizeof(dib_raw_t)), + 2 * sizeof(struct direct_storage))); + + /* Realloc storage (buckets and DIB array). */ + new_storage = realloc(h->has_indirect ? h->indirect.storage : NULL, + 1U << new_shift); + if (!new_storage) + return -ENOMEM; + + /* Must upgrade direct to indirect storage. */ + if (!h->has_indirect) { + memcpy(new_storage, h->direct.storage, + old_n_buckets * (hi->entry_size + sizeof(dib_raw_t))); + h->indirect.n_entries = h->n_direct_entries; + h->indirect.idx_lowest_entry = 0; + h->n_direct_entries = 0; + } + + /* Get a new hash key. If we've just upgraded to indirect storage, + * allow reusing a previously generated key. It's still a different key + * from the shared one that we used for direct storage. */ + get_hash_key(h->indirect.hash_key, !h->has_indirect); + + h->has_indirect = true; + h->indirect.storage = new_storage; + h->indirect.n_buckets = (1U << new_shift) / + (hi->entry_size + sizeof(dib_raw_t)); + + old_dibs = (dib_raw_t*)(new_storage + hi->entry_size * old_n_buckets); + new_dibs = dib_raw_ptr(h); + + /* + * Move the DIB array to the new place, replacing valid DIB values with + * DIB_RAW_REHASH to indicate all of the used buckets need rehashing. + * Note: Overlap is not possible, because we have at least doubled the + * number of buckets and dib_raw_t is smaller than any entry type. + */ + for (idx = 0; idx < old_n_buckets; idx++) { + assert(old_dibs[idx] != DIB_RAW_REHASH); + new_dibs[idx] = old_dibs[idx] == DIB_RAW_FREE ? DIB_RAW_FREE + : DIB_RAW_REHASH; + } + + /* Zero the area of newly added entries (including the old DIB area) */ + memset(bucket_at(h, old_n_buckets), 0, + (n_buckets(h) - old_n_buckets) * hi->entry_size); + + /* The upper half of the new DIB array needs initialization */ + memset(&new_dibs[old_n_buckets], DIB_RAW_INIT, + (n_buckets(h) - old_n_buckets) * sizeof(dib_raw_t)); + + /* Rehash entries that need it */ + n_rehashed = 0; + for (idx = 0; idx < old_n_buckets; idx++) { + if (new_dibs[idx] != DIB_RAW_REHASH) + continue; + + optimal_idx = bucket_hash(h, bucket_at(h, idx)->key); + + /* + * Not much to do if by luck the entry hashes to its current + * location. Just set its DIB. + */ + if (optimal_idx == idx) { + new_dibs[idx] = 0; + n_rehashed++; + continue; + } + + new_dibs[idx] = DIB_RAW_FREE; + bucket_move_entry(h, &swap, idx, IDX_PUT); + /* bucket_move_entry does not clear the source */ + memset(bucket_at(h, idx), 0, hi->entry_size); + + do { + /* + * Find the new bucket for the current entry. This may make + * another entry homeless and load it into IDX_PUT. + */ + rehash_next = hashmap_put_robin_hood(h, optimal_idx, &swap); + n_rehashed++; + + /* Did the current entry displace another one? */ + if (rehash_next) + optimal_idx = bucket_hash(h, bucket_at_swap(&swap, IDX_PUT)->p.b.key); + } while (rehash_next); + } + + assert(n_rehashed == n_entries(h)); return 1; } +/* + * Finds an entry with a matching key + * Returns: index of the found entry, or IDX_NIL if not found. + */ +static unsigned base_bucket_scan(HashmapBase *h, unsigned idx, const void *key) { + struct hashmap_base_entry *e; + unsigned dib, distance; + dib_raw_t *dibs = dib_raw_ptr(h); + + assert(idx < n_buckets(h)); + + for (distance = 0; ; distance++) { + if (dibs[idx] == DIB_RAW_FREE) + return IDX_NIL; + + dib = bucket_calculate_dib(h, idx, dibs[idx]); + + if (dib < distance) + return IDX_NIL; + if (dib == distance) { + e = bucket_at(h, idx); + if (h->hash_ops->compare(e->key, key) == 0) + return idx; + } + + idx = next_idx(h, idx); + } +} +#define bucket_scan(h, idx, key) base_bucket_scan(HASHMAP_BASE(h), idx, key) + int hashmap_put(Hashmap *h, const void *key, void *value) { - struct hashmap_entry *e; - unsigned hash; + struct swap_entries swap; + struct plain_hashmap_entry *e; + unsigned hash, idx; assert(h); hash = bucket_hash(h, key); - e = hash_scan(h, hash, key); - if (e) { + idx = bucket_scan(h, hash, key); + if (idx != IDX_NIL) { + e = plain_bucket_at(h, idx); if (e->value == value) return 0; return -EEXIST; } - return __hashmap_put(h, key, value, hash); + e = &bucket_at_swap(&swap, IDX_PUT)->p; + e->b.key = key; + e->value = value; + return hashmap_put_boldly(h, hash, &swap, true); } -void* hashmap_get(Hashmap *h, const void *key) { - unsigned hash; - struct hashmap_entry *e; +int set_put(Set *s, const void *key) { + struct swap_entries swap; + struct hashmap_base_entry *e; + unsigned hash, idx; + + assert(s); + + hash = bucket_hash(s, key); + idx = bucket_scan(s, hash, key); + if (idx != IDX_NIL) + return 0; + + e = &bucket_at_swap(&swap, IDX_PUT)->p.b; + e->key = key; + return hashmap_put_boldly(s, hash, &swap, true); +} + +int hashmap_replace(Hashmap *h, const void *key, void *value) { + struct swap_entries swap; + struct plain_hashmap_entry *e; + unsigned hash, idx; + + assert(h); + + hash = bucket_hash(h, key); + idx = bucket_scan(h, hash, key); + if (idx != IDX_NIL) { + e = plain_bucket_at(h, idx); +#ifdef ENABLE_DEBUG_HASHMAP + /* Although the key is equal, the key pointer may have changed, + * and this would break our assumption for iterating. So count + * this operation as incompatible with iteration. */ + if (e->b.key != key) { + h->b.debug.put_count++; + h->b.debug.rem_count++; + h->b.debug.last_rem_idx = idx; + } +#endif + e->b.key = key; + e->value = value; + return 0; + } + + e = &bucket_at_swap(&swap, IDX_PUT)->p; + e->b.key = key; + e->value = value; + return hashmap_put_boldly(h, hash, &swap, true); +} + +int hashmap_update(Hashmap *h, const void *key, void *value) { + struct plain_hashmap_entry *e; + unsigned hash, idx; + + assert(h); + + hash = bucket_hash(h, key); + idx = bucket_scan(h, hash, key); + if (idx == IDX_NIL) + return -ENOENT; + + e = plain_bucket_at(h, idx); + e->value = value; + return 0; +} + +void *internal_hashmap_get(HashmapBase *h, const void *key) { + struct hashmap_base_entry *e; + unsigned hash, idx; if (!h) return NULL; hash = bucket_hash(h, key); - e = hash_scan(h, hash, key); - if (!e) + idx = bucket_scan(h, hash, key); + if (idx == IDX_NIL) return NULL; - return e->value; + e = bucket_at(h, idx); + return entry_value(h, e); } -void* hashmap_get2(Hashmap *h, const void *key, void **key2) { - unsigned hash; - struct hashmap_entry *e; +void *hashmap_get2(Hashmap *h, const void *key, void **key2) { + struct plain_hashmap_entry *e; + unsigned hash, idx; if (!h) return NULL; hash = bucket_hash(h, key); - e = hash_scan(h, hash, key); - if (!e) + idx = bucket_scan(h, hash, key); + if (idx == IDX_NIL) return NULL; + e = plain_bucket_at(h, idx); if (key2) - *key2 = (void*) e->key; + *key2 = (void*) e->b.key; return e->value; } -bool hashmap_contains(Hashmap *h, const void *key) { +bool internal_hashmap_contains(HashmapBase *h, const void *key) { unsigned hash; if (!h) return false; hash = bucket_hash(h, key); - return !!hash_scan(h, hash, key); + return bucket_scan(h, hash, key) != IDX_NIL; } -void *hashmap_iterate(Hashmap *h, Iterator *i, const void **key) { - struct hashmap_entry *e; +void *internal_hashmap_remove(HashmapBase *h, const void *key) { + struct hashmap_base_entry *e; + unsigned hash, idx; + void *data; - assert(i); + if (!h) + return NULL; + + hash = bucket_hash(h, key); + idx = bucket_scan(h, hash, key); + if (idx == IDX_NIL) + return NULL; + + e = bucket_at(h, idx); + data = entry_value(h, e); + remove_entry(h, idx); + + return data; +} + +void *hashmap_remove2(Hashmap *h, const void *key, void **rkey) { + struct plain_hashmap_entry *e; + unsigned hash, idx; + void *data; + + if (!h) { + if (rkey) + *rkey = NULL; + return NULL; + } + + hash = bucket_hash(h, key); + idx = bucket_scan(h, hash, key); + if (idx == IDX_NIL) { + if (rkey) + *rkey = NULL; + return NULL; + } + + e = plain_bucket_at(h, idx); + data = e->value; + if (rkey) + *rkey = (void*) e->b.key; + + remove_entry(h, idx); + + return data; +} + +int hashmap_remove_and_put(Hashmap *h, const void *old_key, const void *new_key, void *value) { + struct swap_entries swap; + struct plain_hashmap_entry *e; + unsigned old_hash, new_hash, idx; if (!h) - goto at_end; + return -ENOENT; - if (*i == ITERATOR_LAST) - goto at_end; + old_hash = bucket_hash(h, old_key); + idx = bucket_scan(h, old_hash, old_key); + if (idx == IDX_NIL) + return -ENOENT; - if (*i == ITERATOR_FIRST && !h->iterate_list_head) - goto at_end; + new_hash = bucket_hash(h, new_key); + if (bucket_scan(h, new_hash, new_key) != IDX_NIL) + return -EEXIST; - e = *i == ITERATOR_FIRST ? h->iterate_list_head : (struct hashmap_entry*) *i; + remove_entry(h, idx); - if (e->iterate_next) - *i = (Iterator) e->iterate_next; - else - *i = ITERATOR_LAST; + e = &bucket_at_swap(&swap, IDX_PUT)->p; + e->b.key = new_key; + e->value = value; + assert_se(hashmap_put_boldly(h, new_hash, &swap, false) == 1); - if (key) - *key = e->key; + return 0; +} - return e->value; +int set_remove_and_put(Set *s, const void *old_key, const void *new_key) { + struct swap_entries swap; + struct hashmap_base_entry *e; + unsigned old_hash, new_hash, idx; -at_end: - *i = ITERATOR_LAST; + if (!s) + return -ENOENT; - if (key) - *key = NULL; + old_hash = bucket_hash(s, old_key); + idx = bucket_scan(s, old_hash, old_key); + if (idx == IDX_NIL) + return -ENOENT; + + new_hash = bucket_hash(s, new_key); + if (bucket_scan(s, new_hash, new_key) != IDX_NIL) + return -EEXIST; + + remove_entry(s, idx); - return NULL; + e = &bucket_at_swap(&swap, IDX_PUT)->p.b; + e->key = new_key; + assert_se(hashmap_put_boldly(s, new_hash, &swap, false) == 1); + + return 0; } -void* hashmap_steal_first(Hashmap *h) { - void *data; +int hashmap_remove_and_replace(Hashmap *h, const void *old_key, const void *new_key, void *value) { + struct swap_entries swap; + struct plain_hashmap_entry *e; + unsigned old_hash, new_hash, idx_old, idx_new; if (!h) + return -ENOENT; + + old_hash = bucket_hash(h, old_key); + idx_old = bucket_scan(h, old_hash, old_key); + if (idx_old == IDX_NIL) + return -ENOENT; + + old_key = bucket_at(HASHMAP_BASE(h), idx_old)->key; + + new_hash = bucket_hash(h, new_key); + idx_new = bucket_scan(h, new_hash, new_key); + if (idx_new != IDX_NIL) + if (idx_old != idx_new) { + remove_entry(h, idx_new); + /* Compensate for a possible backward shift. */ + if (old_key != bucket_at(HASHMAP_BASE(h), idx_old)->key) + idx_old = prev_idx(HASHMAP_BASE(h), idx_old); + assert(old_key == bucket_at(HASHMAP_BASE(h), idx_old)->key); + } + + remove_entry(h, idx_old); + + e = &bucket_at_swap(&swap, IDX_PUT)->p; + e->b.key = new_key; + e->value = value; + assert_se(hashmap_put_boldly(h, new_hash, &swap, false) == 1); + + return 0; +} + +void *hashmap_remove_value(Hashmap *h, const void *key, void *value) { + struct plain_hashmap_entry *e; + unsigned hash, idx; + + if (!h) + return NULL; + + hash = bucket_hash(h, key); + idx = bucket_scan(h, hash, key); + if (idx == IDX_NIL) + return NULL; + + e = plain_bucket_at(h, idx); + if (e->value != value) + return NULL; + + remove_entry(h, idx); + + return value; +} + +static unsigned find_first_entry(HashmapBase *h) { + Iterator i = ITERATOR_FIRST; + + if (!h || !n_entries(h)) + return IDX_NIL; + + return hashmap_iterate_entry(h, &i); +} + +void *internal_hashmap_first(HashmapBase *h) { + unsigned idx; + + idx = find_first_entry(h); + if (idx == IDX_NIL) + return NULL; + + return entry_value(h, bucket_at(h, idx)); +} + +void *internal_hashmap_first_key(HashmapBase *h) { + struct hashmap_base_entry *e; + unsigned idx; + + idx = find_first_entry(h); + if (idx == IDX_NIL) return NULL; - if (!h->iterate_list_head) + e = bucket_at(h, idx); + return (void*) e->key; +} + +void *internal_hashmap_steal_first(HashmapBase *h) { + struct hashmap_base_entry *e; + void *data; + unsigned idx; + + idx = find_first_entry(h); + if (idx == IDX_NIL) return NULL; - data = h->iterate_list_head->value; - remove_entry(h, h->iterate_list_head); + e = bucket_at(h, idx); + data = entry_value(h, e); + remove_entry(h, idx); return data; } -unsigned hashmap_size(Hashmap *h) { +void *internal_hashmap_steal_first_key(HashmapBase *h) { + struct hashmap_base_entry *e; + void *key; + unsigned idx; + + idx = find_first_entry(h); + if (idx == IDX_NIL) + return NULL; + + e = bucket_at(h, idx); + key = (void*) e->key; + remove_entry(h, idx); + + return key; +} + +unsigned internal_hashmap_size(HashmapBase *h) { if (!h) return 0; - return h->n_entries; + return n_entries(h); +} + +unsigned internal_hashmap_buckets(HashmapBase *h) { + + if (!h) + return 0; + + return n_buckets(h); +} + +int internal_hashmap_merge(Hashmap *h, Hashmap *other) { + Iterator i; + unsigned idx; + + assert(h); + + HASHMAP_FOREACH_IDX(idx, HASHMAP_BASE(other), i) { + struct plain_hashmap_entry *pe = plain_bucket_at(other, idx); + int r; + + r = hashmap_put(h, pe->b.key, pe->value); + if (r < 0 && r != -EEXIST) + return r; + } + + return 0; +} + +int set_merge(Set *s, Set *other) { + Iterator i; + unsigned idx; + + assert(s); + + HASHMAP_FOREACH_IDX(idx, HASHMAP_BASE(other), i) { + struct set_entry *se = set_bucket_at(other, idx); + int r; + + r = set_put(s, se->b.key); + if (r < 0) + return r; + } + + return 0; } -int hashmap_reserve(Hashmap *h, unsigned entries_add) { +int internal_hashmap_reserve(HashmapBase *h, unsigned entries_add) { int r; assert(h); @@ -496,20 +1651,200 @@ int hashmap_reserve(Hashmap *h, unsigned entries_add) { return 0; } -char **hashmap_get_strv(Hashmap *h) { +/* + * The same as hashmap_merge(), but every new item from other is moved to h. + * Keys already in h are skipped and stay in other. + * Returns: 0 on success. + * -ENOMEM on alloc failure, in which case no move has been done. + */ +int internal_hashmap_move(HashmapBase *h, HashmapBase *other) { + struct swap_entries swap; + struct hashmap_base_entry *e, *n; + Iterator i; + unsigned idx; + int r; + + assert(h); + + if (!other) + return 0; + + assert(other->type == h->type); + + /* + * This reserves buckets for the worst case, where none of other's + * entries are yet present in h. This is preferable to risking + * an allocation failure in the middle of the moving and having to + * rollback or return a partial result. + */ + r = resize_buckets(h, n_entries(other)); + if (r < 0) + return r; + + HASHMAP_FOREACH_IDX(idx, other, i) { + unsigned h_hash; + + e = bucket_at(other, idx); + h_hash = bucket_hash(h, e->key); + if (bucket_scan(h, h_hash, e->key) != IDX_NIL) + continue; + + n = &bucket_at_swap(&swap, IDX_PUT)->p.b; + n->key = e->key; + if (h->type != HASHMAP_TYPE_SET) + ((struct plain_hashmap_entry*) n)->value = + ((struct plain_hashmap_entry*) e)->value; + assert_se(hashmap_put_boldly(h, h_hash, &swap, false) == 1); + + remove_entry(other, idx); + } + + return 0; +} + +int internal_hashmap_move_one(HashmapBase *h, HashmapBase *other, const void *key) { + struct swap_entries swap; + unsigned h_hash, other_hash, idx; + struct hashmap_base_entry *e, *n; + int r; + + assert(h); + + h_hash = bucket_hash(h, key); + if (bucket_scan(h, h_hash, key) != IDX_NIL) + return -EEXIST; + + if (!other) + return -ENOENT; + + assert(other->type == h->type); + + other_hash = bucket_hash(other, key); + idx = bucket_scan(other, other_hash, key); + if (idx == IDX_NIL) + return -ENOENT; + + e = bucket_at(other, idx); + + n = &bucket_at_swap(&swap, IDX_PUT)->p.b; + n->key = e->key; + if (h->type != HASHMAP_TYPE_SET) + ((struct plain_hashmap_entry*) n)->value = + ((struct plain_hashmap_entry*) e)->value; + r = hashmap_put_boldly(h, h_hash, &swap, true); + if (r < 0) + return r; + + remove_entry(other, idx); + return 0; +} + +HashmapBase *internal_hashmap_copy(HashmapBase *h) { + HashmapBase *copy; + int r; + + assert(h); + + copy = hashmap_base_new(h->hash_ops, h->type HASHMAP_DEBUG_SRC_ARGS); + if (!copy) + return NULL; + + switch (h->type) { + case HASHMAP_TYPE_PLAIN: + case HASHMAP_TYPE_ORDERED: + r = hashmap_merge((Hashmap*)copy, (Hashmap*)h); + break; + case HASHMAP_TYPE_SET: + r = set_merge((Set*)copy, (Set*)h); + break; + default: + assert_not_reached("Unknown hashmap type"); + } + + if (r < 0) { + internal_hashmap_free(copy); + return NULL; + } + + return copy; +} + +char **internal_hashmap_get_strv(HashmapBase *h) { char **sv; - Iterator it; - char *item; - int n; + Iterator i; + unsigned idx, n; - sv = new(char*, h->n_entries+1); + sv = new(char*, n_entries(h)+1); if (!sv) return NULL; n = 0; - HASHMAP_FOREACH(item, h, it) - sv[n++] = item; + HASHMAP_FOREACH_IDX(idx, h, i) + sv[n++] = entry_value(h, bucket_at(h, idx)); sv[n] = NULL; return sv; } + +void *ordered_hashmap_next(OrderedHashmap *h, const void *key) { + struct ordered_hashmap_entry *e; + unsigned hash, idx; + + assert(key); + + if (!h) + return NULL; + + hash = bucket_hash(h, key); + idx = bucket_scan(h, hash, key); + if (idx == IDX_NIL) + return NULL; + + e = ordered_bucket_at(h, idx); + if (e->iterate_next == IDX_NIL) + return NULL; + return ordered_bucket_at(h, e->iterate_next)->p.value; +} + +int set_consume(Set *s, void *value) { + int r; + + r = set_put(s, value); + if (r <= 0) + free(value); + + return r; +} + +int set_put_strdup(Set *s, const char *p) { + char *c; + int r; + + assert(s); + assert(p); + + c = strdup(p); + if (!c) + return -ENOMEM; + + r = set_consume(s, c); + if (r == -EEXIST) + return 0; + + return r; +} + +int set_put_strdupv(Set *s, char **l) { + int n = 0, r; + char **i; + + STRV_FOREACH(i, l) { + r = set_put_strdup(s, *i); + if (r < 0) + return r; + + n += r; + } + + return n; +} diff --git a/src/shared/hashmap.h b/src/shared/hashmap.h index 22bda37437..894f67939e 100644 --- a/src/shared/hashmap.h +++ b/src/shared/hashmap.h @@ -1,7 +1,12 @@ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ + +#pragma once + /*** - This file is part of eudev, forked from systemd. + This file is part of systemd. Copyright 2010 Lennart Poettering + Copyright 2014 Michal Schmidt systemd is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -17,26 +22,50 @@ along with systemd; If not, see <http://www.gnu.org/licenses/>. ***/ -#pragma once - #include <stdbool.h> #include "macro.h" #include "util.h" -/* Pretty straightforward hash table implementation. As a minor - * optimization a NULL hashmap object will be treated as empty hashmap - * for all read operations. That way it is not necessary to - * instantiate an object for each Hashmap use. */ +/* + * A hash table implementation. As a minor optimization a NULL hashmap object + * will be treated as empty hashmap for all read operations. That way it is not + * necessary to instantiate an object for each Hashmap use. + * + * If ENABLE_DEBUG_HASHMAP is defined (by configuring with --enable-debug=hashmap), + * the implemention will: + * - store extra data for debugging and statistics (see tools/gdb-sd_dump_hashmaps.py) + * - perform extra checks for invalid use of iterators + */ #define HASH_KEY_SIZE 16 -typedef struct Hashmap Hashmap; -typedef struct _IteratorStruct _IteratorStruct; -typedef _IteratorStruct* Iterator; +/* The base type for all hashmap and set types. Many functions in the + * implementation take (HashmapBase*) parameters and are run-time polymorphic, + * though the API is not meant to be polymorphic (do not call functions + * internal_*() directly). */ +typedef struct HashmapBase HashmapBase; + +/* Specific hashmap/set types */ +typedef struct Hashmap Hashmap; /* Maps keys to values */ +typedef struct OrderedHashmap OrderedHashmap; /* Like Hashmap, but also remembers entry insertion order */ +typedef struct Set Set; /* Stores just keys */ -#define ITERATOR_FIRST ((Iterator) 0) -#define ITERATOR_LAST ((Iterator) -1) +/* Ideally the Iterator would be an opaque struct, but it is instantiated + * by hashmap users, so the definition has to be here. Do not use its fields + * directly. */ +typedef struct { + unsigned idx; /* index of an entry to be iterated next */ + const void *next_key; /* expected value of that entry's key pointer */ +#ifdef ENABLE_DEBUG_HASHMAP + unsigned put_count; /* hashmap's put_count recorded at start of iteration */ + unsigned rem_count; /* hashmap's rem_count in previous iteration */ + unsigned prev_idx; /* idx in previous iteration */ +#endif +} Iterator; + +#define _IDX_ITERATOR_FIRST (UINT_MAX - 1) +#define ITERATOR_FIRST ((Iterator) { .idx = _IDX_ITERATOR_FIRST, .next_key = NULL }) typedef unsigned long (*hash_func_t)(const void *p, const uint8_t hash_key[HASH_KEY_SIZE]); typedef int (*compare_func_t)(const void *a, const void *b); @@ -57,29 +86,335 @@ unsigned long trivial_hash_func(const void *p, const uint8_t hash_key[HASH_KEY_S int trivial_compare_func(const void *a, const void *b) _const_; extern const struct hash_ops trivial_hash_ops; -Hashmap *hashmap_new(const struct hash_ops *hash_ops); -void hashmap_free(Hashmap *h); -void hashmap_free_free(Hashmap *h); +/* 32bit values we can always just embedd in the pointer itself, but + * in order to support 32bit archs we need store 64bit values + * indirectly, since they don't fit in a pointer. */ +unsigned long uint64_hash_func(const void *p, const uint8_t hash_key[HASH_KEY_SIZE]) _pure_; +int uint64_compare_func(const void *a, const void *b) _pure_; +extern const struct hash_ops uint64_hash_ops; + +/* On some archs dev_t is 32bit, and on others 64bit. And sometimes + * it's 64bit on 32bit archs, and sometimes 32bit on 64bit archs. Yuck! */ +#if SIZEOF_DEV_T != 8 +unsigned long devt_hash_func(const void *p, const uint8_t hash_key[HASH_KEY_SIZE]) _pure_; +int devt_compare_func(const void *a, const void *b) _pure_; +extern const struct hash_ops devt_hash_ops = { + .hash = devt_hash_func, + .compare = devt_compare_func +}; +#else +#define devt_hash_func uint64_hash_func +#define devt_compare_func uint64_compare_func +#define devt_hash_ops uint64_hash_ops +#endif + +/* Macros for type checking */ +#define PTR_COMPATIBLE_WITH_HASHMAP_BASE(h) \ + (__builtin_types_compatible_p(typeof(h), HashmapBase*) || \ + __builtin_types_compatible_p(typeof(h), Hashmap*) || \ + __builtin_types_compatible_p(typeof(h), OrderedHashmap*) || \ + __builtin_types_compatible_p(typeof(h), Set*)) + +#define PTR_COMPATIBLE_WITH_PLAIN_HASHMAP(h) \ + (__builtin_types_compatible_p(typeof(h), Hashmap*) || \ + __builtin_types_compatible_p(typeof(h), OrderedHashmap*)) \ + +#define HASHMAP_BASE(h) \ + __builtin_choose_expr(PTR_COMPATIBLE_WITH_HASHMAP_BASE(h), \ + (HashmapBase*)(h), \ + (void)0) + +#define PLAIN_HASHMAP(h) \ + __builtin_choose_expr(PTR_COMPATIBLE_WITH_PLAIN_HASHMAP(h), \ + (Hashmap*)(h), \ + (void)0) + +#ifdef ENABLE_DEBUG_HASHMAP +# define HASHMAP_DEBUG_PARAMS , const char *func, const char *file, int line +# define HASHMAP_DEBUG_SRC_ARGS , __func__, __FILE__, __LINE__ +# define HASHMAP_DEBUG_PASS_ARGS , func, file, line +#else +# define HASHMAP_DEBUG_PARAMS +# define HASHMAP_DEBUG_SRC_ARGS +# define HASHMAP_DEBUG_PASS_ARGS +#endif + +Hashmap *internal_hashmap_new(const struct hash_ops *hash_ops HASHMAP_DEBUG_PARAMS); +OrderedHashmap *internal_ordered_hashmap_new(const struct hash_ops *hash_ops HASHMAP_DEBUG_PARAMS); +#define hashmap_new(ops) internal_hashmap_new(ops HASHMAP_DEBUG_SRC_ARGS) +#define ordered_hashmap_new(ops) internal_ordered_hashmap_new(ops HASHMAP_DEBUG_SRC_ARGS) + +void internal_hashmap_free(HashmapBase *h); +static inline void hashmap_free(Hashmap *h) { + internal_hashmap_free(HASHMAP_BASE(h)); +} +static inline void ordered_hashmap_free(OrderedHashmap *h) { + internal_hashmap_free(HASHMAP_BASE(h)); +} + +void internal_hashmap_free_free(HashmapBase *h); +static inline void hashmap_free_free(Hashmap *h) { + internal_hashmap_free_free(HASHMAP_BASE(h)); +} +static inline void ordered_hashmap_free_free(OrderedHashmap *h) { + internal_hashmap_free_free(HASHMAP_BASE(h)); +} + +void hashmap_free_free_free(Hashmap *h); +static inline void ordered_hashmap_free_free_free(OrderedHashmap *h) { + hashmap_free_free_free(PLAIN_HASHMAP(h)); +} + +HashmapBase *internal_hashmap_copy(HashmapBase *h); +static inline Hashmap *hashmap_copy(Hashmap *h) { + return (Hashmap*) internal_hashmap_copy(HASHMAP_BASE(h)); +} +static inline OrderedHashmap *ordered_hashmap_copy(OrderedHashmap *h) { + return (OrderedHashmap*) internal_hashmap_copy(HASHMAP_BASE(h)); +} + +int internal_hashmap_ensure_allocated(Hashmap **h, const struct hash_ops *hash_ops HASHMAP_DEBUG_PARAMS); +int internal_ordered_hashmap_ensure_allocated(OrderedHashmap **h, const struct hash_ops *hash_ops HASHMAP_DEBUG_PARAMS); +#define hashmap_ensure_allocated(h, ops) internal_hashmap_ensure_allocated(h, ops HASHMAP_DEBUG_SRC_ARGS) +#define ordered_hashmap_ensure_allocated(h, ops) internal_ordered_hashmap_ensure_allocated(h, ops HASHMAP_DEBUG_SRC_ARGS) int hashmap_put(Hashmap *h, const void *key, void *value); -void *hashmap_get(Hashmap *h, const void *key); +static inline int ordered_hashmap_put(OrderedHashmap *h, const void *key, void *value) { + return hashmap_put(PLAIN_HASHMAP(h), key, value); +} + +int hashmap_update(Hashmap *h, const void *key, void *value); +static inline int ordered_hashmap_update(OrderedHashmap *h, const void *key, void *value) { + return hashmap_update(PLAIN_HASHMAP(h), key, value); +} + +int hashmap_replace(Hashmap *h, const void *key, void *value); +static inline int ordered_hashmap_replace(OrderedHashmap *h, const void *key, void *value) { + return hashmap_replace(PLAIN_HASHMAP(h), key, value); +} + +void *internal_hashmap_get(HashmapBase *h, const void *key); +static inline void *hashmap_get(Hashmap *h, const void *key) { + return internal_hashmap_get(HASHMAP_BASE(h), key); +} +static inline void *ordered_hashmap_get(OrderedHashmap *h, const void *key) { + return internal_hashmap_get(HASHMAP_BASE(h), key); +} + void *hashmap_get2(Hashmap *h, const void *key, void **rkey); -bool hashmap_contains(Hashmap *h, const void *key); -int hashmap_reserve(Hashmap *h, unsigned entries_add); +static inline void *ordered_hashmap_get2(OrderedHashmap *h, const void *key, void **rkey) { + return hashmap_get2(PLAIN_HASHMAP(h), key, rkey); +} -unsigned hashmap_size(Hashmap *h) _pure_; +bool internal_hashmap_contains(HashmapBase *h, const void *key); +static inline bool hashmap_contains(Hashmap *h, const void *key) { + return internal_hashmap_contains(HASHMAP_BASE(h), key); +} +static inline bool ordered_hashmap_contains(OrderedHashmap *h, const void *key) { + return internal_hashmap_contains(HASHMAP_BASE(h), key); +} -void *hashmap_iterate(Hashmap *h, Iterator *i, const void **key); +void *internal_hashmap_remove(HashmapBase *h, const void *key); +static inline void *hashmap_remove(Hashmap *h, const void *key) { + return internal_hashmap_remove(HASHMAP_BASE(h), key); +} +static inline void *ordered_hashmap_remove(OrderedHashmap *h, const void *key) { + return internal_hashmap_remove(HASHMAP_BASE(h), key); +} -void hashmap_clear(Hashmap *h); -void hashmap_clear_free(Hashmap *h); +void *hashmap_remove2(Hashmap *h, const void *key, void **rkey); +static inline void *ordered_hashmap_remove2(OrderedHashmap *h, const void *key, void **rkey) { + return hashmap_remove2(PLAIN_HASHMAP(h), key, rkey); +} -void *hashmap_steal_first(Hashmap *h); +void *hashmap_remove_value(Hashmap *h, const void *key, void *value); +static inline void *ordered_hashmap_remove_value(OrderedHashmap *h, const void *key, void *value) { + return hashmap_remove_value(PLAIN_HASHMAP(h), key, value); +} -char **hashmap_get_strv(Hashmap *h); +int hashmap_remove_and_put(Hashmap *h, const void *old_key, const void *new_key, void *value); +static inline int ordered_hashmap_remove_and_put(OrderedHashmap *h, const void *old_key, const void *new_key, void *value) { + return hashmap_remove_and_put(PLAIN_HASHMAP(h), old_key, new_key, value); +} +int hashmap_remove_and_replace(Hashmap *h, const void *old_key, const void *new_key, void *value); +static inline int ordered_hashmap_remove_and_replace(OrderedHashmap *h, const void *old_key, const void *new_key, void *value) { + return hashmap_remove_and_replace(PLAIN_HASHMAP(h), old_key, new_key, value); +} + +/* Since merging data from a OrderedHashmap into a Hashmap or vice-versa + * should just work, allow this by having looser type-checking here. */ +int internal_hashmap_merge(Hashmap *h, Hashmap *other); +#define hashmap_merge(h, other) internal_hashmap_merge(PLAIN_HASHMAP(h), PLAIN_HASHMAP(other)) +#define ordered_hashmap_merge(h, other) hashmap_merge(h, other) + +int internal_hashmap_reserve(HashmapBase *h, unsigned entries_add); +static inline int hashmap_reserve(Hashmap *h, unsigned entries_add) { + return internal_hashmap_reserve(HASHMAP_BASE(h), entries_add); +} +static inline int ordered_hashmap_reserve(OrderedHashmap *h, unsigned entries_add) { + return internal_hashmap_reserve(HASHMAP_BASE(h), entries_add); +} + +int internal_hashmap_move(HashmapBase *h, HashmapBase *other); +/* Unlike hashmap_merge, hashmap_move does not allow mixing the types. */ +static inline int hashmap_move(Hashmap *h, Hashmap *other) { + return internal_hashmap_move(HASHMAP_BASE(h), HASHMAP_BASE(other)); +} +static inline int ordered_hashmap_move(OrderedHashmap *h, OrderedHashmap *other) { + return internal_hashmap_move(HASHMAP_BASE(h), HASHMAP_BASE(other)); +} + +int internal_hashmap_move_one(HashmapBase *h, HashmapBase *other, const void *key); +static inline int hashmap_move_one(Hashmap *h, Hashmap *other, const void *key) { + return internal_hashmap_move_one(HASHMAP_BASE(h), HASHMAP_BASE(other), key); +} +static inline int ordered_hashmap_move_one(OrderedHashmap *h, OrderedHashmap *other, const void *key) { + return internal_hashmap_move_one(HASHMAP_BASE(h), HASHMAP_BASE(other), key); +} + +unsigned internal_hashmap_size(HashmapBase *h) _pure_; +static inline unsigned hashmap_size(Hashmap *h) { + return internal_hashmap_size(HASHMAP_BASE(h)); +} +static inline unsigned ordered_hashmap_size(OrderedHashmap *h) { + return internal_hashmap_size(HASHMAP_BASE(h)); +} + +static inline bool hashmap_isempty(Hashmap *h) { + return hashmap_size(h) == 0; +} +static inline bool ordered_hashmap_isempty(OrderedHashmap *h) { + return ordered_hashmap_size(h) == 0; +} + +unsigned internal_hashmap_buckets(HashmapBase *h) _pure_; +static inline unsigned hashmap_buckets(Hashmap *h) { + return internal_hashmap_buckets(HASHMAP_BASE(h)); +} +static inline unsigned ordered_hashmap_buckets(OrderedHashmap *h) { + return internal_hashmap_buckets(HASHMAP_BASE(h)); +} + +void *internal_hashmap_iterate(HashmapBase *h, Iterator *i, const void **key); +static inline void *hashmap_iterate(Hashmap *h, Iterator *i, const void **key) { + return internal_hashmap_iterate(HASHMAP_BASE(h), i, key); +} +static inline void *ordered_hashmap_iterate(OrderedHashmap *h, Iterator *i, const void **key) { + return internal_hashmap_iterate(HASHMAP_BASE(h), i, key); +} + +void internal_hashmap_clear(HashmapBase *h); +static inline void hashmap_clear(Hashmap *h) { + internal_hashmap_clear(HASHMAP_BASE(h)); +} +static inline void ordered_hashmap_clear(OrderedHashmap *h) { + internal_hashmap_clear(HASHMAP_BASE(h)); +} + +void internal_hashmap_clear_free(HashmapBase *h); +static inline void hashmap_clear_free(Hashmap *h) { + internal_hashmap_clear_free(HASHMAP_BASE(h)); +} +static inline void ordered_hashmap_clear_free(OrderedHashmap *h) { + internal_hashmap_clear_free(HASHMAP_BASE(h)); +} + +void hashmap_clear_free_free(Hashmap *h); +static inline void ordered_hashmap_clear_free_free(OrderedHashmap *h) { + hashmap_clear_free_free(PLAIN_HASHMAP(h)); +} + +/* + * Note about all *_first*() functions + * + * For plain Hashmaps and Sets the order of entries is undefined. + * The functions find whatever entry is first in the implementation + * internal order. + * + * Only for OrderedHashmaps the order is well defined and finding + * the first entry is O(1). + */ + +void *internal_hashmap_steal_first(HashmapBase *h); +static inline void *hashmap_steal_first(Hashmap *h) { + return internal_hashmap_steal_first(HASHMAP_BASE(h)); +} +static inline void *ordered_hashmap_steal_first(OrderedHashmap *h) { + return internal_hashmap_steal_first(HASHMAP_BASE(h)); +} + +void *internal_hashmap_steal_first_key(HashmapBase *h); +static inline void *hashmap_steal_first_key(Hashmap *h) { + return internal_hashmap_steal_first_key(HASHMAP_BASE(h)); +} +static inline void *ordered_hashmap_steal_first_key(OrderedHashmap *h) { + return internal_hashmap_steal_first_key(HASHMAP_BASE(h)); +} + +void *internal_hashmap_first_key(HashmapBase *h) _pure_; +static inline void *hashmap_first_key(Hashmap *h) { + return internal_hashmap_first_key(HASHMAP_BASE(h)); +} +static inline void *ordered_hashmap_first_key(OrderedHashmap *h) { + return internal_hashmap_first_key(HASHMAP_BASE(h)); +} + +void *internal_hashmap_first(HashmapBase *h) _pure_; +static inline void *hashmap_first(Hashmap *h) { + return internal_hashmap_first(HASHMAP_BASE(h)); +} +static inline void *ordered_hashmap_first(OrderedHashmap *h) { + return internal_hashmap_first(HASHMAP_BASE(h)); +} + +/* no hashmap_next */ +void *ordered_hashmap_next(OrderedHashmap *h, const void *key); + +char **internal_hashmap_get_strv(HashmapBase *h); +static inline char **hashmap_get_strv(Hashmap *h) { + return internal_hashmap_get_strv(HASHMAP_BASE(h)); +} +static inline char **ordered_hashmap_get_strv(OrderedHashmap *h) { + return internal_hashmap_get_strv(HASHMAP_BASE(h)); +} + +/* + * Hashmaps are iterated in unpredictable order. + * OrderedHashmaps are an exception to this. They are iterated in the order + * the entries were inserted. + * It is safe to remove the current entry. + */ #define HASHMAP_FOREACH(e, h, i) \ - for ((i) = ITERATOR_FIRST, (e) = hashmap_iterate((h), &(i), NULL); (e); (e) = hashmap_iterate((h), &(i), NULL)) + for ((i) = ITERATOR_FIRST, (e) = hashmap_iterate((h), &(i), NULL); \ + (e); \ + (e) = hashmap_iterate((h), &(i), NULL)) + +#define ORDERED_HASHMAP_FOREACH(e, h, i) \ + for ((i) = ITERATOR_FIRST, (e) = ordered_hashmap_iterate((h), &(i), NULL); \ + (e); \ + (e) = ordered_hashmap_iterate((h), &(i), NULL)) + +#define HASHMAP_FOREACH_KEY(e, k, h, i) \ + for ((i) = ITERATOR_FIRST, (e) = hashmap_iterate((h), &(i), (const void**) &(k)); \ + (e); \ + (e) = hashmap_iterate((h), &(i), (const void**) &(k))) + +#define ORDERED_HASHMAP_FOREACH_KEY(e, k, h, i) \ + for ((i) = ITERATOR_FIRST, (e) = ordered_hashmap_iterate((h), &(i), (const void**) &(k)); \ + (e); \ + (e) = ordered_hashmap_iterate((h), &(i), (const void**) &(k))) DEFINE_TRIVIAL_CLEANUP_FUNC(Hashmap*, hashmap_free); +DEFINE_TRIVIAL_CLEANUP_FUNC(Hashmap*, hashmap_free_free); +DEFINE_TRIVIAL_CLEANUP_FUNC(Hashmap*, hashmap_free_free_free); +DEFINE_TRIVIAL_CLEANUP_FUNC(OrderedHashmap*, ordered_hashmap_free); +DEFINE_TRIVIAL_CLEANUP_FUNC(OrderedHashmap*, ordered_hashmap_free_free); +DEFINE_TRIVIAL_CLEANUP_FUNC(OrderedHashmap*, ordered_hashmap_free_free_free); + #define _cleanup_hashmap_free_ _cleanup_(hashmap_freep) +#define _cleanup_hashmap_free_free_ _cleanup_(hashmap_free_freep) +#define _cleanup_hashmap_free_free_free_ _cleanup_(hashmap_free_free_freep) +#define _cleanup_ordered_hashmap_free_ _cleanup_(ordered_hashmap_freep) +#define _cleanup_ordered_hashmap_free_free_ _cleanup_(ordered_hashmap_free_freep) +#define _cleanup_ordered_hashmap_free_free_free_ _cleanup_(ordered_hashmap_free_free_freep) diff --git a/src/shared/list.h b/src/shared/list.h new file mode 100644 index 0000000000..c020f7e936 --- /dev/null +++ b/src/shared/list.h @@ -0,0 +1,138 @@ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ + +#pragma once + +/*** + This file is part of systemd. + + Copyright 2010 Lennart Poettering + + systemd is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + systemd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with systemd; If not, see <http://www.gnu.org/licenses/>. +***/ + +/* The head of the linked list. Use this in the structure that shall + * contain the head of the linked list */ +#define LIST_HEAD(t,name) \ + t *name + +/* The pointers in the linked list's items. Use this in the item structure */ +#define LIST_FIELDS(t,name) \ + t *name##_next, *name##_prev + +/* Initialize the list's head */ +#define LIST_HEAD_INIT(head) \ + do { \ + (head) = NULL; } \ + while(false) + +/* Initialize a list item */ +#define LIST_INIT(name,item) \ + do { \ + typeof(*(item)) *_item = (item); \ + assert(_item); \ + _item->name##_prev = _item->name##_next = NULL; \ + } while(false) + +/* Prepend an item to the list */ +#define LIST_PREPEND(name,head,item) \ + do { \ + typeof(*(head)) **_head = &(head), *_item = (item); \ + assert(_item); \ + if ((_item->name##_next = *_head)) \ + _item->name##_next->name##_prev = _item; \ + _item->name##_prev = NULL; \ + *_head = _item; \ + } while(false) + +/* Remove an item from the list */ +#define LIST_REMOVE(name,head,item) \ + do { \ + typeof(*(head)) **_head = &(head), *_item = (item); \ + assert(_item); \ + if (_item->name##_next) \ + _item->name##_next->name##_prev = _item->name##_prev; \ + if (_item->name##_prev) \ + _item->name##_prev->name##_next = _item->name##_next; \ + else { \ + assert(*_head == _item); \ + *_head = _item->name##_next; \ + } \ + _item->name##_next = _item->name##_prev = NULL; \ + } while(false) + +/* Find the head of the list */ +#define LIST_FIND_HEAD(name,item,head) \ + do { \ + typeof(*(item)) *_item = (item); \ + if (!_item) \ + (head) = NULL; \ + else { \ + while (_item->name##_prev) \ + _item = _item->name##_prev; \ + (head) = _item; \ + } \ + } while (false) + +/* Find the tail of the list */ +#define LIST_FIND_TAIL(name,item,tail) \ + do { \ + typeof(*(item)) *_item = (item); \ + if (!_item) \ + (tail) = NULL; \ + else { \ + while (_item->name##_next) \ + _item = _item->name##_next; \ + (tail) = _item; \ + } \ + } while (false) + +/* Insert an item after another one (a = where, b = what) */ +#define LIST_INSERT_AFTER(name,head,a,b) \ + do { \ + typeof(*(head)) **_head = &(head), *_a = (a), *_b = (b); \ + assert(_b); \ + if (!_a) { \ + if ((_b->name##_next = *_head)) \ + _b->name##_next->name##_prev = _b; \ + _b->name##_prev = NULL; \ + *_head = _b; \ + } else { \ + if ((_b->name##_next = _a->name##_next)) \ + _b->name##_next->name##_prev = _b; \ + _b->name##_prev = _a; \ + _a->name##_next = _b; \ + } \ + } while(false) + +#define LIST_JUST_US(name,item) \ + (!(item)->name##_prev && !(item)->name##_next) \ + +#define LIST_FOREACH(name,i,head) \ + for ((i) = (head); (i); (i) = (i)->name##_next) + +#define LIST_FOREACH_SAFE(name,i,n,head) \ + for ((i) = (head); (i) && (((n) = (i)->name##_next), 1); (i) = (n)) + +#define LIST_FOREACH_BEFORE(name,i,p) \ + for ((i) = (p)->name##_prev; (i); (i) = (i)->name##_prev) + +#define LIST_FOREACH_AFTER(name,i,p) \ + for ((i) = (p)->name##_next; (i); (i) = (i)->name##_next) + +/* Loop starting from p->next until p->prev. + p can be adjusted meanwhile. */ +#define LIST_LOOP_BUT_ONE(name,i,head,p) \ + for ((i) = (p)->name##_next ? (p)->name##_next : (head); \ + (i) != (p); \ + (i) = (i)->name##_next ? (i)->name##_next : (head)) diff --git a/src/shared/log.c b/src/shared/log.c index 70708cbf0e..92361b0cbc 100644 --- a/src/shared/log.c +++ b/src/shared/log.c @@ -102,8 +102,8 @@ void log_close_syslog(void) { } static int create_log_socket(int type) { - int fd; struct timeval tv; + int fd; fd = socket(AF_UNIX, type|SOCK_CLOEXEC, 0); if (fd < 0) @@ -118,18 +118,20 @@ static int create_log_socket(int type) { timeval_store(&tv, 10 * USEC_PER_MSEC); else timeval_store(&tv, 10 * USEC_PER_SEC); - setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)); + (void) setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)); return fd; } static int log_open_syslog(void) { - int r; - union sockaddr_union sa = { + + static const union sockaddr_union sa = { .un.sun_family = AF_UNIX, .un.sun_path = "/dev/log", }; + int r; + if (syslog_fd >= 0) return 0; @@ -234,10 +236,11 @@ void log_set_max_level(int level) { static int write_to_console( int level, - const char*file, + int error, + const char *file, int line, const char *func, - const char *object_name, + const char *object_field, const char *object, const char *buffer) { @@ -288,15 +291,16 @@ static int write_to_console( } static int write_to_syslog( - int level, - const char*file, - int line, - const char *func, - const char *object_name, - const char *object, - const char *buffer) { + int level, + int error, + const char *file, + int line, + const char *func, + const char *object_field, + const char *object, + const char *buffer) { - char header_priority[16], header_time[64], header_pid[16]; + char header_priority[1 + DECIMAL_STR_MAX(int) + 2], header_time[64], header_pid[1 + DECIMAL_STR_MAX(pid_t) + 4]; struct iovec iovec[5] = {}; struct msghdr msghdr = { .msg_iov = iovec, @@ -350,15 +354,16 @@ static int write_to_syslog( } static int write_to_kmsg( - int level, - const char*file, - int line, - const char *func, - const char *object_name, - const char *object, - const char *buffer) { + int level, + int error, + const char*file, + int line, + const char *func, + const char *object_field, + const char *object, + const char *buffer) { - char header_priority[16], header_pid[16]; + char header_priority[1 + DECIMAL_STR_MAX(int) + 2], header_pid[1 + DECIMAL_STR_MAX(pid_t) + 4]; struct iovec iovec[5] = {}; if (kmsg_fd < 0) @@ -382,45 +387,15 @@ static int write_to_kmsg( return 1; } -static int log_do_header(char *header, size_t size, - int level, - const char *file, int line, const char *func, - const char *object_name, const char *object) { - snprintf(header, size, - "PRIORITY=%i\n" - "SYSLOG_FACILITY=%i\n" - "%s%.*s%s" - "%s%.*i%s" - "%s%.*s%s" - "%s%.*s%s" - "SYSLOG_IDENTIFIER=%s\n", - LOG_PRI(level), - LOG_FAC(level), - file ? "CODE_FILE=" : "", - file ? LINE_MAX : 0, file, /* %.0s means no output */ - file ? "\n" : "", - line ? "CODE_LINE=" : "", - line ? 1 : 0, line, /* %.0d means no output too, special case for 0 */ - line ? "\n" : "", - func ? "CODE_FUNCTION=" : "", - func ? LINE_MAX : 0, func, - func ? "\n" : "", - object ? object_name : "", - object ? LINE_MAX : 0, object, /* %.0s means no output */ - object ? "\n" : "", - program_invocation_short_name); - header[size - 1] = '\0'; - return 0; -} - static int log_dispatch( - int level, - const char*file, - int line, - const char *func, - const char *object_name, - const char *object, - char *buffer) { + int level, + int error, + const char*file, + int line, + const char *func, + const char *object_field, + const char *object, + char *buffer) { int r = 0; @@ -449,8 +424,7 @@ static int log_dispatch( if (log_target == LOG_TARGET_SYSLOG_OR_KMSG || log_target == LOG_TARGET_SYSLOG) { - k = write_to_syslog(level, file, line, func, - object_name, object, buffer); + k = write_to_syslog(level, error, file, line, func, object_field, object, buffer); if (k < 0) { if (k != -EAGAIN) log_close_syslog(); @@ -465,8 +439,7 @@ static int log_dispatch( log_target == LOG_TARGET_SYSLOG_OR_KMSG || log_target == LOG_TARGET_KMSG)) { - k = write_to_kmsg(level, file, line, func, - object_name, object, buffer); + k = write_to_kmsg(level, error, file, line, func, object_field, object, buffer); if (k < 0) { log_close_kmsg(); log_open_console(); @@ -475,8 +448,7 @@ static int log_dispatch( } if (k <= 0) { - k = write_to_console(level, file, line, func, - object_name, object, buffer); + k = write_to_console(level, error, file, line, func, object_field, object, buffer); if (k < 0) return k; } @@ -487,8 +459,9 @@ static int log_dispatch( return r; } -int log_metav( +int log_internalv( int level, + int error, const char*file, int line, const char *func, @@ -504,27 +477,34 @@ int log_metav( vsnprintf(buffer, sizeof(buffer), format, ap); char_array_0(buffer); - return log_dispatch(level, file, line, func, NULL, NULL, buffer); + return log_dispatch(level, error, file, line, func, NULL, NULL, buffer); } -int log_meta( - int level, - const char*file, - int line, - const char *func, - const char *format, ...) { +int log_internal( + int level, + int error, + const char*file, + int line, + const char *func, + const char *format, ...) { int r; va_list ap; va_start(ap, format); - r = log_metav(level, file, line, func, format, ap); + r = log_internalv(level, error, file, line, func, format, ap); va_end(ap); return r; } -static void log_assert(int level, const char *text, const char *file, int line, const char *func, const char *format) { +static void log_assert( + int level, + const char *text, + const char *file, + int line, + const char *func, + const char *format) { static char buffer[LINE_MAX]; if (_likely_(LOG_PRI(level) > log_max_level)) @@ -537,7 +517,7 @@ static void log_assert(int level, const char *text, const char *file, int line, char_array_0(buffer); log_abort_msg = buffer; - log_dispatch(level, file, line, func, NULL, NULL, buffer); + log_dispatch(level, 0, file, line, func, NULL, NULL, buffer); } noreturn void log_assert_failed(const char *text, const char *file, int line, const char *func) { @@ -551,7 +531,7 @@ noreturn void log_assert_failed_unreachable(const char *text, const char *file, } int log_oom_internal(const char *file, int line, const char *func) { - log_meta(LOG_ERR, file, line, func, "Out of memory."); + log_internal(LOG_ERR, ENOMEM, file, line, func, "Out of memory."); return -ENOMEM; } diff --git a/src/shared/log.h b/src/shared/log.h index 30f0cacb65..485f3fa0f6 100644 --- a/src/shared/log.h +++ b/src/shared/log.h @@ -52,26 +52,29 @@ void log_close_journal(void); void log_close_kmsg(void); void log_close_console(void); -int log_meta( +int log_internal( int level, - const char*file, + int error, + const char *file, int line, const char *func, - const char *format, ...) _printf_(5,6); + const char *format, ...) _printf_(6,7); -int log_metav( +int log_internalv( int level, - const char*file, + int error, + const char *file, int line, const char *func, const char *format, - va_list ap) _printf_(5,0); + va_list ap) _printf_(6,0); int log_oom_internal( const char *file, int line, const char *func); +/* Logging for various assertions */ noreturn void log_assert_failed( const char *text, const char *file, @@ -85,17 +88,32 @@ noreturn void log_assert_failed_unreachable( const char *func); -#define log_full(level, ...) \ -do { \ - if (log_get_max_level() >= (level)) \ - log_meta((level), __FILE__, __LINE__, __func__, __VA_ARGS__); \ -} while (0) - -#define log_debug(...) log_full(LOG_DEBUG, __VA_ARGS__) -#define log_info(...) log_full(LOG_INFO, __VA_ARGS__) -#define log_notice(...) log_full(LOG_NOTICE, __VA_ARGS__) -#define log_warning(...) log_full(LOG_WARNING, __VA_ARGS__) -#define log_error(...) log_full(LOG_ERR, __VA_ARGS__) +/* Logging with level */ +#define log_full_errno(level, error, ...) \ + ({ \ + int _l = (level), _e = (error); \ + (log_get_max_level() >= LOG_PRI(_l)) \ + ? log_internal(_l, _e, __FILE__, __LINE__, __func__, __VA_ARGS__) \ + : -abs(_e); \ + }) + +#define log_full(level, ...) log_full_errno(level, 0, __VA_ARGS__) + +/* Normal logging */ +#define log_debug(...) log_full(LOG_DEBUG, __VA_ARGS__) +#define log_info(...) log_full(LOG_INFO, __VA_ARGS__) +#define log_notice(...) log_full(LOG_NOTICE, __VA_ARGS__) +#define log_warning(...) log_full(LOG_WARNING, __VA_ARGS__) +#define log_error(...) log_full(LOG_ERR, __VA_ARGS__) +#define log_emergency(...) log_full(getpid() == 1 ? LOG_EMERG : LOG_ERR, __VA_ARGS__) + +/* Logging triggered by an errno-like error */ +#define log_debug_errno(error, ...) log_full_errno(LOG_DEBUG, error, __VA_ARGS__) +#define log_info_errno(error, ...) log_full_errno(LOG_INFO, error, __VA_ARGS__) +#define log_notice_errno(error, ...) log_full_errno(LOG_NOTICE, error, __VA_ARGS__) +#define log_warning_errno(error, ...) log_full_errno(LOG_WARNING, error, __VA_ARGS__) +#define log_error_errno(error, ...) log_full_errno(LOG_ERR, error, __VA_ARGS__) +#define log_emergency_errno(error, ...) log_full_errno(getpid() == 1 ? LOG_EMERG : LOG_ERR, error, __VA_ARGS__) #ifdef LOG_TRACE # define log_trace(...) log_debug(__VA_ARGS__) @@ -103,7 +121,7 @@ do { \ # define log_trace(...) do {} while(0) #endif -#define log_struct(level, ...) log_struct_internal(level, __FILE__, __LINE__, __func__, __VA_ARGS__) +/* This modifies the buffer passed! */ #define log_oom() log_oom_internal(__FILE__, __LINE__, __func__) diff --git a/src/shared/macro.h b/src/shared/macro.h index cea13182ec..41fe61fb68 100644 --- a/src/shared/macro.h +++ b/src/shared/macro.h @@ -35,6 +35,7 @@ #define _likely_(x) (__builtin_expect(!!(x),1)) #define _unlikely_(x) (__builtin_expect(!!(x),0)) #define _public_ __attribute__ ((visibility("default"))) +#define _alignas_(x) __attribute__((aligned(__alignof(x)))) #define _cleanup_(x) __attribute__((cleanup(x))) /* Temporarily disable some warnings */ @@ -236,4 +237,8 @@ static inline size_t IOVEC_INCREMENT(struct iovec *i, unsigned n, size_t k) { #endif #endif +#define UID_INVALID ((uid_t) -1) +#define GID_INVALID ((gid_t) -1) +#define MODE_INVALID ((mode_t) -1) + #include "log.h" diff --git a/src/shared/mempool.c b/src/shared/mempool.c index b39a37f2db..d5d98d8829 100644 --- a/src/shared/mempool.c +++ b/src/shared/mempool.c @@ -74,6 +74,15 @@ void* mempool_alloc_tile(struct mempool *mp) { return ((uint8_t*) mp->first_pool) + ALIGN(sizeof(struct pool)) + i*mp->tile_size; } +void* mempool_alloc0_tile(struct mempool *mp) { + void *p; + + p = mempool_alloc_tile(mp); + if (p) + memzero(p, mp->tile_size); + return p; +} + void mempool_free_tile(struct mempool *mp, void *p) { * (void**) p = mp->freelist; mp->freelist = p; diff --git a/src/shared/mempool.h b/src/shared/mempool.h index 8b0bf381bf..42f473bee1 100644 --- a/src/shared/mempool.h +++ b/src/shared/mempool.h @@ -34,6 +34,7 @@ struct mempool { }; void* mempool_alloc_tile(struct mempool *mp); +void* mempool_alloc0_tile(struct mempool *mp); void mempool_free_tile(struct mempool *mp, void *p); #define DEFINE_MEMPOOL(pool_name, tile_type, alloc_at_least) \ diff --git a/src/shared/missing.h b/src/shared/missing.h index 572e17117a..00b5f7811c 100644 --- a/src/shared/missing.h +++ b/src/shared/missing.h @@ -42,6 +42,39 @@ /* If RLIMIT_RTTIME is not defined, then we cannot use RLIMIT_NLIMITS as is */ #define _RLIMIT_MAX (RLIMIT_RTTIME+1 > RLIMIT_NLIMITS ? RLIMIT_RTTIME+1 : RLIMIT_NLIMITS) +#ifndef __NR_getrandom +# if defined __x86_64__ +# define __NR_getrandom 318 +# elif defined(__i386__) +# define __NR_getrandom 355 +# elif defined(__arm__) || defined(__aarch64__) +# define __NR_getrandom 384 +# elif defined(__ia64__) +# define __NR_getrandom 1339 +# elif defined(__m68k__) +# define __NR_getrandom 352 +# elif defined(__s390x__) +# define __NR_getrandom 349 +# else +# warning "__NR_getrandom unknown for your architecture" +# define __NR_getrandom 0xffffffff +# endif +#endif + +#if !HAVE_DECL_GETRANDOM +static inline int getrandom(void *buffer, size_t count, unsigned flags) { + return syscall(__NR_getrandom, buffer, count, flags); +} +#endif + +#ifndef GRND_NONBLOCK +#define GRND_NONBLOCK 0x0001 +#endif + +#ifndef GRND_RANDOM +#define GRND_RANDOM 0x0002 +#endif + #ifndef BTRFS_IOCTL_MAGIC #define BTRFS_IOCTL_MAGIC 0x94 #endif diff --git a/src/shared/mkdir.c b/src/shared/mkdir.c index 3bc5131e40..dc400d9b91 100644 --- a/src/shared/mkdir.c +++ b/src/shared/mkdir.c @@ -42,8 +42,8 @@ int mkdir_safe_internal(const char *path, mode_t mode, uid_t uid, gid_t gid, mkd if ((st.st_mode & 0007) > (mode & 0007) || (st.st_mode & 0070) > (mode & 0070) || (st.st_mode & 0700) > (mode & 0700) || - (uid != (uid_t) -1 && st.st_uid != uid) || - (gid != (gid_t) -1 && st.st_gid != gid) || + (uid != UID_INVALID && st.st_uid != uid) || + (gid != GID_INVALID && st.st_gid != gid) || !S_ISDIR(st.st_mode)) { errno = EEXIST; return -errno; diff --git a/src/shared/path-util.c b/src/shared/path-util.c index ccd5c7ecc6..b1f997aef3 100644 --- a/src/shared/path-util.c +++ b/src/shared/path-util.c @@ -112,7 +112,7 @@ char *path_make_absolute_cwd(const char *p) { if (!cwd) return NULL; - return path_make_absolute(p, cwd); + return strjoin(cwd, "/", p, NULL); } char **path_strv_resolve(char **l, const char *prefix) { @@ -183,6 +183,7 @@ char **path_strv_resolve(char **l, const char *prefix) { } else { /* canonicalized path goes outside of * prefix, keep the original path instead */ + free(u); u = orig; orig = NULL; } @@ -318,10 +319,11 @@ int path_is_mount_point(const char *t, bool allow_symlink) { .handle.handle_bytes = MAX_HANDLE_SZ }; - int mount_id, mount_id_parent; + int mount_id = -1, mount_id_parent = -1; _cleanup_free_ char *parent = NULL; struct stat a, b; int r; + bool nosupp = false; /* We are not actually interested in the file handles, but * name_to_handle_at() also passes us the mount ID, hence use @@ -332,16 +334,19 @@ int path_is_mount_point(const char *t, bool allow_symlink) { r = name_to_handle_at(AT_FDCWD, t, &h.handle, &mount_id, allow_symlink ? AT_SYMLINK_FOLLOW : 0); if (r < 0) { - if (IN_SET(errno, ENOSYS, EOPNOTSUPP)) + if (errno == ENOSYS) + /* This kernel does not support name_to_handle_at() + * fall back to the traditional stat() logic. */ + goto fallback; + else if (errno == EOPNOTSUPP) /* This kernel or file system does not support * name_to_handle_at(), hence fallback to the * traditional stat() logic */ - goto fallback; - - if (errno == ENOENT) + nosupp = true; + else if (errno == ENOENT) return 0; - - return -errno; + else + return -errno; } r = path_get_parent(t, &parent); @@ -349,18 +354,23 @@ int path_is_mount_point(const char *t, bool allow_symlink) { return r; h.handle.handle_bytes = MAX_HANDLE_SZ; - r = name_to_handle_at(AT_FDCWD, parent, &h.handle, &mount_id_parent, 0); - if (r < 0) { - /* The parent can't do name_to_handle_at() but the - * directory we are interested in can? If so, it must - * be a mount point */ + r = name_to_handle_at(AT_FDCWD, parent, &h.handle, &mount_id_parent, AT_SYMLINK_FOLLOW); + if (r < 0) if (errno == EOPNOTSUPP) - return 1; - - return -errno; - } - - return mount_id != mount_id_parent; + if (nosupp) + /* Neither parent nor child do name_to_handle_at()? + We have no choice but to fall back. */ + goto fallback; + else + /* The parent can't do name_to_handle_at() but + * the directory we are interested in can? + * Or the other way around? + * If so, it must be a mount point. */ + return 1; + else + return -errno; + else + return mount_id != mount_id_parent; fallback: if (allow_symlink) @@ -375,11 +385,14 @@ fallback: return -errno; } + free(parent); + parent = NULL; + r = path_get_parent(t, &parent); if (r < 0) return r; - r = lstat(parent, &b); + r = stat(parent, &b); if (r < 0) return -errno; diff --git a/src/shared/selinux-util.c b/src/shared/selinux-util.c index e2ccef2865..7f8cc0eb76 100644 --- a/src/shared/selinux-util.c +++ b/src/shared/selinux-util.c @@ -231,7 +231,7 @@ int mac_selinux_get_our_label(char **label) { return r; } -int mac_selinux_get_child_mls_label(int socket_fd, const char *exe, char **label) { +int mac_selinux_get_child_mls_label(int socket_fd, const char *exe, const char *exec_label, char **label) { int r = -EOPNOTSUPP; #ifdef HAVE_SELINUX @@ -255,11 +255,7 @@ int mac_selinux_get_child_mls_label(int socket_fd, const char *exe, char **label if (r < 0) return -errno; - r = getexeccon(&fcon); - if (r < 0) - return -errno; - - if (!fcon) { + if (!exec_label) { /* If there is no context set for next exec let's use context of target executable */ r = getfilecon(exe, &fcon); @@ -330,9 +326,13 @@ int mac_selinux_create_file_prepare(const char *path, mode_t mode) { r = selabel_lookup_raw(label_hnd, &filecon, newpath, mode); } - if (r < 0 && errno != ENOENT) + /* No context specified by the policy? Proceed without setting it. */ + if (r < 0 && errno == ENOENT) + return 0; + + if (r < 0) r = -errno; - else if (r == 0) { + else { r = setfscreatecon(filecon); if (r < 0) { log_enforcing("Failed to set SELinux security context %s for %s: %m", filecon, path); diff --git a/src/shared/selinux-util.h b/src/shared/selinux-util.h index dffd144513..744b1bcf45 100644 --- a/src/shared/selinux-util.h +++ b/src/shared/selinux-util.h @@ -35,7 +35,7 @@ int mac_selinux_apply(const char *path, const char *label); int mac_selinux_get_create_label_from_exe(const char *exe, char **label); int mac_selinux_get_our_label(char **label); -int mac_selinux_get_child_mls_label(int socket_fd, const char *exec, char **label); +int mac_selinux_get_child_mls_label(int socket_fd, const char *exe, const char *exec_label, char **label); void mac_selinux_free(char *label); int mac_selinux_create_file_prepare(const char *path, mode_t mode); diff --git a/src/shared/set.c b/src/shared/set.c deleted file mode 100644 index 087d874598..0000000000 --- a/src/shared/set.c +++ /dev/null @@ -1,56 +0,0 @@ -/*** - This file is part of eudev, forked from systemd. - - Copyright 2010 Lennart Poettering - - systemd is free software; you can redistribute it and/or modify it - under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation; either version 2.1 of the License, or - (at your option) any later version. - - systemd is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with systemd; If not, see <http://www.gnu.org/licenses/>. -***/ - -#include <stdlib.h> - -#include "set.h" -#include "hashmap.h" - -#define MAKE_SET(h) ((Set*) (h)) -#define MAKE_HASHMAP(s) ((Hashmap*) (s)) - -/* For now this is not much more than a wrapper around a hashmap */ - -Set *set_new(const struct hash_ops *hash_ops) { - return MAKE_SET(hashmap_new(hash_ops)); -} - -void set_free(Set* s) { - hashmap_free(MAKE_HASHMAP(s)); -} - -int set_put(Set *s, void *value) { - return hashmap_put(MAKE_HASHMAP(s), value, value); -} - -void *set_get(Set *s, void *value) { - return hashmap_get(MAKE_HASHMAP(s), value); -} - -bool set_contains(Set *s, void *value) { - return hashmap_contains(MAKE_HASHMAP(s), value); -} - -void *set_iterate(Set *s, Iterator *i) { - return hashmap_iterate(MAKE_HASHMAP(s), i, NULL); -} - -int set_reserve(Set *s, unsigned entries_add) { - return hashmap_reserve(MAKE_HASHMAP(s), entries_add); -} diff --git a/src/shared/set.h b/src/shared/set.h index ae3090a09f..4605ecd2c1 100644 --- a/src/shared/set.h +++ b/src/shared/set.h @@ -1,5 +1,9 @@ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ + +#pragma once + /*** - This file is part of eudev, forked from systemd. + This file is part of systemd. Copyright 2010 Lennart Poettering @@ -17,29 +21,114 @@ along with systemd; If not, see <http://www.gnu.org/licenses/>. ***/ -#pragma once - -/* Pretty straightforward set implementation. Internally based on the - * hashmap. That means that as a minor optimization a NULL set - * object will be treated as empty set for all read - * operations. That way it is not necessary to instantiate an object - * for each set use. */ - #include "hashmap.h" #include "util.h" -typedef struct Set Set; +Set *internal_set_new(const struct hash_ops *hash_ops HASHMAP_DEBUG_PARAMS); +#define set_new(ops) internal_set_new(ops HASHMAP_DEBUG_SRC_ARGS) + + +static inline void set_free(Set *s) { + internal_hashmap_free(HASHMAP_BASE(s)); +} + +static inline void set_free_free(Set *s) { + internal_hashmap_free_free(HASHMAP_BASE(s)); +} + +/* no set_free_free_free */ + +static inline Set *set_copy(Set *s) { + return (Set*) internal_hashmap_copy(HASHMAP_BASE(s)); +} + +int internal_set_ensure_allocated(Set **s, const struct hash_ops *hash_ops HASHMAP_DEBUG_PARAMS); +#define set_ensure_allocated(h, ops) internal_set_ensure_allocated(h, ops HASHMAP_DEBUG_SRC_ARGS) + +int set_put(Set *s, const void *key); +/* no set_update */ +/* no set_replace */ +static inline void *set_get(Set *s, void *key) { + return internal_hashmap_get(HASHMAP_BASE(s), key); +} +/* no set_get2 */ + +static inline bool set_contains(Set *s, const void *key) { + return internal_hashmap_contains(HASHMAP_BASE(s), key); +} + +static inline void *set_remove(Set *s, void *key) { + return internal_hashmap_remove(HASHMAP_BASE(s), key); +} -Set *set_new(const struct hash_ops *hash_ops); -void set_free(Set* s); +/* no set_remove2 */ +/* no set_remove_value */ +int set_remove_and_put(Set *s, const void *old_key, const void *new_key); +/* no set_remove_and_replace */ +int set_merge(Set *s, Set *other); -int set_put(Set *s, void *value); -void *set_get(Set *s, void *value); -bool set_contains(Set *s, void *value); +static inline int set_reserve(Set *h, unsigned entries_add) { + return internal_hashmap_reserve(HASHMAP_BASE(h), entries_add); +} -int set_reserve(Set *s, unsigned entries_add); +static inline int set_move(Set *s, Set *other) { + return internal_hashmap_move(HASHMAP_BASE(s), HASHMAP_BASE(other)); +} + +static inline int set_move_one(Set *s, Set *other, const void *key) { + return internal_hashmap_move_one(HASHMAP_BASE(s), HASHMAP_BASE(other), key); +} + +static inline unsigned set_size(Set *s) { + return internal_hashmap_size(HASHMAP_BASE(s)); +} + +static inline bool set_isempty(Set *s) { + return set_size(s) == 0; +} + +static inline unsigned set_buckets(Set *s) { + return internal_hashmap_buckets(HASHMAP_BASE(s)); +} void *set_iterate(Set *s, Iterator *i); +static inline void set_clear(Set *s) { + internal_hashmap_clear(HASHMAP_BASE(s)); +} + +static inline void set_clear_free(Set *s) { + internal_hashmap_clear_free(HASHMAP_BASE(s)); +} + +/* no set_clear_free_free */ + +static inline void *set_steal_first(Set *s) { + return internal_hashmap_steal_first(HASHMAP_BASE(s)); +} + +/* no set_steal_first_key */ +/* no set_first_key */ + +static inline void *set_first(Set *s) { + return internal_hashmap_first(HASHMAP_BASE(s)); +} + +/* no set_next */ + +static inline char **set_get_strv(Set *s) { + return internal_hashmap_get_strv(HASHMAP_BASE(s)); +} + +int set_consume(Set *s, void *value); +int set_put_strdup(Set *s, const char *p); +int set_put_strdupv(Set *s, char **l); + +#define SET_FOREACH(e, s, i) \ + for ((i) = ITERATOR_FIRST, (e) = set_iterate((s), &(i)); (e); (e) = set_iterate((s), &(i))) + DEFINE_TRIVIAL_CLEANUP_FUNC(Set*, set_free); +DEFINE_TRIVIAL_CLEANUP_FUNC(Set*, set_free_free); + #define _cleanup_set_free_ _cleanup_(set_freep) +#define _cleanup_set_free_free_ _cleanup_(set_free_freep) diff --git a/src/shared/smack-util.c b/src/shared/smack-util.c index 407a8e1aa3..65bbb94e7c 100644 --- a/src/shared/smack-util.c +++ b/src/shared/smack-util.c @@ -25,6 +25,7 @@ #include "util.h" #include "path-util.h" +#include "fileio.h" #include "smack-util.h" #define SMACK_FLOOR_LABEL "_" @@ -123,14 +124,38 @@ int mac_smack_apply_ip_in_fd(int fd, const char *label) { return r; } -int mac_smack_fix(const char *path, bool ignore_enoent, bool ignore_erofs) { +int mac_smack_apply_pid(pid_t pid, const char *label) { + +#ifdef HAVE_SMACK + const char *p; +#endif int r = 0; + assert(label); + +#ifdef HAVE_SMACK + if (!mac_smack_use()) + return 0; + + p = procfs_file_alloca(pid, "attr/current"); + r = write_string_file(p, label); + if (r < 0) + return r; +#endif + + return r; +} + +int mac_smack_fix(const char *path, bool ignore_enoent, bool ignore_erofs) { + #ifdef HAVE_SMACK struct stat st; +#endif + int r = 0; assert(path); +#ifdef HAVE_SMACK if (!mac_smack_use()) return 0; @@ -174,8 +199,7 @@ int mac_smack_fix(const char *path, bool ignore_enoent, bool ignore_erofs) { if (ignore_erofs && errno == EROFS) return 0; - log_debug("Unable to fix SMACK label of %s: %m", path); - r = -errno; + r = log_debug_errno(errno, "Unable to fix SMACK label of %s: %m", path); } #endif diff --git a/src/shared/smack-util.h b/src/shared/smack-util.h index 22aef5ac23..587c135308 100644 --- a/src/shared/smack-util.h +++ b/src/shared/smack-util.h @@ -29,5 +29,6 @@ int mac_smack_fix(const char *path, bool ignore_enoent, bool ignore_erofs); int mac_smack_apply(const char *path, const char *label); int mac_smack_apply_fd(int fd, const char *label); +int mac_smack_apply_pid(pid_t pid, const char *label); int mac_smack_apply_ip_in_fd(int fd, const char *label); int mac_smack_apply_ip_out_fd(int fd, const char *label); diff --git a/src/shared/sparse-endian.h b/src/shared/sparse-endian.h index 51694bebb7..c913fda8c5 100644 --- a/src/shared/sparse-endian.h +++ b/src/shared/sparse-endian.h @@ -21,9 +21,9 @@ #ifndef SPARSE_ENDIAN_H #define SPARSE_ENDIAN_H +#include <byteswap.h> #include <endian.h> #include <stdint.h> -#include <byteswap.h> #ifdef __CHECKER__ #define __bitwise __attribute__((bitwise)) diff --git a/src/shared/strv.c b/src/shared/strv.c index 85ae556c16..5cfab8f23e 100644 --- a/src/shared/strv.c +++ b/src/shared/strv.c @@ -26,7 +26,7 @@ #include "util.h" #include "strv.h" -void strv_free(char **l) { +void strv_clear(char **l) { char **k; if (!l) @@ -35,6 +35,11 @@ void strv_free(char **l) { for (k = l; *k; k++) free(*k); + *l = NULL; +} + +void strv_free(char **l) { + strv_clear(l); free(l); } diff --git a/src/shared/strv.h b/src/shared/strv.h index 22c8132c57..94bdbe62aa 100644 --- a/src/shared/strv.h +++ b/src/shared/strv.h @@ -28,6 +28,8 @@ void strv_free(char **l); DEFINE_TRIVIAL_CLEANUP_FUNC(char**, strv_free); #define _cleanup_strv_free_ _cleanup_(strv_freep) +void strv_clear(char **l); + char **strv_copy(char * const *l); unsigned strv_length(char * const *l) _pure_; diff --git a/src/shared/utf8.c b/src/shared/utf8.c index 403166d7f9..fec2f4df34 100644 --- a/src/shared/utf8.c +++ b/src/shared/utf8.c @@ -148,10 +148,12 @@ bool utf8_is_printable_newline(const char* str, size_t length, bool newline) { int encoded_len, val; encoded_len = utf8_encoded_valid_unichar((const char *) p); - val = utf8_encoded_to_unichar((const char*) p); - if (encoded_len < 0 || - val < 0 || + (size_t) encoded_len > length) + return false; + + val = utf8_encoded_to_unichar((const char*) p); + if (val < 0 || is_unicode_control(val) || (!newline && val == '\n')) return false; @@ -175,39 +177,91 @@ char *ascii_is_valid(const char *str) { return (char*) str; } +/** + * utf8_encode_unichar() - Encode single UCS-4 character as UTF-8 + * @out_utf8: output buffer of at least 4 bytes or NULL + * @g: UCS-4 character to encode + * + * This encodes a single UCS-4 character as UTF-8 and writes it into @out_utf8. + * The length of the character is returned. It is not zero-terminated! If the + * output buffer is NULL, only the length is returned. + * + * Returns: The length in bytes that the UTF-8 representation does or would + * occupy. + */ +size_t utf8_encode_unichar(char *out_utf8, uint32_t g) { + if (g < (1 << 7)) { + if (out_utf8) + out_utf8[0] = g & 0x7f; + return 1; + } else if (g < (1 << 11)) { + if (out_utf8) { + out_utf8[0] = 0xc0 | ((g >> 6) & 0x1f); + out_utf8[1] = 0x80 | (g & 0x3f); + } + return 2; + } else if (g < (1 << 16)) { + if (out_utf8) { + out_utf8[0] = 0xe0 | ((g >> 12) & 0x0f); + out_utf8[1] = 0x80 | ((g >> 6) & 0x3f); + out_utf8[2] = 0x80 | (g & 0x3f); + } + return 3; + } else if (g < (1 << 21)) { + if (out_utf8) { + out_utf8[0] = 0xf0 | ((g >> 18) & 0x07); + out_utf8[1] = 0x80 | ((g >> 12) & 0x3f); + out_utf8[2] = 0x80 | ((g >> 6) & 0x3f); + out_utf8[3] = 0x80 | (g & 0x3f); + } + return 4; + } else { + return 0; + } +} + char *utf16_to_utf8(const void *s, size_t length) { - char *r; const uint8_t *f; - uint8_t *t; + char *r, *t; - r = new(char, (length*3+1)/2 + 1); + r = new(char, (length * 4 + 1) / 2 + 1); if (!r) return NULL; - t = (uint8_t*) r; - - for (f = s; f < (const uint8_t*) s + length; f += 2) { - uint16_t c; - - c = (f[1] << 8) | f[0]; - - if (c == 0) { - *t = 0; - return r; - } else if (c < 0x80) { - *(t++) = (uint8_t) c; - } else if (c < 0x800) { - *(t++) = (uint8_t) (0xc0 | (c >> 6)); - *(t++) = (uint8_t) (0x80 | (c & 0x3f)); - } else { - *(t++) = (uint8_t) (0xe0 | (c >> 12)); - *(t++) = (uint8_t) (0x80 | ((c >> 6) & 0x3f)); - *(t++) = (uint8_t) (0x80 | (c & 0x3f)); + f = s; + t = r; + + while (f < (const uint8_t*) s + length) { + uint16_t w1, w2; + + /* see RFC 2781 section 2.2 */ + + w1 = f[1] << 8 | f[0]; + f += 2; + + if (!utf16_is_surrogate(w1)) { + t += utf8_encode_unichar(t, w1); + + continue; } + + if (utf16_is_trailing_surrogate(w1)) + continue; + else if (f >= (const uint8_t*) s + length) + break; + + w2 = f[1] << 8 | f[0]; + f += 2; + + if (!utf16_is_trailing_surrogate(w2)) { + f -= 2; + continue; + } + + t += utf8_encode_unichar(t, utf16_surrogate_pair_to_unichar(w1, w2)); } *t = 0; - return r; } diff --git a/src/shared/utf8.h b/src/shared/utf8.h index 24232247f5..143b0ba08c 100644 --- a/src/shared/utf8.h +++ b/src/shared/utf8.h @@ -30,7 +30,20 @@ _pure_ static inline bool utf8_is_printable(const char* str, size_t length) { return utf8_is_printable_newline(str, length, true); } +size_t utf8_encode_unichar(char *out_utf8, uint32_t g); char *utf16_to_utf8(const void *s, size_t length); int utf8_encoded_valid_unichar(const char *str); int utf8_encoded_to_unichar(const char *str); + +static inline bool utf16_is_surrogate(uint16_t c) { + return (0xd800 <= c && c <= 0xdfff); +} + +static inline bool utf16_is_trailing_surrogate(uint16_t c) { + return (0xdc00 <= c && c <= 0xdfff); +} + +static inline uint32_t utf16_surrogate_pair_to_unichar(uint16_t lead, uint16_t trail) { + return ((lead - 0xd800) << 10) + (trail - 0xdc00) + 0x10000; +} diff --git a/src/shared/util.c b/src/shared/util.c index 3cad297873..6ef53b05ef 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -37,7 +37,6 @@ #include <linux/tiocl.h> #include <termios.h> #include <stdarg.h> -#include <sys/inotify.h> #include <poll.h> #include <ctype.h> #include <sys/prctl.h> @@ -124,6 +123,69 @@ char* endswith(const char *s, const char *postfix) { return (char*) s + sl - pl; } +static size_t cescape_char(char c, char *buf) { + char * buf_old = buf; + + switch (c) { + + case '\a': + *(buf++) = '\\'; + *(buf++) = 'a'; + break; + case '\b': + *(buf++) = '\\'; + *(buf++) = 'b'; + break; + case '\f': + *(buf++) = '\\'; + *(buf++) = 'f'; + break; + case '\n': + *(buf++) = '\\'; + *(buf++) = 'n'; + break; + case '\r': + *(buf++) = '\\'; + *(buf++) = 'r'; + break; + case '\t': + *(buf++) = '\\'; + *(buf++) = 't'; + break; + case '\v': + *(buf++) = '\\'; + *(buf++) = 'v'; + break; + case '\\': + *(buf++) = '\\'; + *(buf++) = '\\'; + break; + case '"': + *(buf++) = '\\'; + *(buf++) = '"'; + break; + case '\'': + *(buf++) = '\\'; + *(buf++) = '\''; + break; + + default: + /* For special chars we prefer octal over + * hexadecimal encoding, simply because glib's + * g_strescape() does the same */ + if ((c < ' ') || (c >= 127)) { + *(buf++) = '\\'; + *(buf++) = octchar((unsigned char) c >> 6); + *(buf++) = octchar((unsigned char) c >> 3); + *(buf++) = octchar((unsigned char) c); + } else + *(buf++) = c; + break; + } + + return buf - buf_old; +} + int close_nointr(int fd) { assert(fd >= 0); @@ -197,7 +259,7 @@ int parse_uid(const char *s, uid_t* ret_uid) { if ((unsigned long) uid != ul) return -ERANGE; - /* Some libc APIs use (uid_t) -1 as special placeholder */ + /* Some libc APIs use UID_INVALID as special placeholder */ if (uid == (uid_t) 0xFFFFFFFF) return -ENXIO; @@ -285,7 +347,7 @@ int safe_atolli(const char *s, long long int *ret_lli) { static size_t strcspn_escaped(const char *s, const char *reject) { bool escaped = false; - size_t n; + int n; for (n=0; s[n]; n++) { if (escaped) @@ -295,6 +357,7 @@ static size_t strcspn_escaped(const char *s, const char *reject) { else if (strchr(reject, s[n])) break; } + /* if s ends in \, return index of previous char */ return n - escaped; } @@ -322,7 +385,7 @@ const char* split(const char **state, size_t *l, const char *separator, bool quo *l = strcspn_escaped(current + 1, quotechars); if (current[*l + 1] == '\0' || (current[*l + 2] && !strchr(separator, current[*l + 2]))) { - /* right quote missing or garbage at the end*/ + /* right quote missing or garbage at the end */ *state = current; return NULL; } @@ -330,6 +393,11 @@ const char* split(const char **state, size_t *l, const char *separator, bool quo *state = current++ + *l + 2; } else if (quoted) { *l = strcspn_escaped(current, separator); + if (current[*l] && !strchr(separator, current[*l])) { + /* unfinished escape */ + *state = current; + return NULL; + } *state = current + *l; } else { *l = strcspn(current, separator); @@ -346,6 +414,39 @@ char *truncate_nl(char *s) { return s; } +int get_process_environ(pid_t pid, char **env) { + _cleanup_fclose_ FILE *f = NULL; + _cleanup_free_ char *outcome = NULL; + int c; + const char *p; + size_t allocated = 0, sz = 0; + + assert(pid >= 0); + assert(env); + + p = procfs_file_alloca(pid, "environ"); + + f = fopen(p, "re"); + if (!f) + return -errno; + + while ((c = fgetc(f)) != EOF) { + if (!GREEDY_REALLOC(outcome, allocated, sz + 5)) + return -ENOMEM; + + if (c == '\0') + outcome[sz++] = '\n'; + else + sz += cescape_char(c, outcome + sz); + } + + outcome[sz] = '\0'; + *env = outcome; + outcome = NULL; + + return 0; +} + char *strnappend(const char *s, const char *suffix, size_t b) { size_t a; char *r; @@ -427,6 +528,115 @@ int rmdir_parents(const char *path, const char *stop) { return 0; } +int get_process_comm(pid_t pid, char **name) { + const char *p; + int r; + + assert(name); + assert(pid >= 0); + + p = procfs_file_alloca(pid, "comm"); + + r = read_one_line_file(p, name); + if (r == -ENOENT) + return -ESRCH; + + return r; +} + +int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char **line) { + _cleanup_fclose_ FILE *f = NULL; + char *r = NULL, *k; + const char *p; + int c; + + assert(line); + assert(pid >= 0); + + p = procfs_file_alloca(pid, "cmdline"); + + f = fopen(p, "re"); + if (!f) + return -errno; + + if (max_length == 0) { + size_t len = 0, allocated = 0; + + while ((c = getc(f)) != EOF) { + + if (!GREEDY_REALLOC(r, allocated, len+2)) { + free(r); + return -ENOMEM; + } + + r[len++] = isprint(c) ? c : ' '; + } + + if (len > 0) + r[len-1] = 0; + + } else { + bool space = false; + size_t left; + + r = new(char, max_length); + if (!r) + return -ENOMEM; + + k = r; + left = max_length; + while ((c = getc(f)) != EOF) { + + if (isprint(c)) { + if (space) { + if (left <= 4) + break; + + *(k++) = ' '; + left--; + space = false; + } + + if (left <= 4) + break; + + *(k++) = (char) c; + left--; + } else + space = true; + } + + if (left <= 4) { + size_t n = MIN(left-1, 3U); + memcpy(k, "...", n); + k[n] = 0; + } else + *k = 0; + } + + /* Kernel threads have no argv[] */ + if (isempty(r)) { + _cleanup_free_ char *t = NULL; + int h; + + free(r); + + if (!comm_fallback) + return -ENOENT; + + h = get_process_comm(pid, &t); + if (h < 0) + return h; + + r = strjoin("[", t, "]", NULL); + if (!r) + return -ENOMEM; + } + + *line = r; + return 0; +} + char hexchar(int x) { static const char table[16] = "0123456789abcdef"; @@ -450,63 +660,7 @@ char *cescape(const char *s) { return NULL; for (f = s, t = r; *f; f++) - - switch (*f) { - - case '\a': - *(t++) = '\\'; - *(t++) = 'a'; - break; - case '\b': - *(t++) = '\\'; - *(t++) = 'b'; - break; - case '\f': - *(t++) = '\\'; - *(t++) = 'f'; - break; - case '\n': - *(t++) = '\\'; - *(t++) = 'n'; - break; - case '\r': - *(t++) = '\\'; - *(t++) = 'r'; - break; - case '\t': - *(t++) = '\\'; - *(t++) = 't'; - break; - case '\v': - *(t++) = '\\'; - *(t++) = 'v'; - break; - case '\\': - *(t++) = '\\'; - *(t++) = '\\'; - break; - case '"': - *(t++) = '\\'; - *(t++) = '"'; - break; - case '\'': - *(t++) = '\\'; - *(t++) = '\''; - break; - - default: - /* For special chars we prefer octal over - * hexadecimal encoding, simply because glib's - * g_strescape() does the same */ - if ((*f < ' ') || (*f >= 127)) { - *(t++) = '\\'; - *(t++) = octchar((unsigned char) *f >> 6); - *(t++) = octchar((unsigned char) *f >> 3); - *(t++) = octchar((unsigned char) *f); - } else - *(t++) = *f; - break; - } + t += cescape_char(*f, t); *t = 0; @@ -542,7 +696,7 @@ char *xescape(const char *s, const char *bad) { return r; } -_pure_ static bool ignore_file_allow_backup(const char *filename) { +_pure_ static bool hidden_file_allow_backup(const char *filename) { assert(filename); return @@ -559,13 +713,13 @@ _pure_ static bool ignore_file_allow_backup(const char *filename) { endswith(filename, ".swp"); } -bool ignore_file(const char *filename) { +bool hidden_file(const char *filename) { assert(filename); if (endswith(filename, "~")) return true; - return ignore_file_allow_backup(filename); + return hidden_file_allow_backup(filename); } int open_terminal(const char *name, int mode) { @@ -660,21 +814,25 @@ ssize_t loop_read(int fd, void *buf, size_t nbytes, bool do_poll) { ssize_t k; k = read(fd, p, nbytes); - if (k < 0 && errno == EINTR) - continue; + if (k < 0) { + if (errno == EINTR) + continue; - if (k < 0 && errno == EAGAIN && do_poll) { + if (errno == EAGAIN && do_poll) { - /* We knowingly ignore any return value here, - * and expect that any error/EOF is reported - * via read() */ + /* We knowingly ignore any return value here, + * and expect that any error/EOF is reported + * via read() */ - fd_wait_for_event(fd, POLLIN, USEC_INFINITY); - continue; + fd_wait_for_event(fd, POLLIN, USEC_INFINITY); + continue; + } + + return n > 0 ? n : -errno; } - if (k <= 0) - return n > 0 ? n : (k < 0 ? -errno : 0); + if (k == 0) + return n; p += k; nbytes -= k; @@ -685,14 +843,53 @@ ssize_t loop_read(int fd, void *buf, size_t nbytes, bool do_poll) { } int dev_urandom(void *p, size_t n) { - _cleanup_close_ int fd; + static int have_syscall = -1; + int r, fd; ssize_t k; + /* Gathers some randomness from the kernel. This call will + * never block, and will always return some data from the + * kernel, regardless if the random pool is fully initialized + * or not. It thus makes no guarantee for the quality of the + * returned entropy, but is good enough for or usual usecases + * of seeding the hash functions for hashtable */ + + /* Use the getrandom() syscall unless we know we don't have + * it, or when the requested size is too large for it. */ + if (have_syscall != 0 || (size_t) (int) n != n) { + r = getrandom(p, n, GRND_NONBLOCK); + if (r == (int) n) { + have_syscall = true; + return 0; + } + + if (r < 0) { + if (errno == ENOSYS) + /* we lack the syscall, continue with + * reading from /dev/urandom */ + have_syscall = false; + else if (errno == EAGAIN) + /* not enough entropy for now. Let's + * remember to use the syscall the + * next time, again, but also read + * from /dev/urandom for now, which + * doesn't care about the current + * amount of entropy. */ + have_syscall = true; + else + return -errno; + } else + /* too short read? */ + return -EIO; + } + fd = open("/dev/urandom", O_RDONLY|O_CLOEXEC|O_NOCTTY); if (fd < 0) return errno == ENOENT ? -ENOSYS : -errno; k = loop_read(fd, p, n, true); + safe_close(fd); + if (k < 0) return (int) k; if ((size_t) k != n) @@ -701,8 +898,36 @@ int dev_urandom(void *p, size_t n) { return 0; } -void random_bytes(void *p, size_t n) { +void initialize_srand(void) { static bool srand_called = false; + unsigned x; +#ifdef HAVE_SYS_AUXV_H + void *auxv; +#endif + + if (srand_called) + return; + + x = 0; + +#ifdef HAVE_SYS_AUXV_H + /* The kernel provides us with a bit of entropy in auxv, so + * let's try to make use of that to seed the pseudo-random + * generator. It's better than nothing... */ + + auxv = (void*) getauxval(AT_RANDOM); + if (auxv) + x ^= *(unsigned*) auxv; +#endif + + x ^= (unsigned) now(CLOCK_REALTIME); + x ^= (unsigned) gettid(); + + srand(x); + srand_called = true; +} + +void random_bytes(void *p, size_t n) { uint8_t *q; int r; @@ -713,28 +938,7 @@ void random_bytes(void *p, size_t n) { /* If some idiot made /dev/urandom unavailable to us, he'll * get a PRNG instead. */ - if (!srand_called) { - unsigned x = 0; - -#ifdef HAVE_SYS_AUXV_H - /* The kernel provides us with a bit of entropy in - * auxv, so let's try to make use of that to seed the - * pseudo-random generator. It's better than - * nothing... */ - - void *auxv; - - auxv = (void*) getauxval(AT_RANDOM); - if (auxv) - x ^= *(unsigned*) auxv; -#endif - - x ^= (unsigned) now(CLOCK_REALTIME); - x ^= (unsigned) gettid(); - - srand(x); - srand_called = true; - } + initialize_srand(); for (q = p; q < (uint8_t*) p + n; q ++) *q = rand(); @@ -754,11 +958,11 @@ int chmod_and_chown(const char *path, mode_t mode, uid_t uid, gid_t gid) { * first change the access mode and only then hand out * ownership to avoid a window where access is too open. */ - if (mode != (mode_t) -1) + if (mode != MODE_INVALID) if (chmod(path, mode) < 0) return -errno; - if (uid != (uid_t) -1 || gid != (gid_t) -1) + if (uid != UID_INVALID || gid != GID_INVALID) if (chown(path, uid, gid) < 0) return -errno; @@ -807,7 +1011,7 @@ bool dirent_is_file_with_suffix(const struct dirent *de, const char *suffix) { de->d_type != DT_UNKNOWN) return false; - if (ignore_file_allow_backup(de->d_name)) + if (hidden_file_allow_backup(de->d_name)) return false; return endswith(de->d_name, suffix); @@ -849,15 +1053,15 @@ int fd_wait_for_event(int fd, int event, usec_t t) { int fopen_temporary(const char *path, FILE **_f, char **_temp_path) { FILE *f; char *t; - int fd; + int r, fd; assert(path); assert(_f); assert(_temp_path); - t = tempfn_xxxxxx(path); - if (!t) - return -ENOMEM; + r = tempfn_xxxxxx(path, &t); + if (r < 0) + return r; #if HAVE_DECL_MKOSTEMP fd = mkostemp_safe(t, O_WRONLY|O_CLOEXEC); @@ -1248,6 +1452,26 @@ bool in_initrd(void) { return saved; } +bool filename_is_valid(const char *p) { + + if (isempty(p)) + return false; + + if (strchr(p, '/')) + return false; + + if (streq(p, ".")) + return false; + + if (streq(p, "..")) + return false; + + if (strlen(p) > FILENAME_MAX) + return false; + + return true; +} + /* hey glibc, APIs with callbacks without a user pointer are so useless */ void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size, int (*compar) (const void *, const void *, void *), void *arg) { @@ -1271,31 +1495,39 @@ void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size, return NULL; } -int proc_cmdline(char **ret) { - int r; +void* greedy_realloc(void **p, size_t *allocated, size_t need, size_t size) { + size_t a, newalloc; + void *q; - if (detect_container(NULL) > 0) { - char *buf = NULL, *p; - size_t sz = 0; + assert(p); + assert(allocated); - r = read_full_file("/proc/1/cmdline", &buf, &sz); - if (r < 0) - return r; + if (*allocated >= need) + return *p; - for (p = buf; p + 1 < buf + sz; p++) - if (*p == 0) - *p = ' '; + newalloc = MAX(need * 2, 64u / size); + a = newalloc * size; - *p = 0; - *ret = buf; - return 1; - } + /* check for overflows */ + if (a < size * need) + return NULL; - r = read_one_line_file("/proc/cmdline", ret); - if (r < 0) - return r; + q = realloc(*p, a); + if (!q) + return NULL; - return 1; + *p = q; + *allocated = newalloc; + return q; +} + +int proc_cmdline(char **ret) { + assert(ret); + + if (detect_container(NULL) > 0) + return get_process_cmdline(1, 0, false, ret); + else + return read_one_line_file("/proc/cmdline", ret); } int getpeercred(int fd, struct ucred *ucred) { @@ -1317,6 +1549,10 @@ int getpeercred(int fd, struct ucred *ucred) { * to namespacing issues */ if (u.pid <= 0) return -ENODATA; + if (u.uid == UID_INVALID) + return -ENODATA; + if (u.gid == GID_INVALID) + return -ENODATA; *ucred = u; return 0; @@ -1354,35 +1590,45 @@ int mkstemp_safe(char *pattern) { return fd; } -char *tempfn_xxxxxx(const char *p) { +int tempfn_xxxxxx(const char *p, char **ret) { const char *fn; char *t; - size_t k; assert(p); + assert(ret); - t = new(char, strlen(p) + 1 + 6 + 1); - if (!t) - return NULL; + /* + * Turns this: + * /foo/bar/waldo + * + * Into this: + * /foo/bar/.#waldoXXXXXX + */ fn = basename(p); - k = fn - p; + if (!filename_is_valid(fn)) + return -EINVAL; - strcpy(stpcpy(stpcpy(mempcpy(t, p, k), "."), fn), "XXXXXX"); + t = new(char, strlen(p) + 2 + 6 + 1); + if (!t) + return -ENOMEM; - return t; + strcpy(stpcpy(stpcpy(mempcpy(t, p, fn - p), ".#"), fn), "XXXXXX"); + + *ret = path_kill_slashes(t); + return 0; } int is_dir(const char* path, bool follow) { struct stat st; + int r; - if (follow) { - if (stat(path, &st) < 0) - return -errno; - } else { - if (lstat(path, &st) < 0) - return -errno; - } + if (follow) + r = stat(path, &st); + else + r = lstat(path, &st); + if (r < 0) + return -errno; return !!S_ISDIR(st.st_mode); } @@ -1396,7 +1642,7 @@ int execute_command(const char *command, char *const argv[]) { return status; if ((pid = fork()) < 0) { - log_error("Failed to fork: %m"); + log_error_errno(errno, "Failed to fork: %m"); return pid; } @@ -1404,7 +1650,7 @@ int execute_command(const char *command, char *const argv[]) { execvp(command, argv); - log_error("Failed to execute %s: %m", command); + log_error_errno(errno, "Failed to execute %s: %m", command); _exit(EXIT_FAILURE); } else while (1) diff --git a/src/shared/util.h b/src/shared/util.h index 9550aa19f9..bce4f0fa77 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -31,6 +31,7 @@ #include <stddef.h> #include <unistd.h> #include <sys/socket.h> +#include <sys/inotify.h> #include "time-util.h" #include "missing.h" @@ -62,7 +63,7 @@ #if SIZEOF_TIME_T == 8 # define PRI_TIME PRIu64 -#elif SIZEOF_GID_T == 4 +#elif SIZEOF_TIME_T == 4 # define PRI_TIME PRIu32 #else # error Unknown time_t size @@ -98,7 +99,7 @@ #define ANSI_HIGHLIGHT_OFF "\x1B[0m" #define ANSI_ERASE_TO_END_OF_LINE "\x1B[K" -size_t page_size(void); +size_t page_size(void) _pure_; #define PAGE_ALIGN(l) ALIGN_TO((l), page_size()) #define streq(a,b) (strcmp((a),(b)) == 0) @@ -113,6 +114,10 @@ bool streq_ptr(const char *a, const char *b) _pure_; #define new0(t, n) ((t*) calloc((n), sizeof(t))) #define malloc0(n) (calloc((n), 1)) +static inline const char* one_zero(bool b) { + return b ? "1" : "0"; +} + static inline bool isempty(const char *p) { return !p || !p[0]; } @@ -142,7 +147,7 @@ int safe_atollu(const char *s, unsigned long long *ret_u); int safe_atolli(const char *s, long long int *ret_i); -#if __WORDSIZE == 32 +#if LONG_MAX == INT_MAX static inline int safe_atolu(const char *s, unsigned long *ret_u) { assert_cc(sizeof(unsigned long) == sizeof(unsigned)); return safe_atou(s, (unsigned*) ret_u); @@ -180,6 +185,11 @@ char *strnappend(const char *s, const char *suffix, size_t length); char *truncate_nl(char *s); int rmdir_parents(const char *path, const char *stop); + +int get_process_comm(pid_t pid, char **name); +int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char **line); +int get_process_environ(pid_t pid, char **environ); + char hexchar(int x) _const_; char octchar(int x) _const_; @@ -188,10 +198,11 @@ char *xescape(const char *s, const char *bad); bool dirent_is_file_with_suffix(const struct dirent *de, const char *suffix) _pure_; -bool ignore_file(const char *filename) _pure_; +bool hidden_file(const char *filename) _pure_; int dev_urandom(void *p, size_t n); void random_bytes(void *p, size_t n); +void initialize_srand(void); /* For basic lookup tables with strictly enumerated entries */ #define __DEFINE_STRING_TABLE_LOOKUP(name,type,scope) \ @@ -348,6 +359,7 @@ _alloc_(2, 3) static inline void *realloc_multiply(void *p, size_t a, size_t b) return realloc(p, a * b); } +bool filename_is_valid(const char *p) _pure_; /** * Check if a string contains any glob patterns. */ @@ -368,12 +380,36 @@ void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size, break; \ } else +static inline void *mempset(void *s, int c, size_t n) { + memset(s, c, n); + return (uint8_t*)s + n; +} + + +void* greedy_realloc(void **p, size_t *allocated, size_t need, size_t size); +#define GREEDY_REALLOC(array, allocated, need) \ + greedy_realloc((void**) &(array), &(allocated), (need), sizeof((array)[0])) static inline void _reset_errno_(int *saved_errno) { errno = *saved_errno; } #define PROTECT_ERRNO _cleanup_(_reset_errno_) __attribute__((unused)) int _saved_errno_ = errno +static inline unsigned log2u(unsigned x) { + assert(x > 0); + + return sizeof(unsigned) * 8 - __builtin_clz(x) - 1; +} + +static inline unsigned log2u_round_up(unsigned x) { + assert(x > 0); + + if (x == 1) + return 0; + + return log2u(x - 1) + 1; +} + int unlink_noerrno(const char *path); #define strappenda(a, ...) \ @@ -391,6 +427,19 @@ int unlink_noerrno(const char *path); _d_; \ }) +#define procfs_file_alloca(pid, field) \ + ({ \ + pid_t _pid_ = (pid); \ + const char *_r_; \ + if (_pid_ == 0) { \ + _r_ = ("/proc/self/" field); \ + } else { \ + _r_ = alloca(strlen("/proc/") + DECIMAL_STR_MAX(pid_t) + 1 + sizeof(field)); \ + sprintf((char*) _r_, "/proc/"PID_FMT"/" field, _pid_); \ + } \ + _r_; \ + }) + static inline void qsort_safe(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) { if (nmemb) { @@ -410,8 +459,20 @@ union file_handle_union { char padding[sizeof(struct file_handle) + MAX_HANDLE_SZ]; }; -char *tempfn_xxxxxx(const char *p); +int tempfn_xxxxxx(const char *p, char **ret); int is_dir(const char *path, bool follow); int execute_command(const char *command, char *const argv[]); + +#define INOTIFY_EVENT_MAX (sizeof(struct inotify_event) + NAME_MAX + 1) + +#define FOREACH_INOTIFY_EVENT(e, buffer, sz) \ + for ((e) = &buffer.ev; \ + (uint8_t*) (e) < (uint8_t*) (buffer.raw) + (sz); \ + (e) = (struct inotify_event*) ((uint8_t*) (e) + sizeof(struct inotify_event) + (e)->len)) + +union inotify_event_buffer { + struct inotify_event ev; + uint8_t raw[INOTIFY_EVENT_MAX]; +}; diff --git a/src/udev/Makefile.am b/src/udev/Makefile.am index f9af997ffe..652cb67006 100644 --- a/src/udev/Makefile.am +++ b/src/udev/Makefile.am @@ -34,7 +34,10 @@ udevadm_SOURCES = \ udevadm-settle.c \ udevadm-trigger.c \ udevadm-test.c \ - udevadm-test-builtin.c + udevadm-test-builtin.c \ + udevadm-util.c \ + udevadm-util.h + udevadm_LDADD = \ libudev-core.la diff --git a/src/udev/udev-builtin-blkid.c b/src/udev/udev-builtin-blkid.c index f97f516462..93563d867b 100644 --- a/src/udev/udev-builtin-blkid.c +++ b/src/udev/udev-builtin-blkid.c @@ -138,6 +138,7 @@ static int builtin_blkid(struct udev_device *dev, int argc, char *argv[], bool t blkid_probe pr; const char *data; const char *name; + const char *prtype = NULL; int nvals; int i; int err = 0; @@ -172,7 +173,8 @@ static int builtin_blkid(struct udev_device *dev, int argc, char *argv[], bool t blkid_probe_set_superblocks_flags(pr, BLKID_SUBLKS_LABEL | BLKID_SUBLKS_UUID | BLKID_SUBLKS_TYPE | BLKID_SUBLKS_SECTYPE | - BLKID_SUBLKS_USAGE | BLKID_SUBLKS_VERSION); + BLKID_SUBLKS_USAGE | BLKID_SUBLKS_VERSION | + BLKID_SUBLKS_BADCSUM); if (noraid) blkid_probe_filter_superblocks_usage(pr, BLKID_FLTR_NOTIN, BLKID_USAGE_RAID); @@ -194,6 +196,15 @@ static int builtin_blkid(struct udev_device *dev, int argc, char *argv[], bool t err = probe_superblocks(pr); if (err < 0) goto out; + if (blkid_probe_has_value(pr, "SBBADCSUM")) { + if (!blkid_probe_lookup_value(pr, "TYPE", &prtype, NULL)) + log_warning("incorrect %s checksum on %s", + prtype, udev_device_get_devnode(dev)); + else + log_warning("incorrect checksum on %s", + udev_device_get_devnode(dev)); + goto out; + } nvals = blkid_probe_numof_values(pr); for (i = 0; i < nvals; i++) { @@ -214,6 +225,6 @@ out: const struct udev_builtin udev_builtin_blkid = { .name = "blkid", .cmd = builtin_blkid, - .help = "filesystem and partition probing", + .help = "Filesystem and partition probing", .run_once = true, }; diff --git a/src/udev/udev-builtin-btrfs.c b/src/udev/udev-builtin-btrfs.c index 2e2112fd92..3643596a70 100644 --- a/src/udev/udev-builtin-btrfs.c +++ b/src/udev/udev-builtin-btrfs.c @@ -24,6 +24,7 @@ #include <fcntl.h> #include <errno.h> #include <sys/ioctl.h> + #ifdef HAVE_LINUX_BTRFS_H #include <linux/btrfs.h> #endif @@ -32,7 +33,7 @@ #include "udev.h" static int builtin_btrfs(struct udev_device *dev, int argc, char *argv[], bool test) { - struct btrfs_ioctl_vol_args args; + struct btrfs_ioctl_vol_args args = {}; _cleanup_close_ int fd = -1; int err; @@ -48,7 +49,7 @@ static int builtin_btrfs(struct udev_device *dev, int argc, char *argv[], bool t if (err < 0) return EXIT_FAILURE; - udev_builtin_add_property(dev, test, "ID_BTRFS_READY", err == 0 ? "1" : "0"); + udev_builtin_add_property(dev, test, "ID_BTRFS_READY", one_zero(err == 0)); return EXIT_SUCCESS; } diff --git a/src/udev/udev-builtin-hwdb.c b/src/udev/udev-builtin-hwdb.c index 695a31a12f..1eddf86b61 100644 --- a/src/udev/udev-builtin-hwdb.c +++ b/src/udev/udev-builtin-hwdb.c @@ -214,5 +214,5 @@ const struct udev_builtin udev_builtin_hwdb = { .init = builtin_hwdb_init, .exit = builtin_hwdb_exit, .validate = builtin_hwdb_validate, - .help = "hardware database", + .help = "Hardware database", }; diff --git a/src/udev/udev-builtin-input_id.c b/src/udev/udev-builtin-input_id.c index 1a1121ef94..26c723225d 100644 --- a/src/udev/udev-builtin-input_id.c +++ b/src/udev/udev-builtin-input_id.c @@ -1,9 +1,11 @@ /* - * compose persistent device path + * expose input properties via udev * * Copyright (C) 2009 Martin Pitt <martin.pitt@ubuntu.com> * Portions Copyright (C) 2004 David Zeuthen, <david@fubar.dk> * Copyright (C) 2011 Kay Sievers <kay@vrfy.org> + * Copyright (C) 2014 Carlos Garnacho <carlosg@gnome.org> + * Copyright (C) 2014 David Herrmann <dh.herrmann@gmail.com> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -29,6 +31,7 @@ #include <linux/input.h> #include "udev.h" +#include "util.h" /* we must use this kernel-compatible implementation */ #define BITS_PER_LONG (sizeof(unsigned long) * 8) @@ -38,6 +41,34 @@ #define LONG(x) ((x)/BITS_PER_LONG) #define test_bit(bit, array) ((array[LONG(bit)] >> OFF(bit)) & 1) +static inline int abs_size_mm(const struct input_absinfo *absinfo) { + /* Resolution is defined to be in units/mm for ABS_X/Y */ + return (absinfo->maximum - absinfo->minimum) / absinfo->resolution; +} + +static void extract_info(struct udev_device *dev, const char *devpath, bool test) { + char width[DECIMAL_STR_MAX(int)], height[DECIMAL_STR_MAX(int)]; + struct input_absinfo xabsinfo = {}, yabsinfo = {}; + _cleanup_close_ int fd = -1; + + fd = open(devpath, O_RDONLY|O_CLOEXEC); + if (fd < 0) + return; + + if (ioctl(fd, EVIOCGABS(ABS_X), &xabsinfo) < 0 || + ioctl(fd, EVIOCGABS(ABS_Y), &yabsinfo) < 0) + return; + + if (xabsinfo.resolution <= 0 || yabsinfo.resolution <= 0) + return; + + snprintf(width, sizeof(width), "%d", abs_size_mm(&xabsinfo)); + snprintf(height, sizeof(height), "%d", abs_size_mm(&yabsinfo)); + + udev_builtin_add_property(dev, test, "ID_INPUT_WIDTH_MM", width); + udev_builtin_add_property(dev, test, "ID_INPUT_HEIGHT_MM", height); +} + /* * Read a capability attribute and return bitmask. * @param dev udev_device @@ -48,12 +79,17 @@ static void get_cap_mask(struct udev_device *dev, struct udev_device *pdev, const char* attr, unsigned long *bitmask, size_t bitmask_size, bool test) { + const char *v; char text[4096]; unsigned i; char* word; unsigned long val; - snprintf(text, sizeof(text), "%s", udev_device_get_sysattr_value(pdev, attr)); + v = udev_device_get_sysattr_value(pdev, attr); + if (!v) + v = ""; + + snprintf(text, sizeof(text), "%s", v); log_debug("%s raw kernel attribute: %s", attr, text); memzero(bitmask, bitmask_size); @@ -196,6 +232,7 @@ static int builtin_input_id(struct udev_device *dev, int argc, char *argv[], boo unsigned long bitmask_abs[NBITS(ABS_MAX)]; unsigned long bitmask_key[NBITS(KEY_MAX)]; unsigned long bitmask_rel[NBITS(REL_MAX)]; + const char *sysname, *devnode; /* walk up the parental chain until we find the real input device; the * argument is very likely a subdevice of this, like eventN */ @@ -203,24 +240,28 @@ static int builtin_input_id(struct udev_device *dev, int argc, char *argv[], boo while (pdev != NULL && udev_device_get_sysattr_value(pdev, "capabilities/ev") == NULL) pdev = udev_device_get_parent_with_subsystem_devtype(pdev, "input", NULL); - /* not an "input" class device */ - if (pdev == NULL) - return EXIT_SUCCESS; - - /* Use this as a flag that input devices were detected, so that this - * program doesn't need to be called more than once per device */ - udev_builtin_add_property(dev, test, "ID_INPUT", "1"); - get_cap_mask(dev, pdev, "capabilities/ev", bitmask_ev, sizeof(bitmask_ev), test); - get_cap_mask(dev, pdev, "capabilities/abs", bitmask_abs, sizeof(bitmask_abs), test); - get_cap_mask(dev, pdev, "capabilities/rel", bitmask_rel, sizeof(bitmask_rel), test); - get_cap_mask(dev, pdev, "capabilities/key", bitmask_key, sizeof(bitmask_key), test); - test_pointers(dev, bitmask_ev, bitmask_abs, bitmask_key, bitmask_rel, test); - test_key(dev, bitmask_ev, bitmask_key, test); + if (pdev) { + /* Use this as a flag that input devices were detected, so that this + * program doesn't need to be called more than once per device */ + udev_builtin_add_property(dev, test, "ID_INPUT", "1"); + get_cap_mask(dev, pdev, "capabilities/ev", bitmask_ev, sizeof(bitmask_ev), test); + get_cap_mask(dev, pdev, "capabilities/abs", bitmask_abs, sizeof(bitmask_abs), test); + get_cap_mask(dev, pdev, "capabilities/rel", bitmask_rel, sizeof(bitmask_rel), test); + get_cap_mask(dev, pdev, "capabilities/key", bitmask_key, sizeof(bitmask_key), test); + test_pointers(dev, bitmask_ev, bitmask_abs, bitmask_key, bitmask_rel, test); + test_key(dev, bitmask_ev, bitmask_key, test); + } + + devnode = udev_device_get_devnode(dev); + sysname = udev_device_get_sysname(dev); + if (devnode && sysname && startswith(sysname, "event")) + extract_info(dev, devnode, test); + return EXIT_SUCCESS; } const struct udev_builtin udev_builtin_input_id = { .name = "input_id", .cmd = builtin_input_id, - .help = "input device properties", + .help = "Input device properties", }; diff --git a/src/udev/udev-builtin-keyboard.c b/src/udev/udev-builtin-keyboard.c index d6b7dbbac0..118e797c96 100644 --- a/src/udev/udev-builtin-keyboard.c +++ b/src/udev/udev-builtin-keyboard.c @@ -62,7 +62,7 @@ static int install_force_release(struct udev_device *dev, const unsigned int *re log_debug("keyboard: updating force-release list with '%s'", codes); ret = udev_device_set_sysattr_value(atkbd, "force_release", codes); if (ret < 0) - log_error("Error writing force-release attribute: %s", strerror(-ret)); + log_error_errno(ret, "Error writing force-release attribute: %m"); return ret; } @@ -140,7 +140,7 @@ static int builtin_keyboard(struct udev_device *dev, int argc, char *argv[], boo fd = open(udev_device_get_devnode(dev), O_RDWR|O_CLOEXEC|O_NONBLOCK|O_NOCTTY); if (fd < 0) { - log_error("Error, opening device '%s': %m", node); + log_error_errno(errno, "Error, opening device '%s': %m", node); return EXIT_FAILURE; } @@ -149,7 +149,7 @@ static int builtin_keyboard(struct udev_device *dev, int argc, char *argv[], boo log_debug("keyboard: mapping scan code %d (0x%x) to key code %d (0x%x)", map[i].scan, map[i].scan, map[i].key, map[i].key); if (ioctl(fd, EVIOCSKEYCODE, &map[i]) < 0) - log_error("Error calling EVIOCSKEYCODE on device node '%s' (scan code 0x%x, key code %d): %m", node, map[i].scan, map[i].key); + log_error_errno(errno, "Error calling EVIOCSKEYCODE on device node '%s' (scan code 0x%x, key code %d): %m", node, map[i].scan, map[i].key); } /* install list of force-release codes */ @@ -165,5 +165,5 @@ static int builtin_keyboard(struct udev_device *dev, int argc, char *argv[], boo const struct udev_builtin udev_builtin_keyboard = { .name = "keyboard", .cmd = builtin_keyboard, - .help = "keyboard scan code to key mapping", + .help = "Keyboard scan code to key mapping", }; diff --git a/src/udev/udev-builtin-kmod.c b/src/udev/udev-builtin-kmod.c index b83fd523d9..f39b01a452 100644 --- a/src/udev/udev-builtin-kmod.c +++ b/src/udev/udev-builtin-kmod.c @@ -34,7 +34,7 @@ #include "udev.h" -static struct kmod_ctx *ctx; +static struct kmod_ctx *ctx = NULL; static int load_module(struct udev *udev, const char *alias) { int err; @@ -47,18 +47,18 @@ static int load_module(struct udev *udev, const char *alias) { return err; if (list == NULL) - log_debug("no module matches '%s'", alias); + log_debug("No module matches '%s'", alias); kmod_list_foreach(l, list) { struct kmod_module *mod = kmod_module_get_module(l); err = kmod_module_probe_insert_module(mod, KMOD_PROBE_APPLY_BLACKLIST, NULL, NULL, NULL, NULL); if (err == KMOD_PROBE_APPLY_BLACKLIST) - log_debug("module '%s' is blacklisted", kmod_module_get_name(mod)); + log_debug("Module '%s' is blacklisted", kmod_module_get_name(mod)); else if (err == 0) - log_debug("inserted '%s'", kmod_module_get_name(mod)); + log_debug("Inserted '%s'", kmod_module_get_name(mod)); else - log_debug("failed to insert '%s'", kmod_module_get_name(mod)); + log_debug("Failed to insert '%s'", kmod_module_get_name(mod)); kmod_module_unref(mod); } @@ -85,10 +85,8 @@ static int load_module(struct udev *udev, const char *alias) { return err; } -_printf_(6,0) -static void udev_kmod_log(void *data, int priority, const char *file, int line, - const char *fn, const char *format, va_list args) { - udev_main_log(data, priority, file, line, fn, format, args); +_printf_(6,0) static void udev_kmod_log(void *data, int priority, const char *file, int line, const char *fn, const char *format, va_list args) { + log_internalv(priority, 0, file, line, fn, format, args); } static int builtin_kmod(struct udev_device *dev, int argc, char *argv[], bool test) { @@ -106,7 +104,7 @@ static int builtin_kmod(struct udev_device *dev, int argc, char *argv[], bool te } for (i = 2; argv[i]; i++) { - log_debug("execute '%s' '%s'", argv[1], argv[i]); + log_debug("Execute '%s' '%s'", argv[1], argv[i]); load_module(udev, argv[i]); } @@ -123,7 +121,7 @@ static int builtin_kmod_init(struct udev *udev) { if (!ctx) return -ENOMEM; - log_debug("load module index"); + log_debug("Load module index"); kmod_set_log_fn(ctx, udev_kmod_log, udev); kmod_load_resources(ctx); #endif @@ -133,7 +131,7 @@ static int builtin_kmod_init(struct udev *udev) { /* called on udev shutdown and reload request */ static void builtin_kmod_exit(struct udev *udev) { #ifdef HAVE_LIBKMOD - log_debug("unload module index"); + log_debug("Unload module index"); ctx = kmod_unref(ctx); #endif } @@ -141,7 +139,7 @@ static void builtin_kmod_exit(struct udev *udev) { #ifdef HAVE_LIBKMOD /* called every couple of seconds during event activity; 'true' if config has changed */ static bool builtin_kmod_validate(struct udev *udev) { - log_debug("validate module index"); + log_debug("Validate module index"); if (!ctx) return false; return (kmod_validate_resources(ctx) != KMOD_RESOURCES_OK); @@ -156,6 +154,6 @@ const struct udev_builtin udev_builtin_kmod = { #ifdef HAVE_LIBKMOD .validate = builtin_kmod_validate, #endif - .help = "kernel module loader", + .help = "Kernel module loader", .run_once = false, }; diff --git a/src/udev/udev-builtin-net_id.c b/src/udev/udev-builtin-net_id.c index 4731a860b0..5f350abd68 100644 --- a/src/udev/udev-builtin-net_id.c +++ b/src/udev/udev-builtin-net_id.c @@ -307,7 +307,7 @@ static int names_usb(struct udev_device *dev, struct netnames *names) { s[0] = '\0'; interf = s+1; - /* prefix every port number in the chain with "u"*/ + /* prefix every port number in the chain with "u" */ s = ports; while ((s = strchr(s, '.'))) s[0] = 'u'; @@ -562,5 +562,5 @@ out: const struct udev_builtin udev_builtin_net_id = { .name = "net_id", .cmd = builtin_net_id, - .help = "network device properties", + .help = "Network device properties", }; diff --git a/src/udev/udev-builtin-path_id.c b/src/udev/udev-builtin-path_id.c index 0d247f6b5a..b6749aab76 100644 --- a/src/udev/udev-builtin-path_id.c +++ b/src/udev/udev-builtin-path_id.c @@ -118,7 +118,7 @@ out: return parent; } -static struct udev_device *handle_scsi_sas(struct udev_device *parent, char **path) { +static struct udev_device *handle_scsi_sas_wide_port(struct udev_device *parent, char **path) { struct udev *udev = udev_device_get_udev(parent); struct udev_device *targetdev; struct udev_device *target_parent; @@ -154,6 +154,100 @@ out: return parent; } +static struct udev_device *handle_scsi_sas(struct udev_device *parent, char **path) +{ + struct udev *udev = udev_device_get_udev(parent); + struct udev_device *targetdev; + struct udev_device *target_parent; + struct udev_device *port; + struct udev_device *expander; + struct udev_device *target_sasdev = NULL; + struct udev_device *expander_sasdev = NULL; + struct udev_device *port_sasdev = NULL; + const char *sas_address = NULL; + const char *phy_id; + const char *phy_count; + char *lun = NULL; + + targetdev = udev_device_get_parent_with_subsystem_devtype(parent, "scsi", "scsi_target"); + if (targetdev == NULL) + return NULL; + + target_parent = udev_device_get_parent(targetdev); + if (target_parent == NULL) + return NULL; + + /* Get sas device */ + target_sasdev = udev_device_new_from_subsystem_sysname(udev, + "sas_device", udev_device_get_sysname(target_parent)); + if (target_sasdev == NULL) + return NULL; + + /* The next parent is sas port */ + port = udev_device_get_parent(target_parent); + if (port == NULL) { + parent = NULL; + goto out; + } + + /* Get port device */ + port_sasdev = udev_device_new_from_subsystem_sysname(udev, + "sas_port", udev_device_get_sysname(port)); + + phy_count = udev_device_get_sysattr_value(port_sasdev, "num_phys"); + if (phy_count == NULL) { + parent = NULL; + goto out; + } + + /* Check if we are simple disk */ + if (strncmp(phy_count, "1", 2) != 0) { + parent = handle_scsi_sas_wide_port(parent, path); + goto out; + } + + /* Get connected phy */ + phy_id = udev_device_get_sysattr_value(target_sasdev, "phy_identifier"); + if (phy_id == NULL) { + parent = NULL; + goto out; + } + + /* The port's parent is either hba or expander */ + expander = udev_device_get_parent(port); + if (expander == NULL) { + parent = NULL; + goto out; + } + + /* Get expander device */ + expander_sasdev = udev_device_new_from_subsystem_sysname(udev, + "sas_device", udev_device_get_sysname(expander)); + if (expander_sasdev != NULL) { + /* Get expander's address */ + sas_address = udev_device_get_sysattr_value(expander_sasdev, + "sas_address"); + if (sas_address == NULL) { + parent = NULL; + goto out; + } + } + + format_lun_number(parent, &lun); + if (sas_address) + path_prepend(path, "sas-exp%s-phy%s-%s", sas_address, phy_id, lun); + else + path_prepend(path, "sas-phy%s-%s", phy_id, lun); + + if (lun) + free(lun); +out: + udev_device_unref(target_sasdev); + udev_device_unref(expander_sasdev); + udev_device_unref(port_sasdev); + return parent; +} + static struct udev_device *handle_scsi_iscsi(struct udev_device *parent, char **path) { struct udev *udev = udev_device_get_udev(parent); struct udev_device *transportdev; @@ -548,9 +642,9 @@ static int builtin_path_id(struct udev_device *dev, int argc, char *argv[], bool } /* - * Do return devices with have an unknown type of parent device, they - * might produce conflicting IDs below multiple independent parent - * devices. + * Do not return devices with an unknown parent device type. They + * might produce conflicting IDs if the parent does not provide a + * unique and predictable name. */ if (!supported_parent) { free(path); @@ -558,9 +652,9 @@ static int builtin_path_id(struct udev_device *dev, int argc, char *argv[], bool } /* - * Do not return a have-only a single-parent block devices, some - * have entire hidden buses behind it, and not create predictable - * IDs that way. + * Do not return block devices without a well-known transport. Some + * devices do not expose their buses and do not provide a unique + * and predictable name that way. */ if (streq(udev_device_get_subsystem(dev), "block") && !supported_transport) { free(path); @@ -609,6 +703,6 @@ out: const struct udev_builtin udev_builtin_path_id = { .name = "path_id", .cmd = builtin_path_id, - .help = "compose persistent device path", + .help = "Compose persistent device path", .run_once = true, }; diff --git a/src/udev/udev-builtin-usb_id.c b/src/udev/udev-builtin-usb_id.c index 06d4191584..ab0d96e377 100644 --- a/src/udev/udev-builtin-usb_id.c +++ b/src/udev/udev-builtin-usb_id.c @@ -471,6 +471,6 @@ fallback: const struct udev_builtin udev_builtin_usb_id = { .name = "usb_id", .cmd = builtin_usb_id, - .help = "usb device properties", + .help = "USB device properties", .run_once = true, }; diff --git a/src/udev/udev-builtin.c b/src/udev/udev-builtin.c index 70b7ab4332..e4440a6e99 100644 --- a/src/udev/udev-builtin.c +++ b/src/udev/udev-builtin.c @@ -86,7 +86,7 @@ void udev_builtin_list(struct udev *udev) { unsigned int i; for (i = 0; i < ELEMENTSOF(builtins); i++) - fprintf(stderr, " %-12s %s\n", builtins[i]->name, builtins[i]->help); + fprintf(stderr, " %-14s %s\n", builtins[i]->name, builtins[i]->help); } const char *udev_builtin_name(enum udev_builtin_cmd cmd) { diff --git a/src/udev/udev-ctrl.c b/src/udev/udev-ctrl.c index 2fdf4561a9..898ef54514 100644 --- a/src/udev/udev-ctrl.c +++ b/src/udev/udev-ctrl.c @@ -85,7 +85,7 @@ struct udev_ctrl *udev_ctrl_new_from_fd(struct udev *udev, int fd) { if (fd < 0) { uctrl->sock = socket(AF_LOCAL, SOCK_SEQPACKET|SOCK_NONBLOCK|SOCK_CLOEXEC, 0); if (uctrl->sock < 0) { - log_error("error getting socket: %m"); + log_error_errno(errno, "error getting socket: %m"); udev_ctrl_unref(uctrl); return NULL; } @@ -95,7 +95,7 @@ struct udev_ctrl *udev_ctrl_new_from_fd(struct udev *udev, int fd) { } r = setsockopt(uctrl->sock, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on)); if (r < 0) - log_warning("could not set SO_PASSCRED: %m"); + log_warning_errno(errno, "could not set SO_PASSCRED: %m"); uctrl->saddr.sun_family = AF_LOCAL; strscpy(uctrl->saddr.sun_path, sizeof(uctrl->saddr.sun_path), "/run/udev/control"); @@ -119,14 +119,14 @@ int udev_ctrl_enable_receiving(struct udev_ctrl *uctrl) { if (err < 0) { err = -errno; - log_error("bind failed: %m"); + log_error_errno(errno, "bind failed: %m"); return err; } err = listen(uctrl->sock, 0); if (err < 0) { err = -errno; - log_error("listen failed: %m"); + log_error_errno(errno, "listen failed: %m"); return err; } @@ -209,14 +209,14 @@ struct udev_ctrl_connection *udev_ctrl_get_connection(struct udev_ctrl *uctrl) { if (conn->sock < 0) { if (errno != EINTR) - log_error("unable to receive ctrl connection: %m"); + log_error_errno(errno, "unable to receive ctrl connection: %m"); goto err; } /* check peer credential of connection */ r = getpeercred(conn->sock, &ucred); if (r < 0) { - log_error("unable to receive credentials of ctrl connection: %s", strerror(-r)); + log_error_errno(r, "unable to receive credentials of ctrl connection: %m"); goto err; } if (ucred.uid > 0) { @@ -227,7 +227,7 @@ struct udev_ctrl_connection *udev_ctrl_get_connection(struct udev_ctrl *uctrl) { /* enable receiving of the sender credentials in the messages */ r = setsockopt(conn->sock, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on)); if (r < 0) - log_warning("could not set SO_PASSCRED: %m"); + log_warning_errno(errno, "could not set SO_PASSCRED: %m"); udev_ctrl_ref(uctrl); return conn; @@ -383,7 +383,7 @@ struct udev_ctrl_msg *udev_ctrl_receive_msg(struct udev_ctrl_connection *conn) { goto err; } else { if (!(pfd[0].revents & POLLIN)) { - log_error("ctrl connection error: %m"); + log_error_errno(errno, "ctrl connection error: %m"); goto err; } } @@ -396,7 +396,7 @@ struct udev_ctrl_msg *udev_ctrl_receive_msg(struct udev_ctrl_connection *conn) { size = recvmsg(conn->sock, &smsg, 0); if (size < 0) { - log_error("unable to receive ctrl message: %m"); + log_error_errno(errno, "unable to receive ctrl message: %m"); goto err; } cmsg = CMSG_FIRSTHDR(&smsg); diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c index e86f9cb059..5c1352b1b9 100644 --- a/src/udev/udev-event.c +++ b/src/udev/udev-event.c @@ -388,7 +388,7 @@ static int spawn_exec(struct udev_event *event, if (fd_stderr < 0) dup2(fd, STDERR_FILENO); } else - log_error("open /dev/null failed: %m"); + log_error_errno(errno, "open /dev/null failed: %m"); /* connect pipes to std{out,err} */ if (fd_stdout >= 0) { @@ -410,7 +410,7 @@ static int spawn_exec(struct udev_event *event, execve(argv[0], argv, envp); /* exec failed */ - log_error("failed to execute '%s' '%s': %m", argv[0], cmd); + log_error_errno(errno, "failed to execute '%s' '%s': %m", argv[0], cmd); return -errno; } @@ -438,14 +438,14 @@ static void spawn_read(struct udev_event *event, fd_ep = epoll_create1(EPOLL_CLOEXEC); if (fd_ep < 0) { - log_error("error creating epoll fd: %m"); + log_error_errno(errno, "error creating epoll fd: %m"); return; } if (fd_stdout >= 0) { r = epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_stdout, &ep_outpipe); if (r < 0) { - log_error("fail to add stdout fd to epoll: %m"); + log_error_errno(errno, "fail to add stdout fd to epoll: %m"); return; } } @@ -453,7 +453,7 @@ static void spawn_read(struct udev_event *event, if (fd_stderr >= 0) { r = epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_stderr, &ep_errpipe); if (r < 0) { - log_error("fail to add stderr fd to epoll: %m"); + log_error_errno(errno, "fail to add stderr fd to epoll: %m"); return; } } @@ -482,7 +482,7 @@ static void spawn_read(struct udev_event *event, if (fdcount < 0) { if (errno == EINTR) continue; - log_error("failed to poll: %m"); + log_error_errno(errno, "failed to poll: %m"); return; } else if (fdcount == 0) { log_error("timeout '%s'", cmd); @@ -528,7 +528,7 @@ static void spawn_read(struct udev_event *event, } else if (ev[i].events & EPOLLHUP) { r = epoll_ctl(fd_ep, EPOLL_CTL_DEL, *fd, NULL); if (r < 0) { - log_error("failed to remove fd from epoll: %m"); + log_error_errno(errno, "failed to remove fd from epoll: %m"); return; } *fd = -1; @@ -577,7 +577,7 @@ static int spawn_wait(struct udev_event *event, if (errno == EINTR) continue; err = -errno; - log_error("failed to poll: %m"); + log_error_errno(errno, "failed to poll: %m"); goto out; } if (fdcount == 0) { @@ -588,7 +588,7 @@ static int spawn_wait(struct udev_event *event, if (errno == EINTR) continue; err = -errno; - log_error("failed to poll: %m"); + log_error_errno(errno, "failed to poll: %m"); goto out; } if (fdcount == 0) { @@ -677,7 +677,6 @@ int udev_event_spawn(struct udev_event *event, usec_t timeout_warn_usec, const char *cmd, char **envp, const sigset_t *sigmask, char *result, size_t ressize) { - struct udev *udev = event->udev; int outpipe[2] = {-1, -1}; int errpipe[2] = {-1, -1}; pid_t pid; @@ -690,17 +689,17 @@ int udev_event_spawn(struct udev_event *event, udev_build_argv(event->udev, arg, NULL, argv); /* pipes from child to parent */ - if (result != NULL || udev_get_log_priority(udev) >= LOG_INFO) { + if (result != NULL || log_get_max_level() >= LOG_INFO) { if (pipe2(outpipe, O_NONBLOCK) != 0) { err = -errno; - log_error("pipe failed: %m"); + log_error_errno(errno, "pipe failed: %m"); goto out; } } - if (udev_get_log_priority(udev) >= LOG_INFO) { + if (log_get_max_level() >= LOG_INFO) { if (pipe2(errpipe, O_NONBLOCK) != 0) { err = -errno; - log_error("pipe failed: %m"); + log_error_errno(errno, "pipe failed: %m"); goto out; } } @@ -737,7 +736,7 @@ int udev_event_spawn(struct udev_event *event, _exit(2 ); case -1: - log_error("fork of '%s' failed: %m", cmd); + log_error_errno(errno, "fork of '%s' failed: %m", cmd); err = -1; goto out; default: @@ -785,7 +784,7 @@ static int rename_netif_dev_fromname_toname(struct udev_device *dev,const char * sk = socket(PF_INET, SOCK_DGRAM, 0); if (sk < 0) { err = -errno; - log_error("error opening socket: %m\n"); + log_error("error opening socket: %m"); return err; } @@ -799,11 +798,11 @@ static int rename_netif_dev_fromname_toname(struct udev_device *dev,const char * int loop; if (err == 0) { - log_info("renamed network interface %s to %s\n", ifr.ifr_name, ifr.ifr_newname); + log_info("renamed network interface %s to %s", ifr.ifr_name, ifr.ifr_newname); goto out; } /* keep trying if the destination interface name already exists */ - log_debug("collision on rename of network interface %s to %s , retrying until timeout\n", + log_debug("collision on rename of network interface %s to %s , retrying until timeout", ifr.ifr_name, ifr.ifr_newname); err = -errno; @@ -819,7 +818,7 @@ static int rename_netif_dev_fromname_toname(struct udev_device *dev,const char * err = ioctl(sk, SIOCSIFNAME, &ifr); if (err == 0) { - log_info("renamed network interface %s to %s\n", ifr.ifr_name, ifr.ifr_newname); + log_info("renamed network interface %s to %s", ifr.ifr_name, ifr.ifr_newname); break; } err = -errno; @@ -829,13 +828,13 @@ static int rename_netif_dev_fromname_toname(struct udev_device *dev,const char * out: if (err < 0) - log_error("error changing net interface name %s to %s: %m\n", ifr.ifr_name, ifr.ifr_newname); + log_error("error changing net interface name %s to %s: %m", ifr.ifr_name, ifr.ifr_newname); #else if (err >= 0) { - log_info("renamed network interface %s to %s\n", ifr.ifr_name, ifr.ifr_newname); + log_info("renamed network interface %s to %s", ifr.ifr_name, ifr.ifr_newname); } else { err = -errno; - log_error("error changing net interface name %s to %s: %m\n", ifr.ifr_name, ifr.ifr_newname); + log_error("error changing net interface name %s to %s: %m", ifr.ifr_name, ifr.ifr_newname); } #endif @@ -848,9 +847,10 @@ static int rename_netif(struct udev_event *event) { } void udev_event_execute_rules(struct udev_event *event, - usec_t timeout_usec, - usec_t timeout_warn_usec, - struct udev_rules *rules, const sigset_t *sigmask) { + usec_t timeout_usec, usec_t timeout_warn_usec, + struct udev_list *properties_list, + struct udev_rules *rules, + const sigset_t *sigmask) { struct udev_device *dev = event->dev; if (udev_device_get_subsystem(dev) == NULL) @@ -864,7 +864,10 @@ void udev_event_execute_rules(struct udev_event *event, if (major(udev_device_get_devnum(dev)) != 0) udev_watch_end(event->udev, dev); - udev_rules_apply_to_event(rules, event, timeout_usec, timeout_warn_usec, sigmask); + udev_rules_apply_to_event(rules, event, + timeout_usec, timeout_warn_usec, + properties_list, + sigmask); if (major(udev_device_get_devnum(dev)) != 0) udev_node_remove(dev); @@ -898,7 +901,10 @@ void udev_event_execute_rules(struct udev_event *event, } } - udev_rules_apply_to_event(rules, event, timeout_usec, timeout_warn_usec, sigmask); + udev_rules_apply_to_event(rules, event, + timeout_usec, timeout_warn_usec, + properties_list, + sigmask); /* rename a new network interface, if needed */ @@ -955,9 +961,9 @@ void udev_event_execute_rules(struct udev_event *event, r = rename_netif_dev_fromname_toname(dev,udev_device_get_sysname(dev),newifname); if (r == 0) { finalifname = newifname; - log_debug("renamed netif to '%s' for collision avoidance\n", newifname); + log_debug("renamed netif to '%s' for collision avoidance", newifname); } else { - log_error("could not rename netif to '%s' for collision avoidance\n",newifname); + log_error("could not rename netif to '%s' for collision avoidance",newifname); } } /* rename it now to its final target if its not already there */ diff --git a/src/udev/udev-node.c b/src/udev/udev-node.c index 4ac6f71490..c30a428ea1 100644 --- a/src/udev/udev-node.c +++ b/src/udev/udev-node.c @@ -112,12 +112,12 @@ static int node_symlink(struct udev_device *dev, const char *node, const char *s mac_selinux_create_file_clear(); } while (err == -ENOENT); if (err != 0) { - log_error("symlink '%s' '%s' failed: %m", target, slink_tmp); + log_error_errno(errno, "symlink '%s' '%s' failed: %m", target, slink_tmp); goto exit; } err = rename(slink_tmp, slink); if (err != 0) { - log_error("rename '%s' '%s' failed: %m", slink_tmp, slink); + log_error_errno(errno, "rename '%s' '%s' failed: %m", slink_tmp, slink); unlink(slink_tmp); } exit: @@ -264,7 +264,7 @@ static int node_permissions_apply(struct udev_device *dev, bool apply, if (lstat(devnode, &stats) != 0) { err = -errno; - log_debug("can not stat() node '%s' (%m)", devnode); + log_debug_errno(errno, "can not stat() node '%s' (%m)", devnode); goto out; } @@ -283,10 +283,10 @@ static int node_permissions_apply(struct udev_device *dev, bool apply, log_debug("set permissions %s, %#o, uid=%u, gid=%u", devnode, mode, uid, gid); err = chmod(devnode, mode); if (err < 0) - log_warning("setting mode of %s to %#o failed: %m", devnode, mode); + log_warning_errno(errno, "setting mode of %s to %#o failed: %m", devnode, mode); err = chown(devnode, uid, gid); if (err < 0) - log_warning("setting owner of %s to uid=%u, gid=%u failed: %m", devnode, uid, gid); + log_warning_errno(errno, "setting owner of %s to uid=%u, gid=%u failed: %m", devnode, uid, gid); } else { log_debug("preserve permissions %s, %#o, uid=%u, gid=%u", devnode, mode, uid, gid); } @@ -304,7 +304,7 @@ static int node_permissions_apply(struct udev_device *dev, bool apply, r = mac_selinux_apply(devnode, label); if (r < 0) - log_error("SECLABEL: failed to set SELinux label '%s': %s", label, strerror(-r)); + log_error_errno(r, "SECLABEL: failed to set SELinux label '%s': %m", label); else log_debug("SECLABEL: set SELinux label '%s'", label); @@ -313,7 +313,7 @@ static int node_permissions_apply(struct udev_device *dev, bool apply, r = mac_smack_apply(devnode, label); if (r < 0) - log_error("SECLABEL: failed to set SMACK label '%s': %s", label, strerror(-r)); + log_error_errno(r, "SECLABEL: failed to set SMACK label '%s': %m", label); else log_debug("SECLABEL: set SMACK label '%s'", label); @@ -323,7 +323,7 @@ static int node_permissions_apply(struct udev_device *dev, bool apply, /* set the defaults */ if (!selinux) - label_fix(devnode, true, false); + mac_selinux_fix(devnode, true, false); if (!smack) mac_smack_apply(devnode, NULL); } diff --git a/src/udev/udev-rules.c b/src/udev/udev-rules.c index b8fc35e11a..f51691143b 100644 --- a/src/udev/udev-rules.c +++ b/src/udev/udev-rules.c @@ -479,9 +479,9 @@ static uid_t add_uid(struct udev_rules *rules, const char *owner) { r = get_user_creds(&owner, &uid, NULL, NULL, NULL); if (r < 0) { if (r == -ENOENT || r == -ESRCH) - udev_err(rules->udev, "specified user '%s' unknown\n", owner); + log_error("specified user '%s' unknown", owner); else - udev_err(rules->udev, "error resolving user '%s': %s\n", owner, strerror(-r)); + log_error_errno(r, "error resolving user '%s': %m", owner); } /* grow buffer if needed */ @@ -526,9 +526,9 @@ static gid_t add_gid(struct udev_rules *rules, const char *group) { r = get_group_creds(&group, &gid); if (r < 0) { if (r == -ENOENT || r == -ESRCH) - udev_err(rules->udev, "specified group '%s' unknown\n", group); + log_error("specified group '%s' unknown", group); else - udev_err(rules->udev, "error resolving group '%s': %s\n", group, strerror(-r)); + log_error_errno(r, "error resolving group '%s': %m", group); } /* grow buffer if needed */ @@ -1047,11 +1047,11 @@ static int add_rule(struct udev_rules *rules, char *line, const char *filename, unsigned int filename_off, unsigned int lineno) { char *linepos; const char *attr; - struct rule_tmp rule_tmp; + struct rule_tmp rule_tmp = { + .rules = rules, + .rule.type = TK_RULE, + }; - memzero(&rule_tmp, sizeof(struct rule_tmp)); - rule_tmp.rules = rules; - rule_tmp.rule.type = TK_RULE; /* the offset in the rule is limited to unsigned short */ if (filename_off < USHRT_MAX) rule_tmp.rule.rule.filename_off = filename_off; @@ -1072,14 +1072,14 @@ static int add_rule(struct udev_rules *rules, char *line, /* If we aren't at the end of the line, this is a parsing error. * Make a best effort to describe where the problem is. */ - if (*linepos != '\n') { - char buf[2] = {linepos[1]}; + if (!strchr(NEWLINE, *linepos)) { + char buf[2] = {*linepos}; _cleanup_free_ char *tmp; tmp = cescape(buf); - log_error("invalid key/value pair in file %s on line %u, starting at character %tu ('%s')\n", + log_error("invalid key/value pair in file %s on line %u, starting at character %tu ('%s')", filename, lineno, linepos - line + 1, tmp); - if (linepos[1] == '#') + if (*linepos == '#') log_error("hint: comments can only start at beginning of line"); } break; @@ -1420,12 +1420,12 @@ static int add_rule(struct udev_rules *rules, char *line, } else { if (streq(value, "%k")) { log_error("NAME=\"%%k\" is ignored, because it breaks kernel supplied names, " - "please remove it from %s:%u\n", filename, lineno); + "please remove it from %s:%u", filename, lineno); continue; } if (value[0] == '\0') { log_debug("NAME=\"\" is ignored, because udev will not delete any device nodes, " - "please remove it from %s:%u\n", filename, lineno); + "please remove it from %s:%u", filename, lineno); continue; } rule_add_key(&rule_tmp, TK_A_NAME, op, value, NULL); @@ -1690,7 +1690,7 @@ struct udev_rules *udev_rules_new(struct udev *udev, int resolve_names) { r = conf_files_list_strv(&files, ".rules", NULL, rules_dirs); if (r < 0) { - log_error("failed to enumerate rules files: %s", strerror(-r)); + log_error_errno(r, "failed to enumerate rules files: %m"); return udev_rules_unref(rules); } @@ -1916,9 +1916,9 @@ int udev_rules_assigning_name_to(struct udev_rules *rules, const char *match_nam strscpy(name_str,UTIL_PATH_SIZE,name); count = util_replace_chars(name_str, "/"); if (count > 0) - log_debug("%i character(s) replaced\n", count); + log_debug("%i character(s) replaced", count); if (streq(name_str,match_name)) { - log_debug("found a match! NAME assigns %s in: %s:%u\n", + log_debug("found a match! NAME assigns %s in: %s:%u", name, rules_str(rules, rule->rule.filename_off), rule->rule.filename_line); @@ -1945,6 +1945,7 @@ int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event, usec_t timeout_usec, usec_t timeout_warn_usec, + struct udev_list *properties_list, const sigset_t *sigmask) { struct token *cur; struct token *rule; @@ -2334,9 +2335,9 @@ int udev_rules_apply_to_event(struct udev_rules *rules, r = get_user_creds(&ow, &event->uid, NULL, NULL, NULL); if (r < 0) { if (r == -ENOENT || r == -ESRCH) - udev_err(event->udev, "specified user '%s' unknown\n", owner); + log_error("specified user '%s' unknown", owner); else - udev_err(event->udev, "error resolving user '%s': %s\n", owner, strerror(-r)); + log_error_errno(r, "error resolving user '%s': %m", owner); event->uid = 0; } @@ -2360,9 +2361,9 @@ int udev_rules_apply_to_event(struct udev_rules *rules, r = get_group_creds(&gr, &event->gid); if (r < 0) { if (r == -ENOENT || r == -ESRCH) - udev_err(event->udev, "specified group '%s' unknown\n", group); + log_error("specified group '%s' unknown", group); else - udev_err(event->udev, "error resolving group '%s': %s\n", group, strerror(-r)); + log_error_errno(r, "error resolving group '%s': %m", group); event->gid = 0; } @@ -2517,7 +2518,7 @@ int udev_rules_apply_to_event(struct udev_rules *rules, if (major(udev_device_get_devnum(event->dev)) && (!streq(name_str, udev_device_get_devnode(event->dev) + strlen("/dev/")))) { log_error("NAME=\"%s\" ignored, kernel device nodes " - "can not be renamed; please fix it in %s:%u\n", name, + "can not be renamed; please fix it in %s:%u", name, rules_str(rules, rule->rule.filename_off), rule->rule.filename_line); break; } @@ -2592,10 +2593,10 @@ int udev_rules_apply_to_event(struct udev_rules *rules, f = fopen(attr, "we"); if (f != NULL) { if (fprintf(f, "%s", value) <= 0) - log_error("error writing ATTR{%s}: %m", attr); + log_error_errno(errno, "error writing ATTR{%s}: %m", attr); fclose(f); } else { - log_error("error opening ATTR{%s} for writing: %m", attr); + log_error_errno(errno, "error opening ATTR{%s} for writing: %m", attr); } break; } @@ -2710,7 +2711,7 @@ int udev_rules_apply_static_dev_perms(struct udev_rules *rules) { strscpyl(tags_dir, sizeof(tags_dir), "/run/udev/static_node-tags/", *t, "/", NULL); r = mkdir_p(tags_dir, 0755); if (r < 0) { - log_error("failed to create %s: %s", tags_dir, strerror(-r)); + log_error_errno(r, "failed to create %s: %m", tags_dir); return r; } @@ -2718,10 +2719,10 @@ int udev_rules_apply_static_dev_perms(struct udev_rules *rules) { strscpyl(tag_symlink, sizeof(tag_symlink), tags_dir, unescaped_filename, NULL); r = symlink(device_node, tag_symlink); - if (r < 0 && errno != EEXIST) { - log_error("failed to create symlink %s -> %s: %m", tag_symlink, device_node); - return -errno; - } else + if (r < 0 && errno != EEXIST) + return log_error_errno(errno, "failed to create symlink %s -> %s: %m", + tag_symlink, device_node); + else r = 0; } } diff --git a/src/udev/udev-watch.c b/src/udev/udev-watch.c index 061bd05875..6ba8674d77 100644 --- a/src/udev/udev-watch.c +++ b/src/udev/udev-watch.c @@ -39,7 +39,7 @@ static int inotify_fd = -1; int udev_watch_init(struct udev *udev) { inotify_fd = inotify_init1(IN_CLOEXEC); if (inotify_fd < 0) - log_error("inotify_init failed: %m"); + log_error_errno(errno, "inotify_init failed: %m"); return inotify_fd; } @@ -56,7 +56,7 @@ void udev_watch_restore(struct udev *udev) { dir = opendir("/run/udev/watch.old"); if (dir == NULL) { - log_error("unable to open old watches dir /run/udev/watch.old; old watches will not be restored: %m"); + log_error_errno(errno, "unable to open old watches dir /run/udev/watch.old; old watches will not be restored: %m"); return; } @@ -88,7 +88,7 @@ unlink: rmdir("/run/udev/watch.old"); } else if (errno != ENOENT) { - log_error("unable to move watches dir /run/udev/watch; old watches will not be restored: %m"); + log_error_errno(errno, "unable to move watches dir /run/udev/watch; old watches will not be restored: %m"); } } @@ -103,7 +103,7 @@ void udev_watch_begin(struct udev *udev, struct udev_device *dev) { log_debug("adding watch on '%s'", udev_device_get_devnode(dev)); wd = inotify_add_watch(inotify_fd, udev_device_get_devnode(dev), IN_CLOSE_WRITE); if (wd < 0) { - log_error("inotify_add_watch(%d, %s, %o) failed: %m", + log_error_errno(errno, "inotify_add_watch(%d, %s, %o) failed: %m", inotify_fd, udev_device_get_devnode(dev), IN_CLOSE_WRITE); return; } @@ -113,7 +113,7 @@ void udev_watch_begin(struct udev *udev, struct udev_device *dev) { unlink(filename); r = symlink(udev_device_get_id_filename(dev), filename); if (r < 0) - log_error("Failed to create symlink %s: %m", filename); + log_error_errno(errno, "Failed to create symlink %s: %m", filename); udev_device_set_watch_handle(dev, wd); } diff --git a/src/udev/udev.h b/src/udev/udev.h index 5a1f5488cb..fae0408672 100644 --- a/src/udev/udev.h +++ b/src/udev/udev.h @@ -71,7 +71,9 @@ struct udev_rules; struct udev_rules *udev_rules_new(struct udev *udev, int resolve_names); struct udev_rules *udev_rules_unref(struct udev_rules *rules); bool udev_rules_check_timestamp(struct udev_rules *rules); -int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event, usec_t timeout_usec, usec_t timeout_warn_usec, +int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event, + usec_t timeout_usec, usec_t timeout_warn_usec, + struct udev_list *properties_list, const sigset_t *sigmask); int udev_rules_apply_static_dev_perms(struct udev_rules *rules); @@ -86,8 +88,11 @@ int udev_event_spawn(struct udev_event *event, usec_t timeout_warn_usec, const char *cmd, char **envp, const sigset_t *sigmask, char *result, size_t ressize); -void udev_event_execute_rules(struct udev_event *event, usec_t timeout_usec, usec_t timeout_warn_usec, - struct udev_rules *rules, const sigset_t *sigset); +void udev_event_execute_rules(struct udev_event *event, + usec_t timeout_usec, usec_t timeout_warn_usec, + struct udev_list *properties_list, + struct udev_rules *rules, + const sigset_t *sigset); void udev_event_execute_run(struct udev_event *event, usec_t timeout_usec, usec_t timeout_warn_usec, const sigset_t *sigset); int udev_build_argv(struct udev *udev, char *cmd, int *argc, char *argv[]); @@ -193,11 +198,6 @@ int udev_builtin_add_property(struct udev_device *dev, bool test, const char *ke int udev_builtin_hwdb_lookup(struct udev_device *dev, const char *prefix, const char *modalias, const char *filter, bool test); -/* udev logging */ -void udev_main_log(struct udev *udev, int priority, - const char *file, int line, const char *fn, - const char *format, va_list args) _printf_(6, 0); - /* udevadm commands */ struct udevadm_cmd { const char *name; diff --git a/src/udev/udevadm-control.c b/src/udev/udevadm-control.c index 6e3bc2ae98..6af7163d47 100644 --- a/src/udev/udevadm-control.c +++ b/src/udev/udevadm-control.c @@ -29,16 +29,19 @@ #include "udev-util.h" static void print_help(void) { - printf("Usage: udevadm control COMMAND\n" - " -e,--exit instruct the daemon to cleanup and exit\n" - " -l,--log-priority=LEVEL set the udev log level for the daemon\n" - " -s,--stop-exec-queue do not execute events, queue only\n" - " -S,--start-exec-queue execute events, flush queue\n" - " -R,--reload reload rules and databases\n" - " -p,--property=KEY=VALUE set a global property for all events\n" - " -m,--children-max=N maximum number of children\n" - " --timeout=SECONDS maximum time to block for a reply\n" - " -h,--help print this help text\n\n"); + printf("%s control COMMAND\n\n" + "Control the udev daemon.\n\n" + " -h --help Show this help\n" + " --version Show package version\n" + " -e --exit Instruct the daemon to cleanup and exit\n" + " -l --log-priority=LEVEL Set the udev log level for the daemon\n" + " -s --stop-exec-queue Do not execute events, queue only\n" + " -S --start-exec-queue Execute events, flush queue\n" + " -R --reload Reload rules and databases\n" + " -p --property=KEY=VALUE Set a global property for all events\n" + " -m --children-max=N Maximum number of children\n" + " --timeout=SECONDS Maximum time to block for a reply\n" + , program_invocation_short_name); } static int adm_control(struct udev *udev, int argc, char *argv[]) { @@ -161,5 +164,5 @@ static int adm_control(struct udev *udev, int argc, char *argv[]) { const struct udevadm_cmd udevadm_control = { .name = "control", .cmd = adm_control, - .help = "control the udev daemon", + .help = "Control the udev daemon", }; diff --git a/src/udev/udevadm-hwdb.c b/src/udev/udevadm-hwdb.c index 4a3f35c2af..a3f93ba343 100644 --- a/src/udev/udevadm-hwdb.c +++ b/src/udev/udevadm-hwdb.c @@ -435,6 +435,10 @@ static int insert_data(struct trie *trie, struct udev_list *match_list, value[0] = '\0'; value++; + /* libudev requires properties to start with a space */ + while (isblank(line[0]) && isblank(line[1])) + line++; + if (line[0] == '\0' || value[0] == '\0') { log_error("Error, empty key or value '%s' in '%s':", line, filename); return -EINVAL; @@ -615,7 +619,7 @@ static int adm_hwdb(struct udev *udev, int argc, char *argv[]) { err = conf_files_list_strv(&files, ".hwdb", root, conf_file_dirs); if (err < 0) { - log_error("failed to enumerate hwdb files: %s", strerror(-err)); + log_error_errno(err, "failed to enumerate hwdb files: %m"); rc = EXIT_FAILURE; goto out; } @@ -648,7 +652,7 @@ static int adm_hwdb(struct udev *udev, int argc, char *argv[]) { mkdir_parents(hwdb_bin, 0755); err = trie_store(trie, hwdb_bin); if (err < 0) { - log_error("Failure writing database %s: %s", hwdb_bin, strerror(-err)); + log_error_errno(err, "Failure writing database %s: %m", hwdb_bin); rc = EXIT_FAILURE; } } diff --git a/src/udev/udevadm-info.c b/src/udev/udevadm-info.c index 3cb503fc1f..c845df7a23 100644 --- a/src/udev/udevadm-info.c +++ b/src/udev/udevadm-info.c @@ -31,6 +31,7 @@ #include "udev.h" #include "udev-util.h" +#include "udevadm-util.h" #include "util.h" static bool skip_attribute(const char *name) { @@ -258,33 +259,29 @@ static void cleanup_db(struct udev *udev) { } } -static struct udev_device *find_device(struct udev *udev, const char *id, const char *prefix) { - char name[UTIL_PATH_SIZE]; - - if (prefix && !startswith(id, prefix)) { - strscpyl(name, sizeof(name), prefix, id, NULL); - id = name; - } - - if (startswith(id, "/dev/")) { - struct stat statbuf; - char type; - - if (stat(id, &statbuf) < 0) - return NULL; - - if (S_ISBLK(statbuf.st_mode)) - type = 'b'; - else if (S_ISCHR(statbuf.st_mode)) - type = 'c'; - else - return NULL; - - return udev_device_new_from_devnum(udev, type, statbuf.st_rdev); - } else if (startswith(id, "/sys/")) - return udev_device_new_from_syspath(udev, id); - else - return NULL; +static void help(void) { + + printf("%s info [OPTIONS] [DEVPATH|FILE]\n\n" + "Query sysfs or the udev database.\n\n" + " -h --help Print this message\n" + " --version Print version of the program\n" + " -q --query=TYPE Query device information:\n" + " name Name of device node\n" + " symlink Pointing to node\n" + " path sysfs device path\n" + " property The device properties\n" + " all All values\n" + " -p --path=SYSPATH sysfs device path used for query or attribute walk\n" + " -n --name=NAME Node or symlink name used for query or attribute walk\n" + " -r --root Prepend dev directory to path names\n" + " -a --attribute-walk Print all key matches walking along the chain\n" + " of parent devices\n" + " -d --device-id-of-file=FILE Print major:minor of device containing this file\n" + " -x --export Export key/value pairs\n" + " -P --export-prefix Export the key name with a prefix\n" + " -e --export-db Export the content of the udev database\n" + " -c --cleanup-db Clean up the udev database\n" + , program_invocation_short_name); } static int uinfo(struct udev *udev, int argc, char *argv[]) { @@ -312,27 +309,6 @@ static int uinfo(struct udev *udev, int argc, char *argv[]) { {} }; - static const char *usage = - "Usage: udevadm info [OPTIONS] [DEVPATH|FILE]\n" - " -q,--query=TYPE query device information:\n" - " name name of device node\n" - " symlink pointing to node\n" - " path sys device path\n" - " property the device properties\n" - " all all values\n" - " -p,--path=SYSPATH sys device path used for query or attribute walk\n" - " -n,--name=NAME node or symlink name used for query or attribute walk\n" - " -r,--root prepend dev directory to path names\n" - " -a,--attribute-walk print all key matches walking along the chain\n" - " of parent devices\n" - " -d,--device-id-of-file=FILE print major:minor of device containing this file\n" - " -x,--export export key/value pairs\n" - " -P,--export-prefix export the key name with a prefix\n" - " -e,--export-db export the content of the udev database\n" - " -c,--cleanup-db cleanup the udev database\n" - " --version print version of the program\n" - " -h,--help print this message\n"; - enum action_type { ACTION_QUERY, ACTION_ATTRIBUTE_WALK, @@ -417,7 +393,7 @@ static int uinfo(struct udev *udev, int argc, char *argv[]) { printf("%s\n", UDEV_VERSION); return 0; case 'h': - printf("%s\n", usage); + help(); return 0; default: return 1; @@ -427,7 +403,7 @@ static int uinfo(struct udev *udev, int argc, char *argv[]) { case ACTION_QUERY: if (!device) { if (!argv[optind]) { - fprintf(stderr, "%s\n", usage); + help(); return 2; } device = find_device(udev, argv[optind], NULL); @@ -518,5 +494,5 @@ static int uinfo(struct udev *udev, int argc, char *argv[]) { const struct udevadm_cmd udevadm_info = { .name = "info", .cmd = uinfo, - .help = "query sysfs or the udev database", + .help = "Query sysfs or the udev database", }; diff --git a/src/udev/udevadm-monitor.c b/src/udev/udevadm-monitor.c index e776fb99dc..15ded09339 100644 --- a/src/udev/udevadm-monitor.c +++ b/src/udev/udevadm-monitor.c @@ -64,13 +64,16 @@ static void print_device(struct udev_device *device, const char *source, int pro } static void help(void) { - printf("Usage: udevadm monitor [--property] [--kernel] [--udev] [--help]\n" - " -p,--property print the event properties\n" - " -k,--kernel print kernel uevents\n" - " -u,--udev print udev events\n" - " -s,--subsystem-match=SUBSYSTEM[/DEVTYPE] filter events by subsystem\n" - " -t,--tag-match=TAG filter events by tag\n" - " -h,--help\n\n"); + printf("%s monitor [--property] [--kernel] [--udev] [--help]\n\n" + "Listen to kernel and udev events.\n\n" + " -h --help Show this help\n" + " --version Show package version\n" + " -p --property Print the event properties\n" + " -k --kernel Print kernel uevents\n" + " -u --udev Print udev events\n" + " -s --subsystem-match=SUBSYSTEM[/DEVTYPE] Filter events by subsystem\n" + " -t --tag-match=TAG Filter events by tag\n" + , program_invocation_short_name); } static int adm_monitor(struct udev *udev, int argc, char *argv[]) { @@ -155,7 +158,7 @@ static int adm_monitor(struct udev *udev, int argc, char *argv[]) { fd_ep = epoll_create1(EPOLL_CLOEXEC); if (fd_ep < 0) { - log_error("error creating epoll fd: %m"); + log_error_errno(errno, "error creating epoll fd: %m"); return 1; } @@ -195,7 +198,7 @@ static int adm_monitor(struct udev *udev, int argc, char *argv[]) { ep_udev.events = EPOLLIN; ep_udev.data.fd = fd_udev; if (epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_udev, &ep_udev) < 0) { - log_error("fail to add fd to epoll: %m"); + log_error_errno(errno, "fail to add fd to epoll: %m"); return 2; } @@ -229,7 +232,7 @@ static int adm_monitor(struct udev *udev, int argc, char *argv[]) { ep_kernel.events = EPOLLIN; ep_kernel.data.fd = fd_kernel; if (epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_kernel, &ep_kernel) < 0) { - log_error("fail to add fd to epoll: %m"); + log_error_errno(errno, "fail to add fd to epoll: %m"); return 5; } @@ -276,5 +279,5 @@ static int adm_monitor(struct udev *udev, int argc, char *argv[]) { const struct udevadm_cmd udevadm_monitor = { .name = "monitor", .cmd = adm_monitor, - .help = "listen to kernel and udev events", + .help = "Listen to kernel and udev events", }; diff --git a/src/udev/udevadm-settle.c b/src/udev/udevadm-settle.c index 0a8f535c4a..fff5de7a8b 100644 --- a/src/udev/udevadm-settle.c +++ b/src/udev/udevadm-settle.c @@ -37,20 +37,23 @@ #include "util.h" static void help(void) { - printf("Usage: udevadm settle OPTIONS\n" - " -t,--timeout=<seconds> maximum time to wait for events\n" - " -E,--exit-if-exists=<file> stop waiting if file exists\n" - " -h,--help\n\n"); + printf("%s settle OPTIONS\n\n" + "Wait for pending udev events.\n\n" + " -h --help Show this help\n" + " --version Show package version\n" + " -t --timeout=SECONDS Maximum time to wait for events\n" + " -E --exit-if-exists=FILE Stop waiting if file exists\n" + , program_invocation_short_name); } static int adm_settle(struct udev *udev, int argc, char *argv[]) { static const struct option options[] = { - { "seq-start", required_argument, NULL, '\0' }, /* removed */ - { "seq-end", required_argument, NULL, '\0' }, /* removed */ { "timeout", required_argument, NULL, 't' }, { "exit-if-exists", required_argument, NULL, 'E' }, - { "quiet", no_argument, NULL, 'q' }, /* removed */ { "help", no_argument, NULL, 'h' }, + { "seq-start", required_argument, NULL, 's' }, /* removed */ + { "seq-end", required_argument, NULL, 'e' }, /* removed */ + { "quiet", no_argument, NULL, 'q' }, /* removed */ {} }; const char *exists = NULL; @@ -60,8 +63,9 @@ static int adm_settle(struct udev *udev, int argc, char *argv[]) { struct udev_queue *queue; int rc = EXIT_FAILURE; - while ((c = getopt_long(argc, argv, "s:e:t:E:qh", options, NULL)) >= 0) { + while ((c = getopt_long(argc, argv, "t:E:hs:e:q", options, NULL)) >= 0) { switch (c) { + case 't': { int r; @@ -73,14 +77,24 @@ static int adm_settle(struct udev *udev, int argc, char *argv[]) { }; break; } + case 'E': exists = optarg; break; + case 'h': help(); return EXIT_SUCCESS; + + case 's': + case 'e': + case 'q': + log_info("Option -%c no longer supported.", c); + return EXIT_FAILURE; + case '?': return EXIT_FAILURE; + default: assert_not_reached("Unknown argument"); } @@ -145,5 +159,5 @@ out: const struct udevadm_cmd udevadm_settle = { .name = "settle", .cmd = adm_settle, - .help = "wait for pending udev events", + .help = "Wait for pending udev events", }; diff --git a/src/udev/udevadm-test-builtin.c b/src/udev/udevadm-test-builtin.c index f25608c486..baaeca9352 100644 --- a/src/udev/udevadm-test-builtin.c +++ b/src/udev/udevadm-test-builtin.c @@ -34,10 +34,14 @@ #include "udev.h" static void help(struct udev *udev) { - fprintf(stderr, "\n"); - fprintf(stderr, "Usage: udevadm builtin [--help] COMMAND SYSPATH\n"); + printf("%s builtin [--help] COMMAND SYSPATH\n\n" + "Test a built-in command.\n\n" + " -h --help Print this message\n" + " --version Print version of the program\n\n" + "Commands:\n" + , program_invocation_short_name); + udev_builtin_list(udev); - fprintf(stderr, "\n"); } static int adm_builtin(struct udev *udev, int argc, char *argv[]) { @@ -112,6 +116,6 @@ out: const struct udevadm_cmd udevadm_test_builtin = { .name = "test-builtin", .cmd = adm_builtin, - .help = "test a built-in command", + .help = "Test a built-in command", .debug = true, }; diff --git a/src/udev/udevadm-test.c b/src/udev/udevadm-test.c index 4738b611c3..4922b5b6ac 100644 --- a/src/udev/udevadm-test.c +++ b/src/udev/udevadm-test.c @@ -31,6 +31,17 @@ #include "udev.h" #include "udev-util.h" +static void help(void) { + + printf("%s test OPTIONS <syspath>\n\n" + "Test an event run.\n" + " -h --help Show this help\n" + " --version Show package version\n" + " -a --action=ACTION Set action string\n" + " -N --resolve-names=early|late|never When to resolve names\n" + , program_invocation_short_name); +} + static int adm_test(struct udev *udev, int argc, char *argv[]) { int resolve_names = 1; char filename[UTIL_PATH_SIZE]; @@ -71,11 +82,7 @@ static int adm_test(struct udev *udev, int argc, char *argv[]) { } break; case 'h': - printf("Usage: udevadm test OPTIONS <syspath>\n" - " -a,--action=ACTION set action string\n" - " -N,--resolve-names=early|late|never when to resolve names\n" - " -h,--help print this help string\n" - "\n"); + help(); exit(EXIT_SUCCESS); case '?': exit(EXIT_FAILURE); @@ -136,7 +143,11 @@ static int adm_test(struct udev *udev, int argc, char *argv[]) { goto out; } - udev_event_execute_rules(event, 60 * USEC_PER_SEC, 20 * USEC_PER_SEC, rules, &sigmask_orig); + udev_event_execute_rules(event, + 60 * USEC_PER_SEC, 20 * USEC_PER_SEC, + NULL, + rules, + &sigmask_orig); udev_list_entry_foreach(entry, udev_device_get_properties_list_entry(dev)) printf("%s=%s\n", udev_list_entry_get_name(entry), udev_list_entry_get_value(entry)); @@ -157,6 +168,6 @@ out: const struct udevadm_cmd udevadm_test = { .name = "test", .cmd = adm_test, - .help = "test an event run", + .help = "Test an event run", .debug = true, }; diff --git a/src/udev/udevadm-trigger.c b/src/udev/udevadm-trigger.c index a52d1b5ad5..4dc756a28b 100644 --- a/src/udev/udevadm-trigger.c +++ b/src/udev/udevadm-trigger.c @@ -32,6 +32,7 @@ #include "udev.h" #include "udev-util.h" +#include "udevadm-util.h" #include "util.h" static int verbose; @@ -53,7 +54,7 @@ static void exec_list(struct udev_enumerate *udev_enumerate, const char *action) if (fd < 0) continue; if (write(fd, action, strlen(action)) < 0) - log_debug("error writing '%s' to '%s': %m", action, filename); + log_debug_errno(errno, "error writing '%s' to '%s': %m", action, filename); close(fd); } } @@ -72,39 +73,48 @@ static const char *keyval(const char *str, const char **val, char *buf, size_t s } static void help(void) { - printf("Usage: udevadm trigger OPTIONS\n" - " -v,--verbose print the list of devices while running\n" - " -n,--dry-run do not actually trigger the events\n" - " -t,--type= type of events to trigger\n" - " devices sys devices (default)\n" - " subsystems sys subsystems and drivers\n" - " -c,--action=<action> event action value, default is \"change\"\n" - " -s,--subsystem-match=<subsystem> trigger devices from a matching subsystem\n" - " -S,--subsystem-nomatch=<subsystem> exclude devices from a matching subsystem\n" - " -a,--attr-match=<file[=<value>]> trigger devices with a matching attribute\n" - " -A,--attr-nomatch=<file[=<value>]> exclude devices with a matching attribute\n" - " -p,--property-match=<key>=<value> trigger devices with a matching property\n" - " -g,--tag-match=<key>=<value> trigger devices with a matching property\n" - " -y,--sysname-match=<name> trigger devices with a matching name\n" - " -b,--parent-match=<name> trigger devices with that parent device\n" - " -h,--help\n\n"); + printf("%s trigger OPTIONS\n\n" + "Request events from the kernel.\n\n" + " -h --help Show this help\n" + " --version Show package version\n" + " -v --verbose Print the list of devices while running\n" + " -n --dry-run Do not actually trigger the events\n" + " -t --type= Type of events to trigger\n" + " devices sysfs devices (default)\n" + " subsystems sysfs subsystems and drivers\n" + " -c --action=ACTION Event action value, default is \"change\"\n" + " -s --subsystem-match=SUBSYSTEM Trigger devices from a matching subsystem\n" + " -S --subsystem-nomatch=SUBSYSTEM Exclude devices from a matching subsystem\n" + " -a --attr-match=FILE[=VALUE] Trigger devices with a matching attribute\n" + " -A --attr-nomatch=FILE[=VALUE] Exclude devices with a matching attribute\n" + " -p --property-match=KEY=VALUE Trigger devices with a matching property\n" + " -g --tag-match=KEY=VALUE Trigger devices with a matching property\n" + " -y --sysname-match=NAME Trigger devices with this /sys path\n" + " --name-match=NAME Trigger devices with this /dev name\n" + " -b --parent-match=NAME Trigger devices with that parent device\n" + , program_invocation_short_name); } static int adm_trigger(struct udev *udev, int argc, char *argv[]) { + enum { + ARG_NAME = 0x100, + }; + static const struct option options[] = { - { "verbose", no_argument, NULL, 'v' }, - { "dry-run", no_argument, NULL, 'n' }, - { "type", required_argument, NULL, 't' }, - { "action", required_argument, NULL, 'c' }, - { "subsystem-match", required_argument, NULL, 's' }, - { "subsystem-nomatch", required_argument, NULL, 'S' }, - { "attr-match", required_argument, NULL, 'a' }, - { "attr-nomatch", required_argument, NULL, 'A' }, - { "property-match", required_argument, NULL, 'p' }, - { "tag-match", required_argument, NULL, 'g' }, - { "sysname-match", required_argument, NULL, 'y' }, - { "parent-match", required_argument, NULL, 'b' }, - { "help", no_argument, NULL, 'h' }, + { "verbose", no_argument, NULL, 'v' }, + { "dry-run", no_argument, NULL, 'n' }, + { "type", required_argument, NULL, 't' }, + { "action", required_argument, NULL, 'c' }, + { "subsystem-match", required_argument, NULL, 's' }, + { "subsystem-nomatch", required_argument, NULL, 'S' }, + { "attr-match", required_argument, NULL, 'a' }, + { "attr-nomatch", required_argument, NULL, 'A' }, + { "property-match", required_argument, NULL, 'p' }, + { "tag-match", required_argument, NULL, 'g' }, + { "sysname-match", required_argument, NULL, 'y' }, + { "name-match", required_argument, NULL, ARG_NAME }, + { "parent-match", required_argument, NULL, 'b' }, + { "help", no_argument, NULL, 'h' }, {} }; enum { @@ -174,25 +184,31 @@ static int adm_trigger(struct udev *udev, int argc, char *argv[]) { udev_enumerate_add_match_sysname(udev_enumerate, optarg); break; case 'b': { - char path[UTIL_PATH_SIZE]; - struct udev_device *dev; - - /* add sys dir if needed */ - if (!startswith(optarg, "/sys")) - strscpyl(path, sizeof(path), "/sys", optarg, NULL); - else - strscpy(path, sizeof(path), optarg); - util_remove_trailing_chars(path, '/'); - dev = udev_device_new_from_syspath(udev, path); + _cleanup_udev_device_unref_ struct udev_device *dev; + + dev = find_device(udev, optarg, "/sys"); + if (dev == NULL) { + log_error("unable to open the device '%s'", optarg); + return 2; + } + + udev_enumerate_add_match_parent(udev_enumerate, dev); + break; + } + + case ARG_NAME: { + _cleanup_udev_device_unref_ struct udev_device *dev; + + dev = find_device(udev, optarg, "/dev/"); if (dev == NULL) { log_error("unable to open the device '%s'", optarg); return 2; } + udev_enumerate_add_match_parent(udev_enumerate, dev); - /* drop reference immediately, enumerate pins the device as long as needed */ - udev_device_unref(dev); break; } + case 'h': help(); return 0; @@ -203,9 +219,16 @@ static int adm_trigger(struct udev *udev, int argc, char *argv[]) { } } - if (optind < argc) { - fprintf(stderr, "Extraneous argument: '%s'\n", argv[optind]); - return 1; + for (; optind < argc; optind++) { + _cleanup_udev_device_unref_ struct udev_device *dev; + + dev = find_device(udev, argv[optind], NULL); + if (dev == NULL) { + log_error("unable to open the device '%s'", argv[optind]); + return 2; + } + + udev_enumerate_add_match_parent(udev_enumerate, dev); } switch (device_type) { @@ -225,5 +248,5 @@ static int adm_trigger(struct udev *udev, int argc, char *argv[]) { const struct udevadm_cmd udevadm_trigger = { .name = "trigger", .cmd = adm_trigger, - .help = "request events from the kernel", + .help = "Request events from the kernel", }; diff --git a/src/udev/udevadm-util.c b/src/udev/udevadm-util.c new file mode 100644 index 0000000000..37e80c31df --- /dev/null +++ b/src/udev/udevadm-util.c @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2008-2009 Kay Sievers <kay@vrfy.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "udevadm-util.h" + +struct udev_device *find_device(struct udev *udev, + const char *id, + const char *prefix) { + + assert(udev); + assert(id); + + if (prefix && !startswith(id, prefix)) + id = strappenda(prefix, id); + + if (startswith(id, "/dev/")) { + struct stat statbuf; + char type; + + if (stat(id, &statbuf) < 0) + return NULL; + + if (S_ISBLK(statbuf.st_mode)) + type = 'b'; + else if (S_ISCHR(statbuf.st_mode)) + type = 'c'; + else + return NULL; + + return udev_device_new_from_devnum(udev, type, statbuf.st_rdev); + } else if (startswith(id, "/sys/")) + return udev_device_new_from_syspath(udev, id); + else + return NULL; +} diff --git a/src/udev/udevadm-util.h b/src/udev/udevadm-util.h new file mode 100644 index 0000000000..dba651fddb --- /dev/null +++ b/src/udev/udevadm-util.h @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2014 Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "udev.h" + +struct udev_device *find_device(struct udev *udev, + const char *id, + const char *prefix); diff --git a/src/udev/udevadm.c b/src/udev/udevadm.c index fda5aecd83..3e57cf6dee 100644 --- a/src/udev/udevadm.c +++ b/src/udev/udevadm.c @@ -26,12 +26,6 @@ #include "udev.h" -void udev_main_log(struct udev *udev, int priority, - const char *file, int line, const char *fn, - const char *format, va_list args) { - log_metav(priority, file, line, fn, format, args); -} - static int adm_version(struct udev *udev, int argc, char *argv[]) { printf("%s\n", UDEV_VERSION); return 0; @@ -65,11 +59,14 @@ static const struct udevadm_cmd *udevadm_cmds[] = { static int adm_help(struct udev *udev, int argc, char *argv[]) { unsigned int i; - fprintf(stderr, "Usage: udevadm [--help] [--version] [--debug] COMMAND [COMMAND OPTIONS]\n"); + printf("%s [--help] [--version] [--debug] COMMAND [COMMAND OPTIONS]\n\n" + "Send control commands or test the device manager.\n\n" + "Commands:\n" + , program_invocation_short_name); + for (i = 0; i < ELEMENTSOF(udevadm_cmds); i++) if (udevadm_cmds[i]->help != NULL) - printf(" %-12s %s\n", udevadm_cmds[i]->name, udevadm_cmds[i]->help); - fprintf(stderr, "\n"); + printf(" %-12s %s\n", udevadm_cmds[i]->name, udevadm_cmds[i]->help); return 0; } @@ -97,7 +94,6 @@ int main(int argc, char *argv[]) { goto out; log_open(); - udev_set_log_fn(udev, udev_main_log); mac_selinux_init("/dev"); while ((c = getopt_long(argc, argv, "+dhV", options, NULL)) >= 0) @@ -105,7 +101,6 @@ int main(int argc, char *argv[]) { case 'd': log_set_max_level(LOG_DEBUG); - udev_set_log_priority(udev, LOG_DEBUG); break; case 'h': diff --git a/src/udev/udevd.c b/src/udev/udevd.c index a74906aa62..e835bef8df 100644 --- a/src/udev/udevd.c +++ b/src/udev/udevd.c @@ -53,12 +53,6 @@ #include "dev-setup.h" #include "fileio.h" -void udev_main_log(struct udev *udev, int priority, - const char *file, int line, const char *fn, - const char *format, va_list args) { - log_metav(priority, file, line, fn, format, args); -} - static struct udev_rules *rules; static struct udev_ctrl *udev_ctrl; static struct udev_monitor *monitor; @@ -80,6 +74,7 @@ static sigset_t sigmask_orig; static UDEV_LIST(event_list); static UDEV_LIST(worker_list); static char *udev_cgroup; +static struct udev_list properties_list; static bool udev_exit; enum event_state { @@ -223,14 +218,14 @@ static void worker_new(struct event *event) { sigfillset(&mask); fd_signal = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC); if (fd_signal < 0) { - log_error("error creating signalfd %m"); + log_error_errno(errno, "error creating signalfd %m"); rc = 2; goto out; } fd_ep = epoll_create1(EPOLL_CLOEXEC); if (fd_ep < 0) { - log_error("error creating epoll fd: %m"); + log_error_errno(errno, "error creating epoll fd: %m"); rc = 3; goto out; } @@ -246,7 +241,7 @@ static void worker_new(struct event *event) { if (epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_signal, &ep_signal) < 0 || epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_monitor, &ep_monitor) < 0) { - log_error("fail to add fds to epoll: %m"); + log_error_errno(errno, "fail to add fds to epoll: %m"); rc = 4; goto out; } @@ -296,7 +291,7 @@ static void worker_new(struct event *event) { if (d) { fd_lock = open(udev_device_get_devnode(d), O_RDONLY|O_CLOEXEC|O_NOFOLLOW|O_NONBLOCK); if (fd_lock >= 0 && flock(fd_lock, LOCK_SH|LOCK_NB) < 0) { - log_debug("Unable to flock(%s), skipping event handling: %m", udev_device_get_devnode(d)); + log_debug_errno(errno, "Unable to flock(%s), skipping event handling: %m", udev_device_get_devnode(d)); err = -EWOULDBLOCK; fd_lock = safe_close(fd_lock); goto skip; @@ -305,9 +300,15 @@ static void worker_new(struct event *event) { } /* apply rules, create node, symlinks */ - udev_event_execute_rules(udev_event, arg_event_timeout_usec, arg_event_timeout_warn_usec, rules, &sigmask_orig); + udev_event_execute_rules(udev_event, + arg_event_timeout_usec, arg_event_timeout_warn_usec, + &properties_list, + rules, + &sigmask_orig); - udev_event_execute_run(udev_event, arg_event_timeout_usec, arg_event_timeout_warn_usec, &sigmask_orig); + udev_event_execute_run(udev_event, + arg_event_timeout_usec, arg_event_timeout_warn_usec, + &sigmask_orig); /* apply/restore inotify watch */ if (udev_event->inotify_watch) { @@ -349,7 +350,7 @@ skip: if (fdcount < 0) { if (errno == EINTR) continue; - log_error("failed to poll: %m"); + log_error_errno(errno, "failed to poll: %m"); goto out; } @@ -389,7 +390,7 @@ out: udev_monitor_unref(worker_monitor); event->state = EVENT_QUEUED; free(worker); - log_error("fork of child failed: %m"); + log_error_errno(errno, "fork of child failed: %m"); break; default: /* close monitor, but keep address around */ @@ -420,7 +421,7 @@ static void event_run(struct event *event) { count = udev_monitor_send_device(monitor, worker->monitor, event->dev); if (count < 0) { - log_error("worker [%u] did not accept message %zi (%m), kill it", worker->pid, count); + log_error_errno(errno, "worker [%u] did not accept message %zi (%m), kill it", worker->pid, count); kill(worker->pid, SIGKILL); worker->state = WORKER_KILLED; continue; @@ -636,7 +637,6 @@ static struct udev_ctrl_connection *handle_ctrl_msg(struct udev_ctrl *uctrl) { if (i >= 0) { log_debug("udevd message (SET_LOG_LEVEL) received, log_priority=%i", i); log_set_max_level(i); - udev_set_log_priority(udev, i); worker_kill(udev); } @@ -669,10 +669,10 @@ static struct udev_ctrl_connection *handle_ctrl_msg(struct udev_ctrl *uctrl) { val = &val[1]; if (val[0] == '\0') { log_debug("udevd message (ENV) received, unset '%s'", key); - udev_add_property(udev, key, NULL); + udev_list_entry_add(&properties_list, key, NULL); } else { log_debug("udevd message (ENV) received, set '%s=%s'", key, val); - udev_add_property(udev, key, val); + udev_list_entry_add(&properties_list, key, val); } } else { log_error("wrong key format '%s'", key); @@ -807,41 +807,34 @@ static int synthesize_change(struct udev_device *dev) { } static int handle_inotify(struct udev *udev) { - int nbytes, pos; - char *buf; - struct inotify_event *ev; - int r; + union inotify_event_buffer buffer; + struct inotify_event *e; + ssize_t l; - r = ioctl(fd_inotify, FIONREAD, &nbytes); - if (r < 0 || nbytes <= 0) - return -errno; + l = read(fd_inotify, &buffer, sizeof(buffer)); + if (l < 0) { + if (errno == EAGAIN || errno == EINTR) + return 0; - buf = malloc(nbytes); - if (!buf) { - log_error("error getting buffer for inotify"); - return -ENOMEM; + return log_error_errno(errno, "Failed to read inotify fd: %m"); } - nbytes = read(fd_inotify, buf, nbytes); - - for (pos = 0; pos < nbytes; pos += sizeof(struct inotify_event) + ev->len) { + FOREACH_INOTIFY_EVENT(e, buffer, l) { struct udev_device *dev; - ev = (struct inotify_event *)(buf + pos); - dev = udev_watch_lookup(udev, ev->wd); + dev = udev_watch_lookup(udev, e->wd); if (!dev) continue; - log_debug("inotify event: %x for %s", ev->mask, udev_device_get_devnode(dev)); - if (ev->mask & IN_CLOSE_WRITE) + log_debug("inotify event: %x for %s", e->mask, udev_device_get_devnode(dev)); + if (e->mask & IN_CLOSE_WRITE) synthesize_change(dev); - else if (ev->mask & IN_IGNORED) + else if (e->mask & IN_IGNORED) udev_watch_end(udev, dev); udev_device_unref(dev); } - free(buf); return 0; } @@ -966,7 +959,7 @@ static void static_dev_create_from_modules(struct udev *udev) { strscpyl(filename, sizeof(filename), "/dev/", devname, NULL); mkdir_parents_label(filename, 0755); mac_selinux_create_file_prepare(filename, mode); - log_debug("mknod '%s' %c%u:%u\n", filename, type, maj, min); + log_debug("mknod '%s' %c%u:%u", filename, type, maj, min); if (mknod(filename, mode, makedev(maj, min)) < 0 && errno == EEXIST) utimensat(AT_FDCWD, filename, NULL, 0); mac_selinux_create_file_clear(); @@ -976,7 +969,7 @@ static void static_dev_create_from_modules(struct udev *udev) { } /* - * read the kernel commandline, in case we need to get into debug mode + * read the kernel command line, in case we need to get into debug mode * udev.log-priority=<level> syslog priority * udev.children-max=<number of workers> events are fully serialized if set to 1 * udev.exec-delay=<number of seconds> delay execution of every executed program @@ -988,13 +981,13 @@ static void kernel_cmdline_options(struct udev *udev) { int r; r = proc_cmdline(&line); - if (r < 0) - log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r)); - if (r <= 0) + if (r < 0) { + log_warning_errno(r, "Failed to read /proc/cmdline, ignoring: %m"); return; + } FOREACH_WORD_QUOTED(word, l, line, state) { - char *s, *opt; + char *s, *opt, *value; s = strndup(word, l); if (!s) @@ -1006,24 +999,23 @@ static void kernel_cmdline_options(struct udev *udev) { else opt = s; - if (startswith(opt, "udev.log-priority=")) { + if ((value = startswith(opt, "udev.log-priority="))) { int prio; - prio = util_log_priority(opt + 18); + prio = util_log_priority(value); log_set_max_level(prio); - udev_set_log_priority(udev, prio); - } else if (startswith(opt, "udev.children-max=")) { - r = safe_atoi(opt + 18, &arg_children_max); + } else if ((value = startswith(opt, "udev.children-max="))) { + r = safe_atoi(value, &arg_children_max); if (r < 0) - log_warning("Invalid udev.children-max ignored: %s", opt + 18); - } else if (startswith(opt, "udev.exec-delay=")) { - r = safe_atoi(opt + 16, &arg_exec_delay); + log_warning("Invalid udev.children-max ignored: %s", value); + } else if ((value = startswith(opt, "udev.exec-delay="))) { + r = safe_atoi(value, &arg_exec_delay); if (r < 0) - log_warning("Invalid udev.exec-delay ignored: %s", opt + 16); - } else if (startswith(opt, "udev.event-timeout=")) { - r = safe_atou64(opt + 16, &arg_event_timeout_usec); + log_warning("Invalid udev.exec-delay ignored: %s", value); + } else if ((value = startswith(opt, "udev.event-timeout="))) { + r = safe_atou64(value, &arg_event_timeout_usec); if (r < 0) { - log_warning("Invalid udev.event-timeout ignored: %s", opt + 16); + log_warning("Invalid udev.event-timeout ignored: %s", value); break; } arg_event_timeout_usec *= USEC_PER_SEC; @@ -1037,14 +1029,15 @@ static void kernel_cmdline_options(struct udev *udev) { static void help(void) { printf("%s [OPTIONS...]\n\n" "Manages devices.\n\n" - " --daemon\n" - " --debug\n" - " --children-max=<maximum number of workers>\n" - " --exec-delay=<seconds to wait before executing RUN=>\n" - " --event-timeout=<seconds to wait before terminating an event>\n" - " --resolve-names=early|late|never\n" - " --version\n" - " --help\n" + " -h --help Print this message\n" + " --version Print version of the program\n" + " --daemon Detach and run in the background\n" + " --debug Enable debug output\n" + " --children-max=INT Set maximum number of workers\n" + " --exec-delay=SECONDS Seconds to wait before executing RUN=\n" + " --event-timeout=SECONDS Seconds to wait before terminating an event\n" + " --resolve-names=early|late|never\n" + " When to resolve users and groups\n" , program_invocation_short_name); } @@ -1146,19 +1139,14 @@ int main(int argc, char *argv[]) { log_set_target(LOG_TARGET_AUTO); log_open(); - udev_set_log_fn(udev, udev_main_log); - log_set_max_level(udev_get_log_priority(udev)); - r = parse_argv(argc, argv); if (r <= 0) goto exit; kernel_cmdline_options(udev); - if (arg_debug) { + if (arg_debug) log_set_max_level(LOG_DEBUG); - udev_set_log_priority(udev, LOG_DEBUG); - } if (getuid() != 0) { log_error("root privileges required"); @@ -1167,22 +1155,24 @@ int main(int argc, char *argv[]) { r = mac_selinux_init("/dev"); if (r < 0) { - log_error("could not initialize labelling: %s", strerror(-r)); + log_error_errno(r, "could not initialize labelling: %m"); goto exit; } /* set umask before creating any file/directory */ r = chdir("/"); if (r < 0) { - log_error("could not change dir to /: %m"); + log_error_errno(errno, "could not change dir to /: %m"); goto exit; } umask(022); + udev_list_init(udev, &properties_list, true); + r = mkdir("/run/udev", 0755); if (r < 0 && errno != EEXIST) { - log_error("could not create /run/udev: %m"); + log_error_errno(errno, "could not create /run/udev: %m"); goto exit; } @@ -1237,7 +1227,7 @@ int main(int argc, char *argv[]) { udev_monitor_set_receive_buffer_size(monitor, 128 * 1024 * 1024); - log_info("starting version " VERSION "\n"); + log_info("starting version " VERSION); udev_builtin_init(udev); @@ -1249,7 +1239,7 @@ int main(int argc, char *argv[]) { rc = udev_rules_apply_static_dev_perms(rules); if (rc < 0) - log_error("failed to apply permissions on static device nodes - %s", strerror(-rc)); + log_error_errno(rc, "failed to apply permissions on static device nodes - %m"); if (arg_daemonize) { pid_t pid; @@ -1259,7 +1249,7 @@ int main(int argc, char *argv[]) { case 0: break; case -1: - log_error("fork of daemon failed: %m"); + log_error_errno(errno, "fork of daemon failed: %m"); rc = 4; goto exit; default: @@ -1332,7 +1322,7 @@ int main(int argc, char *argv[]) { fd_ep = epoll_create1(EPOLL_CLOEXEC); if (fd_ep < 0) { - log_error("error creating epoll fd: %m"); + log_error_errno(errno, "error creating epoll fd: %m"); goto exit; } if (epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_ctrl, &ep_ctrl) < 0 || @@ -1340,7 +1330,7 @@ int main(int argc, char *argv[]) { epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_signal, &ep_signal) < 0 || epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_netlink, &ep_netlink) < 0 || epoll_ctl(fd_ep, EPOLL_CTL_ADD, fd_worker, &ep_worker) < 0) { - log_error("fail to add fds to epoll: %m"); + log_error_errno(errno, "fail to add fds to epoll: %m"); goto exit; } diff --git a/src/v4l_id/Makefile.am b/src/v4l_id/Makefile.am index 074417f909..6ca3da1146 100644 --- a/src/v4l_id/Makefile.am +++ b/src/v4l_id/Makefile.am @@ -1,5 +1,8 @@ ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} +AM_CPPFLAGS = \ + -I $(top_srcdir)/src/shared + udevlibexec_PROGRAMS = \ v4l_id diff --git a/src/v4l_id/v4l_id.c b/src/v4l_id/v4l_id.c index d5463b27e5..0e3d3003cb 100644 --- a/src/v4l_id/v4l_id.c +++ b/src/v4l_id/v4l_id.c @@ -13,6 +13,10 @@ * General Public License for more details: */ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE 1 +#endif + #include <stdio.h> #include <errno.h> #include <string.h> @@ -26,17 +30,18 @@ #include <sys/ioctl.h> #include <linux/videodev2.h> -int main (int argc, char *argv[]) -{ +#include "util.h" + +int main(int argc, char *argv[]) { static const struct option options[] = { { "help", no_argument, NULL, 'h' }, {} }; - int fd; + _cleanup_close_ int fd = -1; char *device; struct v4l2_capability v2cap; - while (1) { + for (;;) { int option; option = getopt_long(argc, argv, "h", options, NULL); @@ -45,7 +50,10 @@ int main (int argc, char *argv[]) switch (option) { case 'h': - printf("Usage: v4l_id [--help] <device file>\n\n"); + printf("%s [-h,--help] <device file>\n\n" + "Video4Linux device identification.\n\n" + " -h Print this message\n" + , program_invocation_short_name); return 0; default: return 1; @@ -55,11 +63,11 @@ int main (int argc, char *argv[]) if (device == NULL) return 2; - fd = open (device, O_RDONLY); + fd = open(device, O_RDONLY); if (fd < 0) return 3; - if (ioctl (fd, VIDIOC_QUERYCAP, &v2cap) == 0) { + if (ioctl(fd, VIDIOC_QUERYCAP, &v2cap) == 0) { printf("ID_V4L_VERSION=2\n"); printf("ID_V4L_PRODUCT=%s\n", v2cap.card); printf("ID_V4L_CAPABILITIES=:"); @@ -78,6 +86,5 @@ int main (int argc, char *argv[]) printf("\n"); } - close (fd); return 0; } diff --git a/test/test-udev.c b/test/test-udev.c index d07962c285..b59a7969ad 100644 --- a/test/test-udev.c +++ b/test/test-udev.c @@ -46,10 +46,6 @@ static inline int unshare (int x) { return syscall(SYS_unshare, x); } #include <linux/sched.h> #endif -void udev_main_log(struct udev *udev, int priority, - const char *file, int line, const char *fn, - const char *format, va_list args) {} - static int fake_filesystems(void) { static const struct fakefs { const char *src; @@ -164,8 +160,14 @@ int main(int argc, char *argv[]) { } } - udev_event_execute_rules(event, 3 * USEC_PER_SEC, USEC_PER_SEC, rules, &sigmask_orig); - udev_event_execute_run(event, 3 * USEC_PER_SEC, USEC_PER_SEC, NULL); + udev_event_execute_rules(event, + 3 * USEC_PER_SEC, USEC_PER_SEC, + NULL, + rules, + &sigmask_orig); + udev_event_execute_run(event, + 3 * USEC_PER_SEC, USEC_PER_SEC, + NULL); out: if (event != NULL && event->fd_signal >= 0) close(event->fd_signal); diff --git a/test/test-utf8.c b/test/test-utf8.c index bd8ca86834..2f0a95f1c0 100644 --- a/test/test-utf8.c +++ b/test/test-utf8.c @@ -44,10 +44,23 @@ static void test_utf8_encoded_valid_unichar(void) { } +static void test_utf16_to_utf8(void) { + char *a = NULL; + const uint16_t utf16[] = { 'a', 0xd800, 'b', 0xdc00, 'c', 0xd801, 0xdc37 }; + const char utf8[] = { 'a', 'b', 'c', 0xf0, 0x90, 0x90, 0xb7, 0 }; + + a = utf16_to_utf8(utf16, 14); + assert_se(a); + assert_se(streq(a, utf8)); + + free(a); +} + int main(int argc, char *argv[]) { test_utf8_is_printable(); test_ascii_is_valid(); test_utf8_encoded_valid_unichar(); + test_utf16_to_utf8(); return 0; } |