+
+static int ensure_merge(Set **s, Set *other) {
+
+ if (!other)
+ return 0;
+
+ if (*s)
+ return set_merge(*s, other);
+
+ if (!(*s = set_copy(other)))
+ return -ENOMEM;
+
+ return 0;
+}
+
+int name_merge(Name *name, Name *other) {
+ int r;
+ NameDependency d;
+
+ assert(name);
+ assert(other);
+
+ assert(name->meta.manager == other->meta.manager);
+
+ if (name->meta.type != other->meta.type)
+ return -EINVAL;
+
+ if (other->meta.state != NAME_STUB)
+ return -EINVAL;
+
+ /* Merge names */
+ if ((r = ensure_merge(&name->meta.names, other->meta.names)) < 0)
+ return r;
+
+ /* Merge dependencies */
+ for (d = 0; d < _NAME_DEPENDENCY_MAX; d++)
+ if ((r = ensure_merge(&name->meta.dependencies[d], other->meta.dependencies[d])) < 0)
+ return r;
+
+ return 0;
+}
+
+const char* name_id(Name *n) {
+ assert(n);
+
+ return set_first(n->meta.names);
+}
+
+void name_dump(Name *n, FILE *f) {
+
+ static const char* const state_table[_NAME_STATE_MAX] = {
+ [NAME_STUB] = "STUB",
+ [NAME_LOADED] = "LOADED",
+ [NAME_FAILED] = "FAILED"
+ };
+
+ assert(n);
+
+ fprintf(stderr,
+ "Name %s (%s), state %s\n",
+ name_id(n),
+ n->meta.description ? n->meta.description : name_id(n),
+ state_table[n->meta.state]);
+
+ if (n->meta.job) {
+ fprintf(f, "\tâ–¶ ");
+ job_dump(n->meta.job, f);
+ }
+}