X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=device.c;h=e67d0a6c2d71e1d2ec83db8e3fcdc854dd2e41e4;hp=95c458f3d775aaa5beb7b7dbf3b89e12ef520326;hb=92aa6f363360cbb4e300648e5cbdb6fe4cce1b57;hpb=40d50879d9339e539a30e5d32234baffb732f0f9 diff --git a/device.c b/device.c index 95c458f3d..e67d0a6c2 100644 --- a/device.c +++ b/device.c @@ -144,7 +144,7 @@ static int device_find_escape_name(Manager *m, const char *dn, Unit **_u) { } static int device_process_new_device(Manager *m, struct udev_device *dev, bool update_state) { - const char *dn, *wants, *sysfs, *expose, *model; + const char *dn, *wants, *sysfs, *expose, *model, *alias; Unit *u = NULL; int r; char *w, *state; @@ -172,6 +172,15 @@ static int device_process_new_device(Manager *m, struct udev_device *dev, bool u /* Check whether this entry is even relevant for us. */ dn = udev_device_get_devnode(dev); wants = udev_device_get_property_value(dev, "SYSTEMD_WANTS"); + alias = udev_device_get_property_value(dev, "SYSTEMD_ALIAS"); + + /* We allow exactly one alias to be configured a this time and + * it must be a path */ + + if (alias && !is_path(alias)) { + log_warning("SYSTEMD_ALIAS for %s is not a path, ignoring: %s", sysfs, alias); + alias = NULL; + } if ((r = device_find_escape_name(m, sysfs, &u)) < 0) return r; @@ -191,12 +200,16 @@ static int device_process_new_device(Manager *m, struct udev_device *dev, bool u } } + if (r == 0 && alias) + if ((r = device_find_escape_name(m, alias, &u)) < 0) + return r; + /* FIXME: this needs proper merging */ assert((r > 0) == !!u); /* If this is a different unit, then let's not merge things */ - if (u && DEVICE(u)->sysfs && !streq(DEVICE(u)->sysfs, sysfs)) + if (u && DEVICE(u)->sysfs && !path_equal(DEVICE(u)->sysfs, sysfs)) u = NULL; if (!u) { @@ -218,6 +231,10 @@ static int device_process_new_device(Manager *m, struct udev_device *dev, bool u goto fail; } + if (alias) + if ((r = device_add_escaped_name(u, alias, true)) < 0) + goto fail; + if (dn) if ((r = device_add_escaped_name(u, dn, true)) < 0) goto fail; @@ -231,9 +248,12 @@ static int device_process_new_device(Manager *m, struct udev_device *dev, bool u (model = udev_device_get_property_value(dev, "ID_MODEL"))) { if ((r = unit_set_description(u, model)) < 0) goto fail; - } else if (dn) + } else if (dn) { if ((r = unit_set_description(u, dn)) < 0) goto fail; + } else + if ((r = unit_set_description(u, sysfs)) < 0) + goto fail; if (wants) { FOREACH_WORD(w, l, wants, state) {