annotate src/config/config-parser.c @ 10952:30e2d65eb67a HEAD

config: Send client a services names that have more specific settings.
author Timo Sirainen <tss@iki.fi>
date Fri, 19 Mar 2010 17:23:56 +0200
parents 3a575415ce1a
children 513c43179ca9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10582
615eef3139c2 Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents: 10577
diff changeset
1 /* Copyright (c) 2005-2010 Dovecot authors, see the included COPYING file */
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "array.h"
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "str.h"
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "hash.h"
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "strescape.h"
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "istream.h"
10181
4dc080520769 config: Added support for dynamically loaded settings.
Timo Sirainen <tss@iki.fi>
parents: 10179
diff changeset
9 #include "module-dir.h"
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "settings-parser.h"
10336
e18645b47984 config: Allow settings plugins to specify also new default services.
Timo Sirainen <tss@iki.fi>
parents: 10220
diff changeset
11 #include "service-settings.h"
10793
bf4822f0846b lib-master: Added support for caching config lookups.
Timo Sirainen <tss@iki.fi>
parents: 10704
diff changeset
12 #include "master-service-settings.h"
9793
d7ccdbb58a03 config: If master module requests configuration, reread it before replying.
Timo Sirainen <tss@iki.fi>
parents: 9676
diff changeset
13 #include "all-settings.h"
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
14 #include "old-set-parser.h"
10704
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
15 #include "config-request.h"
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
16 #include "config-parser-private.h"
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17
10220
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
18 #include <stdlib.h>
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 #include <unistd.h>
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 #include <fcntl.h>
9669
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
21 #ifdef HAVE_GLOB_H
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
22 # include <glob.h>
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
23 #endif
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24
9676
3771a638cadb Compiling fix for systems without GLOB_BRACE.
Timo Sirainen <tss@iki.fi>
parents: 9669
diff changeset
25 #ifndef GLOB_BRACE
3771a638cadb Compiling fix for systems without GLOB_BRACE.
Timo Sirainen <tss@iki.fi>
parents: 9669
diff changeset
26 # define GLOB_BRACE 0
3771a638cadb Compiling fix for systems without GLOB_BRACE.
Timo Sirainen <tss@iki.fi>
parents: 9669
diff changeset
27 #endif
3771a638cadb Compiling fix for systems without GLOB_BRACE.
Timo Sirainen <tss@iki.fi>
parents: 9669
diff changeset
28
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 #define IS_WHITE(c) ((c) == ' ' || (c) == '\t')
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
31 static const enum settings_parser_flags settings_parser_flags =
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
32 SETTINGS_PARSER_FLAG_IGNORE_UNKNOWN_KEYS |
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
33 SETTINGS_PARSER_FLAG_TRACK_CHANGES;
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
34
9856
6103d925e018 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9846
diff changeset
35 struct config_module_parser *config_module_parsers;
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
36 struct config_filter_context *config_filter;
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
37
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 static const char *info_type_name_find(const struct setting_parser_info *info)
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 {
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 unsigned int i;
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 for (i = 0; info->defines[i].key != NULL; i++) {
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 if (info->defines[i].offset == info->type_offset)
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 return info->defines[i].key;
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 }
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 i_panic("setting parser: Invalid type_offset value");
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 return NULL;
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 }
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49
9247
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
50 static void config_add_type(struct setting_parser_context *parser,
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
51 const char *line, const char *section_name)
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
52 {
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
53 const struct setting_parser_info *info;
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
54 const char *p;
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
55 string_t *str;
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
56 int ret;
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
57
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
58 info = settings_parse_get_prev_info(parser);
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
59 if (info->type_offset == (size_t)-1)
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
60 return;
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
61
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
62 str = t_str_new(256);
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
63 p = strchr(line, '=');
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
64 str_append_n(str, line, p-line);
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
65 str_append_c(str, SETTINGS_SEPARATOR);
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
66 str_append(str, p+1);
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
67 str_append_c(str, SETTINGS_SEPARATOR);
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
68 str_append(str, info_type_name_find(info));
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
69 str_append_c(str, '=');
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
70 str_append(str, section_name);
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
71
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
72 ret = settings_parse_line(parser, str_c(str));
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
73 i_assert(ret > 0);
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
74 }
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
75
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
76 int config_apply_line(struct config_parser_context *ctx, const char *key,
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
77 const char *line, const char *section_name)
9247
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
78 {
9856
6103d925e018 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9846
diff changeset
79 struct config_module_parser *l;
9247
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
80 bool found = FALSE;
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
81 int ret;
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
82
10107
dcda7c495eb6 struct setting_parser_info now specifies the module name.
Timo Sirainen <tss@iki.fi>
parents: 10104
diff changeset
83 for (l = ctx->cur_section->parsers; l->root != NULL; l++) {
9247
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
84 ret = settings_parse_line(l->parser, line);
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
85 if (ret > 0) {
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
86 found = TRUE;
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
87 if (section_name != NULL)
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
88 config_add_type(l->parser, line, section_name);
9833
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
89 } else if (ret < 0) {
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
90 ctx->error = settings_parser_get_error(l->parser);
9833
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
91 return -1;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
92 }
9247
cbade54216a6 config: Code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9229
diff changeset
93 }
9833
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
94 if (!found) {
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
95 ctx->error = p_strconcat(ctx->pool, "Unknown setting: ",
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
96 key, NULL);
9833
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
97 return -1;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
98 }
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
99 return 0;
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
100 }
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
101
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
102 static const char *
9150
92825cc9a59c Settings parser: !included files without absolute paths are relative to their parent config file.
Timo Sirainen <tss@iki.fi>
parents: 9087
diff changeset
103 fix_relative_path(const char *path, struct input_stack *input)
92825cc9a59c Settings parser: !included files without absolute paths are relative to their parent config file.
Timo Sirainen <tss@iki.fi>
parents: 9087
diff changeset
104 {
92825cc9a59c Settings parser: !included files without absolute paths are relative to their parent config file.
Timo Sirainen <tss@iki.fi>
parents: 9087
diff changeset
105 const char *p;
92825cc9a59c Settings parser: !included files without absolute paths are relative to their parent config file.
Timo Sirainen <tss@iki.fi>
parents: 9087
diff changeset
106
92825cc9a59c Settings parser: !included files without absolute paths are relative to their parent config file.
Timo Sirainen <tss@iki.fi>
parents: 9087
diff changeset
107 if (*path == '/')
92825cc9a59c Settings parser: !included files without absolute paths are relative to their parent config file.
Timo Sirainen <tss@iki.fi>
parents: 9087
diff changeset
108 return path;
92825cc9a59c Settings parser: !included files without absolute paths are relative to their parent config file.
Timo Sirainen <tss@iki.fi>
parents: 9087
diff changeset
109
92825cc9a59c Settings parser: !included files without absolute paths are relative to their parent config file.
Timo Sirainen <tss@iki.fi>
parents: 9087
diff changeset
110 p = strrchr(input->path, '/');
92825cc9a59c Settings parser: !included files without absolute paths are relative to their parent config file.
Timo Sirainen <tss@iki.fi>
parents: 9087
diff changeset
111 if (p == NULL)
92825cc9a59c Settings parser: !included files without absolute paths are relative to their parent config file.
Timo Sirainen <tss@iki.fi>
parents: 9087
diff changeset
112 return path;
92825cc9a59c Settings parser: !included files without absolute paths are relative to their parent config file.
Timo Sirainen <tss@iki.fi>
parents: 9087
diff changeset
113
92825cc9a59c Settings parser: !included files without absolute paths are relative to their parent config file.
Timo Sirainen <tss@iki.fi>
parents: 9087
diff changeset
114 return t_strconcat(t_strdup_until(input->path, p+1), path, NULL);
92825cc9a59c Settings parser: !included files without absolute paths are relative to their parent config file.
Timo Sirainen <tss@iki.fi>
parents: 9087
diff changeset
115 }
92825cc9a59c Settings parser: !included files without absolute paths are relative to their parent config file.
Timo Sirainen <tss@iki.fi>
parents: 9087
diff changeset
116
9856
6103d925e018 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9846
diff changeset
117 static struct config_module_parser *
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
118 config_module_parsers_init(pool_t pool)
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
119 {
9856
6103d925e018 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9846
diff changeset
120 struct config_module_parser *dest;
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
121 unsigned int i, count;
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
122
10107
dcda7c495eb6 struct setting_parser_info now specifies the module name.
Timo Sirainen <tss@iki.fi>
parents: 10104
diff changeset
123 for (count = 0; all_roots[count] != NULL; count++) ;
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
124
9856
6103d925e018 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9846
diff changeset
125 dest = p_new(pool, struct config_module_parser, count + 1);
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
126 for (i = 0; i < count; i++) {
10107
dcda7c495eb6 struct setting_parser_info now specifies the module name.
Timo Sirainen <tss@iki.fi>
parents: 10104
diff changeset
127 dest[i].root = all_roots[i];
dcda7c495eb6 struct setting_parser_info now specifies the module name.
Timo Sirainen <tss@iki.fi>
parents: 10104
diff changeset
128 dest[i].parser = settings_parser_init(pool, all_roots[i],
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
129 settings_parser_flags);
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
130 }
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
131 return dest;
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
132 }
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
133
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
134 static void
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
135 config_add_new_parser(struct config_parser_context *ctx)
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
136 {
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
137 struct config_section_stack *cur_section = ctx->cur_section;
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
138 struct config_filter_parser *parser;
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
139
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
140 parser = p_new(ctx->pool, struct config_filter_parser, 1);
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
141 parser->filter = cur_section->filter;
10024
85e532d170cc config: Conflict handling fix.
Timo Sirainen <tss@iki.fi>
parents: 9949
diff changeset
142 if (ctx->cur_input->linenum == 0) {
85e532d170cc config: Conflict handling fix.
Timo Sirainen <tss@iki.fi>
parents: 9949
diff changeset
143 parser->file_and_line =
85e532d170cc config: Conflict handling fix.
Timo Sirainen <tss@iki.fi>
parents: 9949
diff changeset
144 p_strdup(ctx->pool, ctx->cur_input->path);
85e532d170cc config: Conflict handling fix.
Timo Sirainen <tss@iki.fi>
parents: 9949
diff changeset
145 } else {
85e532d170cc config: Conflict handling fix.
Timo Sirainen <tss@iki.fi>
parents: 9949
diff changeset
146 parser->file_and_line =
85e532d170cc config: Conflict handling fix.
Timo Sirainen <tss@iki.fi>
parents: 9949
diff changeset
147 p_strdup_printf(ctx->pool, "%s:%d",
85e532d170cc config: Conflict handling fix.
Timo Sirainen <tss@iki.fi>
parents: 9949
diff changeset
148 ctx->cur_input->path,
85e532d170cc config: Conflict handling fix.
Timo Sirainen <tss@iki.fi>
parents: 9949
diff changeset
149 ctx->cur_input->linenum);
85e532d170cc config: Conflict handling fix.
Timo Sirainen <tss@iki.fi>
parents: 9949
diff changeset
150 }
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
151 parser->parsers = cur_section->prev == NULL ? ctx->root_parsers :
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
152 config_module_parsers_init(ctx->pool);
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
153 array_append(&ctx->all_parsers, &parser, 1);
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
154
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
155 cur_section->parsers = parser->parsers;
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
156 }
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
157
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
158 static struct config_section_stack *
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
159 config_add_new_section(struct config_parser_context *ctx)
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
160 {
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
161 struct config_section_stack *section;
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
162
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
163 section = p_new(ctx->pool, struct config_section_stack, 1);
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
164 section->prev = ctx->cur_section;
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
165 section->filter = ctx->cur_section->filter;
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
166 section->parsers = ctx->cur_section->parsers;
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
167 return section;
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
168 }
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
169
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
170 static struct config_filter_parser *
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
171 config_filter_parser_find(struct config_parser_context *ctx,
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
172 const struct config_filter *filter)
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
173 {
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
174 struct config_filter_parser *const *parsers;
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
175
10406
ad3fb3f929fc Use array_foreach() more.
Timo Sirainen <tss@iki.fi>
parents: 10336
diff changeset
176 array_foreach(&ctx->all_parsers, parsers) {
ad3fb3f929fc Use array_foreach() more.
Timo Sirainen <tss@iki.fi>
parents: 10336
diff changeset
177 struct config_filter_parser *parser = *parsers;
ad3fb3f929fc Use array_foreach() more.
Timo Sirainen <tss@iki.fi>
parents: 10336
diff changeset
178
ad3fb3f929fc Use array_foreach() more.
Timo Sirainen <tss@iki.fi>
parents: 10336
diff changeset
179 if (config_filters_equal(&parser->filter, filter))
ad3fb3f929fc Use array_foreach() more.
Timo Sirainen <tss@iki.fi>
parents: 10336
diff changeset
180 return parser;
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
181 }
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
182 return NULL;
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
183 }
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
184
10220
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
185 static int
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
186 config_parse_net(struct config_parser_context *ctx, const char *value,
10220
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
187 const char **host_r, struct ip_addr *ip_r,
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
188 unsigned int *bits_r, const char **error_r)
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
189 {
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
190 struct ip_addr *ips;
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
191 const char *p;
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
192 unsigned int ip_count;
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
193 int ret;
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
194
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
195 if (net_parse_range(value, ip_r, bits_r) == 0)
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
196 return 0;
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
197
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
198 p = strchr(value, '/');
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
199 if (p != NULL) {
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
200 value = t_strdup_until(value, p);
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
201 p++;
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
202 }
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
203
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
204 ret = net_gethostbyname(value, &ips, &ip_count);
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
205 if (ret != 0) {
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
206 *error_r = t_strdup_printf("gethostbyname(%s) failed: %s",
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
207 value, net_gethosterror(ret));
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
208 return -1;
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
209 }
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
210 *host_r = p_strdup(ctx->pool, value);
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
211 *ip_r = ips[0];
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
212 if (p != NULL && is_numeric(p, '\0'))
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
213 *bits_r = atoi(p);
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
214 else
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
215 *bits_r = IPADDR_IS_V4(&ips[0]) ? 32 : 128;
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
216 return 0;
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
217 }
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
218
9856
6103d925e018 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9846
diff changeset
219 static bool
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
220 config_filter_add_new_filter(struct config_parser_context *ctx,
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
221 const char *key, const char *value)
9856
6103d925e018 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9846
diff changeset
222 {
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
223 struct config_filter *filter = &ctx->cur_section->filter;
9860
d3d8ba13faa6 config: Added some nesting requirements to remote_ip, local_ip and protocol.
Timo Sirainen <tss@iki.fi>
parents: 9859
diff changeset
224 struct config_filter *parent = &ctx->cur_section->prev->filter;
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
225 struct config_filter_parser *parser;
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
226 const char *error;
9856
6103d925e018 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9846
diff changeset
227
6103d925e018 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9846
diff changeset
228 if (strcmp(key, "protocol") == 0) {
9860
d3d8ba13faa6 config: Added some nesting requirements to remote_ip, local_ip and protocol.
Timo Sirainen <tss@iki.fi>
parents: 9859
diff changeset
229 if (parent->service != NULL)
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
230 ctx->error = "protocol must not be under protocol";
9860
d3d8ba13faa6 config: Added some nesting requirements to remote_ip, local_ip and protocol.
Timo Sirainen <tss@iki.fi>
parents: 9859
diff changeset
231 else
d3d8ba13faa6 config: Added some nesting requirements to remote_ip, local_ip and protocol.
Timo Sirainen <tss@iki.fi>
parents: 9859
diff changeset
232 filter->service = p_strdup(ctx->pool, value);
10220
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
233 } else if (strcmp(key, "local") == 0) {
9860
d3d8ba13faa6 config: Added some nesting requirements to remote_ip, local_ip and protocol.
Timo Sirainen <tss@iki.fi>
parents: 9859
diff changeset
234 if (parent->remote_bits > 0)
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
235 ctx->error = "local must not be under remote";
9860
d3d8ba13faa6 config: Added some nesting requirements to remote_ip, local_ip and protocol.
Timo Sirainen <tss@iki.fi>
parents: 9859
diff changeset
236 else if (parent->service != NULL)
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
237 ctx->error = "local must not be under protocol";
10220
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
238 else if (config_parse_net(ctx, value, &filter->local_host,
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
239 &filter->local_net,
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
240 &filter->local_bits, &error) < 0)
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
241 ctx->error = p_strdup(ctx->pool, error);
9860
d3d8ba13faa6 config: Added some nesting requirements to remote_ip, local_ip and protocol.
Timo Sirainen <tss@iki.fi>
parents: 9859
diff changeset
242 else if (parent->local_bits > filter->local_bits ||
d3d8ba13faa6 config: Added some nesting requirements to remote_ip, local_ip and protocol.
Timo Sirainen <tss@iki.fi>
parents: 9859
diff changeset
243 (parent->local_bits > 0 &&
d3d8ba13faa6 config: Added some nesting requirements to remote_ip, local_ip and protocol.
Timo Sirainen <tss@iki.fi>
parents: 9859
diff changeset
244 !net_is_in_network(&filter->local_net,
d3d8ba13faa6 config: Added some nesting requirements to remote_ip, local_ip and protocol.
Timo Sirainen <tss@iki.fi>
parents: 9859
diff changeset
245 &parent->local_net,
d3d8ba13faa6 config: Added some nesting requirements to remote_ip, local_ip and protocol.
Timo Sirainen <tss@iki.fi>
parents: 9859
diff changeset
246 parent->local_bits)))
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
247 ctx->error = "local not a subset of parent local";
10220
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
248 } else if (strcmp(key, "remote") == 0) {
9860
d3d8ba13faa6 config: Added some nesting requirements to remote_ip, local_ip and protocol.
Timo Sirainen <tss@iki.fi>
parents: 9859
diff changeset
249 if (parent->service != NULL)
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
250 ctx->error = "remote must not be under protocol";
10220
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
251 else if (config_parse_net(ctx, value, &filter->remote_host,
a90d9bb6fec3 config: Renamed remote/local_ip to just remote/local and added support for hostnames.
Timo Sirainen <tss@iki.fi>
parents: 10181
diff changeset
252 &filter->remote_net,
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
253 &filter->remote_bits, &error) < 0)
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
254 ctx->error = p_strdup(ctx->pool, error);
9860
d3d8ba13faa6 config: Added some nesting requirements to remote_ip, local_ip and protocol.
Timo Sirainen <tss@iki.fi>
parents: 9859
diff changeset
255 else if (parent->remote_bits > filter->remote_bits ||
d3d8ba13faa6 config: Added some nesting requirements to remote_ip, local_ip and protocol.
Timo Sirainen <tss@iki.fi>
parents: 9859
diff changeset
256 (parent->remote_bits > 0 &&
d3d8ba13faa6 config: Added some nesting requirements to remote_ip, local_ip and protocol.
Timo Sirainen <tss@iki.fi>
parents: 9859
diff changeset
257 !net_is_in_network(&filter->remote_net,
d3d8ba13faa6 config: Added some nesting requirements to remote_ip, local_ip and protocol.
Timo Sirainen <tss@iki.fi>
parents: 9859
diff changeset
258 &parent->remote_net,
d3d8ba13faa6 config: Added some nesting requirements to remote_ip, local_ip and protocol.
Timo Sirainen <tss@iki.fi>
parents: 9859
diff changeset
259 parent->remote_bits)))
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
260 ctx->error = "remote not a subset of parent remote";
9856
6103d925e018 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9846
diff changeset
261 } else {
6103d925e018 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9846
diff changeset
262 return FALSE;
6103d925e018 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9846
diff changeset
263 }
6103d925e018 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9846
diff changeset
264
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
265 parser = config_filter_parser_find(ctx, filter);
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
266 if (parser != NULL)
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
267 ctx->cur_section->parsers = parser->parsers;
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
268 else
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
269 config_add_new_parser(ctx);
9856
6103d925e018 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9846
diff changeset
270 return TRUE;
6103d925e018 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9846
diff changeset
271 }
6103d925e018 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9846
diff changeset
272
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
273 static int
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
274 config_filter_parser_check(struct config_parser_context *ctx,
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
275 const struct config_module_parser *p,
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
276 const char **error_r)
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
277 {
10107
dcda7c495eb6 struct setting_parser_info now specifies the module name.
Timo Sirainen <tss@iki.fi>
parents: 10104
diff changeset
278 for (; p->root != NULL; p++) {
9910
5f61efdc9f35 config: When reporting errors in variable-strings, skip over the "0" prefix.
Timo Sirainen <tss@iki.fi>
parents: 9881
diff changeset
279 settings_parse_var_skip(p->parser);
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
280 if (!settings_parser_check(p->parser, ctx->pool, error_r))
9793
d7ccdbb58a03 config: If master module requests configuration, reread it before replying.
Timo Sirainen <tss@iki.fi>
parents: 9676
diff changeset
281 return -1;
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
282 }
9793
d7ccdbb58a03 config: If master module requests configuration, reread it before replying.
Timo Sirainen <tss@iki.fi>
parents: 9676
diff changeset
283 return 0;
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
284 }
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
285
9793
d7ccdbb58a03 config: If master module requests configuration, reread it before replying.
Timo Sirainen <tss@iki.fi>
parents: 9676
diff changeset
286 static int
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
287 config_all_parsers_check(struct config_parser_context *ctx,
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
288 struct config_filter_context *new_filter,
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
289 const char **error_r)
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
290 {
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
291 struct config_filter_parser *const *parsers;
9881
8ad868df4649 Memory leak fixes.
Timo Sirainen <tss@iki.fi>
parents: 9874
diff changeset
292 struct config_module_parser *tmp_parsers;
10793
bf4822f0846b lib-master: Added support for caching config lookups.
Timo Sirainen <tss@iki.fi>
parents: 10704
diff changeset
293 struct master_service_settings_output output;
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
294 unsigned int i, count;
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
295 pool_t tmp_pool;
9881
8ad868df4649 Memory leak fixes.
Timo Sirainen <tss@iki.fi>
parents: 9874
diff changeset
296 int ret = 0;
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
297
9874
831adf94c39f config: Increased initial pool sizes.
Timo Sirainen <tss@iki.fi>
parents: 9862
diff changeset
298 tmp_pool = pool_alloconly_create("config parsers check", 1024*32);
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
299 parsers = array_get(&ctx->all_parsers, &count);
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
300 i_assert(count > 0 && parsers[count-1] == NULL);
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
301 count--;
9881
8ad868df4649 Memory leak fixes.
Timo Sirainen <tss@iki.fi>
parents: 9874
diff changeset
302 for (i = 0; i < count && ret == 0; i++) {
10952
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
303 if (config_filter_parsers_get(new_filter, tmp_pool, "",
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
304 &parsers[i]->filter,
10793
bf4822f0846b lib-master: Added support for caching config lookups.
Timo Sirainen <tss@iki.fi>
parents: 10704
diff changeset
305 &tmp_parsers, &output,
bf4822f0846b lib-master: Added support for caching config lookups.
Timo Sirainen <tss@iki.fi>
parents: 10704
diff changeset
306 error_r) < 0) {
9881
8ad868df4649 Memory leak fixes.
Timo Sirainen <tss@iki.fi>
parents: 9874
diff changeset
307 ret = -1;
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
308 break;
9881
8ad868df4649 Memory leak fixes.
Timo Sirainen <tss@iki.fi>
parents: 9874
diff changeset
309 }
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
310
9881
8ad868df4649 Memory leak fixes.
Timo Sirainen <tss@iki.fi>
parents: 9874
diff changeset
311 ret = config_filter_parser_check(ctx, tmp_parsers, error_r);
8ad868df4649 Memory leak fixes.
Timo Sirainen <tss@iki.fi>
parents: 9874
diff changeset
312 config_filter_parsers_free(tmp_parsers);
8ad868df4649 Memory leak fixes.
Timo Sirainen <tss@iki.fi>
parents: 9874
diff changeset
313 p_clear(tmp_pool);
9793
d7ccdbb58a03 config: If master module requests configuration, reread it before replying.
Timo Sirainen <tss@iki.fi>
parents: 9676
diff changeset
314 }
9881
8ad868df4649 Memory leak fixes.
Timo Sirainen <tss@iki.fi>
parents: 9874
diff changeset
315 pool_unref(&tmp_pool);
8ad868df4649 Memory leak fixes.
Timo Sirainen <tss@iki.fi>
parents: 9874
diff changeset
316 return ret;
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
317 }
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
318
9833
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
319 static int
9274
39c2db5f1fcc config: If value contains <file, the setting value is read from the given file.
Timo Sirainen <tss@iki.fi>
parents: 9263
diff changeset
320 str_append_file(string_t *str, const char *key, const char *path,
39c2db5f1fcc config: If value contains <file, the setting value is read from the given file.
Timo Sirainen <tss@iki.fi>
parents: 9263
diff changeset
321 const char **error_r)
39c2db5f1fcc config: If value contains <file, the setting value is read from the given file.
Timo Sirainen <tss@iki.fi>
parents: 9263
diff changeset
322 {
39c2db5f1fcc config: If value contains <file, the setting value is read from the given file.
Timo Sirainen <tss@iki.fi>
parents: 9263
diff changeset
323 unsigned char buf[1024];
39c2db5f1fcc config: If value contains <file, the setting value is read from the given file.
Timo Sirainen <tss@iki.fi>
parents: 9263
diff changeset
324 int fd;
39c2db5f1fcc config: If value contains <file, the setting value is read from the given file.
Timo Sirainen <tss@iki.fi>
parents: 9263
diff changeset
325 ssize_t ret;
39c2db5f1fcc config: If value contains <file, the setting value is read from the given file.
Timo Sirainen <tss@iki.fi>
parents: 9263
diff changeset
326
39c2db5f1fcc config: If value contains <file, the setting value is read from the given file.
Timo Sirainen <tss@iki.fi>
parents: 9263
diff changeset
327 fd = open(path, O_RDONLY);
39c2db5f1fcc config: If value contains <file, the setting value is read from the given file.
Timo Sirainen <tss@iki.fi>
parents: 9263
diff changeset
328 if (fd == -1) {
39c2db5f1fcc config: If value contains <file, the setting value is read from the given file.
Timo Sirainen <tss@iki.fi>
parents: 9263
diff changeset
329 *error_r = t_strdup_printf("%s: Can't open file %s: %m",
39c2db5f1fcc config: If value contains <file, the setting value is read from the given file.
Timo Sirainen <tss@iki.fi>
parents: 9263
diff changeset
330 key, path);
9833
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
331 return -1;
9274
39c2db5f1fcc config: If value contains <file, the setting value is read from the given file.
Timo Sirainen <tss@iki.fi>
parents: 9263
diff changeset
332 }
39c2db5f1fcc config: If value contains <file, the setting value is read from the given file.
Timo Sirainen <tss@iki.fi>
parents: 9263
diff changeset
333 while ((ret = read(fd, buf, sizeof(buf))) > 0)
39c2db5f1fcc config: If value contains <file, the setting value is read from the given file.
Timo Sirainen <tss@iki.fi>
parents: 9263
diff changeset
334 str_append_n(str, buf, ret);
39c2db5f1fcc config: If value contains <file, the setting value is read from the given file.
Timo Sirainen <tss@iki.fi>
parents: 9263
diff changeset
335 if (ret < 0) {
39c2db5f1fcc config: If value contains <file, the setting value is read from the given file.
Timo Sirainen <tss@iki.fi>
parents: 9263
diff changeset
336 *error_r = t_strdup_printf("%s: read(%s) failed: %m",
39c2db5f1fcc config: If value contains <file, the setting value is read from the given file.
Timo Sirainen <tss@iki.fi>
parents: 9263
diff changeset
337 key, path);
39c2db5f1fcc config: If value contains <file, the setting value is read from the given file.
Timo Sirainen <tss@iki.fi>
parents: 9263
diff changeset
338 }
39c2db5f1fcc config: If value contains <file, the setting value is read from the given file.
Timo Sirainen <tss@iki.fi>
parents: 9263
diff changeset
339 (void)close(fd);
9833
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
340 return ret < 0 ? -1 : 0;
9274
39c2db5f1fcc config: If value contains <file, the setting value is read from the given file.
Timo Sirainen <tss@iki.fi>
parents: 9263
diff changeset
341 }
39c2db5f1fcc config: If value contains <file, the setting value is read from the given file.
Timo Sirainen <tss@iki.fi>
parents: 9263
diff changeset
342
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
343 static int settings_add_include(struct config_parser_context *ctx, const char *path,
9669
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
344 bool ignore_errors, const char **error_r)
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
345 {
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
346 struct input_stack *tmp, *new_input;
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
347 int fd;
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
348
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
349 for (tmp = ctx->cur_input; tmp != NULL; tmp = tmp->prev) {
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
350 if (strcmp(tmp->path, path) == 0)
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
351 break;
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
352 }
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
353 if (tmp != NULL) {
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
354 *error_r = t_strdup_printf("Recursive include file: %s", path);
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
355 return -1;
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
356 }
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
357
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
358 if ((fd = open(path, O_RDONLY)) == -1) {
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
359 if (ignore_errors)
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
360 return 0;
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
361
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
362 *error_r = t_strdup_printf("Couldn't open include file %s: %m",
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
363 path);
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
364 return -1;
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
365 }
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
366
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
367 new_input = t_new(struct input_stack, 1);
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
368 new_input->prev = ctx->cur_input;
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
369 new_input->path = t_strdup(path);
9949
ab80ebdc6557 Allow config file line lengths to be unlimited.
Timo Sirainen <tss@iki.fi>
parents: 9910
diff changeset
370 new_input->input = i_stream_create_fd(fd, (size_t)-1, TRUE);
9669
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
371 i_stream_set_return_partial_line(new_input->input, TRUE);
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
372 ctx->cur_input = new_input;
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
373 return 0;
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
374 }
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
375
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
376 static int
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
377 settings_include(struct config_parser_context *ctx, const char *pattern,
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
378 bool ignore_errors)
9669
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
379 {
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
380 const char *error;
9669
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
381 #ifdef HAVE_GLOB
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
382 glob_t globbers;
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
383 unsigned int i;
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
384
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
385 switch (glob(pattern, GLOB_BRACE, NULL, &globbers)) {
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
386 case 0:
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
387 break;
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
388 case GLOB_NOSPACE:
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
389 ctx->error = "glob() failed: Not enough memory";
9669
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
390 return -1;
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
391 case GLOB_ABORTED:
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
392 ctx->error = "glob() failed: Read error";
9669
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
393 return -1;
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
394 case GLOB_NOMATCH:
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
395 if (ignore_errors)
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
396 return 0;
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
397 ctx->error = "No matches";
9669
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
398 return -1;
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
399 default:
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
400 ctx->error = "glob() failed: Unknown error";
9669
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
401 return -1;
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
402 }
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
403
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
404 /* iterate throuth the different files matching the globbing */
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
405 for (i = 0; i < globbers.gl_pathc; i++) {
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
406 if (settings_add_include(ctx, globbers.gl_pathv[i],
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
407 ignore_errors, &error) < 0) {
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
408 ctx->error = p_strdup(ctx->pool, error);
9669
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
409 return -1;
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
410 }
9669
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
411 }
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
412 globfree(&globbers);
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
413 return 0;
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
414 #else
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
415 if (settings_add_include(ctx, pattern, ignore_errors, &error) < 0) {
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
416 ctx->error = p_strdup(ctx->pool, error);
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
417 return -1;
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
418 }
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
419 return 0;
9669
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
420 #endif
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
421 }
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
422
9833
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
423 static enum config_line_type
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
424 config_parse_line(struct config_parser_context *ctx,
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
425 char *line, string_t *full_line,
10104
5bdae566e0dc settings parser: Warn if a line has '#' character not preceded by whitespace.
Timo Sirainen <tss@iki.fi>
parents: 10046
diff changeset
426 const char **key_r, const char **value_r)
9833
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
427 {
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
428 const char *key;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
429 unsigned int len;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
430 char *p;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
431
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
432 *key_r = NULL;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
433 *value_r = NULL;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
434
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
435 /* @UNSAFE: line is modified */
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
436
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
437 /* skip whitespace */
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
438 while (IS_WHITE(*line))
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
439 line++;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
440
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
441 /* ignore comments or empty lines */
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
442 if (*line == '#' || *line == '\0')
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
443 return CONFIG_LINE_TYPE_SKIP;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
444
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
445 /* strip away comments. pretty kludgy way really.. */
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
446 for (p = line; *p != '\0'; p++) {
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
447 if (*p == '\'' || *p == '"') {
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
448 char quote = *p;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
449 for (p++; *p != quote && *p != '\0'; p++) {
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
450 if (*p == '\\' && p[1] != '\0')
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
451 p++;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
452 }
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
453 if (*p == '\0')
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
454 break;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
455 } else if (*p == '#') {
10104
5bdae566e0dc settings parser: Warn if a line has '#' character not preceded by whitespace.
Timo Sirainen <tss@iki.fi>
parents: 10046
diff changeset
456 if (!IS_WHITE(p[-1])) {
5bdae566e0dc settings parser: Warn if a line has '#' character not preceded by whitespace.
Timo Sirainen <tss@iki.fi>
parents: 10046
diff changeset
457 i_warning("Configuration file %s line %u: "
5bdae566e0dc settings parser: Warn if a line has '#' character not preceded by whitespace.
Timo Sirainen <tss@iki.fi>
parents: 10046
diff changeset
458 "Ambiguous '#' character in line, treating it as comment. "
5bdae566e0dc settings parser: Warn if a line has '#' character not preceded by whitespace.
Timo Sirainen <tss@iki.fi>
parents: 10046
diff changeset
459 "Add a space before it to remove this warning.",
5bdae566e0dc settings parser: Warn if a line has '#' character not preceded by whitespace.
Timo Sirainen <tss@iki.fi>
parents: 10046
diff changeset
460 ctx->cur_input->path,
5bdae566e0dc settings parser: Warn if a line has '#' character not preceded by whitespace.
Timo Sirainen <tss@iki.fi>
parents: 10046
diff changeset
461 ctx->cur_input->linenum);
5bdae566e0dc settings parser: Warn if a line has '#' character not preceded by whitespace.
Timo Sirainen <tss@iki.fi>
parents: 10046
diff changeset
462 }
9833
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
463 *p = '\0';
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
464 break;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
465 }
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
466 }
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
467
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
468 /* remove whitespace from end of line */
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
469 len = strlen(line);
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
470 while (IS_WHITE(line[len-1]))
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
471 len--;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
472 line[len] = '\0';
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
473
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
474 if (len > 0 && line[len-1] == '\\') {
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
475 /* continues in next line */
10426
05cfc267aa3d config parser: If line ends with '\' continuation, remove extra whitespace before it.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
476 len--;
05cfc267aa3d config parser: If line ends with '\' continuation, remove extra whitespace before it.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
477 while (IS_WHITE(line[len-1]))
05cfc267aa3d config parser: If line ends with '\' continuation, remove extra whitespace before it.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
478 len--;
05cfc267aa3d config parser: If line ends with '\' continuation, remove extra whitespace before it.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
479 str_append_n(full_line, line, len);
05cfc267aa3d config parser: If line ends with '\' continuation, remove extra whitespace before it.
Timo Sirainen <tss@iki.fi>
parents: 10422
diff changeset
480 str_append_c(full_line, ' ');
9833
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
481 return CONFIG_LINE_TYPE_SKIP;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
482 }
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
483 if (str_len(full_line) > 0) {
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
484 str_append(full_line, line);
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
485 line = str_c_modifiable(full_line);
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
486 }
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
487
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
488 /* a) key = value
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
489 b) section_type [section_name] {
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
490 c) } */
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
491 key = line;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
492 while (!IS_WHITE(*line) && *line != '\0' && *line != '=')
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
493 line++;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
494 if (IS_WHITE(*line)) {
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
495 *line++ = '\0';
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
496 while (IS_WHITE(*line)) line++;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
497 }
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
498 *key_r = key;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
499 *value_r = line;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
500
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
501 if (strcmp(key, "!include") == 0)
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
502 return CONFIG_LINE_TYPE_INCLUDE;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
503 if (strcmp(key, "!include_try") == 0)
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
504 return CONFIG_LINE_TYPE_INCLUDE_TRY;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
505
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
506 if (*line == '=') {
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
507 /* a) */
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
508 *line++ = '\0';
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
509 while (IS_WHITE(*line)) line++;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
510
10026
4442b6aa5a66 config: key="<value" shouldn't treat value as file.
Timo Sirainen <tss@iki.fi>
parents: 10024
diff changeset
511 if (*line == '<') {
4442b6aa5a66 config: key="<value" shouldn't treat value as file.
Timo Sirainen <tss@iki.fi>
parents: 10024
diff changeset
512 *value_r = line + 1;
4442b6aa5a66 config: key="<value" shouldn't treat value as file.
Timo Sirainen <tss@iki.fi>
parents: 10024
diff changeset
513 return CONFIG_LINE_TYPE_KEYFILE;
4442b6aa5a66 config: key="<value" shouldn't treat value as file.
Timo Sirainen <tss@iki.fi>
parents: 10024
diff changeset
514 }
10704
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
515 if (*line == '$') {
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
516 *value_r = line + 1;
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
517 return CONFIG_LINE_TYPE_KEYVARIABLE;
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
518 }
10026
4442b6aa5a66 config: key="<value" shouldn't treat value as file.
Timo Sirainen <tss@iki.fi>
parents: 10024
diff changeset
519
9833
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
520 len = strlen(line);
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
521 if (len > 0 &&
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
522 ((*line == '"' && line[len-1] == '"') ||
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
523 (*line == '\'' && line[len-1] == '\''))) {
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
524 line[len-1] = '\0';
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
525 line = str_unescape(line+1);
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
526 }
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
527 *value_r = line;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
528 return CONFIG_LINE_TYPE_KEYVALUE;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
529 }
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
530
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
531 if (strcmp(key, "}") == 0 && *line == '\0')
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
532 return CONFIG_LINE_TYPE_SECTION_END;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
533
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
534 /* b) + errors */
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
535 line[-1] = '\0';
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
536
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
537 if (*line == '{')
9856
6103d925e018 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9846
diff changeset
538 *value_r = "";
9833
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
539 else {
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
540 /* get section name */
9856
6103d925e018 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9846
diff changeset
541 *value_r = line;
9833
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
542 while (!IS_WHITE(*line) && *line != '\0')
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
543 line++;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
544
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
545 if (*line != '\0') {
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
546 *line++ = '\0';
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
547 while (IS_WHITE(*line))
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
548 line++;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
549 }
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
550 if (*line != '{') {
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
551 *value_r = "Expecting '='";
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
552 return CONFIG_LINE_TYPE_ERROR;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
553 }
9856
6103d925e018 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9846
diff changeset
554 if (line[1] != '\0') {
6103d925e018 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9846
diff changeset
555 *value_r = "Garbage after '{'";
6103d925e018 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9846
diff changeset
556 return CONFIG_LINE_TYPE_ERROR;
6103d925e018 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9846
diff changeset
557 }
9833
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
558 }
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
559 return CONFIG_LINE_TYPE_SECTION_BEGIN;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
560 }
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
561
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
562 static int config_parse_finish(struct config_parser_context *ctx, const char **error_r)
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
563 {
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
564 struct config_filter_context *new_filter;
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
565 const char *error;
10569
b01b9eff1f15 doveconf: Dump config to stdout even when there are errors, just show them afterwards.
Timo Sirainen <tss@iki.fi>
parents: 10426
diff changeset
566 int ret;
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
567
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
568 new_filter = config_filter_init(ctx->pool);
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
569 (void)array_append_space(&ctx->all_parsers);
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
570 config_filter_add_all(new_filter, array_idx(&ctx->all_parsers, 0));
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
571
10569
b01b9eff1f15 doveconf: Dump config to stdout even when there are errors, just show them afterwards.
Timo Sirainen <tss@iki.fi>
parents: 10426
diff changeset
572 if ((ret = config_all_parsers_check(ctx, new_filter, &error)) < 0) {
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
573 *error_r = t_strdup_printf("Error in configuration file %s: %s",
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
574 ctx->path, error);
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
575 }
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
576
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
577 if (config_filter != NULL)
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
578 config_filter_deinit(&config_filter);
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
579 config_module_parsers = ctx->root_parsers;
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
580 config_filter = new_filter;
10569
b01b9eff1f15 doveconf: Dump config to stdout even when there are errors, just show them afterwards.
Timo Sirainen <tss@iki.fi>
parents: 10426
diff changeset
581 return ret;
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
582 }
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
583
10704
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
584 static const void *
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
585 config_get_value(struct config_parser_context *ctx, const char *key,
10704
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
586 enum setting_type *type_r)
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
587 {
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
588 struct config_module_parser *l;
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
589 const void *value;
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
590
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
591 for (l = ctx->cur_section->parsers; l->root != NULL; l++) {
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
592 value = settings_parse_get_value(l->parser, key, type_r);
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
593 if (value != NULL)
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
594 return value;
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
595 }
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
596 return NULL;
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
597 }
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
598
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
599 static int config_write_value(struct config_parser_context *ctx,
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
600 enum config_line_type type,
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
601 const char *key, const char *value)
10704
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
602 {
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
603 string_t *str = ctx->str;
10820
4b744015a8ae config: Allow key=$var to contain other text after the $var.
Timo Sirainen <tss@iki.fi>
parents: 10793
diff changeset
604 const void *var_name, *var_value, *p;
10704
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
605 enum setting_type var_type;
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
606 const char *error;
10704
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
607 bool dump;
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
608
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
609 switch (type) {
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
610 case CONFIG_LINE_TYPE_KEYVALUE:
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
611 str_append(str, value);
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
612 break;
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
613 case CONFIG_LINE_TYPE_KEYFILE:
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
614 if (!ctx->expand_values) {
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
615 str_append_c(str, '<');
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
616 str_append(str, value);
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
617 } else {
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
618 if (str_append_file(str, key, value, &error) < 0) {
10704
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
619 /* file reading failed */
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
620 ctx->error = p_strdup(ctx->pool, error);
10704
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
621 return -1;
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
622 }
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
623 }
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
624 break;
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
625 case CONFIG_LINE_TYPE_KEYVARIABLE:
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
626 if (!ctx->expand_values) {
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
627 str_append_c(str, '$');
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
628 str_append(str, value);
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
629 } else {
10820
4b744015a8ae config: Allow key=$var to contain other text after the $var.
Timo Sirainen <tss@iki.fi>
parents: 10793
diff changeset
630 p = strchr(value, ' ');
4b744015a8ae config: Allow key=$var to contain other text after the $var.
Timo Sirainen <tss@iki.fi>
parents: 10793
diff changeset
631 if (p == NULL)
4b744015a8ae config: Allow key=$var to contain other text after the $var.
Timo Sirainen <tss@iki.fi>
parents: 10793
diff changeset
632 var_name = value;
4b744015a8ae config: Allow key=$var to contain other text after the $var.
Timo Sirainen <tss@iki.fi>
parents: 10793
diff changeset
633 else
4b744015a8ae config: Allow key=$var to contain other text after the $var.
Timo Sirainen <tss@iki.fi>
parents: 10793
diff changeset
634 var_name = t_strdup_until(value, p);
4b744015a8ae config: Allow key=$var to contain other text after the $var.
Timo Sirainen <tss@iki.fi>
parents: 10793
diff changeset
635
4b744015a8ae config: Allow key=$var to contain other text after the $var.
Timo Sirainen <tss@iki.fi>
parents: 10793
diff changeset
636 var_value = config_get_value(ctx, var_name, &var_type);
10704
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
637 if (var_value == NULL) {
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
638 ctx->error = p_strconcat(ctx->pool,
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
639 "Unknown variable: $",
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
640 var_name, NULL);
10704
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
641 return -1;
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
642 }
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
643 if (!config_export_type(str, var_value, NULL,
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
644 var_type, TRUE, &dump)) {
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
645 ctx->error = p_strconcat(ctx->pool,
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
646 "Invalid variable: $",
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
647 var_name, NULL);
10704
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
648 return -1;
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
649 }
10820
4b744015a8ae config: Allow key=$var to contain other text after the $var.
Timo Sirainen <tss@iki.fi>
parents: 10793
diff changeset
650 if (p != NULL)
4b744015a8ae config: Allow key=$var to contain other text after the $var.
Timo Sirainen <tss@iki.fi>
parents: 10793
diff changeset
651 str_append(str, p);
10704
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
652 }
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
653 break;
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
654 default:
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
655 i_unreached();
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
656 }
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
657 return 0;
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
658 }
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
659
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
660 void config_parser_apply_line(struct config_parser_context *ctx,
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
661 enum config_line_type type,
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
662 const char *key, const char *value)
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
663 {
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
664 const char *section_name;
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
665
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
666 str_truncate(ctx->str, ctx->pathlen);
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
667 switch (type) {
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
668 case CONFIG_LINE_TYPE_SKIP:
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
669 break;
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
670 case CONFIG_LINE_TYPE_ERROR:
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
671 ctx->error = p_strdup(ctx->pool, value);
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
672 break;
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
673 case CONFIG_LINE_TYPE_KEYVALUE:
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
674 case CONFIG_LINE_TYPE_KEYFILE:
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
675 case CONFIG_LINE_TYPE_KEYVARIABLE:
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
676 str_append(ctx->str, key);
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
677 str_append_c(ctx->str, '=');
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
678
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
679 if (config_write_value(ctx, type, key, value) < 0)
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
680 break;
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
681 (void)config_apply_line(ctx, key, str_c(ctx->str), NULL);
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
682 break;
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
683 case CONFIG_LINE_TYPE_SECTION_BEGIN:
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
684 ctx->cur_section = config_add_new_section(ctx);
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
685 ctx->cur_section->pathlen = ctx->pathlen;
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
686
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
687 if (config_filter_add_new_filter(ctx, key, value)) {
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
688 /* new filter */
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
689 break;
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
690 }
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
691
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
692 /* new config section */
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
693 if (*value == '\0') {
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
694 /* no section name, use a counter */
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
695 section_name = dec2str(ctx->section_counter++);
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
696 } else {
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
697 section_name = settings_section_escape(value);
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
698 }
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
699 str_append(ctx->str, key);
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
700 ctx->pathlen = str_len(ctx->str);
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
701
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
702 str_append_c(ctx->str, '=');
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
703 str_append(ctx->str, section_name);
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
704
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
705 if (config_apply_line(ctx, key, str_c(ctx->str), value) < 0)
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
706 break;
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
707
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
708 str_truncate(ctx->str, ctx->pathlen);
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
709 str_append_c(ctx->str, SETTINGS_SEPARATOR);
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
710 str_append(ctx->str, section_name);
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
711 str_append_c(ctx->str, SETTINGS_SEPARATOR);
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
712 ctx->pathlen = str_len(ctx->str);
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
713 break;
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
714 case CONFIG_LINE_TYPE_SECTION_END:
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
715 if (ctx->cur_section->prev == NULL)
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
716 ctx->error = "Unexpected '}'";
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
717 else {
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
718 ctx->pathlen = ctx->cur_section->pathlen;
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
719 ctx->cur_section = ctx->cur_section->prev;
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
720 }
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
721 break;
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
722 case CONFIG_LINE_TYPE_INCLUDE:
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
723 case CONFIG_LINE_TYPE_INCLUDE_TRY:
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
724 (void)settings_include(ctx, fix_relative_path(value, ctx->cur_input),
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
725 type == CONFIG_LINE_TYPE_INCLUDE_TRY);
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
726 break;
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
727 }
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
728 }
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
729
10704
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
730 int config_parse_file(const char *path, bool expand_values,
9793
d7ccdbb58a03 config: If master module requests configuration, reread it before replying.
Timo Sirainen <tss@iki.fi>
parents: 9676
diff changeset
731 const char **error_r)
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
732 {
9669
6cc6913fee1c dovecot.conf: Added support for !include globs.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
733 struct input_stack root;
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
734 struct config_parser_context ctx;
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
735 unsigned int i, count;
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
736 const char *key, *value;
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
737 string_t *full_line;
9833
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
738 enum config_line_type type;
a0ec16185806 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9821
diff changeset
739 char *line;
9793
d7ccdbb58a03 config: If master module requests configuration, reread it before replying.
Timo Sirainen <tss@iki.fi>
parents: 9676
diff changeset
740 int fd, ret = 0;
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
741
9793
d7ccdbb58a03 config: If master module requests configuration, reread it before replying.
Timo Sirainen <tss@iki.fi>
parents: 9676
diff changeset
742 fd = open(path, O_RDONLY);
d7ccdbb58a03 config: If master module requests configuration, reread it before replying.
Timo Sirainen <tss@iki.fi>
parents: 9676
diff changeset
743 if (fd < 0) {
d7ccdbb58a03 config: If master module requests configuration, reread it before replying.
Timo Sirainen <tss@iki.fi>
parents: 9676
diff changeset
744 *error_r = t_strdup_printf("open(%s) failed: %m", path);
9842
e95135898a3c Split dovecot-example.conf to multiple files. Also it's now installed under docdir.
Timo Sirainen <tss@iki.fi>
parents: 9834
diff changeset
745 return 0;
9793
d7ccdbb58a03 config: If master module requests configuration, reread it before replying.
Timo Sirainen <tss@iki.fi>
parents: 9676
diff changeset
746 }
d7ccdbb58a03 config: If master module requests configuration, reread it before replying.
Timo Sirainen <tss@iki.fi>
parents: 9676
diff changeset
747
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
748 memset(&ctx, 0, sizeof(ctx));
9532
29733d23d903 Increased some initial memory pool sizes.
Timo Sirainen <tss@iki.fi>
parents: 9274
diff changeset
749 ctx.pool = pool_alloconly_create("config file parser", 1024*64);
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
750 ctx.path = path;
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
751
10107
dcda7c495eb6 struct setting_parser_info now specifies the module name.
Timo Sirainen <tss@iki.fi>
parents: 10104
diff changeset
752 for (count = 0; all_roots[count] != NULL; count++) ;
9793
d7ccdbb58a03 config: If master module requests configuration, reread it before replying.
Timo Sirainen <tss@iki.fi>
parents: 9676
diff changeset
753 ctx.root_parsers =
9856
6103d925e018 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9846
diff changeset
754 p_new(ctx.pool, struct config_module_parser, count+1);
9793
d7ccdbb58a03 config: If master module requests configuration, reread it before replying.
Timo Sirainen <tss@iki.fi>
parents: 9676
diff changeset
755 for (i = 0; i < count; i++) {
10107
dcda7c495eb6 struct setting_parser_info now specifies the module name.
Timo Sirainen <tss@iki.fi>
parents: 10104
diff changeset
756 ctx.root_parsers[i].root = all_roots[i];
9793
d7ccdbb58a03 config: If master module requests configuration, reread it before replying.
Timo Sirainen <tss@iki.fi>
parents: 9676
diff changeset
757 ctx.root_parsers[i].parser =
10107
dcda7c495eb6 struct setting_parser_info now specifies the module name.
Timo Sirainen <tss@iki.fi>
parents: 10104
diff changeset
758 settings_parser_init(ctx.pool, all_roots[i],
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
759 settings_parser_flags);
9793
d7ccdbb58a03 config: If master module requests configuration, reread it before replying.
Timo Sirainen <tss@iki.fi>
parents: 9676
diff changeset
760 }
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
761
9862
864693ced870 config: When we detect a conflict, log where in config it came from.
Timo Sirainen <tss@iki.fi>
parents: 9860
diff changeset
762 memset(&root, 0, sizeof(root));
864693ced870 config: When we detect a conflict, log where in config it came from.
Timo Sirainen <tss@iki.fi>
parents: 9860
diff changeset
763 root.path = path;
864693ced870 config: When we detect a conflict, log where in config it came from.
Timo Sirainen <tss@iki.fi>
parents: 9860
diff changeset
764 ctx.cur_input = &root;
10704
c26002b81f57 config: $setting as value returns the setting's current value.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
765 ctx.expand_values = expand_values;
9862
864693ced870 config: When we detect a conflict, log where in config it came from.
Timo Sirainen <tss@iki.fi>
parents: 9860
diff changeset
766
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
767 p_array_init(&ctx.all_parsers, ctx.pool, 128);
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
768 ctx.cur_section = p_new(ctx.pool, struct config_section_stack, 1);
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
769 config_add_new_parser(&ctx);
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
770
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
771 ctx.str = str_new(ctx.pool, 256);
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
772 full_line = t_str_new(512);
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
773 ctx.cur_input->input = i_stream_create_fd(fd, (size_t)-1, TRUE);
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
774 i_stream_set_return_partial_line(ctx.cur_input->input, TRUE);
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
775 old_settings_init(&ctx);
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
776
9007
06015880f4c7 config: Support !include and !include_try.
Timo Sirainen <tss@iki.fi>
parents: 9002
diff changeset
777 prevfile:
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
778 while ((line = i_stream_read_next_line(ctx.cur_input->input)) != NULL) {
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
779 ctx.cur_input->linenum++;
10104
5bdae566e0dc settings parser: Warn if a line has '#' character not preceded by whitespace.
Timo Sirainen <tss@iki.fi>
parents: 10046
diff changeset
780 type = config_parse_line(&ctx, line, full_line,
9856
6103d925e018 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9846
diff changeset
781 &key, &value);
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
782 str_truncate(ctx.str, ctx.pathlen);
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
783
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
784 if (!old_settings_handle(&ctx, type, key, value))
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
785 config_parser_apply_line(&ctx, type, key, value);
9856
6103d925e018 config: Code cleanups.
Timo Sirainen <tss@iki.fi>
parents: 9846
diff changeset
786
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
787 if (ctx.error != NULL) {
9793
d7ccdbb58a03 config: If master module requests configuration, reread it before replying.
Timo Sirainen <tss@iki.fi>
parents: 9676
diff changeset
788 *error_r = t_strdup_printf(
d7ccdbb58a03 config: If master module requests configuration, reread it before replying.
Timo Sirainen <tss@iki.fi>
parents: 9676
diff changeset
789 "Error in configuration file %s line %d: %s",
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
790 ctx.cur_input->path, ctx.cur_input->linenum,
10874
3a575415ce1a config: Added support for reading v1.2 config files.
Timo Sirainen <tss@iki.fi>
parents: 10820
diff changeset
791 ctx.error);
10569
b01b9eff1f15 doveconf: Dump config to stdout even when there are errors, just show them afterwards.
Timo Sirainen <tss@iki.fi>
parents: 10426
diff changeset
792 ret = -2;
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
793 break;
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
794 }
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
795 str_truncate(full_line, 0);
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
796 }
9007
06015880f4c7 config: Support !include and !include_try.
Timo Sirainen <tss@iki.fi>
parents: 9002
diff changeset
797
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
798 i_stream_destroy(&ctx.cur_input->input);
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
799 ctx.cur_input = ctx.cur_input->prev;
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9247
diff changeset
800 if (line == NULL && ctx.cur_input != NULL)
9007
06015880f4c7 config: Support !include and !include_try.
Timo Sirainen <tss@iki.fi>
parents: 9002
diff changeset
801 goto prevfile;
06015880f4c7 config: Support !include and !include_try.
Timo Sirainen <tss@iki.fi>
parents: 9002
diff changeset
802
9859
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
803 if (ret == 0)
f9ca1a1ebcf8 config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents: 9856
diff changeset
804 ret = config_parse_finish(&ctx, error_r);
10577
3117e9f35e45 doveconf: If config parsing fails, don't crash.
Timo Sirainen <tss@iki.fi>
parents: 10570
diff changeset
805 return ret < 0 ? ret : 1;
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
806 }
10181
4dc080520769 config: Added support for dynamically loaded settings.
Timo Sirainen <tss@iki.fi>
parents: 10179
diff changeset
807
4dc080520769 config: Added support for dynamically loaded settings.
Timo Sirainen <tss@iki.fi>
parents: 10179
diff changeset
808 void config_parse_load_modules(void)
4dc080520769 config: Added support for dynamically loaded settings.
Timo Sirainen <tss@iki.fi>
parents: 10179
diff changeset
809 {
10422
55c42d2f7002 module_dir_load*() API changed to take settings struct, with debug field.
Timo Sirainen <tss@iki.fi>
parents: 10406
diff changeset
810 struct module_dir_load_settings mod_set;
10181
4dc080520769 config: Added support for dynamically loaded settings.
Timo Sirainen <tss@iki.fi>
parents: 10179
diff changeset
811 struct module *modules, *m;
4dc080520769 config: Added support for dynamically loaded settings.
Timo Sirainen <tss@iki.fi>
parents: 10179
diff changeset
812 const struct setting_parser_info **roots;
4dc080520769 config: Added support for dynamically loaded settings.
Timo Sirainen <tss@iki.fi>
parents: 10179
diff changeset
813 ARRAY_DEFINE(new_roots, const struct setting_parser_info *);
10336
e18645b47984 config: Allow settings plugins to specify also new default services.
Timo Sirainen <tss@iki.fi>
parents: 10220
diff changeset
814 ARRAY_TYPE(service_settings) new_services;
e18645b47984 config: Allow settings plugins to specify also new default services.
Timo Sirainen <tss@iki.fi>
parents: 10220
diff changeset
815 struct service_settings *const *services, *service_set;
e18645b47984 config: Allow settings plugins to specify also new default services.
Timo Sirainen <tss@iki.fi>
parents: 10220
diff changeset
816 unsigned int i, count;
10181
4dc080520769 config: Added support for dynamically loaded settings.
Timo Sirainen <tss@iki.fi>
parents: 10179
diff changeset
817
10422
55c42d2f7002 module_dir_load*() API changed to take settings struct, with debug field.
Timo Sirainen <tss@iki.fi>
parents: 10406
diff changeset
818 memset(&mod_set, 0, sizeof(mod_set));
55c42d2f7002 module_dir_load*() API changed to take settings struct, with debug field.
Timo Sirainen <tss@iki.fi>
parents: 10406
diff changeset
819 modules = module_dir_load(CONFIG_MODULE_DIR, NULL, &mod_set);
10181
4dc080520769 config: Added support for dynamically loaded settings.
Timo Sirainen <tss@iki.fi>
parents: 10179
diff changeset
820 module_dir_init(modules);
4dc080520769 config: Added support for dynamically loaded settings.
Timo Sirainen <tss@iki.fi>
parents: 10179
diff changeset
821
4dc080520769 config: Added support for dynamically loaded settings.
Timo Sirainen <tss@iki.fi>
parents: 10179
diff changeset
822 i_array_init(&new_roots, 64);
10336
e18645b47984 config: Allow settings plugins to specify also new default services.
Timo Sirainen <tss@iki.fi>
parents: 10220
diff changeset
823 i_array_init(&new_services, 64);
10181
4dc080520769 config: Added support for dynamically loaded settings.
Timo Sirainen <tss@iki.fi>
parents: 10179
diff changeset
824 for (m = modules; m != NULL; m = m->next) {
10336
e18645b47984 config: Allow settings plugins to specify also new default services.
Timo Sirainen <tss@iki.fi>
parents: 10220
diff changeset
825 roots = module_get_symbol_quiet(m,
10181
4dc080520769 config: Added support for dynamically loaded settings.
Timo Sirainen <tss@iki.fi>
parents: 10179
diff changeset
826 t_strdup_printf("%s_set_roots", m->name));
4dc080520769 config: Added support for dynamically loaded settings.
Timo Sirainen <tss@iki.fi>
parents: 10179
diff changeset
827 if (roots != NULL) {
4dc080520769 config: Added support for dynamically loaded settings.
Timo Sirainen <tss@iki.fi>
parents: 10179
diff changeset
828 for (i = 0; roots[i] != NULL; i++)
4dc080520769 config: Added support for dynamically loaded settings.
Timo Sirainen <tss@iki.fi>
parents: 10179
diff changeset
829 array_append(&new_roots, &roots[i], 1);
4dc080520769 config: Added support for dynamically loaded settings.
Timo Sirainen <tss@iki.fi>
parents: 10179
diff changeset
830 }
10336
e18645b47984 config: Allow settings plugins to specify also new default services.
Timo Sirainen <tss@iki.fi>
parents: 10220
diff changeset
831
e18645b47984 config: Allow settings plugins to specify also new default services.
Timo Sirainen <tss@iki.fi>
parents: 10220
diff changeset
832 service_set = module_get_symbol_quiet(m,
e18645b47984 config: Allow settings plugins to specify also new default services.
Timo Sirainen <tss@iki.fi>
parents: 10220
diff changeset
833 t_strdup_printf("%s_service_settings", m->name));
e18645b47984 config: Allow settings plugins to specify also new default services.
Timo Sirainen <tss@iki.fi>
parents: 10220
diff changeset
834 if (service_set != NULL)
e18645b47984 config: Allow settings plugins to specify also new default services.
Timo Sirainen <tss@iki.fi>
parents: 10220
diff changeset
835 array_append(&new_services, &service_set, 1);
10181
4dc080520769 config: Added support for dynamically loaded settings.
Timo Sirainen <tss@iki.fi>
parents: 10179
diff changeset
836 }
4dc080520769 config: Added support for dynamically loaded settings.
Timo Sirainen <tss@iki.fi>
parents: 10179
diff changeset
837 if (array_count(&new_roots) > 0) {
4dc080520769 config: Added support for dynamically loaded settings.
Timo Sirainen <tss@iki.fi>
parents: 10179
diff changeset
838 /* modules added new settings. add the defaults and start
4dc080520769 config: Added support for dynamically loaded settings.
Timo Sirainen <tss@iki.fi>
parents: 10179
diff changeset
839 using the new list. */
4dc080520769 config: Added support for dynamically loaded settings.
Timo Sirainen <tss@iki.fi>
parents: 10179
diff changeset
840 for (i = 0; all_roots[i] != NULL; i++)
4dc080520769 config: Added support for dynamically loaded settings.
Timo Sirainen <tss@iki.fi>
parents: 10179
diff changeset
841 array_append(&new_roots, &all_roots[i], 1);
4dc080520769 config: Added support for dynamically loaded settings.
Timo Sirainen <tss@iki.fi>
parents: 10179
diff changeset
842 (void)array_append_space(&new_roots);
4dc080520769 config: Added support for dynamically loaded settings.
Timo Sirainen <tss@iki.fi>
parents: 10179
diff changeset
843 all_roots = array_idx(&new_roots, 0);
4dc080520769 config: Added support for dynamically loaded settings.
Timo Sirainen <tss@iki.fi>
parents: 10179
diff changeset
844 }
10336
e18645b47984 config: Allow settings plugins to specify also new default services.
Timo Sirainen <tss@iki.fi>
parents: 10220
diff changeset
845 if (array_count(&new_services) > 0) {
e18645b47984 config: Allow settings plugins to specify also new default services.
Timo Sirainen <tss@iki.fi>
parents: 10220
diff changeset
846 /* module added new services. update the defaults. */
e18645b47984 config: Allow settings plugins to specify also new default services.
Timo Sirainen <tss@iki.fi>
parents: 10220
diff changeset
847 services = array_get(default_services, &count);
e18645b47984 config: Allow settings plugins to specify also new default services.
Timo Sirainen <tss@iki.fi>
parents: 10220
diff changeset
848 for (i = 0; i < count; i++)
e18645b47984 config: Allow settings plugins to specify also new default services.
Timo Sirainen <tss@iki.fi>
parents: 10220
diff changeset
849 array_append(&new_services, &services[i], 1);
e18645b47984 config: Allow settings plugins to specify also new default services.
Timo Sirainen <tss@iki.fi>
parents: 10220
diff changeset
850 *default_services = new_services;
e18645b47984 config: Allow settings plugins to specify also new default services.
Timo Sirainen <tss@iki.fi>
parents: 10220
diff changeset
851 }
10181
4dc080520769 config: Added support for dynamically loaded settings.
Timo Sirainen <tss@iki.fi>
parents: 10179
diff changeset
852 }
10952
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
853
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
854 static bool parsers_are_connected(const struct setting_parser_info *root,
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
855 const struct setting_parser_info *info)
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
856 {
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
857 const struct setting_parser_info *p;
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
858 const struct setting_parser_info *const *dep;
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
859
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
860 /* we're trying to find info or its parents from root's dependencies. */
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
861
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
862 for (p = info; p != NULL; p = p->parent) {
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
863 if (p == root)
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
864 return TRUE;
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
865 }
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
866
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
867 if (root->dependencies != NULL) {
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
868 for (dep = root->dependencies; *dep != NULL; dep++) {
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
869 if (parsers_are_connected(*dep, info))
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
870 return TRUE;
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
871 }
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
872 }
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
873 return FALSE;
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
874 }
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
875
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
876 bool config_module_want_parser(const char *module,
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
877 const struct setting_parser_info *root)
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
878 {
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
879 struct config_module_parser *l;
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
880
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
881 if (strcmp(root->module_name, module) == 0)
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
882 return TRUE;
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
883 if (root == &master_service_setting_parser_info) {
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
884 /* everyone wants master service settings */
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
885 return TRUE;
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
886 }
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
887
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
888 for (l = config_module_parsers; l->root != NULL; l++) {
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
889 if (strcmp(l->root->module_name, module) != 0)
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
890 continue;
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
891
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
892 /* see if we can find a way to get from the original parser
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
893 to this parser */
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
894 if (parsers_are_connected(l->root, root))
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
895 return TRUE;
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
896 }
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
897 return FALSE;
30e2d65eb67a config: Send client a services names that have more specific settings.
Timo Sirainen <tss@iki.fi>
parents: 10874
diff changeset
898 }