install: optionally return discovered unit file path in unit_file_exists()

This commit is contained in:
Lennart Poettering
2024-01-04 18:38:50 +01:00
parent 3392079e4b
commit e09c255d2e
2 changed files with 32 additions and 5 deletions

View File

@@ -3142,8 +3142,10 @@ int unit_file_get_state(
return unit_file_lookup_state(scope, &lp, name, ret);
}
int unit_file_exists(RuntimeScope scope, const LookupPaths *lp, const char *name) {
_cleanup_(install_context_done) InstallContext c = { .scope = scope };
int unit_file_exists_full(RuntimeScope scope, const LookupPaths *lp, const char *name, char **ret_path) {
_cleanup_(install_context_done) InstallContext c = {
.scope = scope,
};
int r;
assert(lp);
@@ -3152,12 +3154,33 @@ int unit_file_exists(RuntimeScope scope, const LookupPaths *lp, const char *name
if (!unit_name_is_valid(name, UNIT_NAME_ANY))
return -EINVAL;
r = install_info_discover(&c, lp, name, 0, NULL, NULL, NULL);
if (r == -ENOENT)
InstallInfo *info = NULL;
r = install_info_discover(
&c,
lp,
name,
/* flags= */ 0,
ret_path ? &info : NULL,
/* changes= */ NULL,
/* n_changes= */ NULL);
if (r == -ENOENT) {
if (ret_path)
*ret_path = NULL;
return 0;
}
if (r < 0)
return r;
if (ret_path) {
assert(info);
_cleanup_free_ char *p = strdup(info->path);
if (!p)
return -ENOMEM;
*ret_path = TAKE_PTR(p);
}
return 1;
}

View File

@@ -193,7 +193,11 @@ int unit_file_lookup_state(
UnitFileState *ret);
int unit_file_get_state(RuntimeScope scope, const char *root_dir, const char *filename, UnitFileState *ret);
int unit_file_exists(RuntimeScope scope, const LookupPaths *paths, const char *name);
int unit_file_exists_full(RuntimeScope scope, const LookupPaths *paths, const char *name, char **ret_path);
static inline int unit_file_exists(RuntimeScope scope, const LookupPaths *paths, const char *name) {
return unit_file_exists_full(scope, paths, name, NULL);
}
int unit_file_get_list(RuntimeScope scope, const char *root_dir, Hashmap *h, char **states, char **patterns);