From: Timo Sirainen Date: Mon, 17 Apr 2023 23:12:44 +0000 (+0300) Subject: lib-master: Introduce struct settings_root X-Git-Tag: 2.4.0~2169 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d7887d9d98472dd2469d3feaa1cf7d60f232e1ba;p=thirdparty%2Fdovecot%2Fcore.git lib-master: Introduce struct settings_root It contains the latest created settings_mmap. --- diff --git a/src/lib-master/master-service-private.h b/src/lib-master/master-service-private.h index bf18f3bb9d..b8cd2668cd 100644 --- a/src/lib-master/master-service-private.h +++ b/src/lib-master/master-service-private.h @@ -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; diff --git a/src/lib-master/master-service-settings.c b/src/lib-master/master-service-settings.c index faf0e5e357..efab1a6746 100644 --- a/src/lib-master/master-service-settings.c +++ b/src/lib-master/master-service-settings.c @@ -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("", 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; diff --git a/src/lib-master/master-service-settings.h b/src/lib-master/master-service-settings.h index ba9bcadb3b..f5db2938b5 100644 --- a/src/lib-master/master-service-settings.h +++ b/src/lib-master/master-service-settings.h @@ -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 diff --git a/src/lib-master/master-service.c b/src/lib-master/master-service.c index db87cd2eef..f2f89447df 100644 --- a/src/lib-master/master-service.c +++ b/src/lib-master/master-service.c @@ -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); diff --git a/src/lib-master/master-service.h b/src/lib-master/master-service.h index bb09d0f14b..042fb4f86a 100644 --- a/src/lib-master/master-service.h +++ b/src/lib-master/master-service.h @@ -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,