dovecot-2.0: doveconf: When module is given, ignore checks for n...
dovecot at dovecot.org
dovecot at dovecot.org
Thu Mar 25 19:29:00 EET 2010
details: http://hg.dovecot.org/dovecot-2.0/rev/02e0d6f0e1d4
changeset: 10981:02e0d6f0e1d4
user: Timo Sirainen <tss at iki.fi>
date: Thu Mar 25 19:19:02 2010 +0200
description:
doveconf: When module is given, ignore checks for non-required settings.
diffstat:
src/config/config-connection.c | 2 +-
src/config/config-filter.c | 3 ++-
src/config/config-parser-private.h | 1 +
src/config/config-parser.c | 33 +++++++++++++++++++++++++++++----
src/config/config-parser.h | 5 +++--
src/config/config-request.c | 3 ++-
src/config/doveconf.c | 3 ++-
src/config/main.c | 2 +-
8 files changed, 41 insertions(+), 11 deletions(-)
diffs (178 lines):
diff -r 5b0a88cb9a12 -r 02e0d6f0e1d4 src/config/config-connection.c
--- a/src/config/config-connection.c Thu Mar 25 17:41:16 2010 +0200
+++ b/src/config/config-connection.c Thu Mar 25 19:19:02 2010 +0200
@@ -100,7 +100,7 @@
if (strcmp(module, "master") == 0) {
/* master reads configuration only when reloading settings */
path = master_service_get_config_path(master_service);
- if (config_parse_file(path, TRUE, &error) <= 0) {
+ if (config_parse_file(path, TRUE, "", &error) <= 0) {
o_stream_send_str(conn->output,
t_strconcat("ERROR ", error, "\n", NULL));
config_connection_destroy(conn);
diff -r 5b0a88cb9a12 -r 02e0d6f0e1d4 src/config/config-filter.c
--- a/src/config/config-filter.c Thu Mar 25 17:41:16 2010 +0200
+++ b/src/config/config-filter.c Thu Mar 25 19:19:02 2010 +0200
@@ -174,7 +174,8 @@
for (i = 0; parser->parsers[i].root != NULL; i++) {
if (*module != '\0' &&
- !config_module_want_parser(module, parser->parsers[i].root))
+ !config_module_want_parser(config_module_parsers,
+ module, parser->parsers[i].root))
continue;
changes = settings_parser_get_changes(parser->parsers[i].parser);
diff -r 5b0a88cb9a12 -r 02e0d6f0e1d4 src/config/config-parser-private.h
--- a/src/config/config-parser-private.h Thu Mar 25 17:41:16 2010 +0200
+++ b/src/config/config-parser-private.h Thu Mar 25 19:19:02 2010 +0200
@@ -36,6 +36,7 @@
struct config_parser_context {
pool_t pool;
const char *path;
+ const char *module;
ARRAY_DEFINE(all_parsers, struct config_filter_parser *);
struct config_module_parser *root_parsers;
diff -r 5b0a88cb9a12 -r 02e0d6f0e1d4 src/config/config-parser.c
--- a/src/config/config-parser.c Thu Mar 25 17:41:16 2010 +0200
+++ b/src/config/config-parser.c Thu Mar 25 19:19:02 2010 +0200
@@ -275,6 +275,11 @@
const struct config_module_parser *p,
const char **error_r)
{
+ /* skip checking settings we don't care about */
+ if (*ctx->module != '\0' &&
+ !config_module_want_parser(ctx->root_parsers, ctx->module, p->root))
+ return 0;
+
for (; p->root != NULL; p++) {
settings_parse_var_skip(p->parser);
if (!settings_parser_check(p->parser, ctx->pool, error_r))
@@ -603,6 +608,23 @@
return NULL;
}
+static bool
+config_require_key(struct config_parser_context *ctx, const char *key)
+{
+ struct config_module_parser *l;
+
+ if (*ctx->module == '\0')
+ return TRUE;
+
+ for (l = ctx->cur_section->parsers; l->root != NULL; l++) {
+ if (config_module_want_parser(ctx->root_parsers,
+ ctx->module, l->root) &&
+ settings_parse_is_valid_key(l->parser, key))
+ return TRUE;
+ }
+ return FALSE;
+}
+
static int config_write_value(struct config_parser_context *ctx,
enum config_line_type type,
const char *key, const char *value)
@@ -622,7 +644,8 @@
str_append_c(str, '<');
str_append(str, value);
} else {
- if (str_append_file(str, key, value, &error) < 0) {
+ if (str_append_file(str, key, value, &error) < 0 &&
+ config_require_key(ctx, key)) {
/* file reading failed */
ctx->error = p_strdup(ctx->pool, error);
return -1;
@@ -737,7 +760,7 @@
}
}
-int config_parse_file(const char *path, bool expand_values,
+int config_parse_file(const char *path, bool expand_values, const char *module,
const char **error_r)
{
struct input_stack root;
@@ -773,6 +796,7 @@
root.path = path;
ctx.cur_input = &root;
ctx.expand_values = expand_values;
+ ctx.module = module;
p_array_init(&ctx.all_parsers, ctx.pool, 128);
ctx.cur_section = p_new(ctx.pool, struct config_section_stack, 1);
@@ -883,7 +907,8 @@
return FALSE;
}
-bool config_module_want_parser(const char *module,
+bool config_module_want_parser(struct config_module_parser *parsers,
+ const char *module,
const struct setting_parser_info *root)
{
struct config_module_parser *l;
@@ -895,7 +920,7 @@
return TRUE;
}
- for (l = config_module_parsers; l->root != NULL; l++) {
+ for (l = parsers; l->root != NULL; l++) {
if (strcmp(l->root->module_name, module) != 0)
continue;
diff -r 5b0a88cb9a12 -r 02e0d6f0e1d4 src/config/config-parser.h
--- a/src/config/config-parser.h Thu Mar 25 17:41:16 2010 +0200
+++ b/src/config/config-parser.h Thu Mar 25 19:19:02 2010 +0200
@@ -13,12 +13,13 @@
extern struct config_module_parser *config_module_parsers;
extern struct config_filter_context *config_filter;
-int config_parse_file(const char *path, bool expand_values,
+int config_parse_file(const char *path, bool expand_values, const char *module,
const char **error_r);
void config_parse_load_modules(void);
-bool config_module_want_parser(const char *module,
+bool config_module_want_parser(struct config_module_parser *parsers,
+ const char *module,
const struct setting_parser_info *root);
#endif
diff -r 5b0a88cb9a12 -r 02e0d6f0e1d4 src/config/config-request.c
--- a/src/config/config-request.c Thu Mar 25 17:41:16 2010 +0200
+++ b/src/config/config-request.c Thu Mar 25 19:19:02 2010 +0200
@@ -367,7 +367,8 @@
for (i = 0; ctx->parsers[i].root != NULL; i++) {
parser = &ctx->parsers[i];
if (*ctx->module != '\0' &&
- !config_module_want_parser(ctx->module, parser->root))
+ !config_module_want_parser(config_module_parsers,
+ ctx->module, parser->root))
continue;
settings_export(ctx, parser->root, FALSE,
diff -r 5b0a88cb9a12 -r 02e0d6f0e1d4 src/config/doveconf.c
--- a/src/config/doveconf.c Thu Mar 25 17:41:16 2010 +0200
+++ b/src/config/doveconf.c Thu Mar 25 19:19:02 2010 +0200
@@ -517,7 +517,8 @@
master_service_init_finish(master_service);
config_parse_load_modules();
- if ((ret = config_parse_file(config_path, expand_vars, &error)) == 0 &&
+ if ((ret = config_parse_file(config_path, expand_vars,
+ module, &error)) == 0 &&
access(EXAMPLE_CONFIG_DIR, X_OK) == 0) {
i_fatal("%s (copy example configs from "EXAMPLE_CONFIG_DIR"/)",
error);
diff -r 5b0a88cb9a12 -r 02e0d6f0e1d4 src/config/main.c
--- a/src/config/main.c Thu Mar 25 17:41:16 2010 +0200
+++ b/src/config/main.c Thu Mar 25 19:19:02 2010 +0200
@@ -30,7 +30,7 @@
config_parse_load_modules();
path = master_service_get_config_path(master_service);
- if (config_parse_file(path, TRUE, &error) <= 0)
+ if (config_parse_file(path, TRUE, "", &error) <= 0)
i_fatal("%s", error);
master_service_run(master_service, client_connected);
More information about the dovecot-cvs
mailing list