From 345df96d0715e0ddd550b2c7a50c96c345d2f58d Mon Sep 17 00:00:00 2001 From: Tom Gundersen Date: Tue, 11 Nov 2014 22:47:13 +0100 Subject: sd-device: add sd_device_get_devlink_{first,next} --- src/libsystemd/sd-device/device-util.h | 5 ++++ src/libsystemd/sd-device/sd-device.c | 52 ++++++++++++++++++++++++++++++++++ src/systemd/sd-device.h | 2 ++ 3 files changed, 59 insertions(+) diff --git a/src/libsystemd/sd-device/device-util.h b/src/libsystemd/sd-device/device-util.h index 0fe15494b..600cd30a9 100644 --- a/src/libsystemd/sd-device/device-util.h +++ b/src/libsystemd/sd-device/device-util.h @@ -41,3 +41,8 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(sd_device*, sd_device_unref); for (key = sd_device_get_sysattr_first(device, &(value)); \ key; \ key = sd_device_get_sysattr_next(device, &(value))) + +#define FOREACH_DEVICE_DEVLINK(device, devlink) \ + for (devlink = sd_device_get_devlink_first(device); \ + devlink; \ + devlink = sd_device_get_devlink_next(device)) diff --git a/src/libsystemd/sd-device/sd-device.c b/src/libsystemd/sd-device/sd-device.c index cb6de70c8..a41aa1956 100644 --- a/src/libsystemd/sd-device/sd-device.c +++ b/src/libsystemd/sd-device/sd-device.c @@ -49,6 +49,9 @@ struct sd_device { Set *tags; Iterator tags_iterator; bool tags_modified; + Set *devlinks; + Iterator devlinks_iterator; + bool devlinks_modified; char *syspath; const char *devpath; @@ -75,6 +78,7 @@ struct sd_device { bool driver_set; bool tags_uptodate; + bool devlinks_uptodate; }; static int device_new(sd_device **ret) { @@ -88,6 +92,7 @@ static int device_new(sd_device **ret) { device->n_ref = REFCNT_INIT; device->tags_uptodate = true; + device->devlinks_uptodate = true; *ret = device; device = NULL; @@ -116,6 +121,7 @@ _public_ sd_device *sd_device_unref(sd_device *device) { ordered_hashmap_free_free_free(device->properties); hashmap_free_free_free(device->sysattrs); set_free_free(device->tags); + set_free_free(device->devlinks); free(device); } @@ -221,6 +227,26 @@ static int device_add_tag(sd_device *device, const char *tag) { return 0; } +static int device_add_devlink(sd_device *device, const char *devlink) { + int r; + + assert(device); + assert(devlink); + + r = set_ensure_allocated(&device->devlinks, &string_hash_ops); + if (r < 0) + return r; + + r = set_put_strdup(device->devlinks, devlink); + if (r < 0) + return r; + + device->devlinks_modified = true; + device->devlinks_uptodate = false; + + return 0; +} + static int device_set_syspath(sd_device *device, const char *_syspath) { _cleanup_free_ char *syspath = NULL, *sysname = NULL; const char *devpath, *sysnum; @@ -1059,12 +1085,20 @@ static int device_set_usec_initialized(sd_device *device, const char *initialize } static int handle_db_line(sd_device *device, char key, const char *value) { + char *path; int r; assert(device); assert(value); switch (key) { + case 'S': + path = strappenda("/dev/", value); + r = device_add_devlink(device, path); + if (r < 0) + return r; + + break; case 'E': r = device_add_property_from_string(device, value); if (r < 0) @@ -1315,6 +1349,24 @@ _public_ const char *sd_device_get_tag_next(sd_device *device) { return set_iterate(device->tags, &device->tags_iterator); } +_public_ const char *sd_device_get_devlink_first(sd_device *device) { + assert_return(device, NULL); + + device->devlinks_modified = false; + device->devlinks_iterator = ITERATOR_FIRST; + + return set_iterate(device->devlinks, &device->devlinks_iterator); +} + +_public_ const char *sd_device_get_devlink_next(sd_device *device) { + assert_return(device, NULL); + + if (device->devlinks_modified) + return NULL; + + return set_iterate(device->devlinks, &device->devlinks_iterator); +} + _public_ int sd_device_get_sysattr_value(sd_device *device, const char *sysattr, const char **_value) { _cleanup_close_ int fd = -1; _cleanup_free_ char *value = NULL; diff --git a/src/systemd/sd-device.h b/src/systemd/sd-device.h index 3d5f05c7a..daaa2bb62 100644 --- a/src/systemd/sd-device.h +++ b/src/systemd/sd-device.h @@ -60,6 +60,8 @@ const char *sd_device_get_tag_first(sd_device *device); const char *sd_device_get_tag_next(sd_device *device); const char *sd_device_get_sysattr_first(sd_device *device, const char **value); const char *sd_device_get_sysattr_next(sd_device *device, const char **value); +const char *sd_device_get_devlink_first(sd_device *device); +const char *sd_device_get_devlink_next(sd_device *device); _SD_END_DECLARATIONS; -- cgit v1.2.3