void *context;
};
+static bool dict_settings_check(void *_set, pool_t pool, const char **error_r);
+
#undef DEF
#define DEF(type, name) \
SETTING_DEFINE_STRUCT_##type(#name, name, struct dict_settings)
static const struct setting_define dict_setting_defines[] = {
+ DEF(STR, dict_name),
DEF(STR, dict_driver),
+ { .type = SET_FILTER_ARRAY, .key = "dict",
+ .offset = offsetof(struct dict_settings, dicts),
+ .filter_array_field_name = "dict_name", },
SETTING_DEFINE_LIST_END
};
static const struct dict_settings dict_default_settings = {
+ .dict_name = "",
.dict_driver = "",
+ .dicts = ARRAY_INIT,
};
const struct setting_parser_info dict_setting_parser_info = {
.name = "dict",
.struct_size = sizeof(struct dict_settings),
.pool_offset1 = 1 + offsetof(struct dict_settings, pool),
+
+ .check_func = dict_settings_check,
};
static ARRAY(struct dict *) dict_drivers;
return 0;
}
+static bool dict_settings_check(void *_set, pool_t pool ATTR_UNUSED,
+ const char **error_r ATTR_UNUSED)
+{
+ struct dict_settings *set = _set;
+
+ if (set->dict_driver[0] == '\0' && set->dict_name[0] != '\0') {
+ /* default an empty dict_driver to dict_name, so it's possible
+ to configure simply: dict driver { .. }, but to still allow
+ the same driver to be used multiple times if necessary. */
+ set->dict_driver = set->dict_name;
+ }
+ return TRUE;
+}
+
int dict_init_auto(struct event *event, struct dict **dict_r,
const char **error_r)
{
if (settings_get(event, &dict_setting_parser_info, 0,
&dict_set, error_r) < 0)
return -1;
-
- if (dict_set->dict_driver[0] == '\0') {
- *error_r = "dict_driver setting is empty";
+ if (array_is_empty(&dict_set->dicts)) {
+ *error_r = "dict { .. } named list filter is missing";
settings_free(dict_set);
return 0;
}
+ const char *dict_name_first =
+ t_strdup(array_idx_elem(&dict_set->dicts, 0));
+ if (array_count(&dict_set->dicts) > 1) {
+ /* There are currently no dicts that support child dicts. */
+ const char *dict_name_extra =
+ array_idx_elem(&dict_set->dicts, 1);
+ *error_r = t_strdup_printf(
+ "Extra dict %s { .. } named list filter - "
+ "the parent dict %s { .. } doesn't support a child dict",
+ dict_name_extra, dict_name_first);
+ settings_free(dict_set);
+ return -1;
+ }
+
+ /* Get settings for the first dict list filter */
+ event = event_create(event);
+ event_add_str(event, "dict", dict_name_first);
+ settings_free(dict_set);
+ if (settings_get(event, &dict_setting_parser_info, 0,
+ &dict_set, error_r) < 0) {
+ event_unref(&event);
+ return -1;
+ }
+
dict_driver = dict_driver_lookup(dict_set->dict_driver);
if (dict_driver == NULL) {
*error_r = t_strdup_printf("Unknown dict module: %s",
dict_set->dict_driver);
+ event_unref(&event);
settings_free(dict_set);
return -1;
}
- event = event_create(event);
event_add_category(event, &event_category_dict);
event_add_str(event, "driver", dict_driver->name);
event_set_append_log_prefix(event, t_strdup_printf("dict(%s): ",