]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-master: Access settings_root via all created event roots
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 17 Apr 2023 23:23:58 +0000 (02:23 +0300)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 20 Nov 2023 12:21:55 +0000 (14:21 +0200)
src/lib-master/master-service-settings.c
src/lib-master/master-service-settings.h
src/lib-master/master-service.c

index 008f70278a810426c0891c07ce974617734d682c..d01ecbae5a82f84df9fd3ab85d3b9aee1f603f12 100644 (file)
@@ -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);
 }
index 20f3ba8b9e425cdf4c497ea95c63621270eba0cc..dbe56d3baa1d0e17e3af0fd53d3c25af8e1b0d6a 100644 (file)
@@ -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:
index 1bc9a562f731d4ab27654ef0ab651c8cc96bd723..d8597d98eba2d2a48047d9cf98e5df806410f3a9 100644 (file)
@@ -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' ?