diff mbox series

[dunfell,2/2] systemd: support to list only initialized/uninitialized devices

Message ID 20230608095227.34548-2-badganchipv@gmail.com
State New, archived
Headers show
Series [dunfell,1/2] systemd: implement --initialized-match/nomatch arguments | expand

Commit Message

Pawan Badganchi June 8, 2023, 9:52 a.m. UTC
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

Comments

Pawan Badganchi Nov. 23, 2023, 5:45 a.m. UTC | #1
Hi,

Could you please take this patch
diff mbox series

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+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;
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