+int unit_file_add_dependency(
+ UnitFileScope scope,
+ bool runtime,
+ const char *root_dir,
+ char **files,
+ char *target,
+ UnitDependency dep,
+ bool force,
+ UnitFileChange **changes,
+ unsigned *n_changes) {
+
+ _cleanup_lookup_paths_free_ LookupPaths paths = {};
+ _cleanup_(install_context_done) InstallContext c = {};
+ _cleanup_free_ char *config_path = NULL;
+ char **i;
+ int r;
+ InstallInfo *info;
+
+ assert(scope >= 0);
+ assert(scope < _UNIT_FILE_SCOPE_MAX);
+
+ r = lookup_paths_init_from_scope(&paths, scope, root_dir);
+ if (r < 0)
+ return r;
+
+ r = get_config_path(scope, runtime, root_dir, &config_path);
+ if (r < 0)
+ return r;
+
+ STRV_FOREACH(i, files) {
+ UnitFileState state;
+
+ state = unit_file_get_state(scope, root_dir, *i);
+ if (state < 0) {
+ log_error("Failed to get unit file state for %s: %s", *i, strerror(-state));
+ return state;
+ }
+
+ if (state == UNIT_FILE_MASKED || state == UNIT_FILE_MASKED_RUNTIME) {
+ log_error("Failed to enable unit: Unit %s is masked", *i);
+ return -ENOTSUP;
+ }
+
+ r = install_info_add_auto(&c, *i);
+ if (r < 0)
+ return r;
+ }
+
+ if (!ordered_hashmap_isempty(c.will_install)) {
+ r = ordered_hashmap_ensure_allocated(&c.have_installed, &string_hash_ops);
+ if (r < 0)
+ return r;
+
+ r = ordered_hashmap_reserve(c.have_installed, ordered_hashmap_size(c.will_install));
+ if (r < 0)
+ return r;
+ }
+
+ while ((info = ordered_hashmap_first(c.will_install))) {
+ assert_se(ordered_hashmap_move_one(c.have_installed, c.will_install, info->name) == 0);
+
+ r = unit_file_search(&c, info, &paths, root_dir, false, false, NULL);
+ if (r < 0)
+ return r;
+
+ if (dep == UNIT_WANTS)
+ r = strv_extend(&info->wanted_by, target);
+ else if (dep == UNIT_REQUIRES)
+ r = strv_extend(&info->required_by, target);
+ else
+ r = -EINVAL;
+
+ if (r < 0)
+ return r;
+
+ r = install_info_apply(info, &paths, config_path, root_dir, force, changes, n_changes);
+ if (r < 0)
+ return r;
+ }
+
+ return 0;
+}
+