This patch filter devices by properties and return a sorted list only initialized/uninitialized devices.
Signed-off-by: Pawan Badganchi <badganch...@gmail.com> --- ...initialized-or-uninitialized-devices.patch | 192 ++++++++++++++++++ meta/recipes-core/systemd/systemd_244.5.bb | 1 + 2 files changed, 193 insertions(+) create mode 100644 meta/recipes-core/systemd/systemd/0001-sd-device-enumerator-support-to-list-only-initialized-or-uninitialized-devices.patch diff --git a/meta/recipes-core/systemd/systemd/0001-sd-device-enumerator-support-to-list-only-initialized-or-uninitialized-devices.patch b/meta/recipes-core/systemd/systemd/0001-sd-device-enumerator-support-to-list-only-initialized-or-uninitialized-devices.patch new file mode 100644 index 0000000000..9ebd044343 --- /dev/null +++ b/meta/recipes-core/systemd/systemd/0001-sd-device-enumerator-support-to-list-only-initialized-or-uninitialized-devices.patch @@ -0,0 +1,192 @@ +From d8b50e5df7e01983279e70c6d970fb60d053df97 Mon Sep 17 00:00:00 2001 +From: Yu Watanabe <watanabe.yu+git...@gmail.com> +Date: Tue, 8 Mar 2022 13:58:02 +0900 +Subject: [PATCH] sd-device-enumerator: support to list only initialized or + uninitialized devices + +Upstream-Status: Backport [https://github.com/systemd/systemd/commit/d8b50e5df7e01983279e70c6d970fb60d053df97.patch] +Comment: Refreshed hunk from device-enumerator-private.h and device-enumerator.c +Add "errno.h" header file to fix below compiler error. +error: 'EINVAL' undeclared here (not in a function) +12 _MATCH_INITIALIZED_INVALID = -EINVAL +Signed-off-by: Pawan Badganchi <pawan.badgan...@kpit.com> +--- + .../sd-device/device-enumerator-private.h | 11 ++- + src/libsystemd/sd-device/device-enumerator.c | 71 +++++++++++-------- + src/libudev/libudev-enumerate.c | 2 +- + 3 files changed, 54 insertions(+), 30 deletions(-) + +diff --git a/src/libsystemd/sd-device/device-enumerator-private.h b/src/libsystemd/sd-device/device-enumerator-private.h +index d74198822ca3..54fc13c43b22 100644 +--- a/src/libsystemd/sd-device/device-enumerator-private.h ++++ b/src/libsystemd/sd-device/device-enumerator-private.h +@@ -1,12 +1,23 @@ + /* SPDX-License-Identifier: LGPL-2.1+ */ + #pragma once + ++#include <errno.h> ++ + #include "sd-device.h" + ++typedef enum MatchInitializedType { ++ MATCH_INITIALIZED_NO, /* only devices without a db entry */ ++ MATCH_INITIALIZED_YES, /* only devices with a db entry */ ++ MATCH_INITIALIZED_ALL, /* all devices */ ++ MATCH_INITIALIZED_COMPAT, /* only devices that have no devnode/ifindex or have a db entry */ ++ _MATCH_INITIALIZED_MAX, ++ _MATCH_INITIALIZED_INVALID = -EINVAL, ++} MatchInitializedType; ++ + int device_enumerator_scan_devices(sd_device_enumerator *enumeartor); + int device_enumerator_scan_subsystems(sd_device_enumerator *enumeartor); + int device_enumerator_add_device(sd_device_enumerator *enumerator, sd_device *device); +-int device_enumerator_add_match_is_initialized(sd_device_enumerator *enumerator); ++int device_enumerator_add_match_is_initialized(sd_device_enumerator *enumerator, MatchInitializedType type); + int device_enumerator_add_match_parent_incremental(sd_device_enumerator *enumerator, sd_device *parent); + sd_device *device_enumerator_get_first(sd_device_enumerator *enumerator); + sd_device *device_enumerator_get_next(sd_device_enumerator *enumerator); +diff --git a/src/libsystemd/sd-device/device-enumerator.c b/src/libsystemd/sd-device/device-enumerator.c +index df8753dec9b4..1379764156ee 100644 +--- a/src/libsystemd/sd-device/device-enumerator.c ++++ b/src/libsystemd/sd-device/device-enumerator.c +@@ -44,7 +44,7 @@ struct sd_device_enumerator { + Set *match_sysname; + Set *match_tag; + Set *match_parent; +- bool match_allow_uninitialized; ++ MatchInitializedType match_initialized; + }; + + _public_ int sd_device_enumerator_new(sd_device_enumerator **ret) { +@@ -59,6 +59,7 @@ _public_ int sd_device_enumerator_new(sd_device_enumerator **ret) { + *enumerator = (sd_device_enumerator) { + .n_ref = 1, + .type = _DEVICE_ENUMERATION_TYPE_INVALID, ++ .match_initialized = MATCH_INITIALIZED_COMPAT, + }; + + *ret = TAKE_PTR(enumerator); +@@ -259,17 +259,18 @@ + _public_ int sd_device_enumerator_allow_uninitialized(sd_device_enumerator *enumerator) { + assert_return(enumerator, -EINVAL); + +- enumerator->match_allow_uninitialized = true; ++ enumerator->match_initialized = MATCH_INITIALIZED_ALL; + + enumerator->scan_uptodate = false; + + return 0; + } + +-int device_enumerator_add_match_is_initialized(sd_device_enumerator *enumerator) { ++int device_enumerator_add_match_is_initialized(sd_device_enumerator *enumerator, MatchInitializedType type) { + assert_return(enumerator, -EINVAL); ++ assert_return(type >= 0 && type < _MATCH_INITIALIZED_MAX, -EINVAL); + +- enumerator->match_allow_uninitialized = false; ++ enumerator->match_initialized = type; + + enumerator->scan_uptodate = false; + +@@ -461,11 +461,44 @@ + return false; + } + ++static int match_initialized(sd_device_enumerator *enumerator, sd_device *device) { ++ int r; ++ ++ assert(enumerator); ++ assert(device); ++ ++ if (enumerator->match_initialized == MATCH_INITIALIZED_ALL) ++ return true; ++ ++ r = sd_device_get_is_initialized(device); ++ if (r == -ENOENT) /* this is necessarily racey, so ignore missing devices */ ++ return false; ++ if (r < 0) ++ return r; ++ ++ if (enumerator->match_initialized == MATCH_INITIALIZED_COMPAT) { ++ /* only devices that have no devnode/ifindex or have a db entry are accepted. */ ++ if (r > 0) ++ return true; ++ ++ if (sd_device_get_devnum(device, NULL) >= 0) ++ return true; ++ ++ if (sd_device_get_ifindex(device, NULL) >= 0) ++ return true; ++ ++ return false; ++ } ++ ++ return (enumerator->match_initialized == MATCH_INITIALIZED_NO) == (r == 0); ++} ++ ++ + static int enumerator_scan_dir_and_add_devices(sd_device_enumerator *enumerator, const char *basedir, const char *subdir1, const char *subdir2) { + _cleanup_closedir_ DIR *dir = NULL; + char *path; + struct dirent *dent; +- int r = 0; ++ int k, r = 0; + + assert(enumerator); + assert(basedir); +@@ -485,7 +519,6 @@ + FOREACH_DIRENT_ALL(dent, dir, return -errno) { + _cleanup_(sd_device_unrefp) sd_device *device = NULL; + char syspath[strlen(path) + 1 + strlen(dent->d_name) + 1]; +- int initialized, k; + + if (dent->d_name[0] == '.') + continue; +@@ -504,31 +537,13 @@ + continue; + } + +- initialized = sd_device_get_is_initialized(device); +- if (initialized < 0) { +- if (initialized != -ENOENT) +- /* this is necessarily racey, so ignore missing devices */ +- r = initialized; +- ++ k = match_initialized(enumerator, device); ++ if (k <= 0) { ++ if (k < 0) ++ r = k; + continue; + } + +- /* +- * All devices with a device node or network interfaces +- * possibly need udev to adjust the device node permission +- * or context, or rename the interface before it can be +- * reliably used from other processes. +- * +- * For now, we can only check these types of devices, we +- * might not store a database, and have no way to find out +- * for all other types of devices. +- */ +- if (!enumerator->match_allow_uninitialized && +- !initialized && +- (sd_device_get_devnum(device, NULL) >= 0 || +- sd_device_get_ifindex(device, NULL) >= 0)) +- continue; +- + if (!match_parent(enumerator, device)) + continue; + +diff --git a/src/libudev/libudev-enumerate.c b/src/libudev/libudev-enumerate.c +index 2dc695bd03f9..d71a31c566a7 100644 +--- a/src/libudev/libudev-enumerate.c ++++ b/src/libudev/libudev-enumerate.c +@@ -365,7 +365,7 @@ _public_ int udev_enumerate_add_match_is_initialized(struct udev_enumerate *udev + + assert_return(udev_enumerate, -EINVAL); + +- r = device_enumerator_add_match_is_initialized(udev_enumerate->enumerator); ++ r = device_enumerator_add_match_is_initialized(udev_enumerate->enumerator, MATCH_INITIALIZED_COMPAT); + if (r < 0) + return r; diff --git a/meta/recipes-core/systemd/systemd_244.5.bb b/meta/recipes-core/systemd/systemd_244.5.bb index a398043308..e393e46909 100644 --- a/meta/recipes-core/systemd/systemd_244.5.bb +++ b/meta/recipes-core/systemd/systemd_244.5.bb @@ -40,6 +40,7 @@ SRC_URI += "file://touchscreen.rules \ file://CVE-2023-26604-3.patch \ file://CVE-2023-26604-4.patch \ file://0001-udevadm-trigger-implement-initialized-match-nomatch-arguments.patch \ + file://0001-sd-device-enumerator-support-to-list-only-initialized-or-uninitialized-devices.patch \ " # patches needed by musl -- 2.38.1
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#182501): https://lists.openembedded.org/g/openembedded-core/message/182501 Mute This Topic: https://lists.openembedded.org/mt/99403409/21656 Group Owner: openembedded-core+ow...@lists.openembedded.org Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-