path-lookup: add runtime_directory for resolving $RUNTIME_DIRECTORY

This commit is contained in:
Sam Leonard 2024-01-23 13:39:32 +00:00
parent 7bf52f5d1c
commit fd1cd4a843
No known key found for this signature in database
GPG key ID: 96850F0978CE78F0
2 changed files with 39 additions and 0 deletions

View file

@ -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",

View file

@ -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);