core: include partition label in .device description fields

This commit is contained in:
Lennart Poettering 2014-03-06 04:57:16 +01:00
parent 646e392e10
commit 965e5c5daf

View File

@ -183,13 +183,85 @@ static int device_find_escape_name(Manager *m, const char *dn, Unit **_u) {
return 0;
}
static int device_update_unit(Manager *m, struct udev_device *dev, const char *path, bool main) {
const char *sysfs, *model;
Unit *u = NULL;
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;
Unit *u = NULL;
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