]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-device: use set_strjoin()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 6 Dec 2020 11:11:37 +0000 (20:11 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 8 Dec 2020 03:28:58 +0000 (12:28 +0900)
This slightly changes TAGS= and CURRENT_TAGS= properties:

Before
E: TAGS=:aaa:bbb:

After
E: TAGS=aaa:bbb

src/libsystemd/sd-device/sd-device.c
test/units/testsuite-55.sh

index d06f90ce1d881348499b28cf7bb0cf17a584d753..005801e1a69bb7bd9a6e2dd2d34682d2d5e344bc 100644 (file)
@@ -1518,30 +1518,6 @@ _public_ const char *sd_device_get_devlink_next(sd_device *device) {
         return v;
 }
 
-static char *join_string_set(Set *s) {
-        size_t ret_allocated = 0, ret_len;
-        _cleanup_free_ char *ret = NULL;
-        const char *tag;
-
-        if (!GREEDY_REALLOC(ret, ret_allocated, 2))
-                return NULL;
-
-        strcpy(ret, ":");
-        ret_len = 1;
-
-        SET_FOREACH(tag, s) {
-                char *e;
-
-                if (!GREEDY_REALLOC(ret, ret_allocated, ret_len + strlen(tag) + 2))
-                        return NULL;
-
-                e = stpcpy(stpcpy(ret + ret_len, tag), ":");
-                ret_len = e - ret;
-        }
-
-        return TAKE_PTR(ret);
-}
-
 int device_properties_prepare(sd_device *device) {
         int r;
 
@@ -1557,46 +1533,39 @@ int device_properties_prepare(sd_device *device) {
 
         if (device->property_devlinks_outdated) {
                 _cleanup_free_ char *devlinks = NULL;
-                size_t devlinks_allocated = 0, devlinks_len = 0;
-                const char *devlink;
-
-                for (devlink = sd_device_get_devlink_first(device); devlink; devlink = sd_device_get_devlink_next(device)) {
-                        char *e;
 
-                        if (!GREEDY_REALLOC(devlinks, devlinks_allocated, devlinks_len + strlen(devlink) + 2))
-                                return -ENOMEM;
-                        if (devlinks_len > 0)
-                                stpcpy(devlinks + devlinks_len++, " ");
-                        e = stpcpy(devlinks + devlinks_len, devlink);
-                        devlinks_len = e - devlinks;
-                }
-
-                r = device_add_property_internal(device, "DEVLINKS", devlinks);
+                r = set_strjoin(device->devlinks, " ", &devlinks);
                 if (r < 0)
                         return r;
 
+                if (!isempty(devlinks)) {
+                        r = device_add_property_internal(device, "DEVLINKS", devlinks);
+                        if (r < 0)
+                                return r;
+                }
+
                 device->property_devlinks_outdated = false;
         }
 
         if (device->property_tags_outdated) {
                 _cleanup_free_ char *tags = NULL;
 
-                tags = join_string_set(device->all_tags);
-                if (!tags)
-                        return -ENOMEM;
+                r = set_strjoin(device->all_tags, ":", &tags);
+                if (r < 0)
+                        return r;
 
-                if (!streq(tags, ":")) {
+                if (!isempty(tags)) {
                         r = device_add_property_internal(device, "TAGS", tags);
                         if (r < 0)
                                 return r;
                 }
 
-                free(tags);
-                tags = join_string_set(device->current_tags);
-                if (!tags)
-                        return -ENOMEM;
+                tags = mfree(tags);
+                r = set_strjoin(device->current_tags, ":", &tags);
+                if (r < 0)
+                        return r;
 
-                if (!streq(tags, ":")) {
+                if (!isempty(tags)) {
                         r = device_add_property_internal(device, "CURRENT_TAGS", tags);
                         if (r < 0)
                                 return r;
index ffceefb6a57ae2fe1beb5d0923aef7fc88fad0ca..19f5683f57a104fa01ae4c54531db07462a6e537 100755 (executable)
@@ -2,14 +2,26 @@
 set -ex
 set -o pipefail
 
+function has_tag_internal() {
+    udevadm info /dev/null | sed -n '/E: '$1'=/ {s/E: '$1'=/:/; s/$/:/; p}' | grep -q ":$2:"
+}
+
+function has_tag() {
+    has_tag_internal TAGS $1
+}
+
+function has_current_tag() {
+    has_tag_internal CURRENT_TAGS $1
+}
+
 mkdir -p /run/udev/rules.d/
 
 ! test -f /run/udev/tags/added/c1:3 &&
     ! test -f /run/udev/tags/changed/c1:3 &&
-    udevadm info /dev/null | grep -q -v 'E: TAGS=.*:added:.*' &&
-    udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:added:.*' &&
-    udevadm info /dev/null | grep -q -v 'E: TAGS=.*:changed:.*' &&
-    udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:changed:.*'
+    ! has_tag added &&
+    ! has_current_tag added &&
+    ! has_tag changed &&
+    ! has_current_tag changed
 
 cat > /run/udev/rules.d/50-testsuite.rules <<EOF
 ACTION=="add", SUBSYSTEM=="mem", KERNEL=="null", TAG+="added"
@@ -22,10 +34,10 @@ udevadm trigger -c add /dev/null
 while : ; do
     test -f /run/udev/tags/added/c1:3 &&
         ! test -f /run/udev/tags/changed/c1:3 &&
-        udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*' &&
-        udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:added:.*' &&
-        udevadm info /dev/null | grep -q -v 'E: TAGS=.*:changed:.*' &&
-        udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:changed:.*' &&
+        has_tag added &&
+        has_current_tag added &&
+        ! has_tag changed &&
+        ! has_current_tag changed &&
         break
 
     sleep .5
@@ -37,10 +49,10 @@ udevadm trigger -c change /dev/null
 while : ; do
     test -f /run/udev/tags/added/c1:3 &&
         test -f /run/udev/tags/changed/c1:3 &&
-        udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*' &&
-        udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:added:.*' &&
-        udevadm info /dev/null | grep -q 'E: TAGS=.*:changed:.*' &&
-        udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:changed:.*' &&
+        has_tag added &&
+        ! has_current_tag added &&
+        has_tag changed &&
+        has_current_tag changed &&
         break
 
     sleep .5
@@ -52,10 +64,10 @@ udevadm trigger -c add /dev/null
 while : ; do
     test -f /run/udev/tags/added/c1:3 &&
         test -f /run/udev/tags/changed/c1:3 &&
-        udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*' &&
-        udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:added:.*' &&
-        udevadm info /dev/null | grep -q 'E: TAGS=.*:changed:.*' &&
-        udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:changed:.*' &&
+        has_tag added &&
+        has_current_tag added &&
+        has_tag changed &&
+        ! has_current_tag changed &&
         break
 
     sleep .5