Mercurial > dovecot > core-2.2
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 |
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 | 2 |
3 #include "lib.h" | |
4 #include "array.h" | |
5 #include "str.h" | |
6 #include "hash.h" | |
7 #include "strescape.h" | |
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 | 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 | 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 | 19 #include <unistd.h> |
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 | 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 | 29 #define IS_WHITE(c) ((c) == ' ' || (c) == '\t') |
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 | 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 | 38 static const char *info_type_name_find(const struct setting_parser_info *info) |
39 { | |
40 unsigned int i; | |
41 | |
42 for (i = 0; info->defines[i].key != NULL; i++) { | |
43 if (info->defines[i].offset == info->type_offset) | |
44 return info->defines[i].key; | |
45 } | |
46 i_panic("setting parser: Invalid type_offset value"); | |
47 return NULL; | |
48 } | |
49 | |
9247 | 50 static void config_add_type(struct setting_parser_context *parser, |
51 const char *line, const char *section_name) | |
52 { | |
53 const struct setting_parser_info *info; | |
54 const char *p; | |
55 string_t *str; | |
56 int ret; | |
57 | |
58 info = settings_parse_get_prev_info(parser); | |
59 if (info->type_offset == (size_t)-1) | |
60 return; | |
61 | |
62 str = t_str_new(256); | |
63 p = strchr(line, '='); | |
64 str_append_n(str, line, p-line); | |
65 str_append_c(str, SETTINGS_SEPARATOR); | |
66 str_append(str, p+1); | |
67 str_append_c(str, SETTINGS_SEPARATOR); | |
68 str_append(str, info_type_name_find(info)); | |
69 str_append_c(str, '='); | |
70 str_append(str, section_name); | |
71 | |
72 ret = settings_parse_line(parser, str_c(str)); | |
73 i_assert(ret > 0); | |
74 } | |
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 | 78 { |
9856 | 79 struct config_module_parser *l; |
9247 | 80 bool found = FALSE; |
81 int ret; | |
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 | 84 ret = settings_parse_line(l->parser, line); |
85 if (ret > 0) { | |
86 found = TRUE; | |
87 if (section_name != NULL) | |
88 config_add_type(l->parser, line, section_name); | |
9833 | 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 | 91 return -1; |
92 } | |
9247 | 93 } |
9833 | 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 | 97 return -1; |
98 } | |
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 | 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 | 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 | 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 | 142 if (ctx->cur_input->linenum == 0) { |
143 parser->file_and_line = | |
144 p_strdup(ctx->pool, ctx->cur_input->path); | |
145 } else { | |
146 parser->file_and_line = | |
147 p_strdup_printf(ctx->pool, "%s:%d", | |
148 ctx->cur_input->path, | |
149 ctx->cur_input->linenum); | |
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 | 176 array_foreach(&ctx->all_parsers, parsers) { |
177 struct config_filter_parser *parser = *parsers; | |
178 | |
179 if (config_filters_equal(&parser->filter, filter)) | |
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 | 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 | 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 | 227 |
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 | 261 } else { |
262 return FALSE; | |
263 } | |
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 | 270 return TRUE; |
271 } | |
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 | 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 | 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 | 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 | 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 | 309 } |
9859
f9ca1a1ebcf8
config: Several fixes. Now per-ip settings work properly.
Timo Sirainen <tss@iki.fi>
parents:
9856
diff
changeset
|
310 |
9881 | 311 ret = config_filter_parser_check(ctx, tmp_parsers, error_r); |
312 config_filter_parsers_free(tmp_parsers); | |
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 | 315 pool_unref(&tmp_pool); |
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 | 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 | 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 | 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 | 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 | 427 { |
428 const char *key; | |
429 unsigned int len; | |
430 char *p; | |
431 | |
432 *key_r = NULL; | |
433 *value_r = NULL; | |
434 | |
435 /* @UNSAFE: line is modified */ | |
436 | |
437 /* skip whitespace */ | |
438 while (IS_WHITE(*line)) | |
439 line++; | |
440 | |
441 /* ignore comments or empty lines */ | |
442 if (*line == '#' || *line == '\0') | |
443 return CONFIG_LINE_TYPE_SKIP; | |
444 | |
445 /* strip away comments. pretty kludgy way really.. */ | |
446 for (p = line; *p != '\0'; p++) { | |
447 if (*p == '\'' || *p == '"') { | |
448 char quote = *p; | |
449 for (p++; *p != quote && *p != '\0'; p++) { | |
450 if (*p == '\\' && p[1] != '\0') | |
451 p++; | |
452 } | |
453 if (*p == '\0') | |
454 break; | |
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 | 463 *p = '\0'; |
464 break; | |
465 } | |
466 } | |
467 | |
468 /* remove whitespace from end of line */ | |
469 len = strlen(line); | |
470 while (IS_WHITE(line[len-1])) | |
471 len--; | |
472 line[len] = '\0'; | |
473 | |
474 if (len > 0 && line[len-1] == '\\') { | |
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 | 481 return CONFIG_LINE_TYPE_SKIP; |
482 } | |
483 if (str_len(full_line) > 0) { | |
484 str_append(full_line, line); | |
485 line = str_c_modifiable(full_line); | |
486 } | |
487 | |
488 /* a) key = value | |
489 b) section_type [section_name] { | |
490 c) } */ | |
491 key = line; | |
492 while (!IS_WHITE(*line) && *line != '\0' && *line != '=') | |
493 line++; | |
494 if (IS_WHITE(*line)) { | |
495 *line++ = '\0'; | |
496 while (IS_WHITE(*line)) line++; | |
497 } | |
498 *key_r = key; | |
499 *value_r = line; | |
500 | |
501 if (strcmp(key, "!include") == 0) | |
502 return CONFIG_LINE_TYPE_INCLUDE; | |
503 if (strcmp(key, "!include_try") == 0) | |
504 return CONFIG_LINE_TYPE_INCLUDE_TRY; | |
505 | |
506 if (*line == '=') { | |
507 /* a) */ | |
508 *line++ = '\0'; | |
509 while (IS_WHITE(*line)) line++; | |
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 | 520 len = strlen(line); |
521 if (len > 0 && | |
522 ((*line == '"' && line[len-1] == '"') || | |
523 (*line == '\'' && line[len-1] == '\''))) { | |
524 line[len-1] = '\0'; | |
525 line = str_unescape(line+1); | |
526 } | |
527 *value_r = line; | |
528 return CONFIG_LINE_TYPE_KEYVALUE; | |
529 } | |
530 | |
531 if (strcmp(key, "}") == 0 && *line == '\0') | |
532 return CONFIG_LINE_TYPE_SECTION_END; | |
533 | |
534 /* b) + errors */ | |
535 line[-1] = '\0'; | |
536 | |
537 if (*line == '{') | |
9856 | 538 *value_r = ""; |
9833 | 539 else { |
540 /* get section name */ | |
9856 | 541 *value_r = line; |
9833 | 542 while (!IS_WHITE(*line) && *line != '\0') |
543 line++; | |
544 | |
545 if (*line != '\0') { | |
546 *line++ = '\0'; | |
547 while (IS_WHITE(*line)) | |
548 line++; | |
549 } | |
550 if (*line != '{') { | |
551 *value_r = "Expecting '='"; | |
552 return CONFIG_LINE_TYPE_ERROR; | |
553 } | |
9856 | 554 if (line[1] != '\0') { |
555 *value_r = "Garbage after '{'"; | |
556 return CONFIG_LINE_TYPE_ERROR; | |
557 } | |
9833 | 558 } |
559 return CONFIG_LINE_TYPE_SECTION_BEGIN; | |
560 } | |
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 | 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 | 738 enum config_line_type type; |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 793 break; |
794 } | |
795 str_truncate(full_line, 0); | |
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 | 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 } |