]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-settings: Add settings_parse_keyidx_value[_nodup]()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Sat, 20 May 2023 20:03:13 +0000 (23:03 +0300)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 20 Nov 2023 12:22:31 +0000 (14:22 +0200)
src/lib-settings/settings-parser.c
src/lib-settings/settings-parser.h

index 08d8af28937f9da765145a6d6146d79f03d6ffd1..bcbec75f5251be5fed9dfd8115714f62bc4662e8 100644 (file)
@@ -300,6 +300,8 @@ settings_parse(struct setting_parser_context *ctx,
        const void *ptr2;
        const char *error;
 
+       i_free(ctx->error);
+
        while (def->type == SET_ALIAS) {
                i_assert(def != ctx->info->defines);
                def--;
@@ -447,8 +449,6 @@ settings_parse_keyvalue_real(struct setting_parser_context *ctx,
 {
        const struct setting_define *def;
 
-       i_free(ctx->error);
-
        if (!settings_find_key(ctx, key, FALSE, &def)) {
                settings_parser_set_error(ctx,
                        t_strconcat("Unknown setting: ", key, NULL));
@@ -466,12 +466,28 @@ int settings_parse_keyvalue(struct setting_parser_context *ctx,
        return settings_parse_keyvalue_real(ctx, key, value, TRUE);
 }
 
+int settings_parse_keyidx_value(struct setting_parser_context *ctx,
+                               unsigned int key_idx, const char *key,
+                               const char *value)
+{
+       return settings_parse(ctx, &ctx->info->defines[key_idx],
+                             key, value, TRUE);
+}
+
 int settings_parse_keyvalue_nodup(struct setting_parser_context *ctx,
                                  const char *key, const char *value)
 {
        return settings_parse_keyvalue_real(ctx, key, value, FALSE);
 }
 
+int settings_parse_keyidx_value_nodup(struct setting_parser_context *ctx,
+                                     unsigned int key_idx, const char *key,
+                                     const char *value)
+{
+       return settings_parse(ctx, &ctx->info->defines[key_idx],
+                             key, value, FALSE);
+}
+
 const char *settings_parse_unalias(struct setting_parser_context *ctx,
                                   const char *key)
 {
index c68a2af34f509b0281ef470715cf7e0e544ca5d9..7ab4f02d206f92ec5edc432de8899bb541a42e30 100644 (file)
@@ -167,10 +167,21 @@ uint8_t settings_parse_get_change_counter(struct setting_parser_context *ctx,
 /* Parse key/value pair. Returns 1 if OK, 0 if key is unknown, -1 if error. */
 int settings_parse_keyvalue(struct setting_parser_context *ctx,
                            const char *key, const char *value);
+/* Parse key index/value pair. The key_idx points to the key in
+   info->defines[]. The key string is still needed to support strlists, which
+   need the key in "strlist/key" format. Returns 0 if OK, -1 if error. */
+int settings_parse_keyidx_value(struct setting_parser_context *ctx,
+                               unsigned int key_idx, const char *key,
+                               const char *value);
 /* Same as settings_parse_keyvalue(), but don't strdup() the value. The value
    pointer's validity must be enforced by the caller. */
 int settings_parse_keyvalue_nodup(struct setting_parser_context *ctx,
                                  const char *key, const char *value);
+/* Same as settings_parse_keyidx_value(), but don't strdup() the value.
+   The value pointer's validity must be enforced by the caller. */
+int settings_parse_keyidx_value_nodup(struct setting_parser_context *ctx,
+                                     unsigned int key_idx, const char *key,
+                                     const char *value);
 /* Call all check_func()s and ext_check_func()s to see if currently parsed
    settings are valid. */
 bool settings_parser_check(struct setting_parser_context *ctx, pool_t pool,