ctx->cur_section->filter_parser->filter_required_setting_seen = TRUE;
/* if key is list/key, lookup only "list" */
- config_key = hash_table_lookup(ctx->all_keys, t_strcut(key, '/'));
+ const char *lookup_key = t_strcut(key, '/');
+ config_key = hash_table_lookup(ctx->all_keys, lookup_key);
if (config_key == NULL)
return 0;
&l->settings[config_key->define_idx].array) < 0)
return -1;
break;
- case SET_FILE:
+ case SET_FILE: {
+ const char *inline_value;
+ if (str_begins(value, SET_FILE_INLINE_PREFIX,
+ &inline_value)) {
+ l->settings[config_key->define_idx].str =
+ value[0] == '\0' ? "" :
+ p_strconcat(ctx->pool, "\n", inline_value, NULL);
+ break;
+ }
if (config_apply_file(ctx, line, value,
&l->settings[config_key->define_idx].str) < 0)
return -1;
break;
+ }
default:
l->settings[config_key->define_idx].str =
p_strdup(ctx->pool, value);
config_request_get_strings(const struct config_export_setting *set,
struct config_dump_human_context *ctx)
{
- const char *p, *value;
+ const char *p, *key, *value;
switch (set->type) {
case CONFIG_KEY_NORMAL:
+ key = set->key;
if (set->def_type != SET_FILE)
value = set->value;
- else
+ else if (set->value[0] != '\n')
value = t_strcut(set->value, '\n');
- value = p_strdup_printf(ctx->pool, "%s=%s", set->key, value);
+ else
+ value = t_strconcat(SET_FILE_INLINE_PREFIX,
+ set->value + 1, NULL);
+ value = p_strdup_printf(ctx->pool, "%s=%s", key, value);
break;
case CONFIG_KEY_BOOLLIST_ELEM:
/* add list index as the prefix to preserve the configured
#define SET_TIME_INFINITE UINT_MAX
#define SET_TIME_MSECS_INFINITE UINT_MAX
+#define SET_FILE_INLINE_PREFIX "inline:"
+
enum setting_type {
SET_BOOL,
SET_UINT,
ctx->info->defines[key_idx].type == SET_FILTER_ARRAY) {
*_key = key;
*key_idx_r = key_idx;
- *value_r = set->value;
+
+ const char *inline_value;
+ if (!str_begins(set->value, SET_FILE_INLINE_PREFIX,
+ &inline_value))
+ *value_r = set->value;
+ else
+ *value_r = t_strconcat("\n", inline_value, NULL);
return 1;
}