]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-settings: Add settings_parse_keyvalue_nodup()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 9 Mar 2023 22:07:38 +0000 (00:07 +0200)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 20 Nov 2023 12:20:55 +0000 (14:20 +0200)
src/lib-settings/settings-parser.c
src/lib-settings/settings-parser.h

index cdd65e9bc0b99126b873290d8797c962fba88252..8d9519cf35fda4e33d71d00114280f8ad0a1234e 100644 (file)
@@ -451,7 +451,7 @@ get_in_port_zero(struct setting_parser_context *ctx, const char *value,
 static int
 settings_parse(struct setting_parser_context *ctx, struct setting_link *link,
               const struct setting_define *def,
-              const char *key, const char *value)
+              const char *key, const char *value, bool dup_value)
 {
        void *ptr, *change_ptr;
        const void *ptr2;
@@ -507,7 +507,9 @@ settings_parse(struct setting_parser_context *ctx, struct setting_link *link,
                        return -1;
                break;
        case SET_STR:
-               *((char **)ptr) = p_strdup(ctx->set_pool, value);
+               if (dup_value)
+                       value = p_strdup(ctx->set_pool, value);
+               *((const char **)ptr) = value;
                break;
        case SET_STR_VARS:
                *((char **)ptr) = p_strconcat(ctx->set_pool,
@@ -650,8 +652,9 @@ settings_parse_strlist(struct setting_parser_context *ctx,
        array_push_back(link->array, &vvalue);
 }
 
-int settings_parse_keyvalue(struct setting_parser_context *ctx,
-                           const char *key, const char *value)
+static int
+settings_parse_keyvalue_real(struct setting_parser_context *ctx,
+                            const char *key, const char *value, bool dup_value)
 {
        const struct setting_define *def;
        struct setting_link *link;
@@ -673,13 +676,25 @@ int settings_parse_keyvalue(struct setting_parser_context *ctx,
                        return 1;
                }
 
-               if (settings_parse(ctx, link, def, key, value) < 0)
+               if (settings_parse(ctx, link, def, key, value, dup_value) < 0)
                        return -1;
                /* there may be more instances of the setting */
        } while (settings_find_key_nth(ctx, key, &n, &def, &link));
        return 1;
 }
 
+int settings_parse_keyvalue(struct setting_parser_context *ctx,
+                           const char *key, const char *value)
+{
+       return settings_parse_keyvalue_real(ctx, 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);
+}
+
 const char *settings_parse_unalias(struct setting_parser_context *ctx,
                                   const char *key)
 {
index 2453e3dae55c83b8212f7627497df1acd5328087..3ca82202d4e8776e204963b53da348e3e381b89d 100644 (file)
@@ -157,6 +157,10 @@ int settings_parse_line(struct setting_parser_context *ctx, const char *line);
 /* 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);
+/* 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);
 /* Call all check_func()s to see if currently parsed settings are valid. */
 bool settings_parser_check(struct setting_parser_context *ctx, pool_t pool,
                           const char **error_r);