]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-master: Introduce struct settings_root
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 17 Apr 2023 23:12:44 +0000 (02:12 +0300)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 20 Nov 2023 12:21:32 +0000 (14:21 +0200)
It contains the latest created settings_mmap.

src/lib-master/master-service-private.h
src/lib-master/master-service-settings.c
src/lib-master/master-service-settings.h
src/lib-master/master-service.c
src/lib-master/master-service.h

index bf18f3bb9d2ab72f688f0043aecad7b902a5629f..b8cd2668cdf62f955076c1d71fbb8d99646f328a 100644 (file)
@@ -39,7 +39,7 @@ struct master_service {
        const char *version_string;
        char *config_path;
        ARRAY_TYPE(const_string) config_overrides;
-       struct settings_mmap *config_mmap;
+       struct settings_root *settings_root;
        int syslog_facility;
        data_stack_frame_t datastack_frame_id;
 
index faf0e5e3573326d03cf70e74ff7b4b4bf176468e..efab1a6746822216964527d79230960f4df294ee 100644 (file)
@@ -50,6 +50,7 @@ struct settings_mmap_block {
 
 struct settings_mmap {
        int refcount;
+       struct settings_root *root;
        struct master_service *service;
 
        void *mmap_base;
@@ -58,6 +59,11 @@ struct settings_mmap {
        HASH_TABLE(const char *, struct settings_mmap_block *) blocks;
 };
 
+struct settings_root {
+       pool_t pool;
+       struct settings_mmap *mmap;
+};
+
 struct settings_override {
        int type;
        bool append;
@@ -835,7 +841,8 @@ int master_service_settings_read(struct master_service *service,
                /* unit test */
                fd = input->config_fd;
                path = t_strdup_printf("<input fd %d>", fd);
-       } else if (service->config_mmap != NULL && !input->reload_config) {
+       } else if (service->settings_root->mmap != NULL &&
+                  !input->reload_config) {
                /* config was already read once */
        } else if ((value = getenv(DOVECOT_CONFIG_FD_ENV)) != NULL) {
                /* doveconf -F parameter already executed us back.
@@ -860,9 +867,10 @@ int master_service_settings_read(struct master_service *service,
        }
        if (fd != -1) {
                struct settings_mmap *mmap;
-               settings_mmap_unref(&service->config_mmap);
+               settings_mmap_unref(&service->settings_root->mmap);
                mmap = i_new(struct settings_mmap, 1);
                mmap->refcount = 1;
+               mmap->root = service->settings_root;
                mmap->service = service;
                mmap->mmap_base = mmap_ro_file(fd, &mmap->mmap_size);
                if (mmap->mmap_base == MAP_FAILED)
@@ -870,7 +878,7 @@ int master_service_settings_read(struct master_service *service,
                if (mmap->mmap_size == 0)
                        i_fatal("Failed to read config: %s file size is empty", path);
 
-               service->config_mmap = mmap;
+               service->settings_root->mmap = mmap;
                hash_table_create(&mmap->blocks, default_pool, 0,
                                  str_hash, strcmp);
 
@@ -892,8 +900,8 @@ int master_service_settings_read(struct master_service *service,
 
        /* config_mmap is NULL only if MASTER_SERVICE_FLAG_NO_CONFIG_SETTINGS
           is used */
-       if (service->config_mmap != NULL) {
-               ret = settings_mmap_parse(service->config_mmap,
+       if (service->settings_root->mmap != NULL) {
+               ret = settings_mmap_parse(service->settings_root->mmap,
                                          output_r, &error);
                if (ret < 0) {
                        if (getenv(DOVECOT_CONFIG_FD_ENV) != NULL) {
@@ -1229,15 +1237,15 @@ settings_instance_get(struct event *event,
        }
 
        struct master_settings_pool *mpool =
-               master_settings_pool_create(master_service->config_mmap,
+               master_settings_pool_create(master_service->settings_root->mmap,
                                            source_filename, source_linenum);
        pool_t set_pool = &mpool->pool;
        struct setting_parser_context *parser =
                settings_parser_init(set_pool, info,
                                     SETTINGS_PARSER_FLAG_IGNORE_UNKNOWN_KEYS);
 
-       if (service->config_mmap != NULL) {
-               ret = settings_mmap_apply(service->config_mmap,
+       if (service->settings_root->mmap != NULL) {
+               ret = settings_mmap_apply(service->settings_root->mmap,
                                event, parser, info, &error);
                if (ret < 0) {
                        *error_r = t_strdup_printf(
@@ -1416,6 +1424,24 @@ void settings_instance_free(struct settings_instance **_instance)
        pool_unref(&instance->pool);
 }
 
+struct settings_root *settings_root_init(void)
+{
+       pool_t pool = pool_alloconly_create("settings root", 128);
+       struct settings_root *root = p_new(pool, struct settings_root, 1);
+       root->pool = pool;
+       return root;
+}
+
+void settings_root_deinit(struct settings_root **_root)
+{
+       struct settings_root *root = *_root;
+
+       *_root = NULL;
+
+       settings_mmap_unref(&root->mmap);
+       pool_unref(&root->pool);
+}
+
 void master_service_settings_deinit(struct master_service *service)
 {
        struct master_settings_pool *mpool;
index ba9bcadb3b9544b16a69645ab10c8150a63e3eb5..f5db2938b51ceaceb815f4be1af3ec06295c1679 100644 (file)
@@ -7,6 +7,7 @@
 struct var_expand_table;
 struct var_expand_func_table;
 struct master_service;
+struct settings_root;
 struct settings_mmap;
 struct settings_instance;
 
@@ -210,6 +211,9 @@ settings_instance_dup(const struct settings_instance *src);
 /* Free a settings instance. */
 void settings_instance_free(struct settings_instance **instance);
 
+struct settings_root *settings_root_init(void);
+void settings_root_deinit(struct settings_root **root);
+
 void master_service_settings_deinit(struct master_service *service);
 
 #endif
index db87cd2eef3b96e053f03cda46097329d02cb180..f2f89447dfe65c3507c283b9edd746fba10af801 100644 (file)
@@ -510,6 +510,7 @@ master_service_init(const char *name, enum master_service_flags flags,
        service->argv = *argv;
        service->name = i_strdup(name);
        service->configured_name = i_strdup(service_configured_name);
+       service->settings_root = settings_root_init();
 
        master_service_category_name =
                i_strdup_printf("service:%s", service->configured_name);
@@ -1179,6 +1180,12 @@ const char *master_service_get_configured_name(struct master_service *service)
        return service->configured_name;
 }
 
+struct settings_root *
+master_service_get_settings_root(struct master_service *service)
+{
+       return service->settings_root;
+}
+
 void master_service_run(struct master_service *service,
                        master_service_connection_callback_t *callback)
 {
@@ -1584,7 +1591,7 @@ static void master_service_deinit_real(struct master_service *service)
                array_free(&service->config_overrides);
 
        master_service_settings_free(service->set);
-       settings_mmap_unref(&service->config_mmap);
+       settings_root_deinit(&service->settings_root);
        i_free(master_service_category_name);
        master_service_category.name = NULL;
        event_unregister_callback(master_service_event_callback);
index bb09d0f14ba3330c73e91a6357b58f1fd2a533f5..042fb4f86a7350ece532e758ae92b8a19b4aea7e 100644 (file)
@@ -237,6 +237,9 @@ const char *master_service_get_name(struct master_service *service);
    service name=auth, but configured_name=auth-worker. This is preferred in
    e.g. log prefixes. */
 const char *master_service_get_configured_name(struct master_service *service);
+/* Returns the settings root. */
+struct settings_root *
+master_service_get_settings_root(struct master_service *service);
 
 /* Start the service. Blocks until finished */
 void master_service_run(struct master_service *service,