ctx = p_new(pool, struct config_filter_context, 1);
ctx->pool = pool;
+ pool_ref(ctx->pool);
p_array_init(&ctx->errors, pool, 1);
return ctx;
}
static int
config_parse_finish(struct config_parser_context *ctx,
+ enum config_parse_flags flags,
struct config_filter_context **filter_r,
const char **error_r)
{
ctx->path, error);
}
+ if (ret < 0 && (flags & CONFIG_PARSE_FLAG_RETURN_BROKEN_CONFIG) == 0) {
+ config_filter_deinit(&new_filter);
+ return -1;
+ }
config_module_parsers = ctx->root_parsers;
*filter_r = new_filter;
return ret;
hash_table_destroy(&ctx.seen_settings);
str_free(&full_line);
if (ret == 0)
- ret = config_parse_finish(&ctx, filter_r, error_r);
+ ret = config_parse_finish(&ctx, flags, filter_r, error_r);
+ pool_unref(&ctx.pool);
return ret < 0 ? ret : 1;
}
CONFIG_PARSE_FLAG_EXPAND_VALUES = BIT(0),
CONFIG_PARSE_FLAG_HIDE_OBSOLETE_WARNINGS = BIT(1),
CONFIG_PARSE_FLAG_DELAY_ERRORS = BIT(3),
+ CONFIG_PARSE_FLAG_RETURN_BROKEN_CONFIG = BIT(4),
};
struct config_module_parser {
}
}
- enum config_parse_flags flags = 0;
+ enum config_parse_flags flags = CONFIG_PARSE_FLAG_RETURN_BROKEN_CONFIG;
if (expand_vars)
flags |= CONFIG_PARSE_FLAG_EXPAND_VALUES;
if (dump_full && exec_args != NULL && !check_full_config)