chiark / gitweb /
systemadm: ignore entry activation on empty string
[elogind.git] / device.c
index 4812a8687886cef49b26e1de5e5bc3dcd64b8937..e67d0a6c2d71e1d2ec83db8e3fcdc854dd2e41e4 100644 (file)
--- a/device.c
+++ b/device.c
@@ -52,7 +52,7 @@ static void device_set_state(Device *d, DeviceState state) {
         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));
@@ -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) {
@@ -244,7 +264,7 @@ static int device_process_new_device(Manager *m, struct udev_device *dev, bool u
                                 goto fail;
                         }
 
-                        r = unit_add_dependency_by_name(u, UNIT_WANTS, NULL, e);
+                        r = unit_add_dependency_by_name(u, UNIT_WANTS, NULL, e, true);
                         free(e);
 
                         if (r < 0)
@@ -433,6 +453,7 @@ const UnitVTable device_vtable = {
         .no_requires = true,
         .no_instances = true,
         .no_snapshots = true,
+        .no_isolate = true,
 
         .load = unit_load_fragment_and_dropin_optional,
         .done = device_done,