diff options
author | Tom Gundersen <teg@jklm.no> | 2014-11-13 16:45:16 +0100 |
---|---|---|
committer | Tom Gundersen <teg@jklm.no> | 2014-12-11 13:54:18 +0100 |
commit | f4aed9003a2d5df182123369451a19464d25fd11 (patch) | |
tree | e8954a238906d9f26ff1cc781083fb6d258d34f1 | |
parent | 345df96d0715e0ddd550b2c7a50c96c345d2f58d (diff) |
sd-device: add TAGS and DEVLINKS properties
-rw-r--r-- | src/libsystemd/sd-device/sd-device.c | 68 |
1 files changed, 63 insertions, 5 deletions
diff --git a/src/libsystemd/sd-device/sd-device.c b/src/libsystemd/sd-device/sd-device.c index a41aa1956..af06ea86c 100644 --- a/src/libsystemd/sd-device/sd-device.c +++ b/src/libsystemd/sd-device/sd-device.c @@ -1262,6 +1262,58 @@ _public_ int sd_device_get_usec_since_initialized(sd_device *device, uint64_t *u return 0; } +static int device_properties_prepare(sd_device *device) { + int r; + + r = device_read_uevent_file(device); + if (r < 0) + return r; + + r = device_read_db(device); + if (r < 0) + return r; + + if (!device->devlinks_uptodate) { + char *devlinks = NULL; + const char *devlink; + + devlink = sd_device_get_devlink_first(device); + if (devlink) + devlinks = strdupa(devlink); + + while ((devlink = sd_device_get_devlink_next(device))) + devlinks = strappenda(devlinks, " ", devlink); + + r = device_add_property(device, "DEVLINKS", devlinks); + if (r < 0) + return r; + + device->devlinks_uptodate = true; + } + + if (!device->tags_uptodate) { + char *tags = NULL; + const char *tag; + + tag = sd_device_get_tag_first(device); + if (tag) + tags = strappenda(":", tag); + + while ((tag = sd_device_get_tag_next(device))) + tags = strappenda(tags, ":", tag); + + tags = strappenda(tags, ":"); + + r = device_add_property(device, "TAGS", tags); + if (r < 0) + return r; + + device->tags_uptodate = true; + } + + return 0; +} + _public_ int sd_device_get_property_value(sd_device *device, const char *key, const char **_value) { char *value; int r; @@ -1270,11 +1322,7 @@ _public_ int sd_device_get_property_value(sd_device *device, const char *key, co assert_return(key, -EINVAL); assert_return(_value, -EINVAL); - r = device_read_uevent_file(device); - if (r < 0) - return r; - - r = device_read_db(device); + r = device_properties_prepare(device); if (r < 0) return r; @@ -1290,9 +1338,14 @@ _public_ int sd_device_get_property_value(sd_device *device, const char *key, co _public_ const char *sd_device_get_property_first(sd_device *device, const char **_value) { const char *key; const char *value; + int r; assert_return(device, NULL); + r = device_properties_prepare(device); + if (r < 0) + return NULL; + device->properties_modified = false; device->properties_iterator = ITERATOR_FIRST; @@ -1307,9 +1360,14 @@ _public_ const char *sd_device_get_property_first(sd_device *device, const char _public_ const char *sd_device_get_property_next(sd_device *device, const char **_value) { const char *key; const char *value; + int r; assert_return(device, NULL); + r = device_properties_prepare(device); + if (r < 0) + return NULL; + if (device->properties_modified) return NULL; |