--- src/core/main.c | 27 +++++++++++++++++++++++++++ src/core/unit.c | 2 +- src/shared/install.c | 25 ++++++++++++++++++++----- src/shared/install.h | 2 +- 4 files changed, 49 insertions(+), 7 deletions(-)
diff --git a/src/core/main.c b/src/core/main.c index 08f46f5..2656779 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -1207,6 +1207,23 @@ static int write_container_id(void) { return write_string_file("/run/systemd/container", c); } +static int transient_presets(void) { + struct stat st; + + if (lstat("/usr/lib/systemd/system-preset-transient", &st) == 0) + return !!S_ISDIR(st.st_mode); + +#ifdef HAVE_SPLIT_USR + if (lstat("/lib/systemd/system-preset-transient", &st) == 0) + return !!S_ISDIR(st.st_mode); +#endif + + if (lstat("/etc/systemd/system-preset-transient", &st) == 0) + return !!S_ISDIR(st.st_mode); + + return 0; +} + int main(int argc, char *argv[]) { Manager *m = NULL; int r, retval = EXIT_FAILURE; @@ -1619,6 +1636,16 @@ int main(int argc, char *argv[]) { if (arg_running_as == SYSTEMD_SYSTEM) { bump_rlimit_nofile(&saved_rlimit_nofile); + // NB! transient presets must be applied before normal + if (transient_presets()) { + r = unit_file_preset_all(UNIT_FILE_SYSTEM, true, NULL, UNIT_FILE_PRESET_ENABLE_ONLY, false, NULL, 0); + if (r < 0) + log_warning_errno(r, "Failed to populate transient preset unit settings, ignoring: %m"); + else + log_info("Populated transient preset unit settings."); + } + + // NB! normal presets must be applied after transient if (empty_etc) { r = unit_file_preset_all(UNIT_FILE_SYSTEM, false, NULL, UNIT_FILE_PRESET_FULL, false, NULL, 0); if (r < 0) diff --git a/src/core/unit.c b/src/core/unit.c index ee8e607..dcafde0 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -3123,7 +3123,7 @@ int unit_get_unit_file_preset(Unit *u) { if (u->unit_file_preset < 0 && u->fragment_path) u->unit_file_preset = unit_file_query_preset( u->manager->running_as == SYSTEMD_SYSTEM ? UNIT_FILE_SYSTEM : UNIT_FILE_USER, - NULL, basename(u->fragment_path)); + false, NULL, basename(u->fragment_path)); return u->unit_file_preset; } diff --git a/src/shared/install.c b/src/shared/install.c index 65f1c24..7372e56 100644 --- a/src/shared/install.c +++ b/src/shared/install.c @@ -1873,7 +1873,7 @@ UnitFileState unit_file_get_state( return r < 0 ? r : state; } -int unit_file_query_preset(UnitFileScope scope, const char *root_dir, const char *name) { +int unit_file_query_preset(UnitFileScope scope, bool runtime, const char *root_dir, const char *name) { _cleanup_strv_free_ char **files = NULL; char **p; int r; @@ -1882,7 +1882,7 @@ int unit_file_query_preset(UnitFileScope scope, const char *root_dir, const char assert(scope < _UNIT_FILE_SCOPE_MAX); assert(name); - if (scope == UNIT_FILE_SYSTEM) + if (scope == UNIT_FILE_SYSTEM && !runtime) r = conf_files_list(&files, ".preset", root_dir, "/etc/systemd/system-preset", "/usr/local/lib/systemd/system-preset", @@ -1891,12 +1891,27 @@ int unit_file_query_preset(UnitFileScope scope, const char *root_dir, const char "/lib/systemd/system-preset", #endif NULL); - else if (scope == UNIT_FILE_GLOBAL) + else if (scope == UNIT_FILE_GLOBAL && !runtime) r = conf_files_list(&files, ".preset", root_dir, "/etc/systemd/user-preset", "/usr/local/lib/systemd/user-preset", "/usr/lib/systemd/user-preset", NULL); + else if (scope == UNIT_FILE_SYSTEM && runtime) + r = conf_files_list(&files, ".preset", root_dir, + "/etc/systemd/system-preset-transient", + "/usr/local/lib/systemd/system-preset-transient", + "/usr/lib/systemd/system-preset-transient", +#ifdef HAVE_SPLIT_USR + "/lib/systemd/system-preset-transient", +#endif + NULL); + else if (scope == UNIT_FILE_GLOBAL && runtime) + r = conf_files_list(&files, ".preset", root_dir, + "/etc/systemd/user-preset-transient", + "/usr/local/lib/systemd/user-preset-transient", + "/usr/lib/systemd/user-preset-transient", + NULL); else return 1; @@ -1988,7 +2003,7 @@ int unit_file_preset( if (!unit_name_is_valid(*i, TEMPLATE_VALID)) return -EINVAL; - r = unit_file_query_preset(scope, root_dir, *i); + r = unit_file_query_preset(scope, runtime, root_dir, *i); if (r < 0) return r; @@ -2089,7 +2104,7 @@ int unit_file_preset_all( if (de->d_type != DT_REG) continue; - r = unit_file_query_preset(scope, root_dir, de->d_name); + r = unit_file_query_preset(scope, runtime, root_dir, de->d_name); if (r < 0) return r; diff --git a/src/shared/install.h b/src/shared/install.h index 357be0f..f621a3d 100644 --- a/src/shared/install.h +++ b/src/shared/install.h @@ -105,7 +105,7 @@ int unit_file_get_list(UnitFileScope scope, const char *root_dir, Hashmap *h); void unit_file_list_free(Hashmap *h); void unit_file_changes_free(UnitFileChange *changes, unsigned n_changes); -int unit_file_query_preset(UnitFileScope scope, const char *root_dir, const char *name); +int unit_file_query_preset(UnitFileScope scope, bool runtime, const char *root_dir, const char *name); const char *unit_file_state_to_string(UnitFileState s) _const_; UnitFileState unit_file_state_from_string(const char *s) _pure_; -- 2.1.0 _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel