d->state = state;
if (state != old_state)
- log_debug("%s changed %s → %s",
+ log_debug("%s changed %s -> %s",
UNIT(d)->meta.id,
device_state_to_string(old_state),
device_state_to_string(state));
}
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;
/* 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;
}
}
+ 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) {
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;
(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) {
.no_requires = true,
.no_instances = true,
.no_snapshots = true,
+ .no_isolate = true,
.load = unit_load_fragment_and_dropin_optional,
.done = device_done,