diff --git a/src/libsystemd/libsystemd.sym b/src/libsystemd/libsystemd.sym index bdf76b467b7..ccc321ec339 100644 --- a/src/libsystemd/libsystemd.sym +++ b/src/libsystemd/libsystemd.sym @@ -776,4 +776,5 @@ global: sd_device_new_from_devname; sd_device_new_from_path; sd_device_open; + sd_device_enumerator_add_nomatch_sysname; } LIBSYSTEMD_250; diff --git a/src/libsystemd/sd-device/device-enumerator-private.h b/src/libsystemd/sd-device/device-enumerator-private.h index 5aaa384095e..cf62fabdad9 100644 --- a/src/libsystemd/sd-device/device-enumerator-private.h +++ b/src/libsystemd/sd-device/device-enumerator-private.h @@ -1,6 +1,8 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once +#include + #include "sd-device.h" typedef enum MatchInitializedType { diff --git a/src/libsystemd/sd-device/device-enumerator.c b/src/libsystemd/sd-device/device-enumerator.c index 977f4ef24ad..3af9e36a5a5 100644 --- a/src/libsystemd/sd-device/device-enumerator.c +++ b/src/libsystemd/sd-device/device-enumerator.c @@ -42,6 +42,7 @@ struct sd_device_enumerator { Hashmap *nomatch_sysattr; Hashmap *match_property; Set *match_sysname; + Set *nomatch_sysname; Set *match_tag; Set *match_parent; MatchInitializedType match_initialized; @@ -96,6 +97,7 @@ static sd_device_enumerator *device_enumerator_free(sd_device_enumerator *enumer hashmap_free(enumerator->nomatch_sysattr); hashmap_free(enumerator->match_property); set_free(enumerator->match_sysname); + set_free(enumerator->nomatch_sysname); set_free(enumerator->match_tag); set_free(enumerator->match_parent); @@ -183,13 +185,13 @@ _public_ int sd_device_enumerator_add_match_property(sd_device_enumerator *enume return 1; } -_public_ int sd_device_enumerator_add_match_sysname(sd_device_enumerator *enumerator, const char *sysname) { +static int device_enumerator_add_match_sysname(sd_device_enumerator *enumerator, const char *sysname, bool match) { int r; assert_return(enumerator, -EINVAL); assert_return(sysname, -EINVAL); - r = set_put_strdup(&enumerator->match_sysname, sysname); + r = set_put_strdup(match ? &enumerator->match_sysname : &enumerator->nomatch_sysname, sysname); if (r <= 0) return r; @@ -198,6 +200,14 @@ _public_ int sd_device_enumerator_add_match_sysname(sd_device_enumerator *enumer return 1; } +_public_ int sd_device_enumerator_add_match_sysname(sd_device_enumerator *enumerator, const char *sysname) { + return device_enumerator_add_match_sysname(enumerator, sysname, true); +} + +_public_ int sd_device_enumerator_add_nomatch_sysname(sd_device_enumerator *enumerator, const char *sysname) { + return device_enumerator_add_match_sysname(enumerator, sysname, false); +} + _public_ int sd_device_enumerator_add_match_tag(sd_device_enumerator *enumerator, const char *tag) { int r; @@ -500,19 +510,10 @@ static bool match_tag(sd_device_enumerator *enumerator, sd_device *device) { } static bool match_sysname(sd_device_enumerator *enumerator, const char *sysname) { - const char *sysname_match; - assert(enumerator); assert(sysname); - if (set_isempty(enumerator->match_sysname)) - return true; - - SET_FOREACH(sysname_match, enumerator->match_sysname) - if (fnmatch(sysname_match, sysname, 0) == 0) - return true; - - return false; + return set_fnmatch(enumerator->match_sysname, enumerator->nomatch_sysname, sysname); } static int match_initialized(sd_device_enumerator *enumerator, sd_device *device) { diff --git a/src/systemd/sd-device.h b/src/systemd/sd-device.h index f0c3c115e43..2d122888644 100644 --- a/src/systemd/sd-device.h +++ b/src/systemd/sd-device.h @@ -126,6 +126,7 @@ int sd_device_enumerator_add_match_subsystem(sd_device_enumerator *enumerator, c int sd_device_enumerator_add_match_sysattr(sd_device_enumerator *enumerator, const char *sysattr, const char *value, int match); int sd_device_enumerator_add_match_property(sd_device_enumerator *enumerator, const char *property, const char *value); int sd_device_enumerator_add_match_sysname(sd_device_enumerator *enumerator, const char *sysname); +int sd_device_enumerator_add_nomatch_sysname(sd_device_enumerator *enumerator, const char *sysname); int sd_device_enumerator_add_match_tag(sd_device_enumerator *enumerator, const char *tag); int sd_device_enumerator_add_match_parent(sd_device_enumerator *enumerator, sd_device *parent); int sd_device_enumerator_allow_uninitialized(sd_device_enumerator *enumerator);