New upstream version 244.2

This commit is contained in:
Michael Biebl 2020-02-07 17:37:04 +01:00
parent 763f54adb3
commit 97e5042fa2
133 changed files with 7284 additions and 1337 deletions

4
README
View File

@ -174,7 +174,9 @@ REQUIREMENTS:
dependencies:
util-linux >= v2.27.1 required
dbus >= 1.11.0 (strictly speaking optional, but recommended)
dbus >= 1.4.0 (strictly speaking optional, but recommended)
NOTE: If using dbus < 1.9.18, you should override the default
policy directory (--with-dbuspolicydir=/etc/dbus-1/system.d).
dracut (optional)
polkit (optional)

3
TODO
View File

@ -218,7 +218,7 @@ Features:
* the a-posteriori stopping of units bound to units that disappeared logic
should be reworked: there should be a queue of units, and we should only
enqeue stop jobs from a defer event that processes queue instead of
enqueue stop jobs from a defer event that processes queue instead of
right-away when we find a unit that is bound to one that doesn't exist
anymore. (similar to how the stop-unneeded queue has been reworked the same
way)
@ -1050,6 +1050,7 @@ Features:
- introduce mix of BindTo and Requisite
- add a concept of RemainAfterExit= to scope units
- Allow multiple ExecStart= for all Type= settings, so that we can cover rescue.service nicely
- add verification of [Install] section to systemd-analyze verify
* udev-link-config:
- Make sure ID_PATH is always exported and complete for

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
--- 20-acpi-vendor.hwdb.base 2019-11-29 14:29:51.816965218 +0100
+++ 20-acpi-vendor.hwdb 2019-11-29 14:29:51.821964280 +0100
--- 20-acpi-vendor.hwdb.base 2020-02-04 18:26:50.552863816 +0100
+++ 20-acpi-vendor.hwdb 2020-02-04 18:26:50.569863967 +0100
@@ -3,6 +3,8 @@
# Data imported from:
# https://uefi.org/uefi-pnp-export

File diff suppressed because it is too large Load Diff

View File

@ -57233,6 +57233,30 @@ usb:v2237*
usb:v2237p4161*
ID_MODEL_FROM_DATABASE=eReader White
usb:v224F*
ID_VENDOR_FROM_DATABASE=APDM
usb:v224Fp0001*
ID_MODEL_FROM_DATABASE=Access Point
usb:v224Fp0002*
ID_MODEL_FROM_DATABASE=Docking Station
usb:v224Fp0004*
ID_MODEL_FROM_DATABASE=V2 Opal ACM
usb:v224Fp0005*
ID_MODEL_FROM_DATABASE=V2 Opal
usb:v224Fp0006*
ID_MODEL_FROM_DATABASE=V2 Docking Station
usb:v224Fp0007*
ID_MODEL_FROM_DATABASE=V2 Access Point ACM
usb:v224Fp0008*
ID_MODEL_FROM_DATABASE=V2 Access Point
usb:v225D*
ID_VENDOR_FROM_DATABASE=Morpho

View File

@ -479,6 +479,13 @@ evdev:name:AlpsPS/2 ALPS GlidePoint:dmi:*svnLENOVO:*pvrLenovoideapadY700-14ISK*
EVDEV_ABS_35=::27
EVDEV_ABS_36=::29
# Lenovo Ideapad 310S-14ISK
evdev:name:AlpsPS/2 ALPS GlidePoint:dmi:*svnLENOVO:*pvrLenovoideapad310S-14ISK*
EVDEV_ABS_00=113:3960:37
EVDEV_ABS_01=100:1959:27
EVDEV_ABS_35=113:3960:37
EVDEV_ABS_36=100:1959:27
# Lenovo Ideapad 500S-13ISK
evdev:name:AlpsPS/2 ALPS GlidePoint:dmi:*svnLENOVO:*pvrLenovoideapad500S-13ISK*
EVDEV_ABS_00=125:3955:37
@ -514,6 +521,13 @@ evdev:name:AlpsPS/2 ALPS GlidePoint:dmi:*svnLENOVO:*pvrLenovoYoga500-14IBD*
EVDEV_ABS_35=117:3952:36
EVDEV_ABS_36=105:1960:26
# Lenovo Thinkpad T490
evdev:name:SynPS/2 Synaptics TouchPad:dmi:*:svnLENOVO:*pvrThinkPadT490:*
EVDEV_ABS_00=::57
EVDEV_ABS_01=::33
EVDEV_ABS_35=::57
EVDEV_ABS_36=::33
#########################################
# Razer
#########################################

View File

@ -207,6 +207,10 @@ evdev:atkbd:dmi:bvn*:bvr*:bd*:svnAlienware*:pn*:pvr*
KEYBOARD_KEY_c1=!prog2 #graphics amplifier, undock-button event
KEYBOARD_KEY_c2=!power #graphics amplifier, surprise undock event
# Alienware M17xR3 laptops
evdev:atkbd:dmi:bvn*:bvr*:bd*:svnAlienware*:pnM17xR3:*
KEYBOARD_KEY_89=ejectcd
###########################################################
# Asus
###########################################################

View File

@ -82,10 +82,13 @@ sensor:modalias:acpi:SMO8500:*:dmi:*Acer*:pnOneS1002*
sensor:modalias:acpi:KIOX0009*:dmi:*:svnAcer:pnOneS1003:*
ACCEL_MOUNT_MATRIX=1, 0, 0; 0, -1, 0; 0, 0, 1
sensor:modalias:acpi:BOSC0200*:dmi:*:svnAcer*:pnSwitchSW312-31:*
ACCEL_MOUNT_MATRIX=0, -1, 0; -1, 0, 0; 0, 0, 1
sensor:modalias:acpi:BOSC0200*:dmi:*svn*Acer*:*pn*Spin*SP111-33*
ACCEL_MOUNT_MATRIX=0, 1, 0; 1, 0, 0; 0, 0, 1
#########################################
# Archos
#########################################
@ -102,20 +105,14 @@ sensor:modalias:acpi:INVN6500*:dmi:*svnASUSTeK*:pnT300CHI*
ACCEL_MOUNT_MATRIX=0, -1, 0; 1, 0, 0; 0, 0, 1
sensor:modalias:acpi:INVN6500*:dmi:*svnASUSTeK*:*pnT100TA*
ACCEL_MOUNT_MATRIX=1, 0, 0; 0, -1, 0; 0, 0, 1
sensor:modalias:acpi:INVN6500*:dmi:*svnASUSTeK*:pnT200TA*
ACCEL_MOUNT_MATRIX=1, 0, 0; 0, -1, 0; 0, 0, 1
sensor:modalias:acpi:INVN6500*:dmi:*svnASUSTeK*:*pnTP201SA*
ACCEL_MOUNT_MATRIX=0, -1, 0; -1, 0, 0; 0, 0, 1
sensor:modalias:acpi:INVN6500*:dmi:*svnASUSTeK*:pn*E205SA*
ACCEL_MOUNT_MATRIX=0, -1, 0; -1, 0, 0; 0, 0, 1
sensor:modalias:acpi:INVN6500*:dmi:*svn*ASUSTeK*:*pn*TP300LA*
ACCEL_MOUNT_MATRIX=0, 1, 0; 1, 0, 0; 0, 0, 1
sensor:modalias:acpi:INVN6500*:dmi:*svn*ASUSTeK*:*pn*TP300LD*
ACCEL_MOUNT_MATRIX=0, 1, 0; 1, 0, 0; 0, 0, 1
@ -128,6 +125,7 @@ sensor:modalias:acpi:KXJ2109*:dmi:*:svnASUSTeK*:pnME176C*
sensor:modalias:acpi:SMO8500*:dmi:*svn*ASUSTeK*:*pn*TP300LJ*
ACCEL_MOUNT_MATRIX=0, -1, 0; -1, 0, 0; 0, 0, 1
sensor:modalias:acpi:SMO8500*:dmi:*svn*ASUSTeK*:*pn*TP500LAB*
sensor:modalias:acpi:SMO8500*:dmi:*svn*ASUSTeK*:*pn*TP500LB*
ACCEL_MOUNT_MATRIX=0, 1, 0; 1, 0, 0; 0, 0, 1
@ -163,8 +161,12 @@ sensor:modalias:acpi:BMA250E*:dmi:bvnINSYDECorp.:bvrG1D_S165*:svnilife:pnS165:*
sensor:modalias:acpi:BOSC0200*:dmi:*:svnHampoo:pnX1D3_C806N:*
ACCEL_MOUNT_MATRIX=0, -1, 0; -1, 0, 0; 0, 0, 1
# Chuwi Hi10 (CWI515)
sensor:modalias:acpi:BOSC0200*:dmi:bvnAmericanMegatrendsInc.:bvr5.11:*:svnDefaultstring:pnDefaultstring:*
ACCEL_MOUNT_MATRIX=0, -1, 0; -1, 0, 0; 0, 0, 1
# Chuwi Hi10 (CWI1515)
sensor:modalias:acpi:BOSC0200*:dmi:bvnAmericanMegatrendsInc.:bvrP02A_C106.60E:*:svnDefaultstring:pnDefaultstring:*
sensor:modalias:acpi:BOSC0200*:dmi:bvnAmericanMegatrendsInc.:bvrP02A_C106.60E:*:svnDefaultstring:pnDefaultstring:*
ACCEL_MOUNT_MATRIX=0, -1, 0; -1, 0, 0; 0, 0, 1
# Chuwi Hi10 Pro
@ -223,6 +225,10 @@ sensor:modalias:acpi:KIOX000A*:dmi:*:svnCube:pni8-L:*
sensor:modalias:acpi:BOSC0200*:dmi:*:svnCube:pnI15-TC:*
ACCEL_MOUNT_MATRIX=1, 0, 0; 0, -1, 0; 0, 0, 1
# Cube iWork 11 Stylus
sensor:modalias:acpi:KIOX000A*:dmi:*:svncube:pni8-T:*
ACCEL_MOUNT_MATRIX=0, 1, 0; 1, 0, 0; 0, 0, 1
#########################################
# Cytrix (Mytrix)
#########################################
@ -429,27 +435,16 @@ sensor:modalias:acpi:SMO8500*:dmi:*:svnMEDION:pnAkoyaE2212TMD99720:*
ACCEL_MOUNT_MATRIX=-1, 0, 0; 0, 1, 0; 0, 0, 1
# Medion Akoya E2215T MD60198
sensor:modalias:acpi:KIOX000A*:dmi:*svnMEDION:pnE2215TMD60198:*
ACCEL_MOUNT_MATRIX=0, -1, 0; -1, 0, 0; 0, 0, 1
# Medion Akoya E3216 MD60900
sensor:modalias:acpi:KIOX010A*:dmi:*:svnMEDION*:pnE3216*:*
ACCEL_MOUNT_MATRIX=0, -1, 0; -1, 0, 0; 0, 0, 1
# Medion Akoya E3221 MD61237
sensor:modalias:acpi:KIOX010A*:dmi:*:svnMEDION:pnE3221MD61237:*
ACCEL_MOUNT_MATRIX=0, -1, 0; -1, 0, 0; 0, 0, 1
# Medion Akoya E3222 MD62450
sensor:modalias:acpi:KIOX010A*:dmi:*:svnMEDION*:pnE3222*:*
ACCEL_MOUNT_MATRIX=0, -1, 0; -1, 0, 0; 0, 0, 1
# Medion Akoya E2292 MD63390
sensor:modalias:acpi:KIOX010A*:dmi:*:svnMEDION:pnE2292MD63390:*
ACCEL_MOUNT_MATRIX=0, -1, 0; -1, 0, 0; 0, 0, 1
# Medion Akoya E2293 MD61130
sensor:modalias:acpi:KIOX010A*:dmi:*:svnMEDION:pnE2293MD61130:*
# Medion Akoya E2293 MD61144
# Medion Akoya E3222 MD62450
# and presumably all other Akoya Exxxx
sensor:modalias:acpi:KIOX010A*:dmi:*:svnMEDION:pnE*:*
# Medion Akoya E3222 MD62450
sensor:modalias:acpi:KIOX010A*:dmi:*:svnMEDION:pnMEDION*:*
ACCEL_MOUNT_MATRIX=0, -1, 0; -1, 0, 0; 0, 0, 1
#########################################
@ -551,25 +546,11 @@ sensor:modalias:acpi:BOSC0200*:dmi:bvnAmericanMegatrendsInc.:bvrSCH12i.WJ210Z.Kt
#########################################
# Teclast
#########################################
sensor:modalias:acpi:KIOX000A*:dmi:*:svnTECLAST:pnX80Pro:*
ACCEL_MOUNT_MATRIX=0, 1, 0; 1, 0, 0; 0, 0, 1
#Teclast X80 PLUS (H5C5)
sensor:modalias:acpi:KIOX000A*:dmi:*:svnTECLAST:pnDefaultstring:*
ACCEL_MOUNT_MATRIX=0, 1, 0; 1, 0, 0; 0, 0, 1
sensor:modalias:acpi:KIOX000A*:dmi:*:svnTECLAST:pnX98PlusII:*
ACCEL_MOUNT_MATRIX=1, 0, 0; 0, -1, 0; 0, 0, 1
# Teclast X98 Plus I (A5C6), generic DMI strings, match entire dmi modalias inc. bios-date
sensor:modalias:acpi:KIOX000A*:dmi:bvnAmericanMegatrendsInc.:bvr5.011:bd11/03/2015:svnTobefilledbyO.E.M.:pnTobefilledbyO.E.M.:pvrTobefilledbyO.E.M.:rvnAMICorporation:rnCherryTrailCR:rvrTobefilledbyO.E.M.:cvnToBeFilledByO.E.M.:ct3:cvrToBeFilledByO.E.M.:
ACCEL_MOUNT_MATRIX=0, 1, 0; 1, 0, 0; 0, 0, 1
# Teclast F5
sensor:modalias:acpi:KIOX010A*:dmi:*:svnTECLAST:pnF5:*
ACCEL_MOUNT_MATRIX=0, 1, 0; 1, 0, 0; 0, 0, 1
# Teclast F6 Pro
# Teclast F6 Pro (2 sensors)
sensor:modalias:acpi:KIOX010A*:dmi:*:svnTECLAST:pnF6Pro:*
ACCEL_MOUNT_MATRIX=-1, 0, 0; 0, -1, 0; 0, 0, -1
ACCEL_LOCATION=display
@ -578,6 +559,34 @@ sensor:modalias:acpi:KIOX020A*:dmi:*:svnTECLAST:pnF6Pro:*
ACCEL_MOUNT_MATRIX=0, 1, 0; 1, 0, 0; 0, 0, 1
ACCEL_LOCATION=base
# Teclast X80 Plus (H5C5)
sensor:modalias:acpi:KIOX000A*:dmi:*:svnTECLAST:pnDefaultstring:*
ACCEL_MOUNT_MATRIX=0, 1, 0; 1, 0, 0; 0, 0, 1
# Teclast X80 Pro (E3E6)
sensor:modalias:acpi:KIOX000A*:dmi:*:svnTECLAST:pnX80Pro:*
ACCEL_MOUNT_MATRIX=0, 1, 0; 1, 0, 0; 0, 0, 1
# Teclast X89 (E7ED), "tPAD" is too generic also match on BIOS date
sensor:modalias:acpi:SMO8500*:dmi:*bd12/19/2014:*:rvnTECLAST:rntPAD:*
ACCEL_MOUNT_MATRIX=1, 0, 0; 0, -1, 0; 0, 0, 1
# Teclast X98 Plus I (A5C6), generic DMI strings, match entire dmi modalias inc. bios-date
sensor:modalias:acpi:KIOX000A*:dmi:bvnAmericanMegatrendsInc.:bvr5.011:bd11/03/2015:svnTobefilledbyO.E.M.:pnTobefilledbyO.E.M.:pvrTobefilledbyO.E.M.:rvnAMICorporation:rnCherryTrailCR:rvrTobefilledbyO.E.M.:cvnToBeFilledByO.E.M.:ct3:cvrToBeFilledByO.E.M.:
ACCEL_MOUNT_MATRIX=0, 1, 0; 1, 0, 0; 0, 0, 1
# Teclast X98 Plus II
sensor:modalias:acpi:KIOX000A*:dmi:*:svnTECLAST:pnX98PlusII:*
ACCEL_MOUNT_MATRIX=1, 0, 0; 0, -1, 0; 0, 0, 1
#########################################
# Thundersoft
#########################################
# Thundersoft TST168 tablet, generic DMI strings, match entire dmi modalias inc. bios-date
sensor:modalias:acpi:BMA250E*:dmi:bvnAmericanMegatrendsInc.:bvr5.6.5:bd04/15/2014:svnTobefilledbyO.E.M.:pnTobefilledbyO.E.M.:pvrTobefilledbyO.E.M.:rvnAMICorporation:rnAptioCRB:rvrTobefilledbyO.E.M.:cvnToBeFilledByO.E.M.:ct3:cvrToBeFilledByO.E.M.:
ACCEL_MOUNT_MATRIX=-1, 0, 0; 0, 1, 0; 0, 0, 1
#########################################
# Trekstor
#########################################
@ -585,6 +594,7 @@ sensor:modalias:acpi:BMA250*:dmi:*:bvrTREK.G.WI71C.JGBMRBA*:*:svnInsyde:pnST7041
sensor:modalias:acpi:BMA250*:dmi:*:bvrTREK.G.WI71C.JGBMRBA*:*:svnTrekStor:pnSurfTabwintron7.0ST70416-6:*
ACCEL_MOUNT_MATRIX=0, 1, 0; 1, 0, 0; 0, 0, 1
sensor:modalias:acpi:KIOX000A*:dmi:*:svnTREKSTOR*:pnPrimetabS11B:*
sensor:modalias:acpi:KIOX000A*:dmi:*:svnTREKSTOR:pnPrimetabT13B:*
sensor:modalias:acpi:BOSC0200*:dmi:*:svnTrekStor*:pnSurfTabtwin11.6:*
ACCEL_MOUNT_MATRIX=1, 0, 0; 0, -1, 0; 0, 0, 1

View File

@ -449,7 +449,7 @@ mouse:usb:v046dp406a:name:Logitech MX Anywhere 2S:
mouse:bluetooth:v046dpb01a:name:MX Anywhere 2S Mouse:
MOUSE_WHEEL_CLICK_ANGLE=20
# Logitech MX Master
# Logitech MX Master (via Logitech Unifying Receiver)
# Horiz wheel has 14 stops, angle is rounded up
mouse:usb:v046dp4060:name:Logitech MX Master:
mouse:usb:v046dp4041:name:Logitech MX Master:
@ -459,6 +459,15 @@ mouse:usb:v046dp4041:name:Logitech MX Master:
MOUSE_WHEEL_CLICK_COUNT=24
MOUSE_WHEEL_CLICK_COUNT_HORIZONTAL=14
# Logitech MX Master (via Bluetooth)
# Horiz wheel has 14 stops, angle is rounded up
mouse:bluetooth:v046dpb012:name:MX Master Mouse:
MOUSE_DPI=1000@2000
MOUSE_WHEEL_CLICK_ANGLE=15
MOUSE_WHEEL_CLICK_ANGLE_HORIZONTAL=26
MOUSE_WHEEL_CLICK_COUNT=24
MOUSE_WHEEL_CLICK_COUNT_HORIZONTAL=14
# Logitech MX Master 2S (via Logitech Unifying Receiver)
# Horiz wheel has 14 stops, angle is rounded up
mouse:usb:v046dp4069:name:Logitech MX Master 2s:
@ -471,12 +480,16 @@ mouse:usb:v046dp4069:name:Logitech MX Master 2s:
# Logitech MX Master 2S (via Bluetooth)
# Horiz wheel has 14 stops, angle is rounded up
mouse:bluetooth:v046dpb019:name:MX Master 2S Mouse:
MOUSE_DPI=2000@2000
MOUSE_DPI=1000@2000
MOUSE_WHEEL_CLICK_ANGLE=15
MOUSE_WHEEL_CLICK_ANGLE_HORIZONTAL=26
MOUSE_WHEEL_CLICK_COUNT=24
MOUSE_WHEEL_CLICK_COUNT_HORIZONTAL=14
# Logitech MX Ergo (via Bluetooth)
mouse:bluetooth:v046dpb01d:name:MX Ergo Mouse:
ID_INPUT_TRACKBALL=1
## Other ##
# Logitech M-BJ58 Optical Mouse
@ -724,9 +737,9 @@ mouse:usb:v1038p1369:name:SteelSeries Sensei Raw Gaming Mouse:
mouse:usb:v145fp01ac:name:HID-compliant Mouse Trust Gaming Mouse:
MOUSE_DPI=*800@528 1200@537 1600@536 2400@521
##########################################
# Zelotes
##########################################
##########################################
# Zelotes
##########################################
# Zelotes 5500 DPI 7 Button USB Wired Gaming Mouse
mouse:usb:v1d57pad17:*

File diff suppressed because it is too large Load Diff

View File

