manager: add manager_set_unit_defaults() call that sets all unit defaults in one go

No change in behaviour. Just some refactoring.
This commit is contained in:
Lennart Poettering
2023-09-08 15:25:05 +02:00
parent c9e120e06f
commit bfb27b06da
5 changed files with 95 additions and 56 deletions
+21
View 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;
+2
View 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 })
+14 -31
View 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) */
/* 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;
r = manager_set_unit_defaults(m, &arg_defaults);
if (r < 0)
log_warning_errno(r, "Failed to set manager defaults, ignoring: %m");
(void) manager_set_default_smack_process_label(m, arg_defaults.smack_process_label);
r = manager_default_environment(m);
if (r < 0)
log_warning_errno(r, "Failed to set manager default environment, ignoring: %m");
(void) manager_set_default_rlimits(m, arg_defaults.rlimit);
(void) manager_default_environment(m);
(void) manager_transient_environment_add(m, arg_default_environment);
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) {
+57 -22
View File
@@ -4117,33 +4117,68 @@ int manager_get_effective_environment(Manager *m, char ***ret) {
return 0;
}
int manager_set_default_smack_process_label(Manager *m, const char *label) {
assert(m);
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);
return free_and_strdup(&m->defaults.smack_process_label, label);
}
int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit) {
assert(m);
for (unsigned i = 0; i < _RLIMIT_MAX; i++) {
m->defaults.rlimit[i] = mfree(m->defaults.rlimit[i]);
if (!default_rlimit[i])
continue;
m->defaults.rlimit[i] = newdup(struct rlimit, default_rlimit[i], 1);
if (!m->defaults.rlimit[i])
return log_oom();
if (l) {
label = strdup(l);
if (!label)
return -ENOMEM;
} else
label = NULL;
}
r = rlimit_copy_all(rlimit, defaults->rlimit);
if (r < 0)
return r;
m->defaults.std_output = defaults->std_output;
m->defaults.std_error = defaults->std_error;
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;
m->defaults.start_limit_interval = defaults->start_limit_interval;
m->defaults.start_limit_burst = defaults->start_limit_burst;
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;
}
+1 -3
View 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);