From: Lennart Poettering Date: Thu, 4 Jan 2024 17:38:50 +0000 (+0100) Subject: install: optionally return discovered unit file path in unit_file_exists() X-Git-Tag: v256-rc1~1185^2~7 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e09c255d2e7bc5ec3af8271b2bcc08ed6877fbdf;p=thirdparty%2Fsystemd.git install: optionally return discovered unit file path in unit_file_exists() --- diff --git a/src/shared/install.c b/src/shared/install.c index ad30e9b49c1..fabf5db7ed2 100644 --- a/src/shared/install.c +++ b/src/shared/install.c @@ -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; } diff --git a/src/shared/install.h b/src/shared/install.h index bc0c6db828d..3e2ada45f49 100644 --- a/src/shared/install.h +++ b/src/shared/install.h @@ -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);