From: Timo Sirainen Date: Wed, 18 Sep 2024 11:39:59 +0000 (+0300) Subject: dict-cdb: Implement new init() API X-Git-Tag: 2.4.0~357 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=196271d12fbf04318b9bfdd2bf22d4186b4e9ce6;p=thirdparty%2Fdovecot%2Fcore.git dict-cdb: Implement new init() API --- diff --git a/src/lib-dict-backend/dict-cdb.c b/src/lib-dict-backend/dict-cdb.c index 37e05ccdd8..9710e191c4 100644 --- a/src/lib-dict-backend/dict-cdb.c +++ b/src/lib-dict-backend/dict-cdb.c @@ -4,6 +4,8 @@ #include "buffer.h" #ifdef BUILD_CDB +#include "settings.h" +#include "settings-parser.h" #include "dict-private.h" #include @@ -32,19 +34,47 @@ struct cdb_dict_iterate_context { char *error; }; +struct dict_cdb_settings { + pool_t pool; + + const char *cdb_path; +}; + +#undef DEF +#define DEF(type, name) \ + SETTING_DEFINE_STRUCT_##type(#name, name, struct dict_cdb_settings) +static const struct setting_define cdb_setting_defines[] = { + DEF(STR, cdb_path), + + SETTING_DEFINE_LIST_END +}; +static const struct dict_cdb_settings cdb_default_settings = { + .cdb_path = "", +}; +const struct setting_parser_info cdb_setting_parser_info = { + .name = "dict_cdb", + + .defines = cdb_setting_defines, + .defaults = &cdb_default_settings, + + .struct_size = sizeof(struct dict_cdb_settings), + .pool_offset1 = 1 + offsetof(struct dict_cdb_settings, pool), +}; + static void cdb_dict_deinit(struct dict *_dict); static int -cdb_dict_init_legacy(struct dict *driver, const char *uri, - const struct dict_legacy_settings *set ATTR_UNUSED, +cdb_dict_init_common(const struct dict *driver, + const struct dict_cdb_settings *set, struct dict **dict_r, const char **error_r) { struct cdb_dict *dict; dict = i_new(struct cdb_dict, 1); dict->dict = *driver; - dict->path = i_strdup(uri); + dict->path = i_strdup(set->cdb_path); dict->flag = CDB_WITH_NULL | CDB_WITHOUT_NULL; + settings_free(set); /* initialize cdb to 0 (unallocated) */ i_zero(&dict->cdb); @@ -70,6 +100,31 @@ cdb_dict_init_legacy(struct dict *driver, const char *uri, return 0; } +static int +cdb_dict_init_legacy(struct dict *driver, const char *uri, + const struct dict_legacy_settings *legacy_set ATTR_UNUSED, + struct dict **dict_r, const char **error_r) +{ + pool_t pool = pool_alloconly_create("cdb_settings", 128); + struct dict_cdb_settings *set = + settings_defaults_dup(pool, &cdb_setting_parser_info); + set->cdb_path = p_strdup(pool, uri); + return cdb_dict_init_common(driver, set, dict_r, error_r); +} + +static int +cdb_dict_init(const struct dict *dict_driver, struct event *event, + struct dict **dict_r, const char **error_r) +{ + const struct dict_cdb_settings *set; + + if (settings_get(event, &cdb_setting_parser_info, 0, + &set, error_r) < 0) + return -1; + return cdb_dict_init_common(dict_driver, set, dict_r, error_r); +} + + static void cdb_dict_deinit(struct dict *_dict) { struct cdb_dict *dict = (struct cdb_dict *)_dict; @@ -256,6 +311,7 @@ static int cdb_dict_iterate_deinit(struct dict_iterate_context *_ctx, struct dict dict_driver_cdb = { .name = "cdb", .v = { + .init = cdb_dict_init, .init_legacy = cdb_dict_init_legacy, .deinit = cdb_dict_deinit, .lookup = cdb_dict_lookup,