]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
manager: add manager_set_unit_defaults() call that sets all unit defaults in one go
authorLennart Poettering <lennart@poettering.net>
Fri, 8 Sep 2023 12:06:42 +0000 (14:06 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 8 Sep 2023 13:25:05 +0000 (15:25 +0200)
No change in behaviour. Just some refactoring.

src/basic/rlimit-util.c
src/basic/rlimit-util.h
src/core/main.c
src/core/manager.c
src/core/manager.h

index 259553b6f6d899e0c6d808df00eada40ce83281d..c1f0b2b974c7f0d9f4069c7d6682a5d5cf6bab38 100644 (file)
@@ -362,6 +362,27 @@ void rlimit_free_all(struct rlimit **rl) {
         free_many((void**) rl, _RLIMIT_MAX);
 }
 
+int rlimit_copy_all(struct rlimit* target[static _RLIMIT_MAX], struct rlimit* const source[static _RLIMIT_MAX]) {
+        struct rlimit* copy[_RLIMIT_MAX] = {};
+
+        assert(target);
+        assert(source);
+
+        for (int i = 0; i < _RLIMIT_MAX; i++) {
+                if (!source[i])
+                        continue;
+
+                copy[i] = newdup(struct rlimit, source[i], 1);
+                if (!copy[i]) {
+                        rlimit_free_all(copy);
+                        return -ENOMEM;
+                }
+        }
+
+        memcpy(target, copy, sizeof(struct rlimit*) * _RLIMIT_MAX);
+        return 0;
+}
+
 int rlimit_nofile_bump(int limit) {
         int r;
 
index 59bc066798feca5cc34df07615d2753526f5f984..202c3fdc449b82da150b7357f02e4523e9bad370 100644 (file)
@@ -4,6 +4,7 @@
 #include <sys/resource.h>
 
 #include "macro.h"
+#include "missing_resource.h"
 
 const char *rlimit_to_string(int i) _const_;
 int rlimit_from_string(const char *s) _pure_;
@@ -17,6 +18,7 @@ int rlimit_parse(int resource, const char *val, struct rlimit *ret);
 
 int rlimit_format(const struct rlimit *rl, char **ret);
 
+int rlimit_copy_all(struct rlimit* target[static _RLIMIT_MAX], struct rlimit* const source[static _RLIMIT_MAX]);
 void rlimit_free_all(struct rlimit **rl);
 
 #define RLIMIT_MAKE_CONST(lim) ((struct rlimit) { lim, lim })
index bd9e137871dc405ec52a696325bc38aec30b656e..54511be6d8a3fa1f01ca0995cb43fb9519e4ddb9 100644 (file)
@@ -735,43 +735,26 @@ static int parse_config_file(void) {
 }
 
 static void set_manager_defaults(Manager *m) {
+        int r;
 
         assert(m);
 
-        /* Propagates the various default unit property settings into the manager object, i.e. properties that do not
-         * affect the manager itself, but are just what newly allocated units will have set if they haven't set
-         * anything else. (Also see set_manager_settings() for the settings that affect the manager's own behaviour) */
-
-        m->defaults.timer_accuracy_usec = arg_defaults.timer_accuracy_usec;
-        m->defaults.std_output = arg_defaults.std_output;
-        m->defaults.std_error = arg_defaults.std_error;
-        m->defaults.timeout_start_usec = arg_defaults.timeout_start_usec;
-        m->defaults.timeout_stop_usec = arg_defaults.timeout_stop_usec;
-        m->defaults.timeout_abort_usec = arg_defaults.timeout_abort_usec;
-        m->defaults.timeout_abort_set = arg_defaults.timeout_abort_set;
-        m->defaults.device_timeout_usec = arg_defaults.device_timeout_usec;
-        m->defaults.restart_usec = arg_defaults.restart_usec;
-        m->defaults.start_limit_interval = arg_defaults.start_limit_interval;
-        m->defaults.start_limit_burst = arg_defaults.start_limit_burst;
-        m->defaults.cpu_accounting = arg_defaults.cpu_accounting;
-        m->defaults.io_accounting = arg_defaults.io_accounting;
-        m->defaults.ip_accounting = arg_defaults.ip_accounting;
-        m->defaults.blockio_accounting = arg_defaults.blockio_accounting;
-        m->defaults.memory_accounting = arg_defaults.memory_accounting;
-        m->defaults.tasks_accounting = arg_defaults.tasks_accounting;
-        m->defaults.tasks_max = arg_defaults.tasks_max;
-        m->defaults.memory_pressure_watch = arg_defaults.memory_pressure_watch;
-        m->defaults.memory_pressure_threshold_usec = arg_defaults.memory_pressure_threshold_usec;
-        m->defaults.oom_policy = arg_defaults.oom_policy;
-        m->defaults.oom_score_adjust_set = arg_defaults.oom_score_adjust_set;
-        m->defaults.oom_score_adjust = arg_defaults.oom_score_adjust;
-
-        (void) manager_set_default_smack_process_label(m, arg_defaults.smack_process_label);
-
-        (void) manager_set_default_rlimits(m, arg_defaults.rlimit);
-
-        (void) manager_default_environment(m);
-        (void) manager_transient_environment_add(m, arg_default_environment);
+        /* Propagates the various default unit property settings into the manager object, i.e. properties
+         * that do not affect the manager itself, but are just what newly allocated units will have set if
+         * they haven't set anything else. (Also see set_manager_settings() for the settings that affect the
+         * manager's own behaviour) */
+
+        r = manager_set_unit_defaults(m, &arg_defaults);
+        if (r < 0)
+                log_warning_errno(r, "Failed to set manager defaults, ignoring: %m");
+
+        r = manager_default_environment(m);
+        if (r < 0)
+                log_warning_errno(r, "Failed to set manager default environment, ignoring: %m");
+
+        r = manager_transient_environment_add(m, arg_default_environment);
+        if (r < 0)
+                log_warning_errno(r, "Failed to add to transient environment, ignoring: %m");
 }
 
 static void set_manager_settings(Manager *m) {
index 45409ab6e4796dca8b5197f4a936f2c69ad71d59..c2c689f01fce72391ac09b24468ff3ae265abf87 100644 (file)
@@ -4117,32 +4117,67 @@ int manager_get_effective_environment(Manager *m, char ***ret) {
         return 0;
 }
 
-int manager_set_default_smack_process_label(Manager *m, const char *label) {
+int manager_set_unit_defaults(Manager *m, const UnitDefaults *defaults) {
+        _cleanup_free_ char *label = NULL;
+        struct rlimit *rlimit[_RLIMIT_MAX];
+        int r;
+
         assert(m);
+        assert(defaults);
 
+        if (streq_ptr(defaults->smack_process_label, "/"))
+                label = NULL;
+        else  {
+                const char *l = defaults->smack_process_label;
 #ifdef SMACK_DEFAULT_PROCESS_LABEL
-        if (!label)
-                return free_and_strdup(&m->defaults.smack_process_label, SMACK_DEFAULT_PROCESS_LABEL);
+                if (!l)
+                        l = SMACK_DEFAULT_PROCESS_LABEL;
 #endif
-        if (streq_ptr(label, "/"))
-                return free_and_strdup(&m->defaults.smack_process_label, NULL);
+                if (l) {
+                        label = strdup(l);
+                        if (!label)
+                                return -ENOMEM;
+                } else
+                        label = NULL;
+        }
 
-        return free_and_strdup(&m->defaults.smack_process_label, label);
-}
+        r = rlimit_copy_all(rlimit, defaults->rlimit);
+        if (r < 0)
+                return r;
 
-int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit) {
-        assert(m);
+        m->defaults.std_output = defaults->std_output;
+        m->defaults.std_error = defaults->std_error;
 
-        for (unsigned i = 0; i < _RLIMIT_MAX; i++) {
-                m->defaults.rlimit[i] = mfree(m->defaults.rlimit[i]);
+        m->defaults.restart_usec = defaults->restart_usec;
+        m->defaults.timeout_start_usec = defaults->timeout_start_usec;
+        m->defaults.timeout_stop_usec = defaults->timeout_stop_usec;
+        m->defaults.timeout_abort_usec = defaults->timeout_abort_usec;
+        m->defaults.timeout_abort_set = defaults->timeout_abort_set;
+        m->defaults.device_timeout_usec = defaults->device_timeout_usec;
 
-                if (!default_rlimit[i])
-                        continue;
+        m->defaults.start_limit_interval = defaults->start_limit_interval;
+        m->defaults.start_limit_burst = defaults->start_limit_burst;
 
-                m->defaults.rlimit[i] = newdup(struct rlimit, default_rlimit[i], 1);
-                if (!m->defaults.rlimit[i])
-                        return log_oom();
-        }
+        m->defaults.cpu_accounting = defaults->cpu_accounting;
+        m->defaults.memory_accounting = defaults->memory_accounting;
+        m->defaults.io_accounting = defaults->io_accounting;
+        m->defaults.blockio_accounting = defaults->blockio_accounting;
+        m->defaults.tasks_accounting = defaults->tasks_accounting;
+        m->defaults.ip_accounting = defaults->ip_accounting;
+
+        m->defaults.tasks_max = defaults->tasks_max;
+        m->defaults.timer_accuracy_usec = defaults->timer_accuracy_usec;
+
+        m->defaults.oom_policy = defaults->oom_policy;
+        m->defaults.oom_score_adjust = defaults->oom_score_adjust;
+        m->defaults.oom_score_adjust_set = defaults->oom_score_adjust_set;
+
+        m->defaults.memory_pressure_watch = defaults->memory_pressure_watch;
+        m->defaults.memory_pressure_threshold_usec = defaults->memory_pressure_threshold_usec;
+
+        free_and_replace(m->defaults.smack_process_label, label);
+        rlimit_free_all(m->defaults.rlimit);
+        memcpy(m->defaults.rlimit, rlimit, sizeof(struct rlimit*) * _RLIMIT_MAX);
 
         return 0;
 }
index 2309914a809e00d7c03f6056c0747182ab550d41..b0ba5c5062e64ae79813413b352ff63838f14f2a 100644 (file)
@@ -537,9 +537,7 @@ int manager_transient_environment_add(Manager *m, char **plus);
 int manager_client_environment_modify(Manager *m, char **minus, char **plus);
 int manager_get_effective_environment(Manager *m, char ***ret);
 
-int manager_set_default_smack_process_label(Manager *m, const char *label);
-
-int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit);
+int manager_set_unit_defaults(Manager *m, const UnitDefaults *defaults);
 
 void manager_trigger_run_queue(Manager *m);