summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/device.c112
1 files changed, 78 insertions, 34 deletions
diff --git a/src/core/device.c b/src/core/device.c
index d17b2dfdd7..444286e02b 100644
--- a/src/core/device.c
+++ b/src/core/device.c
@@ -183,13 +183,85 @@ static int device_find_escape_name(Manager *m, const char *dn, Unit **_u) {
return 0;
}
+static int device_make_description(Unit *u, struct udev_device *dev, const char *path) {
+ const char *model;
+
+ assert(u);
+ assert(dev);
+ assert(path);
+
+ model = udev_device_get_property_value(dev, "ID_MODEL_FROM_DATABASE");
+ if (!model)
+ model = udev_device_get_property_value(dev, "ID_MODEL");
+
+ if (model) {
+ const char *label;
+
+ /* Try to concatenate the device model string with a label, if there is one */
+ label = udev_device_get_property_value(dev, "ID_FS_LABEL");
+ if (!label)
+ label = udev_device_get_property_value(dev, "ID_PART_ENTRY_NAME");
+ if (!label)
+ label = udev_device_get_property_value(dev, "ID_PART_ENTRY_NUMBER");
+
+ if (label) {
+ _cleanup_free_ char *j;
+
+ j = strjoin(model, " ", label, NULL);
+ if (j)
+ return unit_set_description(u, j);
+ }
+
+ return unit_set_description(u, model);
+ }
+
+ return unit_set_description(u, path);
+}
+
+static int device_add_udev_wants(Unit *u, struct udev_device *dev) {
+ const char *wants;
+ char *state, *w;
+ size_t l;
+ int r;
+
+ assert(u);
+ assert(dev);
+
+ wants = udev_device_get_property_value(
+ dev,
+ u->manager->running_as == SYSTEMD_USER ? "SYSTEMD_USER_WANTS" : "SYSTEMD_WANTS");
+
+ if (!wants)
+ return 0;
+
+ FOREACH_WORD_QUOTED(w, l, wants, state) {
+ _cleanup_free_ char *n = NULL;
+ char e[l+1];
+
+ memcpy(e, w, l);
+ e[l] = 0;
+
+ n = unit_name_mangle(e, MANGLE_NOGLOB);
+ if (!n)
+ return -ENOMEM;
+
+ r = unit_add_dependency_by_name(u, UNIT_WANTS, n, NULL, true);
+ if (r < 0)
+ return r;
+ }
+
+ return 0;
+}
+
static int device_update_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
- const char *sysfs, *model;
+ const char *sysfs;
Unit *u = NULL;
- int r;
bool delete;
+ int r;
assert(m);
+ assert(dev);
+ assert(path);
sysfs = udev_device_get_syspath(dev);
if (!sysfs)
@@ -242,43 +314,15 @@ static int device_update_unit(Manager *m, struct udev_device *dev, const char *p
goto fail;
}
- if ((model = udev_device_get_property_value(dev, "ID_MODEL_FROM_DATABASE")) ||
- (model = udev_device_get_property_value(dev, "ID_MODEL")))
- r = unit_set_description(u, model);
- else
- r = unit_set_description(u, path);
- if (r < 0)
- goto fail;
+ device_make_description(u, dev, path);
if (main) {
- const char *wants;
-
/* The additional systemd udev properties we only
* interpret for the main object */
- wants = udev_device_get_property_value(dev, m->running_as == SYSTEMD_USER ? "SYSTEMD_USER_WANTS" : "SYSTEMD_WANTS");
- if (wants) {
- char *state, *w;
- size_t l;
-
- FOREACH_WORD_QUOTED(w, l, wants, state) {
- _cleanup_free_ char *n = NULL;
- char e[l+1];
-
- memcpy(e, w, l);
- e[l] = 0;
-
- n = unit_name_mangle(e, MANGLE_NOGLOB);
- if (!n) {
- r = -ENOMEM;
- goto fail;
- }
-
- r = unit_add_dependency_by_name(u, UNIT_WANTS, n, NULL, true);
- if (r < 0)
- goto fail;
- }
- }
+ r = device_add_udev_wants(u, dev);
+ if (r < 0)
+ goto fail;
}
/* Note that this won't dispatch the load queue, the caller