X Tutup
Skip to content

Commit 3c5cc23

Browse files
committed
sd-device-enumerator: introduce device_enumerator_scan_devices_and_subsystems()
1 parent 37cf83d commit 3c5cc23

File tree

2 files changed

+54
-0
lines changed

2 files changed

+54
-0
lines changed

src/libsystemd/sd-device/device-enumerator-private.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
int device_enumerator_scan_devices(sd_device_enumerator *enumeartor);
77
int device_enumerator_scan_subsystems(sd_device_enumerator *enumeartor);
8+
int device_enumerator_scan_devices_and_subsystems(sd_device_enumerator *enumerator);
89
int device_enumerator_add_device(sd_device_enumerator *enumerator, sd_device *device);
910
int device_enumerator_add_match_is_initialized(sd_device_enumerator *enumerator);
1011
int device_enumerator_add_match_parent_incremental(sd_device_enumerator *enumerator, sd_device *parent);

src/libsystemd/sd-device/device-enumerator.c

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
typedef enum DeviceEnumerationType {
2121
DEVICE_ENUMERATION_TYPE_DEVICES,
2222
DEVICE_ENUMERATION_TYPE_SUBSYSTEMS,
23+
DEVICE_ENUMERATION_TYPE_ALL,
2324
_DEVICE_ENUMERATION_TYPE_MAX,
2425
_DEVICE_ENUMERATION_TYPE_INVALID = -EINVAL,
2526
} DeviceEnumerationType;
@@ -980,6 +981,58 @@ _public_ sd_device *sd_device_enumerator_get_subsystem_next(sd_device_enumerator
980981
return enumerator->devices[++enumerator->current_device_index];
981982
}
982983

984+
int device_enumerator_scan_devices_and_subsystems(sd_device_enumerator *enumerator) {
985+
int r = 0, k;
986+
987+
assert(enumerator);
988+
989+
if (enumerator->scan_uptodate &&
990+
enumerator->type == DEVICE_ENUMERATION_TYPE_ALL)
991+
return 0;
992+
993+
device_enumerator_unref_devices(enumerator);
994+
995+
if (!set_isempty(enumerator->match_tag)) {
996+
k = enumerator_scan_devices_tags(enumerator);
997+
if (k < 0)
998+
r = k;
999+
} else if (enumerator->match_parent) {
1000+
k = enumerator_scan_devices_children(enumerator);
1001+
if (k < 0)
1002+
r = k;
1003+
} else {
1004+
k = enumerator_scan_dir(enumerator, "class", NULL, NULL);
1005+
if (k < 0)
1006+
r = log_debug_errno(k, "sd-device-enumerator: Failed to scan /sys/class: %m");
1007+
1008+
k = enumerator_scan_dir(enumerator, "bus", "devices", NULL);
1009+
if (k < 0)
1010+
r = log_debug_errno(k, "sd-device-enumerator: Failed to scan /sys/bus: %m");
1011+
1012+
if (match_subsystem(enumerator, "module")) {
1013+
k = enumerator_scan_dir_and_add_devices(enumerator, "module", NULL, NULL);
1014+
if (k < 0)
1015+
r = log_debug_errno(k, "sd-device-enumerator: Failed to scan modules: %m");
1016+
}
1017+
if (match_subsystem(enumerator, "subsystem")) {
1018+
k = enumerator_scan_dir_and_add_devices(enumerator, "bus", NULL, NULL);
1019+
if (k < 0)
1020+
r = log_debug_errno(k, "sd-device-enumerator: Failed to scan subsystems: %m");
1021+
}
1022+
1023+
if (match_subsystem(enumerator, "drivers")) {
1024+
k = enumerator_scan_dir(enumerator, "bus", "drivers", "drivers");
1025+
if (k < 0)
1026+
r = log_debug_errno(k, "sd-device-enumerator: Failed to scan drivers: %m");
1027+
}
1028+
}
1029+
1030+
enumerator->scan_uptodate = true;
1031+
enumerator->type = DEVICE_ENUMERATION_TYPE_ALL;
1032+
1033+
return r;
1034+
}
1035+
9831036
sd_device *device_enumerator_get_first(sd_device_enumerator *enumerator) {
9841037
assert_return(enumerator, NULL);
9851038

0 commit comments

Comments
 (0)
X Tutup