if (u->manager->running_as == SYSTEMD_USER) {
int r;
- r = user_config_home(dir);
+ if (mode == UNIT_PERSISTENT && !transient)
+ r = user_config_home(dir);
+ else
+ r = user_runtime(dir);
+
if (r == 0)
return -ENOENT;
return r;
if (u->manager->running_as == SYSTEMD_USER) {
_cleanup_free_ char *c = NULL;
- r = user_config_home(&c);
+ r = user_runtime(&c);
if (r < 0)
return r;
if (r == 0)
case UNIT_FILE_USER:
- if (root_dir || runtime)
+ if (root_dir)
return -EINVAL;
- r = user_config_home(&p);
+ if (runtime)
+ r = user_runtime(&p);
+ else
+ r = user_config_home(&p);
+
if (r <= 0)
return r < 0 ? r : -ENOENT;
UnitFileState *state) {
int r;
- _cleanup_free_ char *path2 = NULL;
+ _cleanup_free_ char *path = NULL;
bool same_name_link_runtime = false, same_name_link = false;
assert(scope >= 0);
assert(scope < _UNIT_FILE_SCOPE_MAX);
assert(name);
- if (scope == UNIT_FILE_SYSTEM || scope == UNIT_FILE_GLOBAL) {
- _cleanup_free_ char *path = NULL;
- /* First look in runtime config path */
- r = get_config_path(scope, true, root_dir, &path);
- if (r < 0)
- return r;
+ /* First look in runtime config path */
+ r = get_config_path(scope, true, root_dir, &path);
+ if (r < 0)
+ return r;
- r = find_symlinks(name, path, &same_name_link_runtime);
- if (r < 0)
- return r;
- else if (r > 0) {
- *state = UNIT_FILE_ENABLED_RUNTIME;
- return r;
- }
+ r = find_symlinks(name, path, &same_name_link_runtime);
+ if (r < 0)
+ return r;
+ else if (r > 0) {
+ *state = UNIT_FILE_ENABLED_RUNTIME;
+ return r;
}
/* Then look in the normal config path */
- r = get_config_path(scope, false, root_dir, &path2);
+ r = get_config_path(scope, false, root_dir, &path);
if (r < 0)
return r;
- r = find_symlinks(name, path2, &same_name_link);
+ r = find_symlinks(name, path, &same_name_link);
if (r < 0)
return r;
else if (r > 0) {
return 0;
}
+int user_runtime(char **user_runtime_path) {
+ const char *e;
+ char *r;
+
+ e = getenv("XDG_RUNTIME_DIR");
+ if (e) {
+ r = strappend(e, "/systemd/user");
+ if (!r)
+ return -ENOMEM;
+
+ *user_runtime_path = r;
+ return 1;
+ }
+
+ return 0;
+}
+
static char** user_dirs(
const char *generator,
const char *generator_early,
const char * const config_unit_paths[] = {
USER_CONFIG_UNIT_PATH,
"/etc/systemd/user",
- "/run/systemd/user",
NULL
};
+ const char * const runtime_unit_path = "/run/systemd/user";
+
const char * const data_unit_paths[] = {
"/usr/local/lib/systemd/user",
"/usr/local/share/systemd/user",
};
const char *home, *e;
- _cleanup_free_ char *config_home = NULL, *data_home = NULL;
+ _cleanup_free_ char *config_home = NULL, *user_runtime_dir = NULL, *data_home = NULL;
_cleanup_strv_free_ char **config_dirs = NULL, **data_dirs = NULL;
char **r = NULL;
if (user_config_home(&config_home) < 0)
goto fail;
+ if (user_runtime(&user_runtime_dir) < 0)
+ goto fail;
+
home = getenv("HOME");
e = getenv("XDG_CONFIG_DIRS");
if (strv_extend(&r, config_home) < 0)
goto fail;
+ if (user_runtime_dir)
+ if (strv_extend(&r, user_runtime_dir) < 0)
+ goto fail;
+
+ if (strv_extend(&r, runtime_unit_path) < 0)
+ goto fail;
+
if (!strv_isempty(config_dirs))
if (strv_extend_strv_concat(&r, config_dirs, "/systemd/user") < 0)
goto fail;
} SystemdRunningAs;
int user_config_home(char **config_home);
+int user_runtime(char **user_runtime_path);
int lookup_paths_init(LookupPaths *p,
SystemdRunningAs running_as,