diff --git a/src/basic/path-lookup.c b/src/basic/path-lookup.c index 1969aa9882..6fb8c40e7a 100644 --- a/src/basic/path-lookup.c +++ b/src/basic/path-lookup.c @@ -8,6 +8,7 @@ #include "fs-util.h" #include "log.h" #include "macro.h" +#include "nulstr-util.h" #include "path-lookup.h" #include "path-util.h" #include "stat-util.h" @@ -864,3 +865,30 @@ char **env_generator_binary_paths(bool is_system) { return TAKE_PTR(paths); } + +int find_portable_profile(const char *name, const char *unit, char **ret_path) { + const char *p, *dot; + + assert(name); + assert(ret_path); + + assert_se(dot = strrchr(unit, '.')); + + NULSTR_FOREACH(p, PORTABLE_PROFILE_DIRS) { + _cleanup_free_ char *joined = NULL; + + joined = strjoin(p, "/", name, "/", dot + 1, ".conf"); + if (!joined) + return -ENOMEM; + + if (laccess(joined, F_OK) >= 0) { + *ret_path = TAKE_PTR(joined); + return 0; + } + + if (errno != ENOENT) + return -errno; + } + + return -ENOENT; +} diff --git a/src/basic/path-lookup.h b/src/basic/path-lookup.h index 088bb9b57c..af85dc7b4f 100644 --- a/src/basic/path-lookup.h +++ b/src/basic/path-lookup.h @@ -72,3 +72,6 @@ char **env_generator_binary_paths(bool is_system); #define NETWORK_DIRS ((const char* const*) CONF_PATHS_STRV("systemd/network")) #define NETWORK_DIRS_NULSTR CONF_PATHS_NULSTR("systemd/network") + +#define PORTABLE_PROFILE_DIRS CONF_PATHS_NULSTR("systemd/portable/profile") +int find_portable_profile(const char *name, const char *unit, char **ret_path); diff --git a/src/portable/portable.c b/src/portable/portable.c index 2d1006eabd..8b088f3e32 100644 --- a/src/portable/portable.c +++ b/src/portable/portable.c @@ -40,8 +40,6 @@ #include "tmpfile-util.h" #include "user-util.h" -static const char profile_dirs[] = CONF_PATHS_NULSTR("systemd/portable/profile"); - /* Markers used in the first line of our 20-portable.conf unit file drop-in to determine, that a) the unit file was * dropped there by the portable service logic and b) for which image it was dropped there. */ #define PORTABLE_DROPIN_MARKER_BEGIN "# Drop-in created for image '" @@ -981,33 +979,6 @@ static int install_chroot_dropin( return 0; } -static int find_profile(const char *name, const char *unit, char **ret) { - const char *p, *dot; - - assert(name); - assert(ret); - - assert_se(dot = strrchr(unit, '.')); - - NULSTR_FOREACH(p, profile_dirs) { - _cleanup_free_ char *joined = NULL; - - joined = strjoin(p, "/", name, "/", dot + 1, ".conf"); - if (!joined) - return -ENOMEM; - - if (laccess(joined, F_OK) >= 0) { - *ret = TAKE_PTR(joined); - return 0; - } - - if (errno != ENOENT) - return -errno; - } - - return -ENOENT; -} - static int install_profile_dropin( const char *image_path, const PortableMetadata *m, @@ -1028,7 +999,7 @@ static int install_profile_dropin( if (!profile) return 0; - r = find_profile(profile, m->name, &from); + r = find_portable_profile(profile, m->name, &from); if (r < 0) { if (r != -ENOENT) return log_debug_errno(errno, "Profile '%s' is not accessible: %m", profile); @@ -1790,7 +1761,7 @@ int portable_get_state( int portable_get_profiles(char ***ret) { assert(ret); - return conf_files_list_nulstr(ret, NULL, NULL, CONF_FILES_DIRECTORY|CONF_FILES_BASENAME|CONF_FILES_FILTER_MASKED, profile_dirs); + return conf_files_list_nulstr(ret, NULL, NULL, CONF_FILES_DIRECTORY|CONF_FILES_BASENAME|CONF_FILES_FILTER_MASKED, PORTABLE_PROFILE_DIRS); } static const char* const portable_change_type_table[_PORTABLE_CHANGE_TYPE_MAX] = {