#include "tmpfile-util.h"
#include "user-util.h"
+int user_search_dirs(const char *suffix, char ***ret_config_dirs, char ***ret_data_dirs) {
+ _cleanup_strv_free_ char **config_dirs = NULL, **data_dirs = NULL;
+ int r;
+
+ assert(ret_config_dirs);
+ assert(ret_data_dirs);
+
+ r = sd_path_lookup_strv(SD_PATH_SEARCH_CONFIGURATION, suffix, &config_dirs);
+ if (r < 0)
+ return r;
+
+ r = sd_path_lookup_strv(SD_PATH_SEARCH_SHARED, suffix, &data_dirs);
+ if (r < 0)
+ return r;
+
+ *ret_config_dirs = TAKE_PTR(config_dirs);
+ *ret_data_dirs = TAKE_PTR(data_dirs);
+
+ return 0;
+}
+
int runtime_directory(RuntimeScope scope, const char *suffix, char **ret) {
int r;
/* We don't treat /etc/xdg/systemd/ in these functions as the xdg base dir spec suggests because we assume
* that is a link to /etc/systemd/ anyway. */
+int user_search_dirs(const char *suffix, char ***ret_config_dirs, char ***ret_data_dirs);
static inline int xdg_user_runtime_dir(const char *suffix, char **ret) {
return sd_path_lookup(SD_PATH_USER_RUNTIME, suffix, ret);
}
arg_dry_run ? (would) : (doing), \
__VA_ARGS__)
-static int user_config_paths(char*** ret) {
+static int user_config_paths(char ***ret) {
_cleanup_strv_free_ char **config_dirs = NULL, **data_dirs = NULL;
- _cleanup_free_ char *persistent_config = NULL, *runtime_config = NULL, *data_home = NULL;
- _cleanup_strv_free_ char **res = NULL;
+ _cleanup_free_ char *runtime_config = NULL;
int r;
- r = xdg_user_dirs(&config_dirs, &data_dirs);
- if (r < 0)
- return r;
+ assert(ret);
- r = xdg_user_config_dir("/user-tmpfiles.d", &persistent_config);
- if (r < 0 && !ERRNO_IS_NEG_NOINFO(r))
+ /* Combined user-specific and global dirs */
+ r = user_search_dirs("/user-tmpfiles.d", &config_dirs, &data_dirs);
+ if (r < 0)
return r;
r = xdg_user_runtime_dir("/user-tmpfiles.d", &runtime_config);
if (r < 0 && !ERRNO_IS_NEG_NOINFO(r))
return r;
- r = xdg_user_data_dir("/user-tmpfiles.d", &data_home);
- if (r < 0 && !ERRNO_IS_NEG_NOINFO(r))
- return r;
-
- r = strv_extend_strv_concat(&res, (const char* const*) config_dirs, "/user-tmpfiles.d");
- if (r < 0)
- return r;
-
- r = strv_extend_many(
- &res,
- persistent_config,
- runtime_config,
- data_home);
+ r = strv_consume(&config_dirs, TAKE_PTR(runtime_config));
if (r < 0)
return r;
- r = strv_extend_strv_concat(&res, (const char* const*) data_dirs, "/user-tmpfiles.d");
+ r = strv_extend_strv_consume(&config_dirs, TAKE_PTR(data_dirs), /* filter_duplicates = */ true);
if (r < 0)
return r;
- r = path_strv_make_absolute_cwd(res);
+ r = path_strv_make_absolute_cwd(config_dirs);
if (r < 0)
return r;
- *ret = TAKE_PTR(res);
+ *ret = TAKE_PTR(config_dirs);
return 0;
}