new file mode 100644
@@ -0,0 +1,192 @@
+From d8b50e5df7e01983279e70c6d970fb60d053df97 Mon Sep 17 00:00:00 2001
+From: Yu Watanabe <watanabe.yu+github@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.Badganchi@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;
@@ -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
This patch filter devices by properties and return a sorted list only initialized/uninitialized devices. Signed-off-by: Pawan Badganchi <badganchipv@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