@ -3560,12 +3560,6 @@ E00000-EFFFFF (base 16) Nanjing Yining Intelligent Technology Co., Ltd.
Nanjing Jiangsu 210019
CN
B0-B3-53 (hex) Blake UK
000000-0FFFFF (base 16) Blake UK
177-187, Rutland Road
Sheffield --select-- S3 9PT
GB
B0-B3-53 (hex) Beijing Geekplus Technology Co.,Ltd.
C00000-CFFFFF (base 16) Beijing Geekplus Technology Co.,Ltd.
1st Floor, Building 1, Chaolai High-Tech industrial Part, Chaoyang District
@ -3578,12 +3572,150 @@ D00000-DFFFFF (base 16) IPvideo Corporation
Bay Shore NY 11706
US
B0-B3-53 (hex) Blake UK
000000-0FFFFF (base 16) Blake UK
177-187, Rutland Road
Sheffield --select-- S3 9PT
GB
B0-B3-53 (hex) Zoox
B00000-BFFFFF (base 16) Zoox
1149 Chess Drive
Foster City CA 94404
US
14-AE-85 (hex) Qingdao iTechene Technologies Co., Ltd.
200000-2FFFFF (base 16) Qingdao iTechene Technologies Co., Ltd.
UnitA3-A4,Level8,Block A ,International Innovation Park,No.1Keyuanwei Rd.,Laoshan District
Qingdao 266100
CN
14-AE-85 (hex) Henfred Technology Co., Ltd.
100000-1FFFFF (base 16) Henfred Technology Co., Ltd.
3F.-7, No.77, Sec. 1, Xintai 5th Rd
New Taipei City Xizhi Dist 221
TW
14-AE-85 (hex) MTA Systems
A00000-AFFFFF (base 16) MTA Systems
Pemstraße 2
Mauthausen 4310
AT
64-62-66 (hex) MiiVii Dynamics Technology CO.,LTD
000000-0FFFFF (base 16) MiiVii Dynamics Technology CO.,LTD
1408-1415 Tower A BUGG Building,No.18 N. Taipingzhuang Rd,haidian District
Beijing Beijing 100000
CN
64-62-66 (hex) Annapurna labs
100000-1FFFFF (base 16) Annapurna labs
Matam Scientific Industries Center, Building 8.2
Mail box 15123 Haifa 3508409
IL
64-62-66 (hex) Bühler AG
500000-5FFFFF (base 16) Bühler AG
Gupfenstrasse 5
Uzwil 9240
CH
64-62-66 (hex) Shenzhen Jie Shi Lian Industrial Co., LTD
E00000-EFFFFF (base 16) Shenzhen Jie Shi Lian Industrial Co., LTD
6F,C Building,Jinao Industrial Park,Juling Rd,Guanlan Town,Longhua
Shenzhen Guangdong 518000
CN
64-62-66 (hex) Leontech Limited
800000-8FFFFF (base 16) Leontech Limited
1208 WorkingBerg Commercial Buildung, 41-47 Marble Road
Hong Kong Hong Kong 00000
HK
94-CC-04 (hex) Sam Nazarko Trading Ltd
600000-6FFFFF (base 16) Sam Nazarko Trading Ltd
18 Watermill Way
London Surrey SW19 2RD
GB
94-CC-04 (hex) Hanzhuo Information Technology(Shanghai) Ltd.
D00000-DFFFFF (base 16) Hanzhuo Information Technology(Shanghai) Ltd.
Room 2085, building 2, 622 Yingyuan middle Road, Jiading Strict
Shanghai 201200
CN
94-CC-04 (hex) hyBee Inc.
A00000-AFFFFF (base 16) hyBee Inc.
#1003, Innovalley B, 253, Pangyo-ro, Bundang-gu
Seongnam-si Gyeonggi-do 13486
KR
94-05-BB (hex) iungo
800000-8FFFFF (base 16) iungo
Vrouwenlaan 62
Zwolle Overijssel 8017 HS
NL
94-CC-04 (hex) Nanjing Yacer Communication Technology Co. Ltd.
200000-2FFFFF (base 16) Nanjing Yacer Communication Technology Co. Ltd.
333 Taiping South Road Jinling Yujingyuan 19nd  floor Unit K Qin Huai District
nanjing jiangsu 210000
CN
90-E2-FC (hex) Pars Ertebat Afzar Co.
000000-0FFFFF (base 16) Pars Ertebat Afzar Co.
1116 Burlington Tower Business Bay
Dubai 90072
AE
94-05-BB (hex) Dongguan CXWE Technology Co.,Ltd.
200000-2FFFFF (base 16) Dongguan CXWE Technology Co.,Ltd.
Room 805, building 1, No. 16, Keji 4th Road, Songshanhu
Dongguan Guangdong 523000
CN
94-05-BB (hex) Zimmer GmbH
900000-9FFFFF (base 16) Zimmer GmbH
Im Salmenkopf 5
Rheinau Baden-Württemberg 77866
DE
94-05-BB (hex) Qingdao Maotran Electronics co., ltd
000000-0FFFFF (base 16) Qingdao Maotran Electronics co., ltd
Room2907, Building 2 of Minghui International, No.39 of Shiling Road, Laoshan District
Qingdao Shandong 266000
CN
94-05-BB (hex) LTE-X, Inc
700000-7FFFFF (base 16) LTE-X, Inc
2-2-20 Higashi-Shinagawa
Shinagawa Tokyo 1400002
JP
94-05-BB (hex) BAE Systems
E00000-EFFFFF (base 16) BAE Systems
21 continental boulevard
Merrimack NH 03054
US
F4-90-CB (hex) Cheetah Medical
C00000-CFFFFF (base 16) Cheetah Medical
2A Hashlosha st.
Tel Aviv 6706055
IL
F4-90-CB (hex) A-dec Inc.
B00000-BFFFFF (base 16) A-dec Inc.
2601 Crestview Drive
Newberg OR 97132
US
F4-90-CB (hex) TEQ SA
700000-7FFFFF (base 16) TEQ SA
Via al Municipio 16
Barbengo Ticino 6917
CH
4C-4B-F9 (hex) Shenzhen dingsheng technology co., LTD
400000-4FFFFF (base 16) Shenzhen dingsheng technology co., LTD
Floor 3, building 5, kaijeda industrial zone, no.97, huaxing road, langkou community, dalang street, longhua district
@ -3866,12 +3998,6 @@ D0-C8-57 (hex) Mobicon
Suwon-si Gyeonggi-do 16521
KR
D0-C8-57 (hex) IFLYTEK CO.,LTD.
D00000-DFFFFF (base 16) IFLYTEK CO.,LTD.
National Intelligent Speech High-tech Industrialization Base, No. 666, Wangjiang Road West,
Heifei An hui 230088
CN
60-95-CE (hex) Synamedia
C00000-CFFFFF (base 16) Synamedia
Luipaardstraat 12
@ -6971,6 +7097,84 @@ C00000-CFFFFF (base 16) Shenzhen zhong ju Fiber optical Co.Ltd
Zhuhai Guangdong 519080
CN
90-E2-FC (hex) Huddly AS
900000-9FFFFF (base 16) Huddly AS
Karenslyst Allé 51
Oslo 0279
NO
90-E2-FC (hex) Shenzhen Dingsheng Intelligent Technology Co., Ltd
B00000-BFFFFF (base 16) Shenzhen Dingsheng Intelligent Technology Co., Ltd
10/F Block C, Skyworth Building, Gaoxin South 1st Rd., Hi-Tech Park, Nanshan District
Shenzhen Guangdong 518000
CN
14-AE-85 (hex) Veo Technologies
900000-9FFFFF (base 16) Veo Technologies
Aldersrogade 6c, 4. sal
København Denmark 2100
DK
14-AE-85 (hex) SHENZHEN HONOR ELECTRONIC CO.,LTD
700000-7FFFFF (base 16) SHENZHEN HONOR ELECTRONIC CO.,LTD
No. A Building, Xinghui Industrial Park, Gushu No. 2Rd,
SHEN ZHEN GUANG DONG 518000
CN
94-CC-04 (hex) Shenzhen Link technology Co.,Ltd
300000-3FFFFF (base 16) Shenzhen Link technology Co.,Ltd
901,9/F,Dahong High TechIndusryPark?NO.6-18,Xinhe Road,Xinqiao Community,Baoan District
Shenzhen Guangdong 518000
CN
94-CC-04 (hex) SHENZHEN SANRAY TECHNOLOGY CO.,LTD
500000-5FFFFF (base 16) SHENZHEN SANRAY TECHNOLOGY CO.,LTD
1B08 2/F Folk Culture Industrial Park,Qunli Second Road, Baoan District
Shenzhen GuangDong 518101
CN
94-CC-04 (hex) GOCOAX, INC
100000-1FFFFF (base 16) GOCOAX, INC
15902A Halliburton Rd #662
Hacienda Heights CA 91745
US
94-05-BB (hex) Chengdu Zhongheng Network Co.,Ltd.
500000-5FFFFF (base 16) Chengdu Zhongheng Network Co.,Ltd.
No.898 Baicao Road, Chengdu High-tech Zone (Western District)
Chengdu Sichuan 611731
CN
D0-C8-57 (hex) IFLYTEK CO.,LTD.
D00000-DFFFFF (base 16) IFLYTEK CO.,LTD.
National Intelligent Speech High-tech Industrialization Base, No. 666, Wangjiang Road West,
Hefei An hui 230088
CN
94-CC-04 (hex) Shanxi Baixin Information Technology Co., Ltd.
C00000-CFFFFF (base 16) Shanxi Baixin Information Technology Co., Ltd.
Room 210-213, Room 215-217, Room 219-220, No.2, Yari Street, Taiyuan University Park, Shanxi Comprehensive Reform Demonstration Zone
Taiyuan Shanxi 030032
CN
94-05-BB (hex) ZIGPOS GmbH
600000-6FFFFF (base 16) ZIGPOS GmbH
Räcknitzhöhe 35a
Dresden Saxony 01217
DE
94-05-BB (hex) SolarEdge Technologies
A00000-AFFFFF (base 16) SolarEdge Technologies
1 Abba Eban St.
Herzelia 46725
IL
F4-90-CB (hex) Airbeam Wireless Technologies Inc.
600000-6FFFFF (base 16) Airbeam Wireless Technologies Inc.
#125, 21320 Gordon Way
Richmond British Columbia V6W 1J8
CA
20-85-93 (hex) UNILUMIN GROUP CO.,LTD
300000-3FFFFF (base 16) UNILUMIN GROUP CO.,LTD
No.112 Yongfu Rd.,BaoanDistrict,
@ -10406,6 +10610,78 @@ A00000-AFFFFF (base 16) Ledger
Paris 75002
FR
14-AE-85 (hex) Trimble LEM
800000-8FFFFF (base 16) Trimble LEM
10368 Westmoor Dr
Westminster CO 80021
US
14-AE-85 (hex) Kayamatics Limited
000000-0FFFFF (base 16) Kayamatics Limited
Room 1209, Trend Centre, 29 Cheung Lee Street
Chaiwan NA NA
HK
64-62-66 (hex) Shenzhen C & D Electronics Co., Ltd.
700000-7FFFFF (base 16) Shenzhen C & D Electronics Co., Ltd.
9th FIoor, Building 9, No.1 Qingxiang road, BaoNeng Science and TechnoIogy Industrial Park, Longhua New District
ShenZhen GuangDong 518000
CN
64-62-66 (hex) Signal Hound
B00000-BFFFFF (base 16) Signal Hound
1502 SE Commerce Ave Suite 101
Battle Ground WA 98604
US
64-62-66 (hex) Chunghwa System Integration Co., Ltd.
900000-9FFFFF (base 16) Chunghwa System Integration Co., Ltd.
2F., No. 35, Aiguo E. Rd.,
Taipei 106
TW
64-62-66 (hex) Protectli
200000-2FFFFF (base 16) Protectli
1315 Hot Springs Way
Vista CA 92081
US
64-62-66 (hex) Redstone Systems, Inc.
400000-4FFFFF (base 16) Redstone Systems, Inc.
24 School Street, 2nd floor
Boston 02108
US
64-62-66 (hex) Kobol Innovations Pte. Ltd.
D00000-DFFFFF (base 16) Kobol Innovations Pte. Ltd.
101 Cecil Street, #26-01/07 Tong Eng Building
Singapore 069533
SG
94-05-BB (hex) AUSTAR HEARING SCIENCE AND TECHNILIGY(XIAMEN)CO.,LTD
B00000-BFFFFF (base 16) AUSTAR HEARING SCIENCE AND TECHNILIGY(XIAMEN)CO.,LTD
RM201,No.2Gaoqi South 12th Road,HuliDist
XIamen Fujian 361006
CN
94-05-BB (hex) LAO INDUSTRIA LTDA
C00000-CFFFFF (base 16) LAO INDUSTRIA LTDA
AV DR MAURO LINDENBERG MONTEIRO, 1003
OSASCO SÃO PAULO 06278010
BR
F4-90-CB (hex) Avilution
500000-5FFFFF (base 16) Avilution
103 Shoreline Dr
Madison AL 35758
US
F4-90-CB (hex) OmniNet
400000-4FFFFF (base 16) OmniNet
6410 Del Rio Rd
Charlotte NC 28277
US
4C-4B-F9 (hex) Shandong Linkotech Electronic Co., Ltd.
600000-6FFFFF (base 16) Shandong Linkotech Electronic Co., Ltd.
22nd Floor, Building 2, Aosheng Building, No.1166 Xinyi Street, High-tech Zone
@ -11186,12 +11462,6 @@ E00000-EFFFFF (base 16) NC-LINK Technology Co., Ltd.
Shenzhen Guangdong 518101
CN
7C-BC-84 (hex) VANTAGE INTEGRATED SECURITY SOLUTIONS PVT LTD
D00000-DFFFFF (base 16) VANTAGE INTEGRATED SECURITY SOLUTIONS PVT LTD
B-11 SECTOR-VII
NOIDA UTTAR PRADESH 201301
IN
7C-BC-84 (hex) Shanghai Yitu Technology Co. Ltd
300000-3FFFFF (base 16) Shanghai Yitu Technology Co. Ltd
23/F, Tower 1, No.523 Loushanguan Road, Changning District
@ -13874,6 +14144,90 @@ D00000-DFFFFF (base 16) Beijing Lanxum Computer Technology CO.,LTD.
Beijing Beijing 100192
CN
90-E2-FC (hex) ShenZhen Temwey Innovation Technology Co.,Ltd.
200000-2FFFFF (base 16) ShenZhen Temwey Innovation Technology Co.,Ltd.
Room 1008, 10/F, Bld.B, Bantian International Centre, No. 5 South Huancheng Road, Bantian Street of Shenzhen Longgang District
SHENZHEN GUANGDONG 518129
CN
90-E2-FC (hex) Dongguan Kangyong electronics technology Co. Ltd
400000-4FFFFF (base 16) Dongguan Kangyong electronics technology Co. Ltd
No 9,Yincheng 1st Road, Xiabian Village, Changan Town
Dongguan GuangDong 523877
CN
90-E2-FC (hex) bitsensing Inc.
800000-8FFFFF (base 16) bitsensing Inc.
165, Yeoksam-ro,
Gangnam-gu, Seoul, Republic of Korea 06247
KR
90-E2-FC (hex) Stanley Security
C00000-CFFFFF (base 16) Stanley Security
8350 Sunlight Drive
Fishers IN 46037
US
14-AE-85 (hex) iSolution Technologies Co.,Ltd.
D00000-DFFFFF (base 16) iSolution Technologies Co.,Ltd.
5F,Bldg #6, Zhongguan Honghualing Industrial South Park
Shenzhen Guangdong 518055
CN
7C-BC-84 (hex) VANTAGE INTEGRATED SECURITY SOLUTIONS PVT LTD
D00000-DFFFFF (base 16) VANTAGE INTEGRATED SECURITY SOLUTIONS PVT LTD
B3, Bredon House, 321, Tettenhall Road, Tettenhall
Wolverhampton West Midlands WV6 0JZ
GB
64-62-66 (hex) FaceHeart Inc.
300000-3FFFFF (base 16) FaceHeart Inc.
Rm. 8, 19F., No.118, Ciyun Rd., East Dist.
Hsinchu Taiwan 300
TW
64-62-66 (hex) Sensoro Co., Ltd.
A00000-AFFFFF (base 16) Sensoro Co., Ltd.
7F D-Block, Lei Shing Hong Center, No. 8 Guangshun South Street, Chaoyang District,
Beijing Beijing 100102
CN
64-62-66 (hex) Pass & Seymour, Inc d/b/a Legrand
600000-6FFFFF (base 16) Pass & Seymour, Inc d/b/a Legrand
50 Boyd Ave
Syracuse NY 13209
US
94-CC-04 (hex) Shandong free optical technology co., ltd.
B00000-BFFFFF (base 16) Shandong free optical technology co., ltd.
195 East First Street, Industrial First Street, Economic Development Zone, Weifang, Weicheng District,
Weifeng Shandong 216000
CN
94-CC-04 (hex) ENTEC Electric & Electronic Co., LTD.
900000-9FFFFF (base 16) ENTEC Electric & Electronic Co., LTD.
78-2 Buncheon-ri, Bongdam-eup
Hwaseong-city Gyungki-do 445-894
KR
94-CC-04 (hex) SynchronicIT BV
E00000-EFFFFF (base 16) SynchronicIT BV
Spoorstraat 155, room 413
Gennep Nederland 6591 GT
NL
F4-90-CB (hex) Simavita (Aust) Pty Ltd
D00000-DFFFFF (base 16) Simavita (Aust) Pty Ltd
Suite 2.02, L2, 54 Miller Street
North Sydney NSW 2060
AU
F4-90-CB (hex) Ricker Lyman Robotic
300000-3FFFFF (base 16) Ricker Lyman Robotic
319 Main Street
Beacon NY 12508
US
20-85-93 (hex) Great Lite International
700000-7FFFFF (base 16) Great Lite International
11F., No.207-2, Sec. 3, Beixin Rd., Xindian Dist.,
@ -16421,12 +16775,6 @@ B0-C5-CA (hex) LOWOTEC GmbH
Oldenburg Niedersachsen 26129
DE
DC-44-27 (hex) Tesla Motors, Inc
100000-1FFFFF (base 16) Tesla Motors, Inc
3500 Deer Creek Road
Palo Alto CA 94304
US
78-C2-C0 (hex) ShenZhen TuLing Robot CO.,LTD
500000-5FFFFF (base 16) ShenZhen TuLing Robot CO.,LTD
BLK 9, No 28, Langshan Road, Northern District of High Tech. Industry Park, Nanshan Dist., SZ., PRC.
@ -17273,11 +17621,11 @@ B0-B3-53 (hex) Sprocomm Technologies CO.,LTD.
shenzhen guangdong 518000
CN
3C-FA-D3 (hex) Mirico
E00000-EFFFFF (base 16) Mirico
30 DongSan Rd 9th floor Mirico
Ansan Gyunggi 15434
KR
B0-B3-53 (hex) VOXISCOM
800000-8FFFFF (base 16) VOXISCOM
Rue Jules Ferry
PORNIC 44210
FR
B0-B3-53 (hex) Innotas Elektronik GmbH
400000-4FFFFF (base 16) Innotas Elektronik GmbH
@ -17285,8 +17633,152 @@ B0-B3-53 (hex) Innotas Elektronik GmbH
Zittau D-02763
DE
B0-B3-53 (hex) VOXISCOM
800000-8FFFFF (base 16) VOXISCOM
Rue Jules Ferry
PORNIC 44210
FR
3C-FA-D3 (hex) Mirico
E00000-EFFFFF (base 16) Mirico
30 DongSan Rd 9th floor Mirico
Ansan Gyunggi 15434
KR
90-E2-FC (hex) Power Engineering & Manufacturing, Inc.
A00000-AFFFFF (base 16) Power Engineering & Manufacturing, Inc.
1463 94th Lane NE
Blaine MN 55449
US
90-E2-FC (hex) Sindoh Techno Co., Ltd.
600000-6FFFFF (base 16) Sindoh Techno Co., Ltd.
Sindoh Bldg., 6, Hyoryeong-ro 61-gil, Seocho-gu
Seoul 06643
KR
90-E2-FC (hex) Shenzhen Hisource Technology Development CO.,Ltd.
300000-3FFFFF (base 16) Shenzhen Hisource Technology Development CO.,Ltd.
Dalang
Shenzhen Guangdong 518109
CN
90-E2-FC (hex) TOTALONE TECHNOLOGY CO., LTD.
500000-5FFFFF (base 16) TOTALONE TECHNOLOGY CO., LTD.
3F.-1, NO.18, LN. 48, XingShan RD.,
Taipei Neihu dist 11469
TW
90-E2-FC (hex) Yite technology
100000-1FFFFF (base 16) Yite technology
No. 56, Xiaobei Rd., North Dist
tainan 70448
TW
90-E2-FC (hex) DevCom spol. s r.o.
E00000-EFFFFF (base 16) DevCom spol. s r.o.
Božanovská 884
Praha Select a State 19300
CZ
14-AE-85 (hex) IO Industries Inc.
C00000-CFFFFF (base 16) IO Industries Inc.
15940 Robin's Hill Rd
London Ontario N5V 0A4
CA
14-AE-85 (hex) AZ-TECHNOLOGY SDN BHD
500000-5FFFFF (base 16) AZ-TECHNOLOGY SDN BHD
A108 & A109 BLOCK A KELANA BUSINESS CENTRE NO: 97 JALAN SS7/2 KELANA JAYA
PETALING JAYA SELANGOR 47301
MY
14-AE-85 (hex) CENTERVUE SPA
400000-4FFFFF (base 16) CENTERVUE SPA
VIA SAN MARCO 9/H
PADOVA PADOVA 35129
IT
90-E2-FC (hex) Fair Winds Digital srl
700000-7FFFFF (base 16) Fair Winds Digital srl
Via Italo Svevo 85
Rome Italy 00137
IT
14-AE-85 (hex) TMG TE GmbH
600000-6FFFFF (base 16) TMG TE GmbH
Zur Gießerei 10
Karlsruhe 776227
DE
14-AE-85 (hex) NTC SOFT
B00000-BFFFFF (base 16) NTC SOFT
B-805, Gwangmyeong SK Techno park, 60, Haan-ro,
Gwangmyeong-si Gyeonggi-do 14322
KR
14-AE-85 (hex) Sercomm Corporation.
E00000-EFFFFF (base 16) Sercomm Corporation.
3F,No.81,Yu-Yih Rd.,Chu-Nan Chen
Miao-Lih Hsuan 115
TW
64-62-66 (hex) Jiangsu Aisida Electronic Co.,Ltd
C00000-CFFFFF (base 16) Jiangsu Aisida Electronic Co.,Ltd
Aisida Industrial Park,Lanling Road,Danyang Development Zone
DanYang JiangSu 212300
CN
94-CC-04 (hex) Hangzhou Yongkong Technology Co., Ltd.
000000-0FFFFF (base 16) Hangzhou Yongkong Technology Co., Ltd.
Room 503, Building 12, Lefu Zhihui Garden, 28 Xiangyuan Road, Gongshu Distric
Hangzhou Zhejiang 310000
CN
94-CC-04 (hex) Gowing Business And Contracting Wenzhou Co., LTD
700000-7FFFFF (base 16) Gowing Business And Contracting Wenzhou Co., LTD
Room 101, No.4 Liming Industrial District, Lucheng, Wenzhou, China
Wenzhou 325000
CN
94-CC-04 (hex) CircuitWerkes, Inc.
800000-8FFFFF (base 16) CircuitWerkes, Inc.
2805 NW 6th St
Gainesville FL 32609
US
14-AE-85 (hex) IFLYTEK CO.,LTD.
300000-3FFFFF (base 16) IFLYTEK CO.,LTD.
National Intelligent Speech High-tech Industrialization Base, No. 666, Wangjiang Road West,
Hefei An hui 230088
CN
94-05-BB (hex) Shenzhen Baolijie Technology Co., Ltd.
400000-4FFFFF (base 16) Shenzhen Baolijie Technology Co., Ltd.
D2,No.47,Shasan Road,Sha jing Street,Baoan District
Shenzhen Kowloon 518104
CN
94-CC-04 (hex) ProConnections, Inc.
400000-4FFFFF (base 16) ProConnections, Inc.
30 Massachusetts, Ave, Suite 301
North Andover MA 01845
US
94-05-BB (hex) Neurik AG
300000-3FFFFF (base 16) Neurik AG
Im alten Riet 143
Schaan SCHAAN 9494
LI
94-05-BB (hex) Dongguan Kingtron Electronics Tech Co., Ltd
100000-1FFFFF (base 16) Dongguan Kingtron Electronics Tech Co., Ltd
No.3 Fumin North Rd,Shu'an Industrial Park, Humen Town
Dongguan Guangdong China 523929
CN
94-05-BB (hex) Sunthink S&T Development Co.,Ltd
D00000-DFFFFF (base 16) Sunthink S&T Development Co.,Ltd
A3-f1, xinghezhong Technology Green Valley, No.14, luolei Industrial Avenue, Shiyan street, Bao'an District
Shenzhen 518100
CN
DC-44-27 (hex) Tesla,Inc.
100000-1FFFFF (base 16) Tesla,Inc.
3500 Deer Creek Road
Palo Alto CA 94304
US

