From 6f3ac0d51766b0b9101676cefe5c4ba81feba436 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 6 Dec 2020 20:11:37 +0900 Subject: [PATCH] sd-device: use set_strjoin() 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 | 63 +++++++--------------------- test/units/testsuite-55.sh | 44 ++++++++++++------- 2 files changed, 44 insertions(+), 63 deletions(-) diff --git a/src/libsystemd/sd-device/sd-device.c b/src/libsystemd/sd-device/sd-device.c index d06f90ce1d..005801e1a6 100644 --- a/src/libsystemd/sd-device/sd-device.c +++ b/src/libsystemd/sd-device/sd-device.c @@ -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; diff --git a/test/units/testsuite-55.sh b/test/units/testsuite-55.sh index ffceefb6a5..19f5683f57 100755 --- a/test/units/testsuite-55.sh +++ b/test/units/testsuite-55.sh @@ -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 <