From: Sam Leonard Date: Tue, 23 Jan 2024 13:39:32 +0000 (+0000) Subject: path-lookup: add runtime_directory for resolving $RUNTIME_DIRECTORY X-Git-Tag: v256-rc1~913^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fd1cd4a8436c77e1f55ffc18e0ec9ef6ed235bf5;p=thirdparty%2Fsystemd.git path-lookup: add runtime_directory for resolving $RUNTIME_DIRECTORY --- diff --git a/src/basic/path-lookup.c b/src/basic/path-lookup.c index 068054512bc..1b31a4e23a5 100644 --- a/src/basic/path-lookup.c +++ b/src/basic/path-lookup.c @@ -91,6 +91,44 @@ int xdg_user_data_dir(char **ret, const char *suffix) { return 1; } +int runtime_directory(char **ret, RuntimeScope scope, const char *suffix) { + _cleanup_free_ char *d = NULL; + int r; + + assert(ret); + assert(suffix); + assert(IN_SET(scope, RUNTIME_SCOPE_SYSTEM, RUNTIME_SCOPE_USER, RUNTIME_SCOPE_GLOBAL)); + + /* Accept $RUNTIME_DIRECTORY as authoritative + * If its missing apply the suffix to /run or $XDG_RUNTIME_DIR + * if we are in a user runtime scope. + * + * Return value indicates whether the suffix was applied or not */ + + const char *e = secure_getenv("RUNTIME_DIRECTORY"); + if (e) { + d = strdup(e); + if (!d) + return -ENOMEM; + + *ret = TAKE_PTR(d); + return false; + } + + if (scope == RUNTIME_SCOPE_USER) { + r = xdg_user_runtime_dir(&d, suffix); + if (r < 0) + return r; + } else { + d = path_join("/run", suffix); + if (!d) + return -ENOMEM; + } + + *ret = TAKE_PTR(d); + return true; +} + static const char* const user_data_unit_paths[] = { "/usr/local/lib/systemd/user", "/usr/local/share/systemd/user", diff --git a/src/basic/path-lookup.h b/src/basic/path-lookup.h index 1601787064e..11db264c01a 100644 --- a/src/basic/path-lookup.h +++ b/src/basic/path-lookup.h @@ -59,6 +59,7 @@ int xdg_user_dirs(char ***ret_config_dirs, char ***ret_data_dirs); int xdg_user_runtime_dir(char **ret, const char *suffix); int xdg_user_config_dir(char **ret, const char *suffix); int xdg_user_data_dir(char **ret, const char *suffix); +int runtime_directory(char **ret, RuntimeScope scope, const char *suffix); bool path_is_user_data_dir(const char *path); bool path_is_user_config_dir(const char *path);