View File

@ -2927,12 +2927,6 @@ D3F000-D3FFFF (base 16) GLOBALCOM ENGINEERING SPA
MORNAGO VA 21020
IT
70-B3-D5 (hex) VANTAGE INTEGRATED SECURITY SOLUTIONS PVT LTD
6BE000-6BEFFF (base 16) VANTAGE INTEGRATED SECURITY SOLUTIONS PVT LTD
B-11 SECTOR-VII
NOIDA UTTAR PRADESH 201301
IN
70-B3-D5 (hex) Precitec Optronik GmbH
0C5000-0C5FFF (base 16) Precitec Optronik GmbH
Schleussnerstraße 54
@ -4205,6 +4199,108 @@ EF1000-EF1FFF (base 16) Nanotok LLC
Hong Kong Hong Kong 00000
HK
70-B3-D5 (hex) VANTAGE INTEGRATED SECURITY SOLUTIONS PVT LTD
6BE000-6BEFFF (base 16) VANTAGE INTEGRATED SECURITY SOLUTIONS PVT LTD
B3, Bredon House, 321, Tettenhall Road, Tettenhall
Wolverhampton West Midlands WV6 0JZ
GB
70-B3-D5 (hex) Todd Digital Limited
C9A000-C9AFFF (base 16) Todd Digital Limited
Level 15, 95 Customhouse Quay
Wellington 6011
NZ
70-B3-D5 (hex) JENG IoT BV
5AF000-5AFFFF (base 16) JENG IoT BV
Steenbokstraat 33
APELDOORN Gelderland 7324 AZ
NL
70-B3-D5 (hex) TXMission Ltd.
F47000-F47FFF (base 16) TXMission Ltd.
CP House, Otterspool Way
Watford Hertfordshire WD25 8HU
GB
70-B3-D5 (hex) Technology Link Corporation
B1B000-B1BFFF (base 16) Technology Link Corporation
Shin-Yokohama Kohoku-ku
yokohama kanagawa 222-0033
JP
70-B3-D5 (hex) Tucsen Photonics Co., Ltd.
8A7000-8A7FFF (base 16) Tucsen Photonics Co., Ltd.
6F NO.1 building Caimao Zone, 756# Qi an Road, Gaishan Town, Cangshan Area, Fuzhou, Fujian, PR, CHINA.
fuzhou 350000
CN
70-B3-D5 (hex) sensorway
C52000-C52FFF (base 16) sensorway
A-339 samsong techno valley, 140 tongilro, deockyanggu
goyangsi gyeonggido 10594
KR
70-B3-D5 (hex) KDT Corp.
E72000-E72FFF (base 16) KDT Corp.
no1705-1, BLDG 3#, Lantian shixin plaza, keqiao zone
shaoxing zhejiang 312030
CN
70-B3-D5 (hex) Beijing Yourong Runda Rechnology Development Co.Ltd.
980000-980FFF (base 16) Beijing Yourong Runda Rechnology Development Co.Ltd.
Changping District Science and Technology Park Advanced Road 37
Beijing 6219650
CN
70-B3-D5 (hex) R.C. Systems Inc
52F000-52FFFF (base 16) R.C. Systems Inc
8621 hwy. 6
hitchcock TX 77563
US
70-B3-D5 (hex) Dalcnet srl
1CF000-1CFFFF (base 16) Dalcnet srl
Via Meucci 35
Brendola Vicenza 36040
IT
70-B3-D5 (hex) AUTOMATICA Y REGULACION S.A.
EBF000-EBFFFF (base 16) AUTOMATICA Y REGULACION S.A.
Condell 1735, Nunoa
Santiago RM 7770331
CL
70-B3-D5 (hex) Digital Solutions JSC
D9F000-D9FFFF (base 16) Digital Solutions JSC
room 4, office 1, 3rd floor, building 7, house 9a, 2nd Sinichkina Str.
Moscow 111020
RU
70-B3-D5 (hex) Oculii
B96000-B96FFF (base 16) Oculii
829 Space Dr
Beavercreek OH 45434
US
70-B3-D5 (hex) XPS ELETRONICA LTDA
4F3000-4F3FFF (base 16) XPS ELETRONICA LTDA
AVENIDA JAÇANÃ, 470/474 - VILA NELSON
SÃO PAULO SÃO PAULO 02273-001
BR
70-B3-D5 (hex) Firecom, Inc.
331000-331FFF (base 16) Firecom, Inc.
3927 59th Street
Woodside NY 11377
US
70-B3-D5 (hex) DOGA
62A000-62AFFF (base 16) DOGA
11 rue Lavoisier
MAUREPAS 78310
FR
70-B3-D5 (hex) EVCO SPA
A80000-A80FFF (base 16) EVCO SPA
VIA FELTRE N. 81
@ -8507,6 +8603,84 @@ F80000-F80FFF (base 16) Guan Show Technologe Co., Ltd.
BRUGES 33520
FR
70-B3-D5 (hex) Newtec A/S
18F000-18FFFF (base 16) Newtec A/S
Stærmosegårdsvej 18
Odense SV Region Syd 5230
DK
70-B3-D5 (hex) AUDIO VISUAL DIGITAL SYSTEMS
A7F000-A7FFFF (base 16) AUDIO VISUAL DIGITAL SYSTEMS
PLOT NO.180 PHASE V SECTOR56, HSIIDC I.E KUNDLI SONEPAT
SONEPAT HARYANA 131028
IN
70-B3-D5 (hex) DEUTA-WERKE GmbH
1BF000-1BFFFF (base 16) DEUTA-WERKE GmbH
Paffrather Str. 140
Bergisch Gladbach North Rhine-Westphalia 51465
DE
70-B3-D5 (hex) DONG IL VISION Co., Ltd.
038000-038FFF (base 16) DONG IL VISION Co., Ltd.
#9 Ftrek tower, 11-25, Simindaero 327 beongil,Dongan-gu
Anyangi-Si Gyeonggi-Do 14055
KR
70-B3-D5 (hex) Cetitec GmbH
B36000-B36FFF (base 16) Cetitec GmbH
Mannheimer Strasse 17
Pforzheim 75179
DE
70-B3-D5 (hex) Kamacho Scale Co., Ltd.
385000-385FFF (base 16) Kamacho Scale Co., Ltd.
2246 Mure
Takamatsu-shi Kagawa-ken 761-0196
JP
70-B3-D5 (hex) Vessel Technology Ltd
44D000-44DFFF (base 16) Vessel Technology Ltd
Banchory Business Centre, Burn O'Bennie Road
Banchory Aberdeenshire AB31 5ZU
GB
70-B3-D5 (hex) Munters
FA8000-FA8FFF (base 16) Munters
Hasivim 18
Pethch Tikva Israel 4959376
IL
70-B3-D5 (hex) Visual Robotics
0F4000-0F4FFF (base 16) Visual Robotics
38 Irving Rd
Eugene OR 97404
US
70-B3-D5 (hex) TangRen C&S CO., Ltd
3FC000-3FCFFF (base 16) TangRen C&S CO., Ltd
3a-5d, Tingwei Daxia, Tingwei Industrial Park, No. 6, Liufang Road, Bao'an District
Shenzhen Guangdong 518052
CN
70-B3-D5 (hex) TEX COMPUTER SRL
6C2000-6C2FFF (base 16) TEX COMPUTER SRL
VIA MERCADANTE 35
CATTOLICA RIMINI 47841
IT
70-B3-D5 (hex) LOTES TM OOO
EA5000-EA5FFF (base 16) LOTES TM OOO
Barklaya 22, str.1
Moscow 121309
RU
70-B3-D5 (hex) Yi An Electronics Co., Ltd
F28000-F28FFF (base 16) Yi An Electronics Co., Ltd
5F.-2, No. 81, Sec. 1, Xintai 5th Rd., Xizhi Dist
New Taipei City 22101
TW
70-B3-D5 (hex) System West dba ICS Electronics
E06000-E06FFF (base 16) System West dba ICS Electronics
7034 Commerce Circle Suite A
@ -8939,12 +9113,6 @@ A7D000-A7DFFF (base 16) Prior Scientific Instruments Ltd
Cambridge Cambridgeshire CB21 5ET
GB
70-B3-D5 (hex) Taejin InforTech
A75000-A75FFF (base 16) Taejin InforTech
40, Imi-ro, A-411
Uiwang-si Gyeonggi-do 16006
KR
70-B3-D5 (hex) AUTOMATIZACION Y CONECTIVIDAD SA DE CV
59B000-59BFFF (base 16) AUTOMATIZACION Y CONECTIVIDAD SA DE CV
LA GARITA ANDADOR 6 DUPLEX 1 CASA 2
@ -9281,12 +9449,6 @@ C05000-C05FFF (base 16) KST technology
Songpa-gu Seoul 05636
KR
70-B3-D5 (hex) Coheros Oy
D2E000-D2EFFF (base 16) Coheros Oy
Korkeakoulunkatu 1
Tampere 33720
FI
70-B3-D5 (hex) EA Elektroautomatik GmbH & Co. KG
26C000-26CFFF (base 16) EA Elektroautomatik GmbH & Co. KG
Helmholtzstraße 31-33
@ -12722,6 +12884,12 @@ CFB000-CFBFFF (base 16) Screen Innovations
Bingen WA 98605
US
70-B3-D5 (hex) German Power GmbH
C31000-C31FFF (base 16) German Power GmbH
Freiburger Strasse 7
Pforzheim 75179
DE
70-B3-D5 (hex) Lyse AS
F23000-F23FFF (base 16) Lyse AS
Breiflåtveien 18
@ -12734,6 +12902,162 @@ F23000-F23FFF (base 16) Lyse AS
Paris 75006
FR
70-B3-D5 (hex) Hefei STAROT Technology Co.,Ltd
4D3000-4D3FFF (base 16) Hefei STAROT Technology Co.,Ltd
406, 4th Floor, Quality Control Building, Saipu Science Park, No. 6 Yunfei Road, High-tech Zone
hefei anhui 230000
CN
70-B3-D5 (hex) SysCom Automationstechnik GmbH
117000-117FFF (base 16) SysCom Automationstechnik GmbH
An der Lehmkaute 13
Bad Marienberg Rheinland-Pfalz 56470
DE
70-B3-D5 (hex) Walton Hi-Tech Industries Ltd.
E5C000-E5CFFF (base 16) Walton Hi-Tech Industries Ltd.
HOLDING NO. I-65/2, WARD NO-07
CHANDRA, KALIAKOIR, GAZIPUR. 1750
BD
70-B3-D5 (hex) Flextronics International Kft
699000-699FFF (base 16) Flextronics International Kft
38. Zrinyi Str.
Zalaegerszeg Zala 8900
HU
70-B3-D5 (hex) JFA Electronics Industry and Commerce EIRELI
5F7000-5F7FFF (base 16) JFA Electronics Industry and Commerce EIRELI
Rua Flor das Pedras, 175
Belo Horizonte Minas Gerais 30810-000
BR
70-B3-D5 (hex) Hubbell Power Systems
858000-858FFF (base 16) Hubbell Power Systems
353 Powerville Road
Boonton Township NJ 07005
US
70-B3-D5 (hex) aquila biolabs GmbH
7DB000-7DBFFF (base 16) aquila biolabs GmbH
Arnold-Sommerfeld-Ring 2
Baesweiler NRW 52499
DE
70-B3-D5 (hex) Sicon srl
C82000-C82FFF (base 16) Sicon srl
Via Sila 1/3
Isola Vicentina Vicenza 36033
IT
70-B3-D5 (hex) LGE
DAE000-DAEFFF (base 16) LGE
10, Magokjungang 10-ro, Gangseo-gu
Seoul 07796
KR
70-B3-D5 (hex) Jonsa Australia Pty Ltd
335000-335FFF (base 16) Jonsa Australia Pty Ltd
Unit D2 3-29 Birnie Ave
Lidcombe NSW 2141
AU
70-B3-D5 (hex) GreenWake Technologies
467000-467FFF (base 16) GreenWake Technologies
56 boulevard Niels Bohr, CEI2
Villeurbanne 69100
FR
70-B3-D5 (hex) shenzhen suofeixiang technology Co.,Ltd
EEB000-EEBFFF (base 16) shenzhen suofeixiang technology Co.,Ltd
sales09@sfxhd.com
shenzhen 518000
CN
70-B3-D5 (hex) RCH Vietnam Limited Liability Company
97D000-97DFFF (base 16) RCH Vietnam Limited Liability Company
Workshop F.01B-2, Lot No. F.01B Long Hau
Ho Chi Minh City Ho Chi Minh 70000
VN
70-B3-D5 (hex) SNK, Inc.
E12000-E12FFF (base 16) SNK, Inc.
Rm 302 Inobiz park, 1646, Yuseong-daero, Yuseong-gu
Daejeon 34054
KR
70-B3-D5 (hex) SYLink Technologie
466000-466FFF (base 16) SYLink Technologie
18 rue de la conche
Mirefleurs Auvergne 63730
FR
70-B3-D5 (hex) silicom
F64000-F64FFF (base 16) silicom
14 Atir-Yeda St/
Kfar-Sava Israel 44000
IL
70-B3-D5 (hex) NSP Europe Ltd
18A000-18AFFF (base 16) NSP Europe Ltd
Unit 5, Devonshire Business Park
Borehamwood Hert WD6 1NA
GB
70-B3-D5 (hex) Kospel S.A.
249000-249FFF (base 16) Kospel S.A.
Olchowa 1
Koszalin 75-136
PL
70-B3-D5 (hex) Microchip Technology Germany II GmbH&Co.KG
77F000-77FFFF (base 16) Microchip Technology Germany II GmbH&Co.KG
Emmy-Noether-Straße 14
Karlsruhe 76131
DE
70-B3-D5 (hex) Trust Automation
C98000-C98FFF (base 16) Trust Automation
125 Venture Dr
San Luis Obispo CA 93401
US
70-B3-D5 (hex) ARCLAN'SYSTEM
25C000-25CFFF (base 16) ARCLAN'SYSTEM
1140 rue Ampère - Actimart II - Lot 9
AIX EN PROVENCE 13290
FR
70-B3-D5 (hex) Taejin InfoTech
A75000-A75FFF (base 16) Taejin InfoTech
40, Imi-ro, A-411
Uiwang-si Gyeonggi-do 16006
KR
70-B3-D5 (hex) Coheros Oy
D2E000-D2EFFF (base 16) Coheros Oy
Tammukkakatu 6
Nokia 37130
FI
70-B3-D5 (hex) Gogo Business Aviation
E24000-E24FFF (base 16) Gogo Business Aviation
105 Edgeview Dr., Suite 300
Broomfield CO 80021
US
70-B3-D5 (hex) Smart Embedded Systems
A09000-A09FFF (base 16) Smart Embedded Systems
6701 Koll Center Parkway #250
Pleasonton CA 94566
US
70-B3-D5 (hex) Guan Show Technologe Co., Ltd.
F6A000-F6AFFF (base 16) Guan Show Technologe Co., Ltd.
No.127, Jianguo 1st Rd., Lingya Dist.
Kaohsiung City 802
TW
70-B3-D5 (hex) YUYAMA MFG Co.,Ltd
BBB000-BBBFFF (base 16) YUYAMA MFG Co.,Ltd
3-3-1
@ -16859,12 +17183,6 @@ BB2000-BB2FFF (base 16) Mettler Toledo
Lutz FL 33558
US
70-B3-D5 (hex) SFR
B12000-B12FFF (base 16) SFR
12 rue jean-philippe Rameau CS 80001
La plaine saint denis FRANCE 93634
FR
70-B3-D5 (hex) S.E.I. CO.,LTD.
12D000-12DFFF (base 16) S.E.I. CO.,LTD.
59 Nirayama Tada
@ -16985,17 +17303,167 @@ BE0000-BE0FFF (base 16) Cognosos, Inc.
Taoyuan 330
TW
70-B3-D5 (hex) PolyTech A/S
F4C000-F4CFFF (base 16) PolyTech A/S
HI Park 445
Herning Herning 7400
DK
70-B3-D5 (hex) Zhuhai Lonl electric Co.,Ltd.
EA9000-EA9FFF (base 16) Zhuhai Lonl electric Co.,Ltd.
2nd floor, building B3, nanfang software park, xiangzhou district
Zhuhai Guangdong 519000
CN
70-B3-D5 (hex) PolyTech A/S
F4C000-F4CFFF (base 16) PolyTech A/S
HI Park 445
Herning Herning 7400
DK
70-B3-D5 (hex) Shanghai Tiancheng Communication Technology Corporation
1C3000-1C3FFF (base 16) Shanghai Tiancheng Communication Technology Corporation
No.618,Guangxing Rd.,Songjiang
shanghai 200090
CN
70-B3-D5 (hex) SAMBO HITECH
282000-282FFF (base 16) SAMBO HITECH
469,Seokjung-ro,Namdong-Gu
Incheon 21501
KR
70-B3-D5 (hex) M.A.C. Solutions (UK) Ltd
F9F000-F9FFFF (base 16) M.A.C. Solutions (UK) Ltd
Units 6-7 Kingfisher Business Park, Arthur Street
Redditch Worcestershire B98 8LG
GB
70-B3-D5 (hex) ERA TOYS LIMITED
193000-193FFF (base 16) ERA TOYS LIMITED
Room 505, 5th Floor, Beverley Commercial Centre, 87-105 Chatham Road South
Tsim Sha Tsui Kowloon 0000
HK
70-B3-D5 (hex) T&M Media Pty Ltd
B41000-B41FFF (base 16) T&M Media Pty Ltd
6, 476 Gardeners Road
Alexandria NSW 2015
AU
70-B3-D5 (hex) A&T Corporation
32E000-32EFFF (base 16) A&T Corporation
2023-1
Endo, Fujisawa, Kanagawa 252-0816
JP
70-B3-D5 (hex) Scorpion Precision Industry (HK)CO. Ltd.
02B000-02BFFF (base 16) Scorpion Precision Industry (HK)CO. Ltd.
16th Floor, Excelsior Industrial Building,68-76 Sha Tsui Road,
Tsuen Wan New Territories 999077
HK
70-B3-D5 (hex) Shenzhen CAMERAY ELECTRONIC CO., LTD
1E2000-1E2FFF (base 16) Shenzhen CAMERAY ELECTRONIC CO., LTD
4-5FL, Building 1, Guanghui Science, and Technology Park; Minqing Road, Longhua Town
shenzhen GD 518109
CN
70-B3-D5 (hex) Vulcan Wireless Inc.
E4D000-E4DFFF (base 16) Vulcan Wireless Inc.
2218 Faraday Ave Suite 110
Carlsbad CA 92008
US
70-B3-D5 (hex) MIVO Technology AB
1D5000-1D5FFF (base 16) MIVO Technology AB
Hornsbergsvägen 28
Stockholm 11215
SE
70-B3-D5 (hex) Cryptotronix LLC
0DB000-0DBFFF (base 16) Cryptotronix LLC
P.O. Box 273029
Fort Collins CO 80525
US
70-B3-D5 (hex) TOMEI TSUSHIN KOGYO CO,.LTD
FB1000-FB1FFF (base 16) TOMEI TSUSHIN KOGYO CO,.LTD
100-3, Amaike Kodacho
Inazawa Shi Aichi ken 4928274
JP
70-B3-D5 (hex) RCH Vietnam Limited Liability Company
C09000-C09FFF (base 16) RCH Vietnam Limited Liability Company
Workshop F.01B-2, Lot No. F.01B Long Hau
Ho Chi Minh City Ho Chi Minh 70000
VN
70-B3-D5 (hex) Copper Labs, Inc.
F69000-F69FFF (base 16) Copper Labs, Inc.
3015 Sterling Circle #200
Boulder CO 80301
US
70-B3-D5 (hex) DogWatch Inc
1E7000-1E7FFF (base 16) DogWatch Inc
10 Michigan Drive
Natick 01760
US
70-B3-D5 (hex) Grossenbacher Systeme AG
B75000-B75FFF (base 16) Grossenbacher Systeme AG
Spinnereistrasse 10
St. Gallen 9008
CH
70-B3-D5 (hex) ITsynergy Ltd
D2A000-D2AFFF (base 16) ITsynergy Ltd
9 Bonhill Street
London EC2A 4DJ
GB
70-B3-D5 (hex) SHENZHEN HUINENGYUAN Technology Co., Ltd
A83000-A83FFF (base 16) SHENZHEN HUINENGYUAN Technology Co., Ltd
Room 206, 3 Building, Hongwanchuangke Center, Gushu, Xixiang, Baoan District
Shenzhen Guangdong 518126
CN
70-B3-D5 (hex) Vars Technology
C94000-C94FFF (base 16) Vars Technology
Squires gate industrial estate Unit 14
Blackpool lancashire FY4 3RN
GB
70-B3-D5 (hex) Burk Technology
641000-641FFF (base 16) Burk Technology
7 Beaver Brook road
Littleton MA 01460
US
70-B3-D5 (hex) Inventeq B.V.
529000-529FFF (base 16) Inventeq B.V.
Ravenlaan 27
Blaricum 1261WT
NL
70-B3-D5 (hex) Vaunix Technology Corporation
EE6000-EE6FFF (base 16) Vaunix Technology Corporation
7 New Pasture Rd
Newburyport MA 01950
US
70-B3-D5 (hex) Portrait Displays, Inc.
D77000-D77FFF (base 16) Portrait Displays, Inc.
6663 OWENS DR
PLEASANTON CA 94588
US
70-B3-D5 (hex) chargeBIG
869000-869FFF (base 16) chargeBIG
Pragstraße 26-46
Stuttgart 70376
DE
70-B3-D5 (hex) Tricom Research Inc.
601000-601FFF (base 16) Tricom Research Inc.
17791 Sky Park Circle Suite GHJ
Irvine CA 92614
US
70-B3-D5 (hex) DISMUNTEL SAL
92C000-92CFFF (base 16) DISMUNTEL SAL
@ -21292,3 +21760,111 @@ F5D000-F5DFFF (base 16) Potter Electric Signal Co. LLC
via Cupa Vicinale S.Aniello, 88
Naples 80146
IT
70-B3-D5 (hex) ITK Dr. Kassen GmbH
58A000-58AFFF (base 16) ITK Dr. Kassen GmbH
Beim Eberacker 3
D-35633 Lahnau
DE
70-B3-D5 (hex) RCH Vietnam Limited Liability Company
88E000-88EFFF (base 16) RCH Vietnam Limited Liability Company
Workshop F.01B-2, Lot No. F.01B Long Hau
Ho Chi Minh City Ho Chi Minh 70000
VN
70-B3-D5 (hex) Privafy, Inc
A6A000-A6AFFF (base 16) Privafy, Inc
2 Burlington Woods Dr. Suite 200
Burlington MA 01803
US
70-B3-D5 (hex) Contec Americas Inc.
5D2000-5D2FFF (base 16) Contec Americas Inc.
3991 Sarno Rd
Melbourne FL 32934
US
70-B3-D5 (hex) elements
62D000-62DFFF (base 16) elements
Townsgate Road Suite 200
Westlake Village CA 91361
US
70-B3-D5 (hex) DAT Informatics Pvt Ltd
244000-244FFF (base 16) DAT Informatics Pvt Ltd
Plot No 109 HPSIDC Industria Estate Davni, Baddi
Baddi HIMACHAL PRADESH 173205
IN
70-B3-D5 (hex) Abbott Diagnostics Technologies AS
6C6000-6C6FFF (base 16) Abbott Diagnostics Technologies AS
P. O. Box 6863 Rodeløkka
Oslo Oslo 0504
NO
70-B3-D5 (hex) RCH Vietnam Limited Liability Company
6BD000-6BDFFF (base 16) RCH Vietnam Limited Liability Company
Workshop F.01B-2, Lot No. F.01B Long Hau
Ho Chi Minh City Ho Chi Minh 70000
VN
70-B3-D5 (hex) Gamber Johnson-LLC
E34000-E34FFF (base 16) Gamber Johnson-LLC
3001 Borham Ave
Stevens Point WI 54481
US
70-B3-D5 (hex) YUYAMA MFG Co.,Ltd
C2B000-C2BFFF (base 16) YUYAMA MFG Co.,Ltd
3-3-1
TOYONAKASHI OSAKA 561-0841
JP
70-B3-D5 (hex) YUYAMA MFG Co.,Ltd
1F2000-1F2FFF (base 16) YUYAMA MFG Co.,Ltd
3-3-1
TOYONAKASHI OSAKA 561-0841
JP
70-B3-D5 (hex) QUALITTEQ LLC
614000-614FFF (base 16) QUALITTEQ LLC
16th Parkovaya 26/1
Moscow 105484
RU
70-B3-D5 (hex) Adcole Maryland Aerospace
922000-922FFF (base 16) Adcole Maryland Aerospace
669 Forest St
Marlborough MA 01752
US
70-B3-D5 (hex) eSMART Technologies SA
979000-979FFF (base 16) eSMART Technologies SA
Chemin de la Rueyre, 118
Renens VD 1020
CH
70-B3-D5 (hex) Axnes AS
65F000-65FFFF (base 16) Axnes AS
Terje Løvåsvei 1
Grimstad 4879
NO
70-B3-D5 (hex) Duplomatic MS spa
DE1000-DE1FFF (base 16) Duplomatic MS spa
Via Re Depaolini 24
Parabiago Milan 20015
IT
70-B3-D5 (hex) Nanjing Pingguang Electronic Technology Co., Ltd
541000-541FFF (base 16) Nanjing Pingguang Electronic Technology Co., Ltd
B30/B31 4th Floor, Building#11, Shengtai Road, JiangNing District
NanJing 211100
CN
70-B3-D5 (hex) thingdust AG
3C1000-3C1FFF (base 16) thingdust AG
Moosstrasse 7
Lucerne Lucerne 6003
CH

View File

@ -196,10 +196,11 @@ def check_one_mount_matrix(prop, value):
def check_one_keycode(prop, value):
if value != '!' and ecodes is not None:
key = 'KEY_' + value.upper()
if key not in ecodes:
key = value.upper()
if key not in ecodes:
error('Keycode {} unknown', key)
if not (key in ecodes or
value.upper() in ecodes or
# new keys added in kernel 5.5
'KBD_LCD_MENU' in key):
error('Keycode {} unknown', key)
def check_properties(groups):
grammar = property_grammar()

File diff suppressed because it is too large Load Diff

View File

@ -9,8 +9,8 @@
# The latest version can be obtained from
# http://www.linux-usb.org/usb.ids
#
# Version: 2019.11.05
# Date: 2019-11-05 20:34:06
# Version: 2020.01.09
# Date: 2020-01-09 20:34:06
#
# Vendors, devices and interfaces. Please keep sorted.
@ -19098,6 +19098,14 @@
6323 USB Electronic Scale
2237 Kobo Inc.
4161 eReader White
224f APDM
0001 Access Point
0002 Docking Station
0004 V2 Opal ACM
0005 V2 Opal
0006 V2 Docking Station
0007 V2 Access Point ACM
0008 V2 Access Point
225d Morpho
0001 FINGER VP Multimodal Biometric Sensor
0008 CBM-E3 Fingerprint Sensor

View File

@ -92,49 +92,59 @@
<!-- note: do not use unicode ellipsis here, because docbook will replace that
with three dots anyway, messing up alignment -->
<programlisting>local-fs-pre.target
|
v
(various mounts and (various swap (various cryptsetup
fsck services...) devices...) devices...) (various low-level (various low-level
| | | services: udevd, API VFS mounts:
v v v tmpfiles, random mqueue, configfs,
local-fs.target swap.target cryptsetup.target seed, sysctl, ...) debugfs, ...)
| | | | |
\__________________|_________________ | ___________________|____________________/
\|/
v
sysinit.target
|
____________________________________/|\________________________________________
/ | | | \
| | | | |
v v | v v
(various (various | (various rescue.service
timers...) paths...) | sockets...) |
| | | | v
v v | v <emphasis>rescue.target</emphasis>
timers.target paths.target | sockets.target
| | | |
v \_________________ | ___________________/
\|/
v
basic.target
|
____________________________________/| emergency.service
/ | | |
| | | v
v v v <emphasis>emergency.target</emphasis>
display- (various system (various system
manager.service services services)
| required for |
| graphical UIs) v
| | <emphasis>multi-user.target</emphasis>
| | |
\_________________ | _________________/
\|/
v
<emphasis>graphical.target</emphasis></programlisting>
<programlisting> cryptsetup-pre.target
|
(various low-level v
API VFS mounts: (various cryptsetup devices...)
mqueue, configfs, | |
debugfs, ...) v |
| cryptsetup.target |
| (various swap | | remote-fs-pre.target
| devices...) | | | |
| | | | | v
| v local-fs-pre.target | | | (network file systems)
| swap.target | | v v |
| | v | remote-cryptsetup.target |
| | (various low-level (various mounts and | | |
| | services: udevd, fsck services...) | | remote-fs.target
| | tmpfiles, random | | | /
| | seed, sysctl, ...) v | | /
| | | local-fs.target | | /
| | | | | | /
\____|______|_______________ ______|___________/ | /
\ / | /
v | /
sysinit.target | /
| | /
______________________/|\_____________________ | /
/ | | | \ | /
| | | | | | /
v v | v | | /
(various (various | (various | |/
timers...) paths...) | sockets...) | |
| | | | | |
v v | v | |
timers.target paths.target | sockets.target | |
| | | | v |
v \_______ | _____/ rescue.service |
\|/ | |
v v |
basic.target <emphasis>rescue.target</emphasis> |
| |
________v____________________ |
/ | \ |
| | | |
v v v |
display- (various system (various system |
manager.service services services) |
| required for | |
| graphical UIs) v v
| | <emphasis>multi-user.target</emphasis>
emergency.service | | |
| \_____________ | _____________/
v \|/
<emphasis>emergency.target</emphasis> v
<emphasis>graphical.target</emphasis></programlisting>
<para>Target units that are commonly used as boot targets are
<emphasis>emphasized</emphasis>. These units are good choices as
@ -150,6 +160,45 @@
later in boot.</para>
</refsect1>
<refsect1>
<title>User manager startup</title>
<para>The system manager starts the <filename>user@<replaceable>uid</replaceable>.service</filename> unit
for each user, which launches a separate unprivileged instance of <command>systemd</command> for each
user — the user manager. Similarly to the system manager, the user manager starts units which are pulled
in by <filename>default.target</filename>. The following chart is a structural overview of the well-known
user units. For non-graphical sessions, <filename>default.target</filename> is used. Whenever the user
logs into a graphical session, the login manager will start the
<filename>graphical-session.target</filename> target that is used to pull in units required for the
grahpical session. A number of targets (shown on the right side) are started when specific hardware is
available to the user.</para>
<programlisting>
(various (various (various
timers...) paths...) sockets...) (sound devices)
| | | |
v v v v
timers.target paths.target sockets.target sound.target
| | |
\______________ _|_________________/ (bluetooth devices)
\ / |
V v
basic.target bluetooth.target
|
__________/ \_______ (smartcard devices)
/ \ |
| | v
| v smartcard.target
v graphical-session-pre.target
(various user services) | (printers)
| v |
| (services for the graphical sesion) v
| | printer.target
v v
<emphasis>default.target</emphasis> graphical-session.target</programlisting>
</refsect1>
<refsect1>
<title>Bootup in the Initial RAM Disk (initrd)</title>
<para>The initial RAM disk implementation (initrd) can be set up

View File

@ -110,8 +110,11 @@
<listitem><para>Controls whether to split up journal files per user, either <literal>uid</literal> or
<literal>none</literal>. Split journal files are primarily useful for access control: on UNIX/Linux access
control is managed per file, and the journal daemon will assign users read access to their journal files. If
<literal>uid</literal>, all regular users will each get their own journal files, and system users will log to
the system journal. If <literal>none</literal>, journal files are not split up by user and all messages are
<literal>uid</literal>, all regular users (with UID outside the range of system users, dynamic service users,
and the nobody user) will each get their own journal files, and system users will log to the system journal.
See <ulink url="https://systemd.io/UIDS-GIDS">Users, Groups, UIDs and GIDs on systemd systems</ulink>
for more details about UID ranges.
If <literal>none</literal>, journal files are not split up by user and all messages are
instead stored in the single system journal. In this mode unprivileged users generally do not have access to
their own log data. Note that splitting up journal files by user is only available for journals stored
persistently. If journals are stored on volatile storage (see <varname>Storage=</varname> above), only a single
@ -317,7 +320,7 @@
<term><varname>MaxLevelWall=</varname></term>
<listitem><para>Controls the maximum log level of messages
that are stored on disk, forwarded to syslog, kmsg, the
that are stored in the journal, forwarded to syslog, kmsg, the
console or wall (if that is enabled, see above). As argument,
takes one of
<literal>emerg</literal>,
@ -333,8 +336,8 @@
are stored/forwarded, messages above are dropped. Defaults to
<literal>debug</literal> for <varname>MaxLevelStore=</varname>
and <varname>MaxLevelSyslog=</varname>, to ensure that the all
messages are written to disk and forwarded to syslog. Defaults
to
messages are stored in the journal and forwarded to syslog.
Defaults to
<literal>notice</literal> for <varname>MaxLevelKMsg=</varname>,
<literal>info</literal> for <varname>MaxLevelConsole=</varname>,
and <literal>emerg</literal> for

View File

@ -203,7 +203,7 @@ multi-user.target reached after 47.820s in userspace
jobs (and in particular not jobs that timed out).</para>
<example>
<title><command>systemd-analyze time</command></title>
<title><command>systemd-analyze critical-chain</command></title>
<programlisting>$ systemd-analyze critical-chain
multi-user.target @47.820s

View File

@ -200,8 +200,11 @@ systemd-tmpfiles --create --prefix /var/log/journal</programlisting>
writable. Adding a user to this group thus enables them to read
the journal files.</para>
<para>By default, each logged in user will get their own set of
journal files in <filename>/var/log/journal/</filename>. These
<para>By default, each user, with a UID outside the range of system users,
dynamic service users, and the nobody user, will get their own set of
journal files in <filename>/var/log/journal/</filename>. See
<ulink url="https://systemd.io/UIDS-GIDS">Users, Groups, UIDs and GIDs on systemd systems</ulink>
for more details about UID ranges. These journal
files will not be owned by the user, however, in order to avoid
that the user can write to them directly. Instead, file system
ACLs are used to ensure the user gets read access only.</para>

View File

@ -63,6 +63,7 @@
<citerefentry project='man-pages'><refentrytitle>ext4</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
btrfs (see
<citerefentry project='man-pages'><refentrytitle>btrfs-man5</refentrytitle><manvolnum>5</manvolnum></citerefentry>),
<citerefentry project='man-pages'><refentrytitle>xfs</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
<!-- yes, that's what the man page is called. -->
and dm-crypt partitions (see
<citerefentry project='die-net'><refentrytitle>cryptsetup</refentrytitle><manvolnum>8</manvolnum></citerefentry>).

View File

@ -1902,7 +1902,8 @@ SystemCallErrorNumber=EPERM</programlisting>
<para>The files listed with this directive will be read shortly before the process is executed (more
specifically, after all processes from a previous unit state terminated. This means you can generate these
files in one unit state, and read it with this option in the next).</para>
files in one unit state, and read it with this option in the next. The files are read from the file
system of the service manager, before any file system changes like bind mounts take place).</para>
<para>Settings from these files override settings made with <varname>Environment=</varname>. If the same
variable is set twice from these files, the files will be read in the order they are specified and the later

View File

@ -211,9 +211,9 @@
<term><option>x-systemd.before=</option></term>
<term><option>x-systemd.after=</option></term>
<listitem><para>Configures a <varname>Before=</varname>
dependency or <varname>After=</varname> between the created
mount unit and another systemd unit, such as a mount unit.
<listitem><para>In the created mount unit, configures a
<varname>Before=</varname> or <varname>After=</varname>
dependency on another systemd unit, such as a mount unit.
The argument should be a unit name or an absolute path
to a mount point. This option may be specified more than once.
This option is particularly useful for mount point declarations

View File

@ -94,8 +94,8 @@
<varlistentry>
<term><varname>ID_NET_NAME_ONBOARD=<replaceable>prefix</replaceable><constant>o</constant><replaceable>number</replaceable></varname></term>
<listitem><para>This name is set based on the ordering information given by the firmware for
on-board devices. The name consists of the prefix, letter <constant>o</constant>, and a number
<listitem><para>This name is set based on the numeric ordering information given by the firmware
for on-board devices. The name consists of the prefix, letter <constant>o</constant>, and a number
specified by the firmware. This is only available for PCI devices.</para>
</listitem>
</varlistentry>
@ -103,8 +103,9 @@
<varlistentry>
<term><varname>ID_NET_LABEL_ONBOARD=<replaceable>prefix</replaceable> <replaceable>label</replaceable></varname></term>
<listitem><para>This property is set based on label given by the firmware for on-board devices. The
name consists of the prefix concatenated with the label. This is only available for PCI devices.
<listitem><para>This property is set based on textual label given by the firmware for on-board
devices. The name consists of the prefix concatenated with the label. This is only available for
PCI devices.
</para>
</listitem>
</varlistentry>
@ -121,15 +122,15 @@
<varlistentry>
<term><varname>ID_NET_NAME_SLOT=<replaceable>prefix</replaceable>[<constant>P</constant><replaceable>domain</replaceable>]<constant>s</constant><replaceable>slot</replaceable>[<constant>f</constant><replaceable>function</replaceable>][<constant>n</constant><replaceable>port_name</replaceable>|<constant>d</constant><replaceable>dev_port</replaceable>]</varname></term>
<term><varname>ID_NET_NAME_SLOT=<replaceable>prefix</replaceable><constant>v</constant><replaceable>slot</replaceable></varname></term>
<term><varname>ID_NET_NAME_SLOT=<replaceable>prefix</replaceable>[<constant>P</constant><replaceable>domain</replaceable>]<constant>s</constant><replaceable>slot</replaceable>[<constant>f</constant><replaceable>function</replaceable>][<constant>n</constant><replaceable>port_name</replaceable>|<constant>d</constant><replaceable>dev_port</replaceable>]<constant>b</constant><replaceable>number</replaceable></varname></term>
<term><varname>ID_NET_NAME_SLOT=<replaceable>prefix</replaceable>[<constant>P</constant><replaceable>domain</replaceable>]<constant>s</constant><replaceable>slot</replaceable>[<constant>f</constant><replaceable>function</replaceable>][<constant>n</constant><replaceable>port_name</replaceable>|<constant>d</constant><replaceable>dev_port</replaceable>]<constant>u</constant><replaceable>port</replaceable>…[<constant>c</constant><replaceable>config</replaceable>][<constant>i</constant><replaceable>interface</replaceable>]</varname></term>
<term><varname>ID_NET_NAME_SLOT=<replaceable>prefix</replaceable>[<constant>P</constant><replaceable>domain</replaceable>]<constant>s</constant><replaceable>slot</replaceable>[<constant>f</constant><replaceable>function</replaceable>][<constant>n</constant><replaceable>port_name</replaceable>|<constant>d</constant><replaceable>dev_port</replaceable>]<constant>v</constant><replaceable>slot</replaceable></varname></term>
<listitem><para>This property describes the slot position. Different schemes are used depending on
the bus type, as described in the table below. In all cases, PCI slot information must be known. In
case of USB, BCMA, and SR-VIO devices, the full name consists of the prefix, PCI slot identifier,
and USB or BCMA or SR-VIO slot identifier. The first two parts are denoted as "…" in the table
below.</para>
the bus type, as described in the table below. In case of USB, BCMA, and SR-VIO devices, the full
name consists of the prefix, PCI slot identifier, and USB or BCMA or SR-VIO slot identifier. The
first two parts are denoted as "…" in the table below.</para>
<table>
<title>Slot naming schemes</title>
@ -148,6 +149,11 @@
<entry>PCI slot number</entry>
</row>
<row>
<entry><replaceable>prefix</replaceable> <constant>v</constant><replaceable>slot</replaceable></entry>
<entry>VIO slot number (IBM PowerVM)</entry>
</row>
<row>
<entry>… <constant>b</constant><replaceable>number</replaceable></entry>
<entry>Broadcom bus (BCMA) core number</entry>
@ -177,11 +183,11 @@
<para>For USB devices the full chain of port numbers of hubs is composed. If the name gets longer
than the maximum number of 15 characters, the name is not exported. The usual USB configuration
number 1 and interface number 0 values are suppressed.</para>
</listitem>
<para>SR-IOV virtual devices are named based on the name of the parent interface, with a suffix of
<constant>v</constant> and the virtual device number, with any leading zeros removed. The bus
number is ignored. This device type is found in IBM PowerVMs.</para>
number is ignored.</para>
</listitem>
</varlistentry>
<varlistentry>

View File

@ -2109,7 +2109,7 @@ Endpoint=wireguard.example.com:51820</programlisting>
<example>
<title>/etc/systemd/network/27-xfrm.netdev</title>
<programlisting>[Xfrm]
<programlisting>[NetDev]
Name=xfrm0
Kind=xfrm

View File

@ -1004,12 +1004,10 @@
</listitem>
</varlistentry>
<varlistentry>
<term><varname>PrefixRoute=</varname></term>
<term><varname>AddPrefixRoute=</varname></term>
<listitem>
<para>Takes a boolean. When adding or modifying an IPv6 address, the userspace
application needs a way to suppress adding a prefix route. This is for example relevant
together with IFA_F_MANAGERTEMPADDR, where userspace creates autoconf generated addresses,
but depending on on-link, no route for the prefix should be added. Defaults to false.</para>
<para>Takes a boolean. When true, the prefix route for the address is automatically added.
Defaults to true.</para>
</listitem>
</varlistentry>
<varlistentry>

View File

@ -467,10 +467,12 @@
<programlisting>systemd-analyze --user unit-paths</programlisting>
</para>
<para>Moreover, additional units might be loaded into systemd ("linked") from
directories not on the unit load path. See the <command>link</command> command
for
<citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>.
<para>Moreover, additional units might be loaded into systemd from
directories not on the unit load path by creating a symlink pointing to a
unit file in the directories. You can use <command>systemctl link</command>
for this operation. See
<citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>
for its usage and precaution.
</para>
</refsect1>
@ -1545,7 +1547,7 @@
<para>Note: <varname>ConsistsOf=</varname>, <varname>BoundBy=</varname>,
<varname>RequisiteOf=</varname>, <varname>ConflictedBy=</varname> are created
implicitly along with their reverse and cannot be specified directly.</para>
implicitly along with their reverses and cannot be specified directly.</para>
<para>Note: <varname>Triggers=</varname> is created implicitly between a socket,
path unit, or an automount unit, and the unit they activate. By default a unit
@ -1557,7 +1559,7 @@
<citerefentry><refentrytitle>systemd.path</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
and
<citerefentry><refentrytitle>systemd.automount</refentrytitle><manvolnum>5</manvolnum></citerefentry>
for details. <varname>TriggersBy=</varname> is created implicitly on the
for details. <varname>TriggeredBy=</varname> is created implicitly on the
triggered unit.</para>
<para>Note: <varname>Following=</varname> is used to group device aliases and points to the

View File

@ -535,7 +535,7 @@ w- /proc/sys/vm/swappiness - - - - 10</programlisting></para>
guaranteed to be resolvable during early boot. If this field references users/groups that only become
resolveable during later boot (i.e. after NIS, LDAP or a similar networked directory service become
available), execution of the operations declared by the line will likely fail. Also see <ulink
url="https://systemd.io/UIDS-GIDS.html#notes-on-resolvability-of-user-and-group-names">Notes on
url="https://systemd.io/UIDS-GIDS/#notes-on-resolvability-of-user-and-group-names">Notes on
Resolvability of User and Group Names</ulink> for more information on requirements on system user/group
definitions.</para>
</refsect2>

View File

@ -3170,8 +3170,8 @@ if conf.get('ENABLE_EFI') == 1
status += [
'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
'EFI CC @0@'.format(' '.join(efi_cc)),
'EFI lib directory: @0@'.format(efi_libdir),
'EFI lds directory: @0@'.format(efi_ldsdir),
'EFI lds: @0@'.format(efi_lds),
'EFI crt0: @0@'.format(efi_crt0),
'EFI include directory: @0@'.format(efi_incdir)]
endif
endif

View File

@ -309,8 +309,6 @@ option('efi-ld', type : 'string',
description : 'the linker to use for EFI modules')
option('efi-libdir', type : 'string',
description : 'path to the EFI lib directory')
option('efi-ldsdir', type : 'string',
description : 'path to the EFI lds directory')
option('efi-includedir', type : 'string', value : '/usr/include/efi',
description : 'path to the EFI header directory')
option('tpm-pcrindex', type : 'integer', value : 8,

View File

@ -7,8 +7,9 @@
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
# These ones should be enabled by default, even if distributions
# generally follow a default-off policy.
# Settings for systemd units distributed with systemd itself. Most of these
# should be enabled by default, even if the distribution follows a general
# default-off policy.
enable remote-fs.target
enable remote-cryptsetup.target
@ -34,3 +35,18 @@ disable syslog.socket
disable systemd-journal-gatewayd.*
disable systemd-journal-remote.*
disable systemd-journal-upload.*
# Passive targets: always off by default, since they should only be pulled in
# by dependent units.
disable cryptsetup-pre.target
disable getty-pre.target
disable local-fs-pre.target
disable network.target
disable network-pre.target
disable nss-lookup.target
disable nss-user-lookup.target
disable remote-fs-pre.target
disable rpcbind.target
disable time-set.target
disable time-sync.target

View File

@ -7,8 +7,15 @@
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
# These ones should be enabled by default, even if distributions
# generally follow a default-off policy.
# Settings for systemd units distributed with systemd itself. These should be
# enabled by default, even if the distribution follows a general default-off
# policy.
enable systemd-tmpfiles-setup.service
enable systemd-tmpfiles-clean.timer
# Passive targets: always off by default, since they should only be pulled in
# by dependent units.
disable graphical-session-pre.target
disable graphical-session.target

View File

@ -12,8 +12,22 @@ KERNEL!="loop*|mmcblk*[0-9]|msblk*[0-9]|mspblk*[0-9]|nvme*|sd*|sr*|vd*|xvd*|bcac
# ignore partitions that span the entire disk
TEST=="whole_disk", GOTO="persistent_storage_end"
# for partitions import parent information
ENV{DEVTYPE}=="partition", IMPORT{parent}="ID_*"
# For partitions import parent disk ID_* information, except ID_FS_*.
#
# This is particularly important on media where a filesystem superblock and
# partition table are found on the same level, e.g. common Linux distro ISO
# installation media.
#
# In the case where a partition device points to the same filesystem that
# was detected on the parent disk, the ID_FS_* information is already
# present on the partition devices as well as the parent, so no need to
# propagate it. In the case where the partition device points to a different
# filesystem, merging the parent ID_FS_ properties would lead to
# inconsistencies, so we avoid doing so.
ENV{DEVTYPE}=="partition", \
IMPORT{parent}="ID_[!F]*", IMPORT{parent}="ID_", \
IMPORT{parent}="ID_F[!S]*", IMPORT{parent}="ID_F", \
IMPORT{parent}="ID_FS[!_]*", IMPORT{parent}="ID_FS"
# NVMe
KERNEL=="nvme*[0-9]n*[0-9]", ATTR{wwid}=="?*", SYMLINK+="disk/by-id/nvme-$attr{wwid}"

View File

@ -306,7 +306,7 @@ static int assess_root_directory(
assert(ret_description);
*ret_badness =
empty_or_root(info->root_directory) ||
empty_or_root(info->root_directory) &&
empty_or_root(info->root_image);
*ret_description = NULL;
@ -746,7 +746,7 @@ static const struct security_assessor security_assessor_table[] = {
{
.id = "ProtectControlGroups=",
.description_good = "Service cannot modify the control group file system",
.description_bad = "Service may modify to the control group file system",
.description_bad = "Service may modify the control group file system",
.url = "https://www.freedesktop.org/software/systemd/man/systemd.exec.html#ProtectControlGroups=",
.weight = 1000,
.range = 1,

View File

@ -20,6 +20,7 @@
#include "strv.h"
#include "time-util.h"
#include "utf8.h"
#include "virt.h"
#if ENABLE_EFI
@ -220,6 +221,41 @@ int efi_set_variable_string(sd_id128_t vendor, const char *name, const char *v)
return efi_set_variable(vendor, name, u16, (char16_strlen(u16) + 1) * sizeof(char16_t));
}
bool is_efi_boot(void) {
if (detect_container() > 0)
return false;
return access("/sys/firmware/efi/", F_OK) >= 0;
}
static int read_flag(const char *varname) {
_cleanup_free_ void *v = NULL;
uint8_t b;
size_t s;
int r;
if (!is_efi_boot()) /* If this is not an EFI boot, assume the queried flags are zero */
return 0;
r = efi_get_variable(EFI_VENDOR_GLOBAL, varname, NULL, &v, &s);
if (r < 0)
return r;
if (s != 1)
return -EINVAL;
b = *(uint8_t *)v;
return !!b;
}
bool is_efi_secure_boot(void) {
return read_flag("SecureBoot") > 0;
}
bool is_efi_secure_boot_setup_mode(void) {
return read_flag("SetupMode") > 0;
}
int systemd_efi_options_variable(char **line) {
const char *e;
int r;

View File

@ -28,6 +28,10 @@ int efi_get_variable_string(sd_id128_t vendor, const char *name, char **p);
int efi_set_variable(sd_id128_t vendor, const char *name, const void *value, size_t size);
int efi_set_variable_string(sd_id128_t vendor, const char *name, const char *p);
bool is_efi_boot(void);
bool is_efi_secure_boot(void);
bool is_efi_secure_boot_setup_mode(void);
int systemd_efi_options_variable(char **line);
#else
@ -52,6 +56,18 @@ static inline int efi_set_variable_string(sd_id128_t vendor, const char *name, c
return -EOPNOTSUPP;
}
static inline bool is_efi_boot(void) {
return false;
}
static inline bool is_efi_secure_boot(void) {
return false;
}
static inline bool is_efi_secure_boot_setup_mode(void) {
return false;
}
static inline int systemd_efi_options_variable(char **line) {
return -ENODATA;
}

View File

@ -39,6 +39,18 @@ int proc_cmdline(char **ret) {
return read_one_line_file("/proc/cmdline", ret);
}
/* In SecureBoot mode this is probably not what you want. As your cmdline is
* cryptographically signed like when using Type #2 EFI Unified Kernel Images
* (https://systemd.io/BOOT_LOADER_SPECIFICATION/) The user's intention is then
* that the cmdline should not be modified. You want to make sure that the
* system starts up as exactly specified in the signed artifact. */
static int systemd_options_variable(char **line) {
if (is_efi_secure_boot())
return -ENODATA;
return systemd_efi_options_variable(line);
}
static int proc_cmdline_extract_first(const char **p, char **ret_word, ProcCmdlineFlags flags) {
const char *q = *p;
int r;
@ -119,7 +131,7 @@ int proc_cmdline_parse(proc_cmdline_parse_t parse_item, void *data, ProcCmdlineF
/* We parse the EFI variable first, because later settings have higher priority. */
r = systemd_efi_options_variable(&line);
r = systemd_options_variable(&line);
if (r < 0 && r != -ENODATA)
log_debug_errno(r, "Failed to get SystemdOptions EFI variable, ignoring: %m");
@ -250,7 +262,7 @@ int proc_cmdline_get_key(const char *key, ProcCmdlineFlags flags, char **ret_val
return r;
line = mfree(line);
r = systemd_efi_options_variable(&line);
r = systemd_options_variable(&line);
if (r == -ENODATA)
return false; /* Not found */
if (r < 0)

View File

@ -1500,8 +1500,29 @@ int time_change_fd(void) {
if (fd < 0)
return -errno;
if (timerfd_settime(fd, TFD_TIMER_ABSTIME|TFD_TIMER_CANCEL_ON_SET, &its, NULL) < 0)
return -errno;
if (timerfd_settime(fd, TFD_TIMER_ABSTIME|TFD_TIMER_CANCEL_ON_SET, &its, NULL) >= 0)
return TAKE_FD(fd);
return TAKE_FD(fd);
/* So apparently there are systems where time_t is 64bit, but the kernel actually doesn't support
* 64bit time_t. In that case configuring a timer to TIME_T_MAX will fail with EOPNOTSUPP or a
* similar error. If that's the case let's try with INT32_MAX instead, maybe that works. It's a bit
* of a black magic thing though, but what can we do?
*
* We don't want this code on x86-64, hence let's conditionalize this for systems with 64bit time_t
* but where "long" is shorter than 64bit, i.e. 32bit archs.
*
* See: https://github.com/systemd/systemd/issues/14362 */
#if SIZEOF_TIME_T == 8 && ULONG_MAX < UINT64_MAX
if (ERRNO_IS_NOT_SUPPORTED(errno) || errno == EOVERFLOW) {
static const struct itimerspec its32 = {
.it_value.tv_sec = INT32_MAX,
};
if (timerfd_settime(fd, TFD_TIMER_ABSTIME|TFD_TIMER_CANCEL_ON_SET, &its32, NULL) >= 0)
return TAKE_FD(fd);
}
#endif
return -errno;
}

View File

@ -404,10 +404,10 @@ static VOID print_status(Config *config, CHAR16 *loaded_image_path) {
Print(L"random-seed-mode: off\n");
break;
case RANDOM_SEED_WITH_SYSTEM_TOKEN:
Print(L"random-seed-node: with-system-token\n");
Print(L"random-seed-mode: with-system-token\n");
break;
case RANDOM_SEED_ALWAYS:
Print(L"random-seed-node: always\n");
Print(L"random-seed-mode: always\n");
break;
default:
;
@ -1951,7 +1951,7 @@ static VOID config_entry_add_linux(
continue;
}
if (strcmpa((CHAR8 *)"VERSION_ID", key) == 0) {
if (strcmpa((CHAR8 *)"VERSION", key) == 0) {
FreePool(os_version);
os_version = stra_to_str(value);
continue;

View File

@ -64,12 +64,19 @@ if conf.get('ENABLE_EFI') == 1 and get_option('gnu-efi') != 'false'
efi_libdir = get_option('efi-libdir')
if efi_libdir == ''
ret = run_command(efi_cc + ['-print-multi-os-directory'])
if ret.returncode() == 0
path = join_paths('/usr/lib', ret.stdout().strip())
ret = run_command('realpath', '-e', path)
if ret.returncode() == 0
efi_libdir = ret.stdout().strip()
# New location first introduced with gnu-efi 3.0.11
efi_libdir = join_paths('/usr/lib/gnuefi', EFI_MACHINE_TYPE_NAME)
cmd = run_command('test', '-e', efi_libdir)
if cmd.returncode() != 0
# Fall back to the old approach
cmd = run_command(efi_cc + ['-print-multi-os-directory'])
if cmd.returncode() == 0
path = join_paths('/usr/lib', cmd.stdout().strip())
cmd = run_command('realpath', '-e', path)
if cmd.returncode() == 0
efi_libdir = cmd.stdout().strip()
endif
endif
endif
endif
@ -95,20 +102,35 @@ if have_gnu_efi
objcopy = find_program('objcopy')
efi_ldsdir = get_option('efi-ldsdir')
arch_lds = 'elf_@0@_efi.lds'.format(gnu_efi_path_arch)
if efi_ldsdir == ''
efi_ldsdir = join_paths(efi_libdir, 'gnuefi')
cmd = run_command('test', '-f', join_paths(efi_ldsdir, arch_lds))
if cmd.returncode() != 0
efi_ldsdir = efi_libdir
cmd = run_command('test', '-f', join_paths(efi_ldsdir, arch_lds))
if cmd.returncode() != 0
error('Cannot find @0@'.format(arch_lds))
efi_location_map = [
# New locations first introduced with gnu-efi 3.0.11
[join_paths(efi_libdir, 'efi.lds'),
join_paths(efi_libdir, 'crt0.o')],
# Older locations...
[join_paths(efi_libdir, 'gnuefi', 'elf_@0@_efi.lds'.format(gnu_efi_path_arch)),
join_paths(efi_libdir, 'gnuefi', 'crt0-efi-@0@.o'.format(gnu_efi_path_arch))],
[join_paths(efi_libdir, 'elf_@0@_efi.lds'.format(gnu_efi_path_arch)),
join_paths(efi_libdir, 'crt0-efi-@0@.o'.format(gnu_efi_path_arch))]]
efi_lds = ''
foreach location : efi_location_map
if efi_lds == ''
cmd = run_command('test', '-f', location[0])
if cmd.returncode() == 0
efi_lds = location[0]
efi_crt0 = location[1]
endif
endif
endforeach
if efi_lds == ''
if get_option('gnu-efi') == 'true'
error('gnu-efi support requested, but cannot find efi.lds')
else
have_gnu_efi = false
endif
endif
endif
if have_gnu_efi
compile_args = ['-Wall',
'-Wextra',
'-std=gnu90',
@ -145,14 +167,13 @@ if have_gnu_efi
compile_args += ['-O2']
endif
efi_ldflags = ['-T',
join_paths(efi_ldsdir, arch_lds),
efi_ldflags = ['-T', efi_lds,
'-shared',
'-Bsymbolic',
'-nostdlib',
'-znocombreloc',
'-L', efi_libdir,
join_paths(efi_ldsdir, 'crt0-efi-@0@.o'.format(gnu_efi_path_arch))]
efi_crt0]
if efi_arch == 'aarch64' or efi_arch == 'arm'
# Aarch64 and ARM32 don't have an EFI capable objcopy. Use 'binary'
# instead, and add required symbols manually.
@ -219,11 +240,9 @@ if have_gnu_efi
set_variable(tuple[0].underscorify(), so)
set_variable(tuple[0].underscorify() + '_stub', stub)
endforeach
endif
############################################################
############################################################
if have_gnu_efi
test_efi_disk_img = custom_target(
'test-efi-disk.img',
input : [systemd_boot_so, stub_so_stub],

View File

@ -55,7 +55,7 @@ static inline void FileHandleClosep(EFI_FILE_HANDLE *handle) {
uefi_call_wrapper((*handle)->Close, 1, *handle);
}
const EFI_GUID loader_guid;
extern const EFI_GUID loader_guid;
#define UINTN_MAX (~(UINTN)0)
#define INTN_MAX ((INTN)(UINTN_MAX>>1))

View File

@ -2334,29 +2334,39 @@ unsigned manager_dispatch_cgroup_realize_queue(Manager *m) {
static void unit_add_siblings_to_cgroup_realize_queue(Unit *u) {
Unit *slice;
/* This adds the siblings of the specified unit and the
* siblings of all parent units to the cgroup queue. (But
* neither the specified unit itself nor the parents.) */
/* This adds the siblings of the specified unit and the siblings of all parent units to the cgroup
* queue. (But neither the specified unit itself nor the parents.)
*
* Propagation of realization "side-ways" (i.e. towards siblings) is in relevant on cgroup-v1 where
* scheduling become very weird if two units that own processes reside in the same slice, but one is
* realized in the "cpu" hierarchy and once is not (for example because one has CPUWeight= set and
* the other does not), because that means processes need to be scheduled against groups. Let's avoid
* this asymmetry by always ensuring that units below a slice that are realized at all are hence
* always realized in *all* their hierarchies, and it is sufficient for a unit's sibling to be
* realized for a unit to be realized too. */
while ((slice = UNIT_DEREF(u->slice))) {
Iterator i;
Unit *m;
void *v;
HASHMAP_FOREACH_KEY(v, m, u->dependencies[UNIT_BEFORE], i) {
/* Skip units that have a dependency on the slice
* but aren't actually in it. */
HASHMAP_FOREACH_KEY(v, m, slice->dependencies[UNIT_BEFORE], i) {
/* Skip units that have a dependency on the slice but aren't actually in it. */
if (UNIT_DEREF(m->slice) != slice)
continue;
/* No point in doing cgroup application for units
* without active processes. */
/* No point in doing cgroup application for units without active processes. */
if (UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(m)))
continue;
/* If the unit doesn't need any new controllers
* and has current ones realized, it doesn't need
* any changes. */
/* We only enqueue siblings if they were realized once at least, in the main
* hierarchy. */
if (!m->cgroup_realized)
continue;
/* If the unit doesn't need any new controllers and has current ones realized, it
* doesn't need any changes. */
if (unit_has_mask_realized(m,
unit_get_target_mask(m),
unit_get_enable_mask(m)))
@ -2652,6 +2662,7 @@ void unit_add_to_cgroup_empty_queue(Unit *u) {
/* Let's verify that the cgroup is really empty */
if (!u->cgroup_path)
return;
r = cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path);
if (r < 0) {
log_unit_debug_errno(u, r, "Failed to determine whether cgroup %s is empty: %m", u->cgroup_path);

View File

@ -1902,6 +1902,12 @@ static int install_error(
"Unit %s is transient or generated.", changes[i].path);
goto found;
case -EUCLEAN:
r = sd_bus_error_setf(error, BUS_ERROR_BAD_UNIT_SETTING,
"\"%s\" is not a valid unit name.",
changes[i].path);
goto found;
case -ELOOP:
r = sd_bus_error_setf(error, BUS_ERROR_UNIT_LINKED,
"Refusing to operate on alias name or linked unit file: %s",

View File

@ -5,6 +5,7 @@
#include "alloc-util.h"
#include "bpf-firewall.h"
#include "bus-common-errors.h"
#include "bus-polkit.h"
#include "cgroup-util.h"
#include "condition.h"
#include "dbus-job.h"
@ -2012,6 +2013,21 @@ static int bus_unit_set_transient_property(
if (d >= 0) {
const char *other;
if (!IN_SET(d,
UNIT_REQUIRES,
UNIT_REQUISITE,
UNIT_WANTS,
UNIT_BINDS_TO,
UNIT_PART_OF,
UNIT_CONFLICTS,
UNIT_BEFORE,
UNIT_AFTER,
UNIT_ON_FAILURE,
UNIT_PROPAGATES_RELOAD_TO,
UNIT_RELOAD_PROPAGATED_FROM,
UNIT_JOINS_NAMESPACE_OF))
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Dependency type %s may not be created transiently.", unit_dependency_to_string(d));
r = sd_bus_message_enter_container(message, 'a', "s");
if (r < 0)
return r;

View File

@ -10,7 +10,7 @@
#include "bus-common-errors.h"
#include "bus-error.h"
#include "bus-internal.h"
#include "bus-util.h"
#include "bus-polkit.h"
#include "dbus-automount.h"
#include "dbus-cgroup.h"
#include "dbus-device.h"

View File

@ -4702,7 +4702,9 @@ int unit_load_fragment(Unit *u) {
return r;
if (null_or_empty(&st)) {
u->load_state = UNIT_MASKED;
/* Unit file is masked */
u->load_state = u->perpetual ? UNIT_LOADED : UNIT_MASKED; /* don't allow perpetual units to ever be masked */
u->fragment_mtime = 0;
} else {
u->load_state = UNIT_LOADED;

View File

@ -197,6 +197,8 @@ endforeach
install_data('org.freedesktop.systemd1.conf',
install_dir : dbuspolicydir)
install_data('org.freedesktop.systemd1.service',
install_dir : dbussystemservicedir)
policy = configure_file(
input : 'org.freedesktop.systemd1.policy.in',

View File

@ -537,10 +537,9 @@ static int mount_verify(Mount *m) {
}
p = get_mount_parameters_fragment(m);
if (p && !p->what) {
log_unit_error(UNIT(m), "What= setting is missing. Refusing.");
return -ENOEXEC;
}
if (p && !p->what && !UNIT(m)->perpetual)
return log_unit_error_errno(UNIT(m), SYNTHETIC_ERRNO(ENOEXEC),
"What= setting is missing. Refusing.");
if (m->exec_context.pam_name && m->kill_context.kill_mode != KILL_CONTROL_GROUP) {
log_unit_error(UNIT(m), "Unit has PAM enabled. Kill mode must be set to control-group'. Refusing.");
@ -1568,7 +1567,7 @@ static int mount_setup_existing_unit(
if (r > 0)
flags |= MOUNT_PROC_JUST_CHANGED;
if (!MOUNT(u)->from_proc_self_mountinfo || FLAGS_SET(MOUNT(u)->proc_flags, MOUNT_PROC_JUST_MOUNTED))
if (!MOUNT(u)->from_proc_self_mountinfo || FLAGS_SET(MOUNT(u)->proc_flags, MOUNT_PROC_JUST_MOUNTED) || MOUNT(u)->state == MOUNT_MOUNTING)
flags |= MOUNT_PROC_JUST_MOUNTED;
MOUNT(u)->from_proc_self_mountinfo = true;

View File

@ -0,0 +1,13 @@
# SPDX-License-Identifier: LGPL-2.1+
#
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
[D-BUS Service]
Name=org.freedesktop.systemd1
Exec=/bin/false
User=root

View File

@ -650,24 +650,37 @@ static int service_add_default_dependencies(Service *s) {
return unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, true, UNIT_DEPENDENCY_DEFAULT);
}
static void service_fix_output(Service *s) {
static void service_fix_stdio(Service *s) {
assert(s);
/* If nothing has been explicitly configured, patch default output in. If input is socket/tty we avoid this
* however, since in that case we want output to default to the same place as we read input from. */
if (s->exec_context.std_error == EXEC_OUTPUT_INHERIT &&
s->exec_context.std_output == EXEC_OUTPUT_INHERIT &&
s->exec_context.std_input == EXEC_INPUT_NULL)
s->exec_context.std_error = UNIT(s)->manager->default_std_error;
if (s->exec_context.std_output == EXEC_OUTPUT_INHERIT &&
s->exec_context.std_input == EXEC_INPUT_NULL)
s->exec_context.std_output = UNIT(s)->manager->default_std_output;
/* Note that EXEC_INPUT_NULL and EXEC_OUTPUT_INHERIT play a special role here: they are both the
* default value that is subject to automatic overriding triggered by other settings and an explicit
* choice the user can make. We don't distuingish between these cases currently. */
if (s->exec_context.std_input == EXEC_INPUT_NULL &&
s->exec_context.stdin_data_size > 0)
s->exec_context.std_input = EXEC_INPUT_DATA;
if (IN_SET(s->exec_context.std_input,
EXEC_INPUT_TTY,
EXEC_INPUT_TTY_FORCE,
EXEC_INPUT_TTY_FAIL,
EXEC_INPUT_SOCKET,
EXEC_INPUT_NAMED_FD))
return;
/* We assume these listed inputs refer to bidirectional streams, and hence duplicating them from
* stdin to stdout/stderr makes sense and hence leaving EXEC_OUTPUT_INHERIT in place makes sense,
* too. Outputs such as regular files or sealed data memfds otoh don't really make sense to be
* duplicated for both input and output at the same time (since they then would cause a feedback
* loop), hence override EXEC_OUTPUT_INHERIT with the default stderr/stdout setting. */
if (s->exec_context.std_error == EXEC_OUTPUT_INHERIT &&
s->exec_context.std_output == EXEC_OUTPUT_INHERIT)
s->exec_context.std_error = UNIT(s)->manager->default_std_error;
if (s->exec_context.std_output == EXEC_OUTPUT_INHERIT)
s->exec_context.std_output = UNIT(s)->manager->default_std_output;
}
static int service_setup_bus_name(Service *s) {
@ -715,7 +728,7 @@ static int service_add_extras(Service *s) {
if (s->type == SERVICE_ONESHOT && !s->start_timeout_defined)
s->timeout_start_usec = USEC_INFINITY;
service_fix_output(s);
service_fix_stdio(s);
r = unit_patch_contexts(UNIT(s));
if (r < 0)

View File

@ -3257,7 +3257,12 @@ static void socket_trigger_notify(Unit *u, Unit *other) {
assert(other);
/* Filter out invocations with bogus state */
if (other->load_state != UNIT_LOADED || other->type != UNIT_SERVICE)
if (!IN_SET(other->load_state,
UNIT_LOADED,
UNIT_NOT_FOUND,
UNIT_BAD_SETTING,
UNIT_ERROR,
UNIT_MASKED) || other->type != UNIT_SERVICE)
return;
/* Don't propagate state changes from the service if we are already down */

View File

@ -21,6 +21,8 @@ systemdsystemunitpath=${systemdsystemconfdir}:/etc/systemd/system:/run/systemd/s
systemduserunitpath=${systemduserconfdir}:/etc/systemd/user:/run/systemd/user:/usr/local/lib/systemd/user:/usr/local/share/systemd/user:${systemduserunitdir}:/usr/lib/systemd/user:/usr/share/systemd/user
systemdsystemgeneratordir=${rootprefix}/lib/systemd/system-generators
systemdusergeneratordir=${prefix}/lib/systemd/user-generators
systemdsystemgeneratorpath=/run/systemd/system-generators:/etc/systemd/system-generators:/usr/local/lib/systemd/system-generators:${systemdsystemgeneratordir}
systemdusergeneratorpath=/run/systemd/user-generators:/etc/systemd/user-generators:/usr/local/lib/systemd/user-generators:${systemdusergeneratordir}
systemdsleepdir=${rootprefix}/lib/systemd/system-sleep
systemdshutdowndir=${rootprefix}/lib/systemd/system-shutdown
tmpfilesdir=${prefix}/lib/tmpfiles.d

View File

@ -362,7 +362,7 @@ static int create_disk(
r = generator_write_timeouts(arg_dest, device, name, options, &filtered);
if (r < 0)
return r;
log_warning_errno(r, "Failed to write device timeout drop-in: %m");
if (filtered) {
filtered_escaped = specifier_escape(filtered);
@ -415,11 +415,11 @@ static int create_disk(
return r;
if (!noauto && !nofail) {
r = write_drop_in(arg_dest, dmname, 90, "device-timeout",
"# Automatically generated by systemd-cryptsetup-generator \n\n"
r = write_drop_in(arg_dest, dmname, 40, "device-timeout",
"# Automatically generated by systemd-cryptsetup-generator\n\n"
"[Unit]\nJobTimeoutSec=0");
if (r < 0)
return log_error_errno(r, "Failed to write device drop-in: %m");
log_warning_errno(r, "Failed to write device timeout drop-in: %m");
}
return 0;
@ -646,7 +646,6 @@ static int add_proc_cmdline_devices(void) {
crypto_device *d;
HASHMAP_FOREACH(d, arg_disks, i) {
const char *options;
_cleanup_free_ char *device = NULL;
if (!d->create)
@ -662,14 +661,11 @@ static int add_proc_cmdline_devices(void) {
if (!device)
return log_oom();
if (d->options)
options = d->options;
else if (arg_default_options)
options = arg_default_options;
else
options = "timeout=0";
r = create_disk(d->name, device, d->keyfile ?: arg_default_keyfile, d->keydev, options);
r = create_disk(d->name,
device,
d->keyfile ?: arg_default_keyfile,
d->keydev,
d->options ?: arg_default_options);
if (r < 0)
return r;
}

View File

@ -381,6 +381,19 @@ static int add_automount(
return generator_add_symlink(arg_dest, SPECIAL_LOCAL_FS_TARGET, "wants", unit);
}
static const char *esp_or_xbootldr_options(const DissectedPartition *p) {
assert(p);
/* if we probed vfat or have no idea about the file system then assume these file systems are vfat
* and thus understand "umask=0077". If we detected something else then don't specify any options and
* use kernel defaults. */
if (!p->fstype || streq(p->fstype, "vfat"))
return "umask=0077";
return NULL;
}
static int add_xbootldr(DissectedPartition *p) {
int r;
@ -410,7 +423,7 @@ static int add_xbootldr(DissectedPartition *p) {
"/boot",
p->fstype,
true,
"umask=0077",
esp_or_xbootldr_options(p),
"Boot Loader Partition",
120 * USEC_PER_SEC);
}
@ -484,7 +497,7 @@ static int add_esp(DissectedPartition *p, bool has_xbootldr) {
esp_path,
p->fstype,
true,
"umask=0077",
esp_or_xbootldr_options(p),
"EFI System Partition Automount",
120 * USEC_PER_SEC);
}

View File

@ -8,7 +8,7 @@
#include "alloc-util.h"
#include "bus-common-errors.h"
#include "bus-util.h"
#include "bus-polkit.h"
#include "def.h"
#include "env-file-label.h"
#include "env-file.h"

View File

@ -7,7 +7,7 @@
#include "alloc-util.h"
#include "bus-common-errors.h"
#include "bus-util.h"
#include "bus-polkit.h"
#include "def.h"
#include "fd-util.h"
#include "float.h"
@ -694,6 +694,7 @@ static int method_import_tar_or_raw(sd_bus_message *msg, void *userdata, sd_bus_
const char *local, *object;
Manager *m = userdata;
TransferType type;
struct stat st;
uint32_t id;
assert(msg);
@ -717,9 +718,11 @@ static int method_import_tar_or_raw(sd_bus_message *msg, void *userdata, sd_bus_
if (r < 0)
return r;
r = fd_verify_regular(fd);
if (r < 0)
return r;
if (fstat(fd, &st) < 0)
return -errno;
if (!S_ISREG(st.st_mode) && !S_ISFIFO(st.st_mode))
return -EINVAL;
if (!machine_name_is_valid(local))
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Local name %s is invalid", local);
@ -829,6 +832,7 @@ static int method_export_tar_or_raw(sd_bus_message *msg, void *userdata, sd_bus_
const char *local, *object, *format;
Manager *m = userdata;
TransferType type;
struct stat st;
uint32_t id;
assert(msg);
@ -855,9 +859,11 @@ static int method_export_tar_or_raw(sd_bus_message *msg, void *userdata, sd_bus_
if (!machine_name_is_valid(local))
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Local name %s is invalid", local);
r = fd_verify_regular(fd);
if (r < 0)
return r;
if (fstat(fd, &st) < 0)
return -errno;
if (!S_ISREG(st.st_mode) && !S_ISFIFO(st.st_mode))
return -EINVAL;
type = streq_ptr(sd_bus_message_get_member(msg), "ExportTar") ? TRANSFER_EXPORT_TAR : TRANSFER_EXPORT_RAW;

View File

@ -2428,15 +2428,6 @@ int main(int argc, char *argv[]) {
}
r = sd_journal_previous(j);
} else if (arg_lines >= 0) {
r = sd_journal_seek_tail(j);
if (r < 0) {
log_error_errno(r, "Failed to seek to tail: %m");
goto finish;
}
r = sd_journal_previous_skip(j, arg_lines);
} else if (arg_reverse) {
r = sd_journal_seek_tail(j);
if (r < 0) {
@ -2446,6 +2437,15 @@ int main(int argc, char *argv[]) {
r = sd_journal_previous(j);
} else if (arg_lines >= 0) {
r = sd_journal_seek_tail(j);
if (r < 0) {
log_error_errno(r, "Failed to seek to tail: %m");
goto finish;
}
r = sd_journal_previous_skip(j, arg_lines);
} else {
r = sd_journal_seek_head(j);
if (r < 0) {
@ -2514,7 +2514,7 @@ int main(int argc, char *argv[]) {
goto finish;
}
if (usec > arg_until)
goto finish;
break;
}
if (arg_since_set && arg_reverse) {
@ -2526,7 +2526,7 @@ int main(int argc, char *argv[]) {
goto finish;
}
if (usec < arg_since)
goto finish;
break;
}
if (!arg_merge && !arg_quiet) {
@ -2632,29 +2632,6 @@ int main(int argc, char *argv[]) {
if (!arg_follow) {
if (n_shown == 0 && !arg_quiet)
printf("-- No entries --\n");
if (arg_show_cursor || arg_cursor_file) {
_cleanup_free_ char *cursor = NULL;
r = sd_journal_get_cursor(j, &cursor);
if (r < 0 && r != -EADDRNOTAVAIL)
log_error_errno(r, "Failed to get cursor: %m");
else if (r >= 0) {
if (arg_show_cursor)
printf("-- cursor: %s\n", cursor);
if (arg_cursor_file) {
r = write_string_file(arg_cursor_file, cursor,
WRITE_STRING_FILE_CREATE |
WRITE_STRING_FILE_ATOMIC);
if (r < 0)
log_error_errno(r,
"Failed to write new cursor to %s: %m",
arg_cursor_file);
}
}
}
break;
}
@ -2667,6 +2644,28 @@ int main(int argc, char *argv[]) {
first_line = false;
}
if (arg_show_cursor || arg_cursor_file) {
_cleanup_free_ char *cursor = NULL;
r = sd_journal_get_cursor(j, &cursor);
if (r < 0 && r != -EADDRNOTAVAIL)
log_error_errno(r, "Failed to get cursor: %m");
else if (r >= 0) {
if (arg_show_cursor)
printf("-- cursor: %s\n", cursor);
if (arg_cursor_file) {
r = write_string_file(arg_cursor_file, cursor,
WRITE_STRING_FILE_CREATE |
WRITE_STRING_FILE_ATOMIC);
if (r < 0)
log_error_errno(r,
"Failed to write new cursor to %s: %m",
arg_cursor_file);
}
}
}
finish:
pager_close();

View File

@ -161,7 +161,7 @@ static int match_is_valid(const void *data, size_t size) {
if (size < 2)
return false;
if (startswith(data, "__"))
if (((char*) data)[0] == '_' && ((char*) data)[1] == '_')
return false;
b = data;

View File

@ -675,8 +675,7 @@ static int client_timeout_resend_expire(sd_event_source *s, uint64_t usec, void
}
static usec_t client_timeout_compute_random(usec_t val) {
return val - val / 10 +
(random_u32() % (2 * USEC_PER_SEC)) * val / 10 / USEC_PER_SEC;
return val - (random_u32() % USEC_PER_SEC) * val / 10 / USEC_PER_SEC;
}
static int client_timeout_resend(sd_event_source *s, uint64_t usec, void *userdata) {

View File

@ -160,7 +160,7 @@ int introspect_write_interface(struct introspect *i, const sd_bus_vtable *v) {
case _SD_BUS_VTABLE_SIGNAL:
fprintf(i->f, " <signal name=\"%s\">\n", v->x.signal.member);
if (bus_vtable_has_names(vtable))
names = strempty(v->x.method.names);
names = strempty(v->x.signal.names);
introspect_write_arguments(i, strempty(v->x.signal.signature), &names, NULL);
introspect_write_flags(i, v->type, v->flags);
fputs(" </signal>\n", i->f);

View File

@ -225,3 +225,4 @@ void bus_message_set_sender_local(sd_bus *bus, sd_bus_message *m);
sd_bus_message* bus_message_ref_queued(sd_bus_message *m, sd_bus *bus);
sd_bus_message* bus_message_unref_queued(sd_bus_message *m, sd_bus *bus);
int sd_bus_enqueue_for_read(sd_bus *bus, sd_bus_message *m);

View File

@ -4207,3 +4207,27 @@ _public_ int sd_bus_get_close_on_exit(sd_bus *bus) {
return bus->close_on_exit;
}
int sd_bus_enqueue_for_read(sd_bus *bus, sd_bus_message *m) {
int r;
assert_return(bus, -EINVAL);
assert_return(bus = bus_resolve(bus), -ENOPKG);
assert_return(m, -EINVAL);
assert_return(m->sealed, -EINVAL);
assert_return(!bus_pid_changed(bus), -ECHILD);
if (!BUS_IS_OPEN(bus->state))
return -ENOTCONN;
/* Re-enqueue a message for reading. This is primarily useful for PolicyKit-style authentication,
* where we accept a message, then determine we need to interactively authenticate the user, and then
* we want to process the message again. */
r = bus_rqueue_make_room(bus);
if (r < 0)
return r;
bus->rqueue[bus->rqueue_size++] = bus_message_ref_queued(m, bus);
return 0;
}

View File

@ -108,7 +108,7 @@ fail:
static int client(struct context *c) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL, *reply = NULL;
_cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
int r;
assert_se(sd_bus_new(&bus) >= 0);

View File

@ -5,7 +5,7 @@
#include <sys/types.h>
#include <unistd.h>
#include "bus-util.h"
#include "bus-polkit.h"
#include "env-file-label.h"
#include "env-file.h"
#include "env-util.h"

View File

@ -15,7 +15,7 @@
#include "alloc-util.h"
#include "bus-error.h"
#include "bus-message.h"
#include "bus-util.h"
#include "bus-polkit.h"
#include "def.h"
#include "keymap-util.h"
#include "locale-util.h"
@ -33,7 +33,7 @@ static int locale_update_system_manager(Context *c, sd_bus *bus) {
_cleanup_free_ char **l_unset = NULL;
_cleanup_strv_free_ char **l_set = NULL;
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
size_t c_set, c_unset;
LocaleVariable p;
int r;

View File

@ -32,9 +32,12 @@ SUBSYSTEM=="pci", ENV{ID_PCI_CLASS_FROM_DATABASE}=="Display controller", \
SUBSYSTEM=="drm", KERNEL=="card[0-9]*", TAG+="seat", TAG+="master-of-seat"
SUBSYSTEM=="usb", ATTR{bDeviceClass}=="09", TAG+="seat"
# 'Plugable' USB hub, sound, network, graphics adapter
# 'Plugable UD-160' USB hub, sound, network, graphics adapter
SUBSYSTEM=="usb", ATTR{idVendor}=="2230", ATTR{idProduct}=="000[13]", ENV{ID_AUTOSEAT}="1"
# 'Plugable UD-PRO8' USB hub, sound, network, graphics adapter
SUBSYSTEM=="usb", ATTR{idVendor}=="1a40", ATTR{idProduct}=="0201", ENV{ID_AUTOSEAT}="1"
# qemu (version 2.4+) has a PCI-PCI bridge (-device pci-bridge-seat) to group
# devices belonging to one seat. See:
# http://git.qemu.org/?p=qemu.git;a=blob;f=docs/multiseat.txt

View File

@ -981,7 +981,6 @@ static int show_seat(int argc, char *argv[], void *userdata) {
static int activate(int argc, char *argv[], void *userdata) {
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
sd_bus *bus = userdata;
char *short_argv[3];
int r, i;
assert(bus);
@ -990,12 +989,20 @@ static int activate(int argc, char *argv[], void *userdata) {
polkit_agent_open_if_enabled(arg_transport, arg_ask_password);
if (argc < 2) {
short_argv[0] = argv[0];
short_argv[1] = (char*) "";
short_argv[2] = NULL;
r = sd_bus_call_method(
bus,
"org.freedesktop.login1",
"/org/freedesktop/login1/session/auto",
"org.freedesktop.login1.Session",
streq(argv[0], "lock-session") ? "Lock" :
streq(argv[0], "unlock-session") ? "Unlock" :
streq(argv[0], "terminate-session") ? "Terminate" :
"Activate",
&error, NULL, NULL);
if (r < 0)
return log_error_errno(r, "Failed to issue method call: %s", bus_error_message(&error, r));
argv = short_argv;
argc = 2;
return 0;
}
for (i = 1; i < argc; i++) {

View File

@ -12,13 +12,14 @@
#include "bootspec.h"
#include "bus-common-errors.h"
#include "bus-error.h"
#include "bus-polkit.h"
#include "bus-unit-util.h"
#include "bus-util.h"
#include "cgroup-util.h"
#include "device-util.h"
#include "dirent-util.h"
#include "efivars.h"
#include "efi-loader.h"
#include "efivars.h"
#include "env-util.h"
#include "escape.h"
#include "fd-util.h"

View File

@ -5,6 +5,7 @@
#include "alloc-util.h"
#include "bus-common-errors.h"
#include "bus-label.h"
#include "bus-polkit.h"
#include "bus-util.h"
#include "logind-dbus.h"
#include "logind-seat-dbus.h"

View File

@ -5,6 +5,7 @@
#include "alloc-util.h"
#include "bus-common-errors.h"
#include "bus-label.h"
#include "bus-polkit.h"
#include "bus-util.h"
#include "fd-util.h"
#include "logind-brightness.h"
@ -249,7 +250,11 @@ static int method_set_idle_hint(sd_bus_message *message, void *userdata, sd_bus_
if (uid != 0 && uid != s->user->uid)
return sd_bus_error_setf(error, SD_BUS_ERROR_ACCESS_DENIED, "Only owner of session may set idle hint");
session_set_idle_hint(s, b);
r = session_set_idle_hint(s, b);
if (r == -ENOTTY)
return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, "Idle hint control is not supported on non-graphical sessions.");
if (r < 0)
return r;
return sd_bus_reply_method_return(message, NULL);
}

View File

@ -932,63 +932,57 @@ static int get_process_ctty_atime(pid_t pid, usec_t *atime) {
}
int session_get_idle_hint(Session *s, dual_timestamp *t) {
usec_t atime = 0, n;
usec_t atime = 0;
int r;
assert(s);
/* Explicit idle hint is set */
if (s->idle_hint) {
/* Graphical sessions have an explicit idle hint */
if (SESSION_TYPE_IS_GRAPHICAL(s->type)) {
if (t)
*t = s->idle_hint_timestamp;
return s->idle_hint;
}
/* Graphical sessions should really implement a real
* idle hint logic */
if (SESSION_TYPE_IS_GRAPHICAL(s->type))
goto dont_know;
/* For sessions with an explicitly configured tty, let's check
* its atime */
/* For sessions with an explicitly configured tty, let's check its atime */
if (s->tty) {
r = get_tty_atime(s->tty, &atime);
if (r >= 0)
goto found_atime;
}
/* For sessions with a leader but no explicitly configured
* tty, let's check the controlling tty of the leader */
/* For sessions with a leader but no explicitly configured tty, let's check the controlling tty of
* the leader */
if (pid_is_valid(s->leader)) {
r = get_process_ctty_atime(s->leader, &atime);
if (r >= 0)
goto found_atime;
}
dont_know:
if (t)
*t = s->idle_hint_timestamp;
*t = DUAL_TIMESTAMP_NULL;
return 0;
return false;
found_atime:
if (t)
dual_timestamp_from_realtime(t, atime);
n = now(CLOCK_REALTIME);
if (s->manager->idle_action_usec <= 0)
return 0;
return false;
return atime + s->manager->idle_action_usec <= n;
return usec_add(atime, s->manager->idle_action_usec) <= now(CLOCK_REALTIME);
}
void session_set_idle_hint(Session *s, bool b) {
int session_set_idle_hint(Session *s, bool b) {
assert(s);
if (!SESSION_TYPE_IS_GRAPHICAL(s->type))
return -ENOTTY;
if (s->idle_hint == b)
return;
return 0;
s->idle_hint = b;
dual_timestamp_get(&s->idle_hint_timestamp);
@ -1000,6 +994,8 @@ void session_set_idle_hint(Session *s, bool b) {
user_send_changed(s->user, "IdleHint", "IdleSinceHint", "IdleSinceHintMonotonic", NULL);
manager_send_changed(s->manager, "IdleHint", "IdleSinceHint", "IdleSinceHintMonotonic", NULL);
return 1;
}
int session_get_locked_hint(Session *s) {

View File

@ -132,7 +132,7 @@ void session_add_to_gc_queue(Session *s);
int session_activate(Session *s);
bool session_is_active(Session *s);
int session_get_idle_hint(Session *s, dual_timestamp *t);
void session_set_idle_hint(Session *s, bool b);
int session_set_idle_hint(Session *s, bool b);
int session_get_locked_hint(Session *s);
void session_set_locked_hint(Session *s, bool b);
int session_create_fifo(Session *s);

View File

@ -3,6 +3,7 @@
#include <errno.h>
#include "alloc-util.h"
#include "bus-polkit.h"
#include "bus-util.h"
#include "format-util.h"
#include "logind-dbus.h"

View File

@ -9,7 +9,7 @@
#include "alloc-util.h"
#include "bus-error.h"
#include "bus-util.h"
#include "bus-polkit.h"
#include "cgroup-util.h"
#include "def.h"
#include "device-util.h"

View File

@ -5,6 +5,7 @@
#include "alloc-util.h"
#include "bus-label.h"
#include "bus-polkit.h"
#include "bus-util.h"
#include "copy.h"
#include "dissect-image.h"

View File

@ -14,6 +14,7 @@
#include "bus-common-errors.h"
#include "bus-internal.h"
#include "bus-label.h"
#include "bus-polkit.h"
#include "bus-util.h"
#include "copy.h"
#include "env-file.h"

View File

@ -8,6 +8,7 @@
#include "alloc-util.h"
#include "btrfs-util.h"
#include "bus-common-errors.h"
#include "bus-polkit.h"
#include "bus-util.h"
#include "cgroup-util.h"
#include "errno-util.h"

View File

@ -10,7 +10,7 @@
#include "alloc-util.h"
#include "bus-error.h"
#include "bus-util.h"
#include "bus-polkit.h"
#include "cgroup-util.h"
#include "dirent-util.h"
#include "fd-util.h"

View File

@ -729,7 +729,7 @@ static void ipip_sit_init(NetDev *n) {
assert(t);
t->pmtudisc = true;
t->fou_encap_type = FOU_ENCAP_DIRECT;
t->fou_encap_type = NETDEV_FOO_OVER_UDP_ENCAP_DIRECT;
t->isatap = -1;
}
@ -771,7 +771,7 @@ static void gre_erspan_init(NetDev *n) {
t->pmtudisc = true;
t->gre_erspan_sequence = -1;
t->fou_encap_type = FOU_ENCAP_DIRECT;
t->fou_encap_type = NETDEV_FOO_OVER_UDP_ENCAP_DIRECT;
}
static void ip6gre_init(NetDev *n) {

View File

@ -32,6 +32,7 @@ int address_new(Address **ret) {
.scope = RT_SCOPE_UNIVERSE,
.cinfo.ifa_prefered = CACHE_INFO_INFINITY_LIFE_TIME,
.cinfo.ifa_valid = CACHE_INFO_INFINITY_LIFE_TIME,
.prefix_route = true,
};
*ret = TAKE_PTR(address);
@ -593,7 +594,7 @@ int address_configure(
if (address->manage_temporary_address)
address->flags |= IFA_F_MANAGETEMPADDR;
if (address->prefix_route)
if (!address->prefix_route)
address->flags |= IFA_F_NOPREFIXROUTE;
if (address->autojoin)
@ -908,6 +909,8 @@ int config_parse_address_flags(const char *unit,
else if (streq(lvalue, "ManageTemporaryAddress"))
n->manage_temporary_address = r;
else if (streq(lvalue, "PrefixRoute"))
n->prefix_route = !r;
else if (streq(lvalue, "AddPrefixRoute"))
n->prefix_route = r;
else if (streq(lvalue, "AutoJoin"))
n->autojoin = r;

View File

@ -111,10 +111,10 @@ static int route_scope_from_address(const Route *route, const struct in_addr *se
return RT_SCOPE_UNIVERSE;
}
static bool link_noprefixroute(Link *link) {
return link->network->dhcp_route_table_set &&
link->network->dhcp_route_table != RT_TABLE_MAIN &&
!link->manager->dhcp4_prefix_root_cannot_set_table;
static bool link_prefixroute(Link *link) {
return !link->network->dhcp_route_table_set ||
link->network->dhcp_route_table == RT_TABLE_MAIN ||
link->manager->dhcp4_prefix_root_cannot_set_table;
}
static int dhcp_route_configure(Route **route, Link *link) {
@ -254,7 +254,7 @@ static int link_set_dhcp_routes(Link *link) {
if (r < 0)
return log_link_warning_errno(link, r, "DHCP error: could not get address: %m");
if (link_noprefixroute(link)) {
if (!link_prefixroute(link)) {
_cleanup_(route_freep) Route *prefix_route = NULL;
r = dhcp_prefix_route_from_lease(link->dhcp_lease, table, &address, &prefix_route);
@ -516,7 +516,7 @@ static int dhcp_remove_dns_routes(Link *link, sd_dhcp_lease *lease, const struct
(void) route_remove(route, link, NULL);
}
if (link_noprefixroute(link)) {
if (!link_prefixroute(link)) {
_cleanup_(route_freep) Route *prefix_route = NULL;
r = dhcp_prefix_route_from_lease(lease, table, address, &prefix_route);
@ -719,7 +719,7 @@ static int dhcp4_update_address(Link *link,
addr->cinfo.ifa_valid = lifetime;
addr->prefixlen = prefixlen;
addr->broadcast.s_addr = address->s_addr | ~netmask->s_addr;
addr->prefix_route = link_noprefixroute(link);
addr->prefix_route = link_prefixroute(link);
/* allow reusing an existing address and simply update its lifetime
* in case it already exists */

View File

@ -6,6 +6,7 @@
#include "alloc-util.h"
#include "bus-common-errors.h"
#include "bus-polkit.h"
#include "bus-util.h"
#include "dns-domain.h"
#include "networkd-link-bus.h"

View File

@ -6,7 +6,7 @@
#include "alloc-util.h"
#include "bus-common-errors.h"
#include "bus-util.h"
#include "bus-polkit.h"
#include "networkd-link-bus.h"
#include "networkd-link.h"
#include "networkd-manager-bus.h"

View File

@ -11,6 +11,7 @@
#include "sd-netlink.h"
#include "alloc-util.h"
#include "bus-polkit.h"
#include "bus-util.h"
#include "conf-parser.h"
#include "def.h"
@ -682,8 +683,8 @@ int manager_rtnl_process_neighbor(sd_netlink *rtnl, sd_netlink_message *message,
strnull(addr_str), strnull(lladdr_str));
(void) neighbor_free(neighbor);
} else
log_link_info(link, "Kernel removed a neighbor we don't remember: %s->%s, ignoring.",
strnull(addr_str), strnull(lladdr_str));
log_link_debug(link, "Kernel removed a neighbor we don't remember: %s->%s, ignoring.",
strnull(addr_str), strnull(lladdr_str));
break;
@ -839,9 +840,9 @@ int manager_rtnl_process_address(sd_netlink *rtnl, sd_netlink_message *message,
valid_str ? "for " : "forever", strempty(valid_str));
(void) address_drop(address);
} else
log_link_info(link, "Kernel removed an address we don't remember: %s/%u (valid %s%s), ignoring.",
strnull(buf), prefixlen,
valid_str ? "for " : "forever", strempty(valid_str));
log_link_debug(link, "Kernel removed an address we don't remember: %s/%u (valid %s%s), ignoring.",
strnull(buf), prefixlen,
valid_str ? "for " : "forever", strempty(valid_str));
break;

View File

@ -107,7 +107,8 @@ Address.PreferredLifetime, config_parse_lifetime,
Address.HomeAddress, config_parse_address_flags, 0, 0
Address.DuplicateAddressDetection, config_parse_address_flags, 0, 0
Address.ManageTemporaryAddress, config_parse_address_flags, 0, 0
Address.PrefixRoute, config_parse_address_flags, 0, 0
Address.PrefixRoute, config_parse_address_flags, 0, 0 /* deprecated */
Address.AddPrefixRoute, config_parse_address_flags, 0, 0
Address.AutoJoin, config_parse_address_flags, 0, 0
Address.Scope, config_parse_address_scope, 0, 0
IPv6AddressLabel.Prefix, config_parse_address_label_prefix, 0, 0

View File

@ -3,7 +3,7 @@
#include "alloc-util.h"
#include "btrfs-util.h"
#include "bus-common-errors.h"
#include "bus-util.h"
#include "bus-polkit.h"
#include "fd-util.h"
#include "io-util.h"
#include "machine-image.h"

View File

@ -8,6 +8,7 @@
#include "alloc-util.h"
#include "bus-common-errors.h"
#include "bus-label.h"
#include "bus-polkit.h"
#include "bus-util.h"
#include "fd-util.h"
#include "fileio.h"

View File

@ -7,7 +7,7 @@
#include "sd-daemon.h"
#include "alloc-util.h"
#include "bus-util.h"
#include "bus-polkit.h"
#include "def.h"
#include "main-func.h"
#include "portabled-bus.h"

View File

@ -2,6 +2,7 @@
#include "alloc-util.h"
#include "bus-common-errors.h"
#include "bus-polkit.h"
#include "bus-util.h"
#include "dns-domain.h"
#include "memory-util.h"

View File

@ -20,11 +20,6 @@
static const char trust_anchor_dirs[] = CONF_PATHS_NULSTR("dnssec-trust-anchors.d");
/* The first DS RR from https://data.iana.org/root-anchors/root-anchors.xml, retrieved December 2015 */
static const uint8_t root_digest1[] =
{ 0x49, 0xAA, 0xC1, 0x1D, 0x7B, 0x6F, 0x64, 0x46, 0x70, 0x2E, 0x54, 0xA1, 0x60, 0x73, 0x71, 0x60,
0x7A, 0x1A, 0x41, 0x85, 0x52, 0x00, 0xFD, 0x2C, 0xE1, 0xCD, 0xDE, 0x32, 0xF2, 0x4E, 0x8F, 0xB5 };
/* The second DS RR from https://data.iana.org/root-anchors/root-anchors.xml, retrieved February 2017 */
static const uint8_t root_digest2[] =
{ 0xE0, 0x6D, 0x44, 0xB8, 0x0B, 0x8F, 0x1D, 0x39, 0xA9, 0x5C, 0x0B, 0x0D, 0x7C, 0x65, 0xD0, 0x84,
@ -96,11 +91,7 @@ static int dns_trust_anchor_add_builtin_positive(DnsTrustAnchor *d) {
if (!answer)
return -ENOMEM;
/* Add the two RRs from https://data.iana.org/root-anchors/root-anchors.xml */
r = add_root_ksk(answer, key, 19036, DNSSEC_ALGORITHM_RSASHA256, DNSSEC_DIGEST_SHA256, root_digest1, sizeof(root_digest1));
if (r < 0)
return r;
/* Add the currently valid RRs from https://data.iana.org/root-anchors/root-anchors.xml */
r = add_root_ksk(answer, key, 20326, DNSSEC_ALGORITHM_RSASHA256, DNSSEC_DIGEST_SHA256, root_digest2, sizeof(root_digest2));
if (r < 0)
return r;

View File

@ -1,9 +1,10 @@
/* SPDX-License-Identifier: LGPL-2.1+ */
#include "alloc-util.h"
#include "bus-util.h"
#include "bus-polkit.h"
#include "missing_capability.h"
#include "resolved-dnssd.h"
#include "resolved-dnssd-bus.h"
#include "resolved-dnssd.h"
#include "resolved-link.h"
#include "strv.h"
#include "user-util.h"

View File

@ -6,6 +6,7 @@
#include "alloc-util.h"
#include "bus-common-errors.h"
#include "bus-polkit.h"
#include "bus-util.h"
#include "parse-util.h"
#include "resolve-util.h"

View File

@ -14,7 +14,7 @@
#include "af-list.h"
#include "alloc-util.h"
#include "bus-util.h"
#include "bus-polkit.h"
#include "dirent-util.h"
#include "dns-domain.h"
#include "fd-util.h"

View File

@ -162,6 +162,7 @@ void boot_config_free(BootConfig *config) {
free(config->auto_entries);
free(config->auto_firmware);
free(config->console_mode);
free(config->random_seed_mode);
free(config->entry_oneshot);
free(config->entry_default);
@ -227,6 +228,8 @@ static int boot_loader_read_conf(const char *path, BootConfig *config) {
r = free_and_strdup(&config->auto_firmware, p);
else if (streq(field, "console-mode"))
r = free_and_strdup(&config->console_mode, p);
else if (streq(field, "random-seed-mode"))
r = free_and_strdup(&config->random_seed_mode, p);
else {
log_notice("%s:%u: Unknown line \"%s\", ignoring.", path, line, field);
continue;

View File

@ -42,6 +42,7 @@ typedef struct BootConfig {
char *auto_entries;
char *auto_firmware;
char *console_mode;
char *random_seed_mode;
char *entry_oneshot;
char *entry_default;

416
src/shared/bus-polkit.c Normal file
View File

@ -0,0 +1,416 @@
/* SPDX-License-Identifier: LGPL-2.1+ */
#include "bus-internal.h"
#include "bus-message.h"
#include "bus-polkit.h"
#include "strv.h"
#include "user-util.h"
static int check_good_user(sd_bus_message *m, uid_t good_user) {
_cleanup_(sd_bus_creds_unrefp) sd_bus_creds *creds = NULL;
uid_t sender_uid;
int r;
assert(m);
if (good_user == UID_INVALID)
return 0;
r = sd_bus_query_sender_creds(m, SD_BUS_CREDS_EUID, &creds);
if (r < 0)
return r;
/* Don't trust augmented credentials for authorization */
assert_return((sd_bus_creds_get_augmented_mask(creds) & SD_BUS_CREDS_EUID) == 0, -EPERM);
r = sd_bus_creds_get_euid(creds, &sender_uid);
if (r < 0)
return r;
return sender_uid == good_user;
}
#if ENABLE_POLKIT
static int bus_message_append_strv_key_value(
sd_bus_message *m,
const char **l) {
const char **k, **v;
int r;
assert(m);
r = sd_bus_message_open_container(m, 'a', "{ss}");
if (r < 0)
return r;
STRV_FOREACH_PAIR(k, v, l) {
r = sd_bus_message_append(m, "{ss}", *k, *v);
if (r < 0)
return r;
}
r = sd_bus_message_close_container(m);
if (r < 0)
return r;
return r;
}
#endif
int bus_test_polkit(
sd_bus_message *call,
int capability,
const char *action,
const char **details,
uid_t good_user,
bool *_challenge,
sd_bus_error *ret_error) {
int r;
assert(call);
assert(action);
/* Tests non-interactively! */
r = check_good_user(call, good_user);
if (r != 0)
return r;
r = sd_bus_query_sender_privilege(call, capability);
if (r < 0)
return r;
else if (r > 0)
return 1;
#if ENABLE_POLKIT
else {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *request = NULL;
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
int authorized = false, challenge = false;
const char *sender;
sender = sd_bus_message_get_sender(call);
if (!sender)
return -EBADMSG;
r = sd_bus_message_new_method_call(
call->bus,
&request,
"org.freedesktop.PolicyKit1",
"/org/freedesktop/PolicyKit1/Authority",
"org.freedesktop.PolicyKit1.Authority",
"CheckAuthorization");
if (r < 0)
return r;
r = sd_bus_message_append(
request,
"(sa{sv})s",
"system-bus-name", 1, "name", "s", sender,
action);
if (r < 0)
return r;
r = bus_message_append_strv_key_value(request, details);
if (r < 0)
return r;
r = sd_bus_message_append(request, "us", 0, NULL);
if (r < 0)
return r;
r = sd_bus_call(call->bus, request, 0, ret_error, &reply);
if (r < 0) {
/* Treat no PK available as access denied */
if (sd_bus_error_has_name(ret_error, SD_BUS_ERROR_SERVICE_UNKNOWN)) {
sd_bus_error_free(ret_error);
return -EACCES;
}
return r;
}
r = sd_bus_message_enter_container(reply, 'r', "bba{ss}");
if (r < 0)
return r;
r = sd_bus_message_read(reply, "bb", &authorized, &challenge);
if (r < 0)
return r;
if (authorized)
return 1;
if (_challenge) {
*_challenge = challenge;
return 0;
}
}
#endif
return -EACCES;
}
#if ENABLE_POLKIT
typedef struct AsyncPolkitQuery {
char *action;
char **details;
sd_bus_message *request, *reply;
sd_bus_slot *slot;
Hashmap *registry;
sd_event_source *defer_event_source;
} AsyncPolkitQuery;
static void async_polkit_query_free(AsyncPolkitQuery *q) {
if (!q)
return;
sd_bus_slot_unref(q->slot);
if (q->registry && q->request)
hashmap_remove(q->registry, q->request);
sd_bus_message_unref(q->request);
sd_bus_message_unref(q->reply);
free(q->action);
strv_free(q->details);
sd_event_source_disable_unref(q->defer_event_source);
free(q);
}
static int async_polkit_defer(sd_event_source *s, void *userdata) {
AsyncPolkitQuery *q = userdata;
assert(s);
/* This is called as idle event source after we processed the async polkit reply, hopefully after the
* method call we re-enqueued has been properly processed. */
async_polkit_query_free(q);
return 0;
}
static int async_polkit_callback(sd_bus_message *reply, void *userdata, sd_bus_error *error) {
_cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
AsyncPolkitQuery *q = userdata;
int r;
assert(reply);
assert(q);
assert(q->slot);
q->slot = sd_bus_slot_unref(q->slot);
assert(!q->reply);
q->reply = sd_bus_message_ref(reply);
/* Now, let's dispatch the original message a second time be re-enqueing. This will then traverse the
* whole message processing again, and thus re-validating and re-retrieving the "userdata" field
* again.
*
* We install an idle event loop event to clean-up the PolicyKit request data when we are idle again,
* i.e. after the second time the message is processed is complete. */
assert(!q->defer_event_source);
r = sd_event_add_defer(sd_bus_get_event(sd_bus_message_get_bus(reply)), &q->defer_event_source, async_polkit_defer, q);
if (r < 0)
goto fail;
r = sd_event_source_set_priority(q->defer_event_source, SD_EVENT_PRIORITY_IDLE);
if (r < 0)
goto fail;
r = sd_event_source_set_enabled(q->defer_event_source, SD_EVENT_ONESHOT);
if (r < 0)
goto fail;
r = sd_bus_message_rewind(q->request, true);
if (r < 0)
goto fail;
r = sd_bus_enqueue_for_read(sd_bus_message_get_bus(q->request), q->request);
if (r < 0)
goto fail;
return 1;
fail:
log_debug_errno(r, "Processing asynchronous PolicyKit reply failed, ignoring: %m");
(void) sd_bus_reply_method_errno(q->request, r, NULL);
async_polkit_query_free(q);
return r;
}
#endif
int bus_verify_polkit_async(
sd_bus_message *call,
int capability,
const char *action,
const char **details,
bool interactive,
uid_t good_user,
Hashmap **registry,
sd_bus_error *ret_error) {
#if ENABLE_POLKIT
_cleanup_(sd_bus_message_unrefp) sd_bus_message *pk = NULL;
AsyncPolkitQuery *q;
int c;
#endif
const char *sender;
int r;
assert(call);
assert(action);
assert(registry);
r = check_good_user(call, good_user);
if (r != 0)
return r;
#if ENABLE_POLKIT
q = hashmap_get(*registry, call);
if (q) {
int authorized, challenge;
/* This is the second invocation of this function, and there's already a response from
* polkit, let's process it */
assert(q->reply);
/* If the operation we want to authenticate changed between the first and the second time,
* let's not use this authentication, it might be out of date as the object and context we
* operate on might have changed. */
if (!streq(q->action, action) ||
!strv_equal(q->details, (char**) details))
return -ESTALE;
if (sd_bus_message_is_method_error(q->reply, NULL)) {
const sd_bus_error *e;
e = sd_bus_message_get_error(q->reply);
/* Treat no PK available as access denied */
if (sd_bus_error_has_name(e, SD_BUS_ERROR_SERVICE_UNKNOWN) ||
sd_bus_error_has_name(e, SD_BUS_ERROR_NAME_HAS_NO_OWNER))
return -EACCES;
/* Copy error from polkit reply */
sd_bus_error_copy(ret_error, e);
return -sd_bus_error_get_errno(e);
}
r = sd_bus_message_enter_container(q->reply, 'r', "bba{ss}");
if (r >= 0)
r = sd_bus_message_read(q->reply, "bb", &authorized, &challenge);
if (r < 0)
return r;
if (authorized)
return 1;
if (challenge)
return sd_bus_error_set(ret_error, SD_BUS_ERROR_INTERACTIVE_AUTHORIZATION_REQUIRED, "Interactive authentication required.");
return -EACCES;
}
#endif
r = sd_bus_query_sender_privilege(call, capability);
if (r < 0)
return r;
else if (r > 0)
return 1;
sender = sd_bus_message_get_sender(call);
if (!sender)
return -EBADMSG;
#if ENABLE_POLKIT
c = sd_bus_message_get_allow_interactive_authorization(call);
if (c < 0)
return c;
if (c > 0)
interactive = true;
r = hashmap_ensure_allocated(registry, NULL);
if (r < 0)
return r;
r = sd_bus_message_new_method_call(
call->bus,
&pk,
"org.freedesktop.PolicyKit1",
"/org/freedesktop/PolicyKit1/Authority",
"org.freedesktop.PolicyKit1.Authority",
"CheckAuthorization");
if (r < 0)
return r;
r = sd_bus_message_append(
pk,
"(sa{sv})s",
"system-bus-name", 1, "name", "s", sender,
action);
if (r < 0)
return r;
r = bus_message_append_strv_key_value(pk, details);
if (r < 0)
return r;
r = sd_bus_message_append(pk, "us", interactive, NULL);
if (r < 0)
return r;
q = new(AsyncPolkitQuery, 1);
if (!q)
return -ENOMEM;
*q = (AsyncPolkitQuery) {
.request = sd_bus_message_ref(call),
};
q->action = strdup(action);
if (!q->action) {
async_polkit_query_free(q);
return -ENOMEM;
}
q->details = strv_copy((char**) details);
if (!q->details) {
async_polkit_query_free(q);
return -ENOMEM;
}
r = hashmap_put(*registry, call, q);
if (r < 0) {
async_polkit_query_free(q);
return r;
}
q->registry = *registry;
r = sd_bus_call_async(call->bus, &q->slot, pk, async_polkit_callback, q, 0);
if (r < 0) {
async_polkit_query_free(q);
return r;
}
return 0;
#endif
return -EACCES;
}
void bus_verify_polkit_async_registry_free(Hashmap *registry) {
#if ENABLE_POLKIT
hashmap_free_with_destructor(registry, async_polkit_query_free);
#endif
}

11
src/shared/bus-polkit.h Normal file
View File

@ -0,0 +1,11 @@
/* SPDX-License-Identifier: LGPL-2.1+ */
#pragma once
#include "sd-bus.h"
#include "hashmap.h"
int bus_test_polkit(sd_bus_message *call, int capability, const char *action, const char **details, uid_t good_user, bool *_challenge, sd_bus_error *e);
int bus_verify_polkit_async(sd_bus_message *call, int capability, const char *action, const char **details, bool interactive, uid_t good_user, Hashmap **registry, sd_bus_error *error);
void bus_verify_polkit_async_registry_free(Hashmap *registry);

View File

@ -9,7 +9,6 @@
#include <sys/socket.h>
#include <unistd.h>
#include "sd-bus-protocol.h"
#include "sd-bus.h"
#include "sd-daemon.h"
#include "sd-event.h"
@ -22,15 +21,12 @@
#include "bus-util.h"
#include "cap-list.h"
#include "cgroup-util.h"
#include "def.h"
#include "escape.h"
#include "fd-util.h"
#include "mountpoint-util.h"
#include "nsflags.h"
#include "parse-util.h"
#include "path-util.h"
#include "proc-cmdline.h"
#include "rlimit-util.h"
#include "socket-util.h"
#include "stdio-util.h"
#include "strv.h"
#include "user-util.h"
@ -185,357 +181,6 @@ int bus_name_has_owner(sd_bus *c, const char *name, sd_bus_error *error) {
return has_owner;
}
static int check_good_user(sd_bus_message *m, uid_t good_user) {
_cleanup_(sd_bus_creds_unrefp) sd_bus_creds *creds = NULL;
uid_t sender_uid;
int r;
assert(m);
if (good_user == UID_INVALID)
return 0;
r = sd_bus_query_sender_creds(m, SD_BUS_CREDS_EUID, &creds);
if (r < 0)
return r;
/* Don't trust augmented credentials for authorization */
assert_return((sd_bus_creds_get_augmented_mask(creds) & SD_BUS_CREDS_EUID) == 0, -EPERM);
r = sd_bus_creds_get_euid(creds, &sender_uid);
if (r < 0)
return r;
return sender_uid == good_user;
}
int bus_test_polkit(
sd_bus_message *call,
int capability,
const char *action,
const char **details,
uid_t good_user,
bool *_challenge,
sd_bus_error *e) {
int r;
assert(call);
assert(action);
/* Tests non-interactively! */
r = check_good_user(call, good_user);
if (r != 0)
return r;
r = sd_bus_query_sender_privilege(call, capability);
if (r < 0)
return r;
else if (r > 0)
return 1;
#if ENABLE_POLKIT
else {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *request = NULL;
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
int authorized = false, challenge = false;
const char *sender, **k, **v;
sender = sd_bus_message_get_sender(call);
if (!sender)
return -EBADMSG;
r = sd_bus_message_new_method_call(
call->bus,
&request,
"org.freedesktop.PolicyKit1",
"/org/freedesktop/PolicyKit1/Authority",
"org.freedesktop.PolicyKit1.Authority",
"CheckAuthorization");
if (r < 0)
return r;
r = sd_bus_message_append(
request,
"(sa{sv})s",
"system-bus-name", 1, "name", "s", sender,
action);
if (r < 0)
return r;
r = sd_bus_message_open_container(request, 'a', "{ss}");
if (r < 0)
return r;
STRV_FOREACH_PAIR(k, v, details) {
r = sd_bus_message_append(request, "{ss}", *k, *v);
if (r < 0)
return r;
}
r = sd_bus_message_close_container(request);
if (r < 0)
return r;
r = sd_bus_message_append(request, "us", 0, NULL);
if (r < 0)
return r;
r = sd_bus_call(call->bus, request, 0, e, &reply);
if (r < 0) {
/* Treat no PK available as access denied */
if (sd_bus_error_has_name(e, SD_BUS_ERROR_SERVICE_UNKNOWN)) {
sd_bus_error_free(e);
return -EACCES;
}
return r;
}
r = sd_bus_message_enter_container(reply, 'r', "bba{ss}");
if (r < 0)
return r;
r = sd_bus_message_read(reply, "bb", &authorized, &challenge);
if (r < 0)
return r;
if (authorized)
return 1;
if (_challenge) {
*_challenge = challenge;
return 0;
}
}
#endif
return -EACCES;
}
#if ENABLE_POLKIT
typedef struct AsyncPolkitQuery {
sd_bus_message *request, *reply;
sd_bus_message_handler_t callback;
void *userdata;
sd_bus_slot *slot;
Hashmap *registry;
} AsyncPolkitQuery;
static void async_polkit_query_free(AsyncPolkitQuery *q) {
if (!q)
return;
sd_bus_slot_unref(q->slot);
if (q->registry && q->request)
hashmap_remove(q->registry, q->request);
sd_bus_message_unref(q->request);
sd_bus_message_unref(q->reply);
free(q);
}
static int async_polkit_callback(sd_bus_message *reply, void *userdata, sd_bus_error *error) {
_cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
AsyncPolkitQuery *q = userdata;
int r;
assert(reply);
assert(q);
q->slot = sd_bus_slot_unref(q->slot);
q->reply = sd_bus_message_ref(reply);
r = sd_bus_message_rewind(q->request, true);
if (r < 0) {
r = sd_bus_reply_method_errno(q->request, r, NULL);
goto finish;
}
r = q->callback(q->request, q->userdata, &error_buffer);
r = bus_maybe_reply_error(q->request, r, &error_buffer);
finish:
async_polkit_query_free(q);
return r;
}
#endif
int bus_verify_polkit_async(
sd_bus_message *call,
int capability,
const char *action,
const char **details,
bool interactive,
uid_t good_user,
Hashmap **registry,
sd_bus_error *error) {
#if ENABLE_POLKIT
_cleanup_(sd_bus_message_unrefp) sd_bus_message *pk = NULL;
AsyncPolkitQuery *q;
const char *sender, **k, **v;
sd_bus_message_handler_t callback;
void *userdata;
int c;
#endif
int r;
assert(call);
assert(action);
assert(registry);
r = check_good_user(call, good_user);
if (r != 0)
return r;
#if ENABLE_POLKIT
q = hashmap_get(*registry, call);
if (q) {
int authorized, challenge;
/* This is the second invocation of this function, and
* there's already a response from polkit, let's
* process it */
assert(q->reply);
if (sd_bus_message_is_method_error(q->reply, NULL)) {
const sd_bus_error *e;
e = sd_bus_message_get_error(q->reply);
/* Treat no PK available as access denied */
if (sd_bus_error_has_name(e, SD_BUS_ERROR_SERVICE_UNKNOWN) ||
sd_bus_error_has_name(e, SD_BUS_ERROR_NAME_HAS_NO_OWNER))
return -EACCES;
/* Copy error from polkit reply */
sd_bus_error_copy(error, e);
return -sd_bus_error_get_errno(e);
}
r = sd_bus_message_enter_container(q->reply, 'r', "bba{ss}");
if (r >= 0)
r = sd_bus_message_read(q->reply, "bb", &authorized, &challenge);
if (r < 0)
return r;
if (authorized)
return 1;
if (challenge)
return sd_bus_error_set(error, SD_BUS_ERROR_INTERACTIVE_AUTHORIZATION_REQUIRED, "Interactive authentication required.");
return -EACCES;
}
#endif
r = sd_bus_query_sender_privilege(call, capability);
if (r < 0)
return r;
else if (r > 0)
return 1;
#if ENABLE_POLKIT
if (sd_bus_get_current_message(call->bus) != call)
return -EINVAL;
callback = sd_bus_get_current_handler(call->bus);
if (!callback)
return -EINVAL;
userdata = sd_bus_get_current_userdata(call->bus);
sender = sd_bus_message_get_sender(call);
if (!sender)
return -EBADMSG;
c = sd_bus_message_get_allow_interactive_authorization(call);
if (c < 0)
return c;
if (c > 0)
interactive = true;
r = hashmap_ensure_allocated(registry, NULL);
if (r < 0)
return r;
r = sd_bus_message_new_method_call(
call->bus,
&pk,
"org.freedesktop.PolicyKit1",
"/org/freedesktop/PolicyKit1/Authority",
"org.freedesktop.PolicyKit1.Authority",
"CheckAuthorization");
if (r < 0)
return r;
r = sd_bus_message_append(
pk,
"(sa{sv})s",
"system-bus-name", 1, "name", "s", sender,
action);
if (r < 0)
return r;
r = sd_bus_message_open_container(pk, 'a', "{ss}");
if (r < 0)
return r;
STRV_FOREACH_PAIR(k, v, details) {
r = sd_bus_message_append(pk, "{ss}", *k, *v);
if (r < 0)
return r;
}
r = sd_bus_message_close_container(pk);
if (r < 0)
return r;
r = sd_bus_message_append(pk, "us", interactive, NULL);
if (r < 0)
return r;
q = new0(AsyncPolkitQuery, 1);
if (!q)
return -ENOMEM;
q->request = sd_bus_message_ref(call);
q->callback = callback;
q->userdata = userdata;
r = hashmap_put(*registry, call, q);
if (r < 0) {
async_polkit_query_free(q);
return r;
}
q->registry = *registry;
r = sd_bus_call_async(call->bus, &q->slot, pk, async_polkit_callback, q, 0);
if (r < 0) {
async_polkit_query_free(q);
return r;
}
return 0;
#endif
return -EACCES;
}
void bus_verify_polkit_async_registry_free(Hashmap *registry) {
#if ENABLE_POLKIT
hashmap_free_with_destructor(registry, async_polkit_query_free);
#endif
}
int bus_check_peercred(sd_bus *c) {
struct ucred ucred;
int fd, r;

View File

@ -9,8 +9,8 @@
#include "sd-bus.h"
#include "sd-event.h"
#include "hashmap.h"
#include "macro.h"
#include "set.h"
#include "string-util.h"
#include "time-util.h"
@ -52,11 +52,6 @@ int bus_name_has_owner(sd_bus *c, const char *name, sd_bus_error *error);
int bus_check_peercred(sd_bus *c);
int bus_test_polkit(sd_bus_message *call, int capability, const char *action, const char **details, uid_t good_user, bool *_challenge, sd_bus_error *e);
int bus_verify_polkit_async(sd_bus_message *call, int capability, const char *action, const char **details, bool interactive, uid_t good_user, Hashmap **registry, sd_bus_error *error);
void bus_verify_polkit_async_registry_free(Hashmap *registry);
int bus_connect_system_systemd(sd_bus **_bus);
int bus_connect_user_systemd(sd_bus **_bus);

View File

@ -230,7 +230,6 @@ int unit_file_find_dropin_paths(
char ***ret) {
_cleanup_strv_free_ char **dirs = NULL;
UnitType type = _UNIT_TYPE_INVALID;
char *name, **p;
Iterator i;
int r;
@ -240,22 +239,24 @@ int unit_file_find_dropin_paths(
/* All the names in the unit are of the same type so just grab one. */
name = (char*) set_first(names);
if (name) {
UnitType type = _UNIT_TYPE_INVALID;
type = unit_name_to_type(name);
if (type < 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"Failed to to derive unit type from unit name: %s",
name);
}
/* Special top level drop in for "<unit type>.<suffix>". Add this first as it's the most generic
* and should be able to be overridden by more specific drop-ins. */
STRV_FOREACH(p, lookup_path)
(void) unit_file_find_dirs(original_root,
unit_path_cache,
*p,
unit_type_to_string(type),
dir_suffix,
&dirs);
/* Special top level drop in for "<unit type>.<suffix>". Add this first as it's the most generic
* and should be able to be overridden by more specific drop-ins. */
STRV_FOREACH(p, lookup_path)
(void) unit_file_find_dirs(original_root,
unit_path_cache,
*p,
unit_type_to_string(type),
dir_suffix,
&dirs);
}
SET_FOREACH(name, names, i)
STRV_FOREACH(p, lookup_path)

Some files were not shown because too many files have changed in this diff Show More