#include "str.h"
#include "strescape.h"
#include "event-filter-private.h"
-#include "var-expand.h"
#include "wildcard-match.h"
#include "mmap-util.h"
#include "settings.h"
enum settings_get_flags flags;
pool_t temp_pool;
+ var_expand_escape_t *escape_func;
+ void *escape_context;
+
const char *filter_key;
const char *filter_value;
const char *filter_name;
ctx->var_params.tables_arr = array_front(&init_ctx.tables);
ctx->var_params.funcs_arr = array_front(&init_ctx.funcs);
+
+ ctx->var_params.escape_func = ctx->escape_func;
+ ctx->var_params.escape_context = ctx->escape_context;
}
static int settings_override_cmp(struct settings_override *const *set1,
settings_get_full(struct event *event,
const char *filter_key, const char *filter_value,
const struct setting_parser_info *info,
- enum settings_get_flags flags,
+ const struct settings_get_params *params,
const char *source_filename,
unsigned int source_linenum,
const void **set_r, const char **error_r)
.root = root,
.instance = instance,
.info = info,
- .flags = flags,
+ .flags = params->flags,
+ .escape_func = params->escape_func,
+ .escape_context = params->escape_context,
.filter_name = filter_name,
.filter_key = filter_key,
.filter_value = filter_value,
unsigned int source_linenum,
const void **set_r, const char **error_r)
{
- int ret = settings_get_full(event, NULL, NULL, info, flags,
+ const struct settings_get_params params = {
+ .flags = flags,
+ };
+ int ret = settings_get_full(event, NULL, NULL, info, ¶ms,
+ source_filename, source_linenum,
+ set_r, error_r);
+ i_assert(ret != 0);
+ return ret < 0 ? -1 : 0;
+}
+
+#undef settings_get_params
+int settings_get_params(struct event *event,
+ const struct setting_parser_info *info,
+ const struct settings_get_params *params,
+ const char *source_filename,
+ unsigned int source_linenum,
+ const void **set_r, const char **error_r)
+{
+ int ret = settings_get_full(event, NULL, NULL, info, params,
source_filename, source_linenum,
set_r, error_r);
i_assert(ret != 0);
i_assert(filter_key != NULL);
i_assert(filter_value != NULL);
+ const struct settings_get_params params = {
+ .flags = flags,
+ };
int ret = settings_get_full(event, filter_key, filter_value, info,
- flags, source_filename, source_linenum,
+ ¶ms, source_filename, source_linenum,
set_r, error_r);
if (ret < 0)
return -1;
i_assert(filter_key != NULL);
i_assert(filter_value != NULL);
+ const struct settings_get_params params = {
+ .flags = flags,
+ };
return settings_get_full(event, filter_key, filter_value, info,
- flags, source_filename, source_linenum,
+ ¶ms, source_filename, source_linenum,
set_r, error_r);
}
#ifndef SETTINGS_H
#define SETTINGS_H
+#include "var-expand.h"
#include "settings-parser.h"
-struct var_expand_params;
-
struct settings_root;
struct settings_mmap;
struct settings_instance;
SETTINGS_GET_NO_KEY_VALIDATION = BIT(3),
};
+struct settings_get_params {
+ /* If non-NULL, all %variables are escaped with this function. */
+ var_expand_escape_t *escape_func;
+ void *escape_context;
+
+ enum settings_get_flags flags;
+};
+
/* Set struct settings_instance to events so settings_get() can
use it to get instance-specific settings. */
#define SETTINGS_EVENT_INSTANCE "settings_instance"
__FILE__, __LINE__, (void *)set_r, error_r)
#endif
+/* Like settings_get(), but support additional parameters. */
+int settings_get_params(struct event *event,
+ const struct setting_parser_info *info,
+ const struct settings_get_params *params,
+ const char *source_filename,
+ unsigned int source_linenum,
+ const void **set_r, const char **error_r);
+#ifdef HAVE_TYPE_CHECKS
+# define settings_get_params(event, info, params, set_r, error_r) \
+ settings_get_params(event, info, params, \
+ __FILE__, __LINE__, (void *)set_r, 1 ? (error_r) : \
+ COMPILE_ERROR_IF_TRUE( \
+ !__builtin_types_compatible_p(typeof((*set_r)->pool), pool_t)))
+#else
+# define settings_get_params(event, info, params, set_r, error_r) \
+ settings_get_params(event, info, params, \
+ __FILE__, __LINE__, (void *)set_r, error_r)
+#endif
+
/* Same as settings_get(), but looks up settings for a specific named list
filter. Use e.g. { filter_key="namespace", filter_value="inbox" }.
Returns 0 on success, -1 on error.