]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-device-enumerator: introduce sd_device_enumerator_add_nomatch_sysname()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 25 Apr 2022 02:20:11 +0000 (11:20 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 27 Apr 2022 07:32:42 +0000 (16:32 +0900)
src/libsystemd/libsystemd.sym
src/libsystemd/sd-device/device-enumerator-private.h
src/libsystemd/sd-device/device-enumerator.c
src/systemd/sd-device.h

index bdf76b467b7f80ce64a8a11518e33a8fa87b6d8c..ccc321ec339f1337daa2d07ba3660cca6a977caa 100644 (file)
@@ -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;
index 5aaa384095e099dc3c24b384610a0b991b4cfb7d..cf62fabdad98483bd99fb42d6560cc80d287d0f6 100644 (file)
@@ -1,6 +1,8 @@
 /* SPDX-License-Identifier: LGPL-2.1-or-later */
 #pragma once
 
+#include <stdbool.h>
+
 #include "sd-device.h"
 
 typedef enum MatchInitializedType {
index 977f4ef24ad1f2dc27a07fd4afa10d84adf78577..3af9e36a5a52a52619a79e350e10f9f3a36ec05a 100644 (file)
@@ -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) {
index f0c3c115e4337b3c872288a782cae7830ea38e51..2d122888644080251d8dc51e0dc9b6cc84b6ff82 100644 (file)
@@ -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);