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