From: Timo Sirainen Date: Sat, 20 May 2023 20:03:13 +0000 (+0300) Subject: lib-settings: Add settings_parse_keyidx_value[_nodup]() X-Git-Tag: 2.4.0~1990 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f48e8bf75ddb6240eecf106d04f9077d0f34489e;p=thirdparty%2Fdovecot%2Fcore.git lib-settings: Add settings_parse_keyidx_value[_nodup]() --- diff --git a/src/lib-settings/settings-parser.c b/src/lib-settings/settings-parser.c index 08d8af2893..bcbec75f52 100644 --- a/src/lib-settings/settings-parser.c +++ b/src/lib-settings/settings-parser.c @@ -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) { diff --git a/src/lib-settings/settings-parser.h b/src/lib-settings/settings-parser.h index c68a2af34f..7ab4f02d20 100644 --- a/src/lib-settings/settings-parser.h +++ b/src/lib-settings/settings-parser.h @@ -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,