X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=unit.c;h=60d4bb7b2f5b48c34f5766cd5b065328e19259e7;hb=31cee6f634ce07aa2c3514a506f93830f91f14a5;hp=b69b6e36201a6cb218bff5c3d51e95c68293cf28;hpb=40d50879d9339e539a30e5d32234baffb732f0f9;p=elogind.git diff --git a/unit.c b/unit.c index b69b6e362..60d4bb7b2 100644 --- a/unit.c +++ b/unit.c @@ -47,7 +47,8 @@ const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX] = { [UNIT_DEVICE] = &device_vtable, [UNIT_MOUNT] = &mount_vtable, [UNIT_AUTOMOUNT] = &automount_vtable, - [UNIT_SNAPSHOT] = &snapshot_vtable + [UNIT_SNAPSHOT] = &snapshot_vtable, + [UNIT_SWAP] = &swap_vtable }; Unit *unit_new(Manager *m) { @@ -1830,6 +1831,42 @@ int unit_deserialize(Unit *u, FILE *f, FDSet *fds) { } } +int unit_add_node_link(Unit *u, const char *what, bool wants) { + Unit *device; + char *e; + int r; + + assert(u); + + if (!what) + return 0; + + /* Adds in links to the device node that this unit is based on */ + + if (!path_startswith(what, "/dev/") && !path_startswith(what, "/sys/")) + return 0; + + if (!(e = unit_name_build_escape(what+1, NULL, ".device"))) + return -ENOMEM; + + r = manager_load_unit(u->meta.manager, e, NULL, &device); + free(e); + + if (r < 0) + return r; + + if ((r = unit_add_dependency(u, UNIT_AFTER, device, true)) < 0) + return r; + + if ((r = unit_add_dependency(u, UNIT_REQUIRES, device, true)) < 0) + return r; + + if (wants) + if ((r = unit_add_dependency(device, UNIT_WANTS, u, false)) < 0) + return r; + + return 0; +} static const char* const unit_type_table[_UNIT_TYPE_MAX] = { [UNIT_SERVICE] = "service", @@ -1839,7 +1876,8 @@ static const char* const unit_type_table[_UNIT_TYPE_MAX] = { [UNIT_DEVICE] = "device", [UNIT_MOUNT] = "mount", [UNIT_AUTOMOUNT] = "automount", - [UNIT_SNAPSHOT] = "snapshot" + [UNIT_SNAPSHOT] = "snapshot", + [UNIT_SWAP] = "swap" }; DEFINE_STRING_TABLE_LOOKUP(unit_type, UnitType);