+ return set_first(n->meta.names);
+}
+
+const char *name_description(Name *n) {
+ assert(n);
+
+ if (n->meta.description)
+ return n->meta.description;
+
+ return name_id(n);
+}
+
+void name_dump(Name *n, FILE *f, const char *prefix) {
+
+ static const char* const load_state_table[_NAME_LOAD_STATE_MAX] = {
+ [NAME_STUB] = "stub",
+ [NAME_LOADED] = "loaded",
+ [NAME_FAILED] = "failed"
+ };
+
+ static const char* const active_state_table[_NAME_ACTIVE_STATE_MAX] = {
+ [NAME_ACTIVE] = "active",
+ [NAME_INACTIVE] = "inactive",
+ [NAME_ACTIVATING] = "activating",
+ [NAME_DEACTIVATING] = "deactivating"
+ };
+
+ static const char* const dependency_table[_NAME_DEPENDENCY_MAX] = {
+ [NAME_REQUIRES] = "Requires",
+ [NAME_SOFT_REQUIRES] = "SoftRequires",
+ [NAME_WANTS] = "Wants",
+ [NAME_REQUISITE] = "Requisite",
+ [NAME_SOFT_REQUISITE] = "SoftRequisite",
+ [NAME_REQUIRED_BY] = "RequiredBy",
+ [NAME_SOFT_REQUIRED_BY] = "SoftRequiredBy",
+ [NAME_WANTED_BY] = "WantedBy",
+ [NAME_CONFLICTS] = "Conflicts",
+ [NAME_BEFORE] = "Before",
+ [NAME_AFTER] = "After",
+ };
+
+ char *t;
+ NameDependency d;
+ Iterator i;
+ char *prefix2;
+
+ assert(n);
+
+ if (!prefix)
+ prefix = "";
+ prefix2 = strappend(prefix, "\t");
+ if (!prefix2)
+ prefix2 = "";
+
+ fprintf(f,
+ "%s→ Name %s:\n"
+ "%s\tDescription: %s\n"
+ "%s\tName Load State: %s\n"
+ "%s\tName Active State: %s\n",
+ prefix, name_id(n),
+ prefix, name_description(n),
+ prefix, load_state_table[n->meta.load_state],
+ prefix, active_state_table[name_active_state(n)]);
+
+ SET_FOREACH(t, n->meta.names, i)
+ fprintf(f, "%s\tName: %s\n", prefix, t);
+
+ for (d = 0; d < _NAME_DEPENDENCY_MAX; d++) {
+ Name *other;
+
+ if (set_isempty(n->meta.dependencies[d]))
+ continue;
+
+ SET_FOREACH(other, n->meta.dependencies[d], i)
+ fprintf(f, "%s\t%s: %s\n", prefix, dependency_table[d], name_id(other));
+ }
+
+ if (NAME_VTABLE(n)->dump)
+ NAME_VTABLE(n)->dump(n, f, prefix2);
+
+ if (n->meta.job)
+ job_dump(n->meta.job, f, prefix2);
+
+ free(prefix2);
+}
+
+static int verify_type(Name *name) {
+ char *n;
+ Iterator i;
+
+ assert(name);
+
+ /* Checks that all aliases of this name have the same and valid type */
+
+ SET_FOREACH(n, name->meta.names, i) {
+ NameType t;
+
+ if ((t = name_type_from_string(n)) == _NAME_TYPE_INVALID)
+ return -EINVAL;
+
+ if (name->meta.type == _NAME_TYPE_INVALID) {
+ name->meta.type = t;
+ continue;