From: Timo Sirainen Date: Mon, 17 Apr 2023 23:23:58 +0000 (+0300) Subject: lib-master: Access settings_root via all created event roots X-Git-Tag: 2.4.0~2149 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d366d2a2f339335284e42d7a0335ece0d3df13ce;p=thirdparty%2Fdovecot%2Fcore.git lib-master: Access settings_root via all created event roots --- diff --git a/src/lib-master/master-service-settings.c b/src/lib-master/master-service-settings.c index 008f70278a..d01ecbae5a 100644 --- a/src/lib-master/master-service-settings.c +++ b/src/lib-master/master-service-settings.c @@ -1332,24 +1332,38 @@ int settings_get(struct event *event, unsigned int source_linenum, const void **set_r, const char **error_r) { + struct settings_root *root = NULL; + struct settings_mmap *mmap = NULL; struct settings_instance *instance = NULL; struct event *scan_event = event; do { - instance = event_get_ptr(scan_event, SETTINGS_EVENT_INSTANCE); - if (instance != NULL) + if (root == NULL) + root = event_get_ptr(scan_event, SETTINGS_EVENT_ROOT); + if (instance == NULL) { + instance = event_get_ptr(scan_event, + SETTINGS_EVENT_INSTANCE); + } + if (root != NULL && instance != NULL) break; scan_event = event_get_parent(scan_event); } while (scan_event != NULL); + if (root == NULL) + i_panic("settings_get() - event has no SETTINGS_EVENT_ROOT"); + if (instance != NULL) + mmap = instance->mmap; + else + mmap = root->mmap; + /* no instance-specific settings */ struct settings_instance empty_instance = { - .mmap = master_service->settings_root->mmap, + .mmap = mmap, }; if (instance == NULL) instance = &empty_instance; - return settings_instance_get(event, master_service->settings_root, + return settings_instance_get(event, root, instance, info, flags, source_filename, source_linenum, set_r, error_r); } diff --git a/src/lib-master/master-service-settings.h b/src/lib-master/master-service-settings.h index 20f3ba8b9e..dbe56d3baa 100644 --- a/src/lib-master/master-service-settings.h +++ b/src/lib-master/master-service-settings.h @@ -93,6 +93,10 @@ struct master_service_settings_output { use it to get instance-specific settings. */ #define SETTINGS_EVENT_INSTANCE "settings_instance" +/* Used by settings_get() to find struct settings_root via the event. + This is set automatically by lib-master for all created root events. */ +#define SETTINGS_EVENT_ROOT "settings_root" + /* Set struct var_expand_table to be used for settings expansion. The table is expected to be accessible until the event is freed or the table is cleared from the event. Usage: diff --git a/src/lib-master/master-service.c b/src/lib-master/master-service.c index 1bc9a562f7..d8597d98eb 100644 --- a/src/lib-master/master-service.c +++ b/src/lib-master/master-service.c @@ -353,6 +353,11 @@ master_service_event_callback(struct event *event, to do it only for root events, because all other events inherit the category from them. */ event_add_category(event, &master_service_category); + if (master_service != NULL) { + /* Set settings root for created events */ + event_set_ptr(event, SETTINGS_EVENT_ROOT, + master_service->settings_root); + } } /* This callback may be called while still in master_service_init(). In that case master_service is NULL. */ @@ -518,6 +523,8 @@ master_service_init(const char *name, enum master_service_flags flags, event_register_callback(master_service_event_callback); service->event = event_create(NULL); + event_set_ptr(service->event, SETTINGS_EVENT_ROOT, + service->settings_root); /* keep getopt_str first in case it contains "+" */ service->getopt_str = *getopt_str == '\0' ?