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);
}
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:
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. */
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' ?