summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/shared/install.c11
-rw-r--r--src/shared/path-lookup.c46
-rw-r--r--src/shared/path-lookup.h2
3 files changed, 40 insertions, 19 deletions
diff --git a/src/shared/install.c b/src/shared/install.c
index 4141e0402f..e14a869321 100644
--- a/src/shared/install.c
+++ b/src/shared/install.c
@@ -885,6 +885,7 @@ static int find_symlinks(
}
static int find_symlinks_in_scope(
+ UnitFileScope scope,
const LookupPaths *paths,
UnitFileInstallInfo *i,
bool match_name,
@@ -916,6 +917,12 @@ static int find_symlinks_in_scope(
return 1;
}
+ /* look for globally enablement of user units */
+ if (scope == UNIT_FILE_USER && path_is_user_config_dir(*p)) {
+ *state = UNIT_FILE_ENABLED;
+ return 1;
+ }
+
r = path_is_runtime(paths, *p, false);
if (r < 0)
return r;
@@ -2646,7 +2653,7 @@ static int unit_file_lookup_state(
/* Check if any of the Alias= symlinks have been created.
* We ignore other aliases, and only check those that would
* be created by systemctl enable for this unit. */
- r = find_symlinks_in_scope(paths, i, true, &state);
+ r = find_symlinks_in_scope(scope, paths, i, true, &state);
if (r < 0)
return r;
if (r > 0)
@@ -2654,7 +2661,7 @@ static int unit_file_lookup_state(
/* Check if the file is known under other names. If it is,
* it might be in use. Report that as UNIT_FILE_INDIRECT. */
- r = find_symlinks_in_scope(paths, i, false, &state);
+ r = find_symlinks_in_scope(scope, paths, i, false, &state);
if (r < 0)
return r;
if (r > 0)
diff --git a/src/shared/path-lookup.c b/src/shared/path-lookup.c
index a289511be5..bf10acda94 100644
--- a/src/shared/path-lookup.c
+++ b/src/shared/path-lookup.c
@@ -115,6 +115,21 @@ static int user_data_dir(char **ret, const char *suffix) {
return 1;
}
+static const char* const user_data_unit_paths[] = {
+ "/usr/local/lib/systemd/user",
+ "/usr/local/share/systemd/user",
+ USER_DATA_UNIT_PATH,
+ "/usr/lib/systemd/user",
+ "/usr/share/systemd/user",
+ NULL
+};
+
+static const char* const user_config_unit_paths[] = {
+ USER_CONFIG_UNIT_PATH,
+ "/etc/systemd/user",
+ NULL
+};
+
static char** user_dirs(
const char *persistent_config,
const char *runtime_config,
@@ -125,21 +140,6 @@ static char** user_dirs(
const char *persistent_control,
const char *runtime_control) {
- const char * const config_unit_paths[] = {
- USER_CONFIG_UNIT_PATH,
- "/etc/systemd/user",
- NULL
- };
-
- const char * const data_unit_paths[] = {
- "/usr/local/lib/systemd/user",
- "/usr/local/share/systemd/user",
- USER_DATA_UNIT_PATH,
- "/usr/lib/systemd/user",
- "/usr/share/systemd/user",
- NULL
- };
-
_cleanup_strv_free_ char **config_dirs = NULL, **data_dirs = NULL;
_cleanup_free_ char *data_home = NULL;
_cleanup_strv_free_ char **res = NULL;
@@ -196,7 +196,7 @@ static char** user_dirs(
if (strv_extend(&res, persistent_config) < 0)
return NULL;
- if (strv_extend_strv(&res, (char**) config_unit_paths, false) < 0)
+ if (strv_extend_strv(&res, (char**) user_config_unit_paths, false) < 0)
return NULL;
if (strv_extend(&res, runtime_config) < 0)
@@ -211,7 +211,7 @@ static char** user_dirs(
if (strv_extend_strv_concat(&res, data_dirs, "/systemd/user") < 0)
return NULL;
- if (strv_extend_strv(&res, (char**) data_unit_paths, false) < 0)
+ if (strv_extend_strv(&res, (char**) user_data_unit_paths, false) < 0)
return NULL;
if (strv_extend(&res, generator_late) < 0)
@@ -226,6 +226,18 @@ static char** user_dirs(
return tmp;
}
+bool path_is_user_data_dir(const char *path) {
+ assert(path);
+
+ return strv_contains((char**) user_data_unit_paths, path);
+}
+
+bool path_is_user_config_dir(const char *path) {
+ assert(path);
+
+ return strv_contains((char**) user_config_unit_paths, path);
+}
+
static int acquire_generator_dirs(
UnitFileScope scope,
const char *tempdir,
diff --git a/src/shared/path-lookup.h b/src/shared/path-lookup.h
index 45fba64d2a..fc8b8ed8c7 100644
--- a/src/shared/path-lookup.h
+++ b/src/shared/path-lookup.h
@@ -67,6 +67,8 @@ struct LookupPaths {
};
int lookup_paths_init(LookupPaths *p, UnitFileScope scope, LookupPathsFlags flags, const char *root_dir);
+bool path_is_user_data_dir(const char *path);
+bool path_is_user_config_dir(const char *path);
int lookup_paths_reduce(LookupPaths *p);