]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
master: Use master_service_settings_get[_or_fatal]()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 5 Jan 2023 09:47:40 +0000 (11:47 +0200)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 20 Nov 2023 12:11:41 +0000 (14:11 +0200)
src/master/main.c
src/master/master-settings.c
src/master/master-settings.h
src/master/service.c
src/master/service.h

index f6a2e1c02ed81ceaf40bb8c3a7ce971ec37ec122..edbfcb00ece3960d335aac4ae2507d77fcbb2f39 100644 (file)
@@ -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();
index 898f9122b3cd9bd2b4109dc288c01498ffd1d08f..a50f7693f31eea12bc276a39334d440f68a44820 100644 (file)
@@ -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
 };
 
index 1096d1573319f5ffb4e7aee3c4b38360cc819fac..68d4d3bf048c6631cae0a41f6ae1a338f59a8e3c 100644 (file)
@@ -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;
index e2f0a19c72f777afd130021755394d37d2ca0701..4478124ba13415528e3f42263ac8c9500d06e5af 100644 (file)
@@ -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);
 }
 
index 36b3ec986606d4d2a2f251e4db765f89df7ca1c9..53591141132eaf592ab09d095e1ef54332057cab 100644 (file)
@@ -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;