/* Remove this unit from the chain of devices which share the
* same sysfs path. */
first = hashmap_get(UNIT(d)->manager->devices_by_sysfs, d->sysfs);
- LIST_REMOVE(Device, same_sysfs, first, d);
+ LIST_REMOVE(same_sysfs, first, d);
if (first)
hashmap_remove_and_replace(UNIT(d)->manager->devices_by_sysfs, d->sysfs, first->sysfs, first);
d->state = state;
if (state != old_state)
- log_debug("%s changed %s -> %s",
- UNIT(d)->id,
- device_state_to_string(old_state),
- device_state_to_string(state));
+ log_debug_unit(UNIT(d)->id,
+ "%s changed %s -> %s", UNIT(d)->id,
+ device_state_to_string(old_state),
+ device_state_to_string(state));
unit_notify(UNIT(d), state_translation_table[old_state], state_translation_table[state], true);
}
prefix, strna(d->sysfs));
}
-static UnitActiveState device_active_state(Unit *u) {
+_pure_ static UnitActiveState device_active_state(Unit *u) {
assert(u);
return state_translation_table[DEVICE(u)->state];
}
-static const char *device_sub_state_to_string(Unit *u) {
+_pure_ static const char *device_sub_state_to_string(Unit *u) {
assert(u);
return device_state_to_string(DEVICE(u)->state);
assert(m);
- if (!(sysfs = udev_device_get_syspath(dev)))
+ sysfs = udev_device_get_syspath(dev);
+ if (!sysfs)
return -ENOMEM;
- if ((r = device_find_escape_name(m, path, &u)) < 0)
+ r = device_find_escape_name(m, path, &u);
+ if (r < 0)
return r;
if (u && DEVICE(u)->sysfs && !path_equal(DEVICE(u)->sysfs, sysfs))
}
first = hashmap_get(m->devices_by_sysfs, sysfs);
- LIST_PREPEND(Device, same_sysfs, first, DEVICE(u));
+ LIST_PREPEND(same_sysfs, first, DEVICE(u));
- if ((r = hashmap_replace(m->devices_by_sysfs, DEVICE(u)->sysfs, first)) < 0)
+ r = hashmap_replace(m->devices_by_sysfs, DEVICE(u)->sysfs, first);
+ if (r < 0)
goto fail;
}
if ((model = udev_device_get_property_value(dev, "ID_MODEL_FROM_DATABASE")) ||
(model = udev_device_get_property_value(dev, "ID_MODEL"))) {
- if ((r = unit_set_description(u, model)) < 0)
+ r = unit_set_description(u, model);
+ if (r < 0)
goto fail;
- } else
- if ((r = unit_set_description(u, path)) < 0)
+ } else {
+ r = unit_set_description(u, path);
+ if (r < 0)
goto fail;
+ }
if (main) {
/* The additional systemd udev properties we only
* interpret for the main object */
const char *wants, *alias;
- if ((alias = udev_device_get_property_value(dev, "SYSTEMD_ALIAS"))) {
- if (!is_path(alias))
- log_warning("SYSTEMD_ALIAS for %s is not a path, ignoring: %s", sysfs, alias);
- else {
- if ((r = device_add_escaped_name(u, alias)) < 0)
+ alias = udev_device_get_property_value(dev, "SYSTEMD_ALIAS");
+ if (alias) {
+ char *state, *w;
+ size_t l;
+
+ FOREACH_WORD_QUOTED(w, l, alias, state) {
+ _cleanup_free_ char *e;
+
+ e = strndup(w, l);
+ if (!e) {
+ r = -ENOMEM;
goto fail;
+ }
+
+ if (is_path(e))
+ device_update_unit(m, dev, e, false);
+ else
+ log_warning("SYSTEMD_ALIAS for %s is not a path, ignoring: %s", sysfs, e);
}
}
- if ((wants = udev_device_get_property_value(dev, "SYSTEMD_WANTS"))) {
+ wants = udev_device_get_property_value(dev, "SYSTEMD_WANTS");
+ if (wants) {
char *state, *w;
size_t l;
FOREACH_WORD_QUOTED(w, l, wants, state) {
- char *e;
+ _cleanup_free_ char *e, *n = NULL;
- if (!(e = strndup(w, l))) {
+ e = strndup(w, l);
+ if (!e) {
r = -ENOMEM;
goto fail;
}
- r = unit_add_dependency_by_name(u, UNIT_WANTS, e, NULL, true);
- free(e);
+ n = unit_name_mangle(e);
+ if (!n) {
+ r = -ENOMEM;
+ goto fail;
+ }
+ r = unit_add_dependency_by_name(u, UNIT_WANTS, n, NULL, true);
if (r < 0)
goto fail;
}
static int device_process_new_device(Manager *m, struct udev_device *dev, bool update_state) {
const char *sysfs, *dn;
struct udev_list_entry *item = NULL, *first = NULL;
+ int r;
assert(m);
return -ENOMEM;
/* Add the main unit named after the sysfs path */
- device_update_unit(m, dev, sysfs, true);
+ r = device_update_unit(m, dev, sysfs, true);
+ if (r < 0)
+ return r;
/* Add an additional unit for the device node */
if ((dn = udev_device_get_devnode(dev)))
}
static int device_enumerate(Manager *m) {
- struct epoll_event ev;
int r;
struct udev_enumerate *e = NULL;
struct udev_list_entry *item = NULL, *first = NULL;
assert(m);
if (!m->udev) {
+ struct epoll_event ev;
+
if (!(m->udev = udev_new()))
return -ENOMEM;