install: add root directory to LookupPaths structure

We use the root directory parameter while putting together the LookupPaths
structure, hence let's also store it in the structure as-is. That way we can
drop a parameter from half of the functions in install.c

Also, let's move the validation of the root paths into lookup_paths_init() so
that we can drop even more code from install.c
This commit is contained in:
Lennart Poettering 2016-02-25 00:16:51 +01:00
parent 32c0ed7bbb
commit e4bb56c7a9
5 changed files with 73 additions and 143 deletions

View file

@ -134,32 +134,6 @@ static int path_is_runtime(const LookupPaths *p, const char *path) {
return path_equal(parent, p->runtime_config);
}
static int verify_root_dir(UnitFileScope scope, const char **root_dir) {
int r;
assert(root_dir);
/* Verifies that the specified root directory to operate on
* makes sense. Reset it to NULL if it is the root directory
* or set to empty */
if (isempty(*root_dir) || path_equal(*root_dir, "/")) {
*root_dir = NULL;
return 0;
}
if (scope != UNIT_FILE_SYSTEM)
return -EINVAL;
r = is_dir(*root_dir, true);
if (r < 0)
return r;
if (r == 0)
return -ENOTDIR;
return 0;
}
int unit_file_changes_add(
UnitFileChange **changes,
unsigned *n_changes,
@ -594,7 +568,6 @@ static int find_symlinks(
static int find_symlinks_in_scope(
UnitFileScope scope,
const LookupPaths *paths,
const char *root_dir,
const char *name,
UnitFileState *state) {
@ -607,7 +580,7 @@ static int find_symlinks_in_scope(
assert(name);
/* First look in the persistent config path */
r = find_symlinks(root_dir, name, paths->persistent_config, &same_name_link);
r = find_symlinks(paths->root_dir, name, paths->persistent_config, &same_name_link);
if (r < 0)
return r;
if (r > 0) {
@ -616,7 +589,7 @@ static int find_symlinks_in_scope(
}
/* Then look in runtime config path */
r = find_symlinks(root_dir, name, paths->runtime_config, &same_name_link_runtime);
r = find_symlinks(paths->root_dir, name, paths->runtime_config, &same_name_link_runtime);
if (r < 0)
return r;
if (r > 0) {
@ -982,7 +955,6 @@ static int unit_file_search(
InstallContext *c,
UnitFileInstallInfo *info,
const LookupPaths *paths,
const char *root_dir,
SearchFlags flags) {
char **p;
@ -997,7 +969,7 @@ static int unit_file_search(
return 0;
if (info->path)
return unit_file_load_or_readlink(c, info, info->path, root_dir, flags);
return unit_file_load_or_readlink(c, info, info->path, paths->root_dir, flags);
assert(info->name);
@ -1008,7 +980,7 @@ static int unit_file_search(
if (!path)
return -ENOMEM;
r = unit_file_load_or_readlink(c, info, path, root_dir, flags);
r = unit_file_load_or_readlink(c, info, path, paths->root_dir, flags);
if (r < 0) {
if (r != -ENOENT)
return r;
@ -1038,7 +1010,7 @@ static int unit_file_search(
if (!path)
return -ENOMEM;
r = unit_file_load_or_readlink(c, info, path, root_dir, flags);
r = unit_file_load_or_readlink(c, info, path, paths->root_dir, flags);
if (r < 0) {
if (r != -ENOENT)
return r;
@ -1084,7 +1056,6 @@ static int install_info_follow(
static int install_info_traverse(
UnitFileScope scope,
InstallContext *c,
const char *root_dir,
const LookupPaths *paths,
UnitFileInstallInfo *start,
SearchFlags flags,
@ -1098,7 +1069,7 @@ static int install_info_traverse(
assert(start);
assert(c);
r = unit_file_search(c, start, paths, root_dir, flags);
r = unit_file_search(c, start, paths, flags);
if (r < 0)
return r;
@ -1117,7 +1088,7 @@ static int install_info_traverse(
return -ELOOP;
}
r = install_info_follow(c, i, root_dir, flags);
r = install_info_follow(c, i, paths->root_dir, flags);
if (r < 0) {
_cleanup_free_ char *buffer = NULL;
const char *bn;
@ -1151,7 +1122,7 @@ static int install_info_traverse(
if (r < 0)
return r;
r = unit_file_search(c, i, paths, root_dir, flags);
r = unit_file_search(c, i, paths, flags);
if (r < 0)
return r;
}
@ -1168,7 +1139,6 @@ static int install_info_traverse(
static int install_info_discover(
UnitFileScope scope,
InstallContext *c,
const char *root_dir,
const LookupPaths *paths,
const char *name,
SearchFlags flags,
@ -1185,7 +1155,7 @@ static int install_info_discover(
if (r < 0)
return r;
return install_info_traverse(scope, c, root_dir, paths, i, flags, ret);
return install_info_traverse(scope, c, paths, i, flags, ret);
}
static int install_info_symlink_alias(
@ -1281,7 +1251,6 @@ static int install_info_symlink_link(
UnitFileInstallInfo *i,
const LookupPaths *paths,
const char *config_path,
const char *root_dir,
bool force,
UnitFileChange **changes,
unsigned *n_changes) {
@ -1309,7 +1278,6 @@ static int install_info_apply(
UnitFileInstallInfo *i,
const LookupPaths *paths,
const char *config_path,
const char *root_dir,
bool force,
UnitFileChange **changes,
unsigned *n_changes) {
@ -1333,7 +1301,7 @@ static int install_info_apply(
if (r == 0)
r = q;
q = install_info_symlink_link(i, paths, config_path, root_dir, force, changes, n_changes);
q = install_info_symlink_link(i, paths, config_path, force, changes, n_changes);
if (r == 0)
r = q;
@ -1345,7 +1313,6 @@ static int install_context_apply(
InstallContext *c,
const LookupPaths *paths,
const char *config_path,
const char *root_dir,
bool force,
SearchFlags flags,
UnitFileChange **changes,
@ -1373,14 +1340,14 @@ static int install_context_apply(
if (q < 0)
return q;
r = install_info_traverse(scope, c, root_dir, paths, i, flags, NULL);
r = install_info_traverse(scope, c, paths, i, flags, NULL);
if (r < 0)
return r;
if (i->type != UNIT_FILE_TYPE_REGULAR)
continue;
q = install_info_apply(i, paths, config_path, root_dir, force, changes, n_changes);
q = install_info_apply(i, paths, config_path, force, changes, n_changes);
if (r >= 0) {
if (q < 0)
r = q;
@ -1397,8 +1364,7 @@ static int install_context_mark_for_removal(
InstallContext *c,
const LookupPaths *paths,
Set **remove_symlinks_to,
const char *config_path,
const char *root_dir) {
const char *config_path) {
UnitFileInstallInfo *i;
int r;
@ -1422,7 +1388,7 @@ static int install_context_mark_for_removal(
if (r < 0)
return r;
r = install_info_traverse(scope, c, root_dir, paths, i, SEARCH_LOAD|SEARCH_FOLLOW_CONFIG_SYMLINKS, NULL);
r = install_info_traverse(scope, c, paths, i, SEARCH_LOAD|SEARCH_FOLLOW_CONFIG_SYMLINKS, NULL);
if (r < 0)
return r;
@ -1454,10 +1420,6 @@ int unit_file_mask(
assert(scope >= 0);
assert(scope < _UNIT_FILE_SCOPE_MAX);
r = verify_root_dir(scope, &root_dir);
if (r < 0)
return r;
r = lookup_paths_init(&paths, scope, root_dir);
if (r < 0)
return r;
@ -1505,10 +1467,6 @@ int unit_file_unmask(
assert(scope >= 0);
assert(scope < _UNIT_FILE_SCOPE_MAX);
r = verify_root_dir(scope, &root_dir);
if (r < 0)
return r;
r = lookup_paths_init(&paths, scope, root_dir);
if (r < 0)
return r;
@ -1587,10 +1545,6 @@ int unit_file_link(
assert(scope >= 0);
assert(scope < _UNIT_FILE_SCOPE_MAX);
r = verify_root_dir(scope, &root_dir);
if (r < 0)
return r;
r = lookup_paths_init(&paths, scope, root_dir);
if (r < 0)
return r;
@ -1609,7 +1563,7 @@ int unit_file_link(
if (!unit_name_is_valid(fn, UNIT_NAME_ANY))
return -EINVAL;
full = prefix_root(root_dir, *i);
full = prefix_root(paths.root_dir, *i);
if (!full)
return -ENOMEM;
@ -1680,17 +1634,13 @@ int unit_file_add_dependency(
if (!unit_name_is_valid(target, UNIT_NAME_ANY))
return -EINVAL;
r = verify_root_dir(scope, &root_dir);
if (r < 0)
return r;
r = lookup_paths_init(&paths, scope, root_dir);
if (r < 0)
return r;
config_path = runtime ? paths.runtime_config : paths.persistent_config;
r = install_info_discover(scope, &c, root_dir, &paths, target, SEARCH_FOLLOW_CONFIG_SYMLINKS, &target_info);
r = install_info_discover(scope, &c, &paths, target, SEARCH_FOLLOW_CONFIG_SYMLINKS, &target_info);
if (r < 0)
return r;
if (target_info->type == UNIT_FILE_TYPE_MASKED)
@ -1703,7 +1653,7 @@ int unit_file_add_dependency(
STRV_FOREACH(f, files) {
char ***l;
r = install_info_discover(scope, &c, root_dir, &paths, *f, SEARCH_FOLLOW_CONFIG_SYMLINKS, &i);
r = install_info_discover(scope, &c, &paths, *f, SEARCH_FOLLOW_CONFIG_SYMLINKS, &i);
if (r < 0)
return r;
if (i->type == UNIT_FILE_TYPE_MASKED)
@ -1728,7 +1678,7 @@ int unit_file_add_dependency(
return -ENOMEM;
}
return install_context_apply(scope, &c, &paths, config_path, root_dir, force, SEARCH_FOLLOW_CONFIG_SYMLINKS, changes, n_changes);
return install_context_apply(scope, &c, &paths, config_path, force, SEARCH_FOLLOW_CONFIG_SYMLINKS, changes, n_changes);
}
int unit_file_enable(
@ -1750,10 +1700,6 @@ int unit_file_enable(
assert(scope >= 0);
assert(scope < _UNIT_FILE_SCOPE_MAX);
r = verify_root_dir(scope, &root_dir);
if (r < 0)
return r;
r = lookup_paths_init(&paths, scope, root_dir);
if (r < 0)
return r;
@ -1761,7 +1707,7 @@ int unit_file_enable(
config_path = runtime ? paths.runtime_config : paths.persistent_config;
STRV_FOREACH(f, files) {
r = install_info_discover(scope, &c, root_dir, &paths, *f, SEARCH_LOAD, &i);
r = install_info_discover(scope, &c, &paths, *f, SEARCH_LOAD, &i);
if (r < 0)
return r;
if (i->type == UNIT_FILE_TYPE_MASKED)
@ -1777,7 +1723,7 @@ int unit_file_enable(
is useful to determine whether the passed files had any
installation data at all. */
return install_context_apply(scope, &c, &paths, config_path, root_dir, force, SEARCH_LOAD, changes, n_changes);
return install_context_apply(scope, &c, &paths, config_path, force, SEARCH_LOAD, changes, n_changes);
}
int unit_file_disable(
@ -1798,10 +1744,6 @@ int unit_file_disable(
assert(scope >= 0);
assert(scope < _UNIT_FILE_SCOPE_MAX);
r = verify_root_dir(scope, &root_dir);
if (r < 0)
return r;
r = lookup_paths_init(&paths, scope, root_dir);
if (r < 0)
return r;
@ -1817,7 +1759,7 @@ int unit_file_disable(
return r;
}
r = install_context_mark_for_removal(scope, &c, &paths, &remove_symlinks_to, config_path, root_dir);
r = install_context_mark_for_removal(scope, &c, &paths, &remove_symlinks_to, config_path);
if (r < 0)
return r;
@ -1875,15 +1817,11 @@ int unit_file_set_default(
if (streq(name, SPECIAL_DEFAULT_TARGET))
return -EINVAL;
r = verify_root_dir(scope, &root_dir);
if (r < 0)
return r;
r = lookup_paths_init(&paths, scope, root_dir);
if (r < 0)
return r;
r = install_info_discover(scope, &c, root_dir, &paths, name, 0, &i);
r = install_info_discover(scope, &c, &paths, name, 0, &i);
if (r < 0)
return r;
if (i->type == UNIT_FILE_TYPE_MASKED)
@ -1911,15 +1849,11 @@ int unit_file_get_default(
assert(scope < _UNIT_FILE_SCOPE_MAX);
assert(name);
r = verify_root_dir(scope, &root_dir);
if (r < 0)
return r;
r = lookup_paths_init(&paths, scope, root_dir);
if (r < 0)
return r;
r = install_info_discover(scope, &c, root_dir, &paths, SPECIAL_DEFAULT_TARGET, SEARCH_FOLLOW_CONFIG_SYMLINKS, &i);
r = install_info_discover(scope, &c, &paths, SPECIAL_DEFAULT_TARGET, SEARCH_FOLLOW_CONFIG_SYMLINKS, &i);
if (r < 0)
return r;
if (i->type == UNIT_FILE_TYPE_MASKED)
@ -1935,7 +1869,6 @@ int unit_file_get_default(
int unit_file_lookup_state(
UnitFileScope scope,
const char *root_dir,
const LookupPaths *paths,
const char *name,
UnitFileState *ret) {
@ -1951,11 +1884,7 @@ int unit_file_lookup_state(
if (!unit_name_is_valid(name, UNIT_NAME_ANY))
return -EINVAL;
r = verify_root_dir(scope, &root_dir);
if (r < 0)
return r;
r = install_info_discover(scope, &c, root_dir, paths, name, SEARCH_LOAD|SEARCH_FOLLOW_CONFIG_SYMLINKS, &i);
r = install_info_discover(scope, &c, paths, name, SEARCH_LOAD|SEARCH_FOLLOW_CONFIG_SYMLINKS, &i);
if (r < 0)
return r;
@ -1982,7 +1911,7 @@ int unit_file_lookup_state(
break;
}
r = find_symlinks_in_scope(scope, paths, root_dir, i->name, &state);
r = find_symlinks_in_scope(scope, paths, i->name, &state);
if (r < 0)
return r;
if (r == 0) {
@ -2017,15 +1946,11 @@ int unit_file_get_state(
assert(scope < _UNIT_FILE_SCOPE_MAX);
assert(name);
r = verify_root_dir(scope, &root_dir);
if (r < 0)
return r;
r = lookup_paths_init(&paths, scope, root_dir);
if (r < 0)
return r;
return unit_file_lookup_state(scope, root_dir, &paths, name, ret);
return unit_file_lookup_state(scope, &paths, name, ret);
}
int unit_file_query_preset(UnitFileScope scope, const char *root_dir, const char *name) {
@ -2037,10 +1962,6 @@ int unit_file_query_preset(UnitFileScope scope, const char *root_dir, const char
assert(scope < _UNIT_FILE_SCOPE_MAX);
assert(name);
r = verify_root_dir(scope, &root_dir);
if (r < 0)
return r;
if (!unit_name_is_valid(name, UNIT_NAME_ANY))
return -EINVAL;
@ -2123,7 +2044,6 @@ static int execute_preset(
InstallContext *minus,
const LookupPaths *paths,
const char *config_path,
const char *root_dir,
char **files,
UnitFilePresetMode mode,
bool force,
@ -2140,7 +2060,7 @@ static int execute_preset(
if (mode != UNIT_FILE_PRESET_ENABLE_ONLY) {
_cleanup_set_free_free_ Set *remove_symlinks_to = NULL;
r = install_context_mark_for_removal(scope, minus, paths, &remove_symlinks_to, config_path, root_dir);
r = install_context_mark_for_removal(scope, minus, paths, &remove_symlinks_to, config_path);
if (r < 0)
return r;
@ -2152,7 +2072,7 @@ static int execute_preset(
int q;
/* Returns number of symlinks that where supposed to be installed. */
q = install_context_apply(scope, plus, paths, config_path, root_dir, force, SEARCH_LOAD, changes, n_changes);
q = install_context_apply(scope, plus, paths, config_path, force, SEARCH_LOAD, changes, n_changes);
if (r >= 0) {
if (q < 0)
r = q;
@ -2169,7 +2089,6 @@ static int preset_prepare_one(
InstallContext *plus,
InstallContext *minus,
LookupPaths *paths,
const char *root_dir,
UnitFilePresetMode mode,
const char *name) {
@ -2180,12 +2099,12 @@ static int preset_prepare_one(
install_info_find(minus, name))
return 0;
r = unit_file_query_preset(scope, root_dir, name);
r = unit_file_query_preset(scope, paths->root_dir, name);
if (r < 0)
return r;
if (r > 0) {
r = install_info_discover(scope, plus, root_dir, paths, name, SEARCH_LOAD|SEARCH_FOLLOW_CONFIG_SYMLINKS, &i);
r = install_info_discover(scope, plus, paths, name, SEARCH_LOAD|SEARCH_FOLLOW_CONFIG_SYMLINKS, &i);
if (r < 0)
return r;
@ -2194,7 +2113,7 @@ static int preset_prepare_one(
if (path_is_generator(paths, i->path))
return -EADDRNOTAVAIL;
} else
r = install_info_discover(scope, minus, root_dir, paths, name, SEARCH_FOLLOW_CONFIG_SYMLINKS, &i);
r = install_info_discover(scope, minus, paths, name, SEARCH_FOLLOW_CONFIG_SYMLINKS, &i);
return r;
}
@ -2219,10 +2138,6 @@ int unit_file_preset(
assert(scope < _UNIT_FILE_SCOPE_MAX);
assert(mode < _UNIT_FILE_PRESET_MAX);
r = verify_root_dir(scope, &root_dir);
if (r < 0)
return r;
r = lookup_paths_init(&paths, scope, root_dir);
if (r < 0)
return r;
@ -2233,12 +2148,12 @@ int unit_file_preset(
if (!unit_name_is_valid(*i, UNIT_NAME_ANY))
return -EINVAL;
r = preset_prepare_one(scope, &plus, &minus, &paths, root_dir, mode, *i);
r = preset_prepare_one(scope, &plus, &minus, &paths, mode, *i);
if (r < 0)
return r;
}
return execute_preset(scope, &plus, &minus, &paths, config_path, root_dir, files, mode, force, changes, n_changes);
return execute_preset(scope, &plus, &minus, &paths, config_path, files, mode, force, changes, n_changes);
}
int unit_file_preset_all(
@ -2260,10 +2175,6 @@ int unit_file_preset_all(
assert(scope < _UNIT_FILE_SCOPE_MAX);
assert(mode < _UNIT_FILE_PRESET_MAX);
r = verify_root_dir(scope, &root_dir);
if (r < 0)
return r;
r = lookup_paths_init(&paths, scope, root_dir);
if (r < 0)
return r;
@ -2275,7 +2186,7 @@ int unit_file_preset_all(
_cleanup_free_ char *units_dir;
struct dirent *de;
units_dir = path_join(root_dir, *i, NULL);
units_dir = path_join(paths.root_dir, *i, NULL);
if (!units_dir)
return -ENOMEM;
@ -2297,13 +2208,13 @@ int unit_file_preset_all(
if (!IN_SET(de->d_type, DT_LNK, DT_REG))
continue;
r = preset_prepare_one(scope, &plus, &minus, &paths, root_dir, mode, de->d_name);
r = preset_prepare_one(scope, &plus, &minus, &paths, mode, de->d_name);
if (r < 0)
return r;
}
}
return execute_preset(scope, &plus, &minus, &paths, config_path, root_dir, NULL, mode, force, changes, n_changes);
return execute_preset(scope, &plus, &minus, &paths, config_path, NULL, mode, force, changes, n_changes);
}
static void unit_file_list_free_one(UnitFileList *f) {
@ -2338,10 +2249,6 @@ int unit_file_get_list(
assert(scope < _UNIT_FILE_SCOPE_MAX);
assert(h);
r = verify_root_dir(scope, &root_dir);
if (r < 0)
return r;
r = lookup_paths_init(&paths, scope, root_dir);
if (r < 0)
return r;
@ -2351,7 +2258,7 @@ int unit_file_get_list(
_cleanup_free_ char *units_dir;
struct dirent *de;
units_dir = path_join(root_dir, *i, NULL);
units_dir = path_join(paths.root_dir, *i, NULL);
if (!units_dir)
return -ENOMEM;
@ -2385,7 +2292,7 @@ int unit_file_get_list(
if (!f->path)
return -ENOMEM;
r = unit_file_lookup_state(scope, root_dir, &paths, basename(f->path), &f->state);
r = unit_file_lookup_state(scope, &paths, basename(f->path), &f->state);
if (r < 0)
f->state = UNIT_FILE_BAD;

View file

@ -136,7 +136,7 @@ int unit_file_set_default(UnitFileScope scope, const char *root_dir, const char
int unit_file_get_default(UnitFileScope scope, const char *root_dir, char **name);
int unit_file_add_dependency(UnitFileScope scope, bool runtime, const char *root_dir, char **files, const char *target, UnitDependency dep, bool force, UnitFileChange **changes, unsigned *n_changes);
int unit_file_lookup_state(UnitFileScope scope, const char *root_dir, const LookupPaths *paths, const char *name, UnitFileState *ret);
int unit_file_lookup_state(UnitFileScope scope, const LookupPaths *paths, const char *name, UnitFileState *ret);
int unit_file_get_state(UnitFileScope scope, const char *root_dir, const char *filename, UnitFileState *ret);
int unit_file_get_list(UnitFileScope scope, const char *root_dir, Hashmap *h);

View file

@ -28,6 +28,7 @@
#include "macro.h"
#include "path-lookup.h"
#include "path-util.h"
#include "stat-util.h"
#include "string-util.h"
#include "strv.h"
#include "util.h"
@ -359,9 +360,6 @@ static int patch_root_prefix(char **p, const char *root_dir) {
if (!*p)
return 0;
if (isempty(root_dir) || path_equal(root_dir, "/"))
return 0;
c = prefix_root(root_dir, *p);
if (!c)
return -ENOMEM;
@ -377,7 +375,9 @@ int lookup_paths_init(
UnitFileScope scope,
const char *root_dir) {
_cleanup_free_ char *generator = NULL, *generator_early = NULL, *generator_late = NULL,
_cleanup_free_ char
*root = NULL,
*generator = NULL, *generator_early = NULL, *generator_late = NULL,
*persistent_config = NULL, *runtime_config = NULL;
bool append = false; /* Add items from SYSTEMD_UNIT_PATH before normal directories */
char **l = NULL;
@ -388,6 +388,21 @@ int lookup_paths_init(
assert(scope >= 0);
assert(scope < _UNIT_FILE_SCOPE_MAX);
if (!isempty(root_dir) && !path_equal(root_dir, "/")) {
if (scope == UNIT_FILE_USER)
return -EINVAL;
r = is_dir(root_dir, true);
if (r < 0)
return r;
if (r == 0)
return -ENOTDIR;
root = strdup(root_dir);
if (!root)
return -ENOMEM;
}
r = acquire_config_dirs(scope, &persistent_config, &runtime_config);
if (r < 0)
return r;
@ -492,24 +507,24 @@ int lookup_paths_init(
}
}
r = patch_root_prefix(&persistent_config, root_dir);
r = patch_root_prefix(&persistent_config, root);
if (r < 0)
return r;
r = patch_root_prefix(&runtime_config, root_dir);
r = patch_root_prefix(&runtime_config, root);
if (r < 0)
return r;
r = patch_root_prefix(&generator, root_dir);
r = patch_root_prefix(&generator, root);
if (r < 0)
return r;
r = patch_root_prefix(&generator_early, root_dir);
r = patch_root_prefix(&generator_early, root);
if (r < 0)
return r;
r = patch_root_prefix(&generator_late, root_dir);
r = patch_root_prefix(&generator_late, root);
if (r < 0)
return r;
if (!path_strv_resolve_uniq(l, root_dir))
if (!path_strv_resolve_uniq(l, root))
return -ENOMEM;
if (strv_isempty(l)) {
@ -537,6 +552,9 @@ int lookup_paths_init(
p->generator_late = generator_late;
generator = generator_early = generator_late = NULL;
p->root_dir = root;
root = NULL;
return 0;
}
@ -552,4 +570,6 @@ void lookup_paths_free(LookupPaths *p) {
p->generator = mfree(p->generator);
p->generator_early = mfree(p->generator_early);
p->generator_late = mfree(p->generator_late);
p->root_dir = mfree(p->root_dir);
}

View file

@ -37,6 +37,9 @@ struct LookupPaths {
char *generator;
char *generator_early;
char *generator_late;
/* The root directory prepended to all items above, or NULL */
char *root_dir;
};
int user_config_home(char **config_home);

View file

@ -806,7 +806,7 @@ static int enumerate_sysv(const LookupPaths *lp, Hashmap *all_services) {
if (hashmap_contains(all_services, name))
continue;
r = unit_file_lookup_state(UNIT_FILE_SYSTEM, NULL, lp, name, NULL);
r = unit_file_lookup_state(UNIT_FILE_SYSTEM, lp, name, NULL);
if (r < 0 && r != -ENOENT) {
log_debug_errno(r, "Failed to detect whether %s exists, skipping: %m", name);
continue;