From: Timo Sirainen Date: Thu, 5 Jan 2023 09:47:40 +0000 (+0200) Subject: master: Use master_service_settings_get[_or_fatal]() X-Git-Tag: 2.4.0~2328 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8952bc1ee41ea2638498152d805595ea2c1da5d7;p=thirdparty%2Fdovecot%2Fcore.git master: Use master_service_settings_get[_or_fatal]() --- diff --git a/src/master/main.c b/src/master/main.c index f6a2e1c02e..edbfcb00ec 100644 --- a/src/master/main.c +++ b/src/master/main.c @@ -422,24 +422,32 @@ sig_settings_reload(const siginfo_t *si ATTR_UNUSED, input.never_exec = TRUE; input.reload_config = TRUE; input.return_config_fd = TRUE; + input.disable_check_settings = TRUE; if (master_service_settings_read(master_service, &input, &output, &error) < 0) { i_error("%s", error); i_sd_notify(0, "READY=1"); return; } + if (master_service_settings_get(NULL, &master_setting_parser_info, 0, + &set, &error) < 0) { + i_close_fd(&output.config_fd); + i_error("%s", error); + i_sd_notify(0, "READY=1"); + return; + } i_close_fd(&global_config_fd); global_config_fd = output.config_fd; fd_close_on_exec(global_config_fd, TRUE); - set = master_service_settings_get_root_set(master_service, - &master_setting_parser_info); if (services_create(set, &new_services, &error) < 0) { /* new configuration is invalid, keep the old */ i_error("Config reload failed: %s", error); i_sd_notify(0, "READY=1"); + master_service_settings_free(set); return; } + master_service_settings_free(set); new_services->config->config_file_path = p_strdup(new_services->pool, services->config->config_file_path); @@ -497,7 +505,7 @@ static void sig_die(const siginfo_t *si, void *context ATTR_UNUSED) master_service_stop(master_service); } -static struct master_settings *master_settings_read(void) +static const struct master_settings *master_settings_read(void) { struct master_service_settings_input input; struct master_service_settings_output output; @@ -508,13 +516,14 @@ static struct master_settings *master_settings_read(void) input.preserve_environment = TRUE; input.always_exec = TRUE; input.return_config_fd = TRUE; + input.disable_check_settings = TRUE; if (master_service_settings_read(master_service, &input, &output, &error) < 0) i_fatal("%s", error); global_config_fd = output.config_fd; fd_close_on_exec(global_config_fd, TRUE); - return master_service_settings_get_root_set(master_service, - &master_setting_parser_info); + return master_service_settings_get_or_fatal(NULL, + &master_setting_parser_info); } static void main_log_startup(char **protocols) @@ -784,7 +793,7 @@ static void print_build_options(void) int main(int argc, char *argv[]) { - struct master_settings *set; + const struct master_settings *set; const char *error, *doveconf_arg = NULL; failure_callback_t *orig_info_callback, *orig_debug_callback; bool foreground = FALSE, ask_key_pass = FALSE; @@ -953,6 +962,7 @@ int main(int argc, char *argv[]) T_BEGIN { main_init(set); + master_service_settings_free(set); } T_END; master_service_run(master_service, NULL); main_deinit(); diff --git a/src/master/master-settings.c b/src/master/master-settings.c index 898f9122b3..a50f7693f3 100644 --- a/src/master/master-settings.c +++ b/src/master/master-settings.c @@ -237,6 +237,7 @@ const struct setting_parser_info master_setting_parser_info = { .defaults = &master_default_settings, .struct_size = sizeof(struct master_settings), + .pool_offset1 = 1 + offsetof(struct master_settings, pool), .check_func = master_settings_verify }; diff --git a/src/master/master-settings.h b/src/master/master-settings.h index 1096d15733..68d4d3bf04 100644 --- a/src/master/master-settings.h +++ b/src/master/master-settings.h @@ -4,6 +4,7 @@ #include "service-settings.h" struct master_settings { + pool_t pool; const char *base_dir; const char *state_dir; const char *libexec_dir; diff --git a/src/master/service.c b/src/master/service.c index e2f0a19c72..4478124ba1 100644 --- a/src/master/service.c +++ b/src/master/service.c @@ -433,7 +433,6 @@ services_create_real(const struct master_settings *set, pool_t pool, service_list->refcount = 1; service_list->pool = pool; service_list->event = event; - service_list->set_pool = master_service_settings_detach(master_service); service_list->set = set; service_list->master_log_fd[0] = -1; service_list->master_log_fd[1] = -1; @@ -508,6 +507,7 @@ int services_create(const struct master_settings *set, pool_unref(&pool); return -1; } + pool_ref(set->pool); return 0; } @@ -699,7 +699,7 @@ void service_list_unref(struct service_list *service_list) timeout_remove(&service_list->to_kill); event_unref(&service_list->event); - pool_unref(&service_list->set_pool); + master_service_settings_free(service_list->set); pool_unref(&service_list->pool); } diff --git a/src/master/service.h b/src/master/service.h index 36b3ec9866..5359114113 100644 --- a/src/master/service.h +++ b/src/master/service.h @@ -145,7 +145,6 @@ struct service { struct service_list { pool_t pool; - pool_t set_pool; int refcount; struct timeout *to_kill; unsigned int fork_counter;