]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-settings: Add settings_find_dynamic_by_info()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Sun, 27 Feb 2022 20:32:24 +0000 (21:32 +0100)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 30 Nov 2022 12:39:58 +0000 (14:39 +0200)
src/lib-settings/settings-parser.c
src/lib-settings/settings-parser.h

index 10ce4d8add50402d2a35582f70c1659ae46e1336..599635dfd249d1aceaa46a7a1de50152a0c8e28a 100644 (file)
@@ -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,
index c1db6785fe877c97f333aaa32a630c0d29d82875..76dc6e2a33d465e807e9a84e9acdb6b54c0eea68 100644 (file)
@@ -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