summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Gundersen <teg@jklm.no>2014-11-11 22:47:13 +0100
committerTom Gundersen <teg@jklm.no>2014-12-11 13:54:18 +0100
commit345df96d0715e0ddd550b2c7a50c96c345d2f58d (patch)
tree2b969212603c05d7317b8d1ed9b66bc911ed3338
parent6e67474a816b1021ca7a7beca23891ba35f26d89 (diff)
sd-device: add sd_device_get_devlink_{first,next}
-rw-r--r--src/libsystemd/sd-device/device-util.h5
-rw-r--r--src/libsystemd/sd-device/sd-device.c52
-rw-r--r--src/systemd/sd-device.h2
3 files changed, 59 insertions, 0 deletions
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;