From: Timo Sirainen Date: Sun, 27 Feb 2022 20:32:24 +0000 (+0100) Subject: lib-settings: Add settings_find_dynamic_by_info() X-Git-Tag: 2.4.0~3345 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b7127e4fd759900339f0665fea7942e297e3ae2d;p=thirdparty%2Fdovecot%2Fcore.git lib-settings: Add settings_find_dynamic_by_info() --- diff --git a/src/lib-settings/settings-parser.c b/src/lib-settings/settings-parser.c index 10ce4d8add..599635dfd2 100644 --- a/src/lib-settings/settings-parser.c +++ b/src/lib-settings/settings-parser.c @@ -1630,6 +1630,7 @@ void settings_parser_dyn_update(pool_t pool, new_info = p_new(pool, struct setting_parser_info, 1); *new_info = *dyn_parsers[i].info; + new_info->orig_info = dyn_parsers[i].info; new_info->parent = new_parent; new_dyn_parsers[i].info = new_info; } @@ -1654,6 +1655,29 @@ const void *settings_find_dynamic(const struct setting_parser_info *info, return NULL; } +const void * +settings_find_dynamic_by_info(const struct setting_parser_info *base_info, + const void *base_set, + const struct setting_parser_info *info) +{ + unsigned int i; + + if (base_info->dynamic_parsers == NULL) + return NULL; + + for (i = 0; base_info->dynamic_parsers[i].name != NULL; i++) { + const struct setting_parser_info *ctx_root = + base_info->dynamic_parsers[i].info->orig_info != NULL ? + base_info->dynamic_parsers[i].info->orig_info : + base_info->dynamic_parsers[i].info; + if (ctx_root == info) { + return CONST_PTR_OFFSET(base_set, + base_info->dynamic_parsers[i].struct_offset); + } + } + return NULL; +} + static struct setting_link * settings_link_get_new(struct setting_parser_context *new_ctx, HASH_TABLE_TYPE(setting_link) links, diff --git a/src/lib-settings/settings-parser.h b/src/lib-settings/settings-parser.h index c1db6785fe..76dc6e2a33 100644 --- a/src/lib-settings/settings-parser.h +++ b/src/lib-settings/settings-parser.h @@ -258,6 +258,10 @@ void settings_parser_dyn_update(pool_t pool, no such registered name. */ const void *settings_find_dynamic(const struct setting_parser_info *info, const void *base_set, const char *name); +const void * +settings_find_dynamic_by_info(const struct setting_parser_info *base_info, + const void *base_set, + const struct setting_parser_info *info); /* Copy changed settings from src to dest. If conflict_key_r is not NULL and both src and dest have changed the same setting, return -1 and set the