X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=device.c;h=25661e05f80840a579f54e1fa41f71a8050292b9;hb=e53ae031a0f98f2af37cf3639b29cfd94dc408de;hp=c5901c95ff67697973ed4d22bc7bb65ddb1f5a9b;hpb=2e478a46c3754ede1a7af57b961056a2a375a799;p=elogind.git diff --git a/device.c b/device.c index c5901c95f..25661e05f 100644 --- a/device.c +++ b/device.c @@ -112,7 +112,7 @@ static int device_add_escaped_name(Unit *u, const char *dn, bool make_id) { } static int device_process_new_device(Manager *m, struct udev_device *dev, bool update_state) { - const char *dn, *names, *wants, *sysfs; + const char *dn, *names, *wants, *sysfs, *expose; Unit *u = NULL; int r; char *e, *w, *state; @@ -122,20 +122,32 @@ static int device_process_new_device(Manager *m, struct udev_device *dev, bool u assert(m); + if (!(sysfs = udev_device_get_syspath(dev))) + return -ENOMEM; + /* Check whether this entry is even relevant for us. */ dn = udev_device_get_devnode(dev); + expose = udev_device_get_property_value(dev, "SYSTEMD_EXPOSE"); names = udev_device_get_property_value(dev, "SYSTEMD_NAMES"); wants = udev_device_get_property_value(dev, "SYSTEMD_WANTS"); - if (!dn && !names && !wants) - return 0; + if (expose) { + int b; + + if ((b = parse_boolean(expose)) < 0) { + log_error("Failed to parse SYSTEMD_EXPOSE udev property for device %s: %s", sysfs, expose); + return 0; + } + + if (!b) + return 0; + } else + if (!dn && !names && !wants) + return 0; /* Ok, seems kinda interesting. Now, let's see if this one * already exists. */ - if (!(sysfs = udev_device_get_syspath(dev))) - return -ENOMEM; - assert(sysfs[0] == '/'); if (!(e = unit_name_escape_path(sysfs+1, ".device"))) return -ENOMEM; @@ -162,9 +174,12 @@ static int device_process_new_device(Manager *m, struct udev_device *dev, bool u } if ((model = udev_device_get_property_value(dev, "ID_MODEL_FROM_DATABASE")) || - (model = udev_device_get_property_value(dev, "ID_MODEL"))) + (model = udev_device_get_property_value(dev, "ID_MODEL"))) { if ((r = unit_set_description(u, model)) < 0) goto fail; + } else if (dn) + if ((r = unit_set_description(u, dn)) < 0) + goto fail; unit_add_to_load_queue(u); } else { @@ -183,8 +198,10 @@ static int device_process_new_device(Manager *m, struct udev_device *dev, bool u if (names) { FOREACH_WORD(w, l, names, state) { - if (!(e = strndup(w, l))) + if (!(e = strndup(w, l))) { + r = -ENOMEM; goto fail; + } r = unit_add_name(u, e); free(e); @@ -196,8 +213,10 @@ static int device_process_new_device(Manager *m, struct udev_device *dev, bool u if (wants) { FOREACH_WORD(w, l, wants, state) { - if (!(e = strndup(w, l))) + if (!(e = strndup(w, l))) { + r = -ENOMEM; goto fail; + } r = unit_add_dependency_by_name(u, UNIT_WANTS, e); free(e); @@ -343,8 +362,6 @@ void device_fd_event(Manager *m, int events) { assert(m); assert(events == EPOLLIN); - log_debug("got udev event"); - if (!(dev = udev_monitor_receive_device(m->udev_monitor))) { log_error("Failed to receive device."); return; @@ -374,7 +391,7 @@ fail: const UnitVTable device_vtable = { .suffix = ".device", - .init = unit_load_fragment_and_dropin, + .init = unit_load_fragment_and_dropin_optional, .done = device_done, .coldplug = device_coldplug,