Implemented hosts_avoid_pipelining in the smtp transport.
[exim.git] / src / src / readconf.c
CommitLineData
0e22dfd1 1/* $Cambridge: exim/src/src/readconf.c,v 1.29 2007/02/06 11:11:40 ph10 Exp $ */
059ec3d9
PH
2
3/*************************************************
4* Exim - an Internet mail transport agent *
5*************************************************/
6
184e8823 7/* Copyright (c) University of Cambridge 1995 - 2007 */
059ec3d9
PH
8/* See the file NOTICE for conditions of use and distribution. */
9
10/* Functions for reading the configuration file, and for displaying
11overall configuration values. Thanks to Brian Candler for the original
12implementation of the conditional .ifdef etc. */
13
14#include "exim.h"
15
16#define CSTATE_STACK_SIZE 10
17
18
19/* Structure for chain (stack) of .included files */
20
21typedef struct config_file_item {
22 struct config_file_item *next;
23 uschar *filename;
24 FILE *file;
25 int lineno;
26} config_file_item;
27
28/* Structure of table of conditional words and their state transitions */
29
30typedef struct cond_item {
31 uschar *name;
32 int namelen;
33 int action1;
34 int action2;
35 int pushpop;
36} cond_item;
37
38/* Structure of table of syslog facility names and values */
39
40typedef struct syslog_fac_item {
41 uschar *name;
42 int value;
43} syslog_fac_item;
44
45
46/* Static variables */
47
48static config_file_item *config_file_stack = NULL; /* For includes */
49
50static uschar *syslog_facility_str = NULL;
51static uschar next_section[24];
52static uschar time_buffer[24];
53
54/* State variables for conditional loading (.ifdef / .else / .endif) */
55
56static int cstate = 0;
57static int cstate_stack_ptr = -1;
58static int cstate_stack[CSTATE_STACK_SIZE];
59
60/* Table of state transitions for handling conditional inclusions. There are
61four possible state transitions:
62
63 .ifdef true
64 .ifdef false
65 .elifdef true (or .else)
66 .elifdef false
67
68.endif just causes the previous cstate to be popped off the stack */
69
70static int next_cstate[3][4] =
71 {
72 /* State 0: reading from file, or reading until next .else or .endif */
73 { 0, 1, 2, 2 },
74 /* State 1: condition failed, skipping until next .else or .endif */
75 { 2, 2, 0, 1 },
76 /* State 2: skipping until .endif */
77 { 2, 2, 2, 2 },
78 };
79
80/* Table of conditionals and the states to set. For each name, there are four
81values: the length of the name (to save computing it each time), the state to
82set if a macro was found in the line, the state to set if a macro was not found
83in the line, and a stack manipulation setting which is:
84
85 -1 pull state value off the stack
86 0 don't alter the stack
87 +1 push value onto stack, before setting new state
88*/
89
90static cond_item cond_list[] = {
91 { US"ifdef", 5, 0, 1, 1 },
92 { US"ifndef", 6, 1, 0, 1 },
93 { US"elifdef", 7, 2, 3, 0 },
94 { US"elifndef", 8, 3, 2, 0 },
95 { US"else", 4, 2, 2, 0 },
96 { US"endif", 5, 0, 0, -1 }
97};
98
99static int cond_list_size = sizeof(cond_list)/sizeof(cond_item);
100
101/* Table of syslog facility names and their values */
102
103static syslog_fac_item syslog_list[] = {
104 { US"mail", LOG_MAIL },
105 { US"user", LOG_USER },
106 { US"news", LOG_NEWS },
107 { US"uucp", LOG_UUCP },
108 { US"local0", LOG_LOCAL0 },
109 { US"local1", LOG_LOCAL1 },
110 { US"local2", LOG_LOCAL2 },
111 { US"local3", LOG_LOCAL3 },
112 { US"local4", LOG_LOCAL4 },
113 { US"local5", LOG_LOCAL5 },
114 { US"local6", LOG_LOCAL6 },
115 { US"local7", LOG_LOCAL7 },
116 { US"daemon", LOG_DAEMON }
117};
118
119static int syslog_list_size = sizeof(syslog_list)/sizeof(syslog_fac_item);
120
121
122
123
124/*************************************************
125* Main configuration options *
126*************************************************/
127
128/* The list of options that can be set in the main configuration file. This
129must be in alphabetic order because it is searched by binary chop. */
130
131static optionlist optionlist_config[] = {
132 { "*set_exim_group", opt_bool|opt_hidden, &exim_gid_set },
133 { "*set_exim_user", opt_bool|opt_hidden, &exim_uid_set },
134 { "*set_system_filter_group", opt_bool|opt_hidden, &system_filter_gid_set },
135 { "*set_system_filter_user", opt_bool|opt_hidden, &system_filter_uid_set },
136 { "accept_8bitmime", opt_bool, &accept_8bitmime },
137 { "acl_not_smtp", opt_stringptr, &acl_not_smtp },
54cdb463
PH
138#ifdef WITH_CONTENT_SCAN
139 { "acl_not_smtp_mime", opt_stringptr, &acl_not_smtp_mime },
140#endif
45b91596 141 { "acl_not_smtp_start", opt_stringptr, &acl_not_smtp_start },
059ec3d9
PH
142 { "acl_smtp_auth", opt_stringptr, &acl_smtp_auth },
143 { "acl_smtp_connect", opt_stringptr, &acl_smtp_connect },
144 { "acl_smtp_data", opt_stringptr, &acl_smtp_data },
145 { "acl_smtp_etrn", opt_stringptr, &acl_smtp_etrn },
146 { "acl_smtp_expn", opt_stringptr, &acl_smtp_expn },
147 { "acl_smtp_helo", opt_stringptr, &acl_smtp_helo },
148 { "acl_smtp_mail", opt_stringptr, &acl_smtp_mail },
149 { "acl_smtp_mailauth", opt_stringptr, &acl_smtp_mailauth },
8523533c
TK
150#ifdef WITH_CONTENT_SCAN
151 { "acl_smtp_mime", opt_stringptr, &acl_smtp_mime },
152#endif
059ec3d9
PH
153 { "acl_smtp_predata", opt_stringptr, &acl_smtp_predata },
154 { "acl_smtp_quit", opt_stringptr, &acl_smtp_quit },
155 { "acl_smtp_rcpt", opt_stringptr, &acl_smtp_rcpt },
156#ifdef SUPPORT_TLS
157 { "acl_smtp_starttls", opt_stringptr, &acl_smtp_starttls },
158#endif
159 { "acl_smtp_vrfy", opt_stringptr, &acl_smtp_vrfy },
160 { "admin_groups", opt_gidlist, &admin_groups },
161 { "allow_domain_literals", opt_bool, &allow_domain_literals },
162 { "allow_mx_to_ip", opt_bool, &allow_mx_to_ip },
163 { "allow_utf8_domains", opt_bool, &allow_utf8_domains },
164 { "auth_advertise_hosts", opt_stringptr, &auth_advertise_hosts },
165 { "auto_thaw", opt_time, &auto_thaw },
8523533c
TK
166#ifdef WITH_CONTENT_SCAN
167 { "av_scanner", opt_stringptr, &av_scanner },
168#endif
059ec3d9 169 { "bi_command", opt_stringptr, &bi_command },
8523533c
TK
170#ifdef EXPERIMENTAL_BRIGHTMAIL
171 { "bmi_config_file", opt_stringptr, &bmi_config_file },
172#endif
059ec3d9
PH
173 { "bounce_message_file", opt_stringptr, &bounce_message_file },
174 { "bounce_message_text", opt_stringptr, &bounce_message_text },
175 { "bounce_return_body", opt_bool, &bounce_return_body },
176 { "bounce_return_message", opt_bool, &bounce_return_message },
177 { "bounce_return_size_limit", opt_mkint, &bounce_return_size_limit },
178 { "bounce_sender_authentication",opt_stringptr,&bounce_sender_authentication },
179 { "callout_domain_negative_expire", opt_time, &callout_cache_domain_negative_expire },
180 { "callout_domain_positive_expire", opt_time, &callout_cache_domain_positive_expire },
181 { "callout_negative_expire", opt_time, &callout_cache_negative_expire },
182 { "callout_positive_expire", opt_time, &callout_cache_positive_expire },
183 { "callout_random_local_part",opt_stringptr, &callout_random_local_part },
184 { "check_log_inodes", opt_int, &check_log_inodes },
185 { "check_log_space", opt_Kint, &check_log_space },
a0d6ba8a 186 { "check_rfc2047_length", opt_bool, &check_rfc2047_length },
059ec3d9
PH
187 { "check_spool_inodes", opt_int, &check_spool_inodes },
188 { "check_spool_space", opt_Kint, &check_spool_space },
189 { "daemon_smtp_port", opt_stringptr|opt_hidden, &daemon_smtp_port },
190 { "daemon_smtp_ports", opt_stringptr, &daemon_smtp_port },
4aee0225
PH
191 { "daemon_startup_retries", opt_int, &daemon_startup_retries },
192 { "daemon_startup_sleep", opt_time, &daemon_startup_sleep },
059ec3d9
PH
193 { "delay_warning", opt_timelist, &delay_warning },
194 { "delay_warning_condition", opt_stringptr, &delay_warning_condition },
195 { "deliver_drop_privilege", opt_bool, &deliver_drop_privilege },
196 { "deliver_queue_load_max", opt_fixed, &deliver_queue_load_max },
197 { "delivery_date_remove", opt_bool, &delivery_date_remove },
54fc8428
PH
198#ifdef ENABLE_DISABLE_FSYNC
199 { "disable_fsync", opt_bool, &disable_fsync },
200#endif
7e66e54d 201 { "disable_ipv6", opt_bool, &disable_ipv6 },
059ec3d9
PH
202 { "dns_again_means_nonexist", opt_stringptr, &dns_again_means_nonexist },
203 { "dns_check_names_pattern", opt_stringptr, &check_dns_names_pattern },
e5a9dba6
PH
204 { "dns_csa_search_limit", opt_int, &dns_csa_search_limit },
205 { "dns_csa_use_reverse", opt_bool, &dns_csa_use_reverse },
059ec3d9
PH
206 { "dns_ipv4_lookup", opt_stringptr, &dns_ipv4_lookup },
207 { "dns_retrans", opt_time, &dns_retrans },
208 { "dns_retry", opt_int, &dns_retry },
209 /* This option is now a no-op, retained for compability */
210 { "drop_cr", opt_bool, &drop_cr },
211/*********************************************************/
0e22dfd1 212 { "dsn_from", opt_stringptr, &dsn_from },
059ec3d9
PH
213 { "envelope_to_remove", opt_bool, &envelope_to_remove },
214 { "errors_copy", opt_stringptr, &errors_copy },
215 { "errors_reply_to", opt_stringptr, &errors_reply_to },
216 { "exim_group", opt_gid, &exim_gid },
217 { "exim_path", opt_stringptr, &exim_path },
218 { "exim_user", opt_uid, &exim_uid },
219 { "extra_local_interfaces", opt_stringptr, &extra_local_interfaces },
220 { "extract_addresses_remove_arguments", opt_bool, &extract_addresses_remove_arguments },
221 { "finduser_retries", opt_int, &finduser_retries },
222 { "freeze_tell", opt_stringptr, &freeze_tell },
223 { "gecos_name", opt_stringptr, &gecos_name },
224 { "gecos_pattern", opt_stringptr, &gecos_pattern },
83da1223
PH
225#ifdef SUPPORT_TLS
226 { "gnutls_require_kx", opt_stringptr, &gnutls_require_kx },
227 { "gnutls_require_mac", opt_stringptr, &gnutls_require_mac },
228 { "gnutls_require_protocols", opt_stringptr, &gnutls_require_proto },
229#endif
059ec3d9
PH
230 { "header_line_maxsize", opt_int, &header_line_maxsize },
231 { "header_maxsize", opt_int, &header_maxsize },
232 { "headers_charset", opt_stringptr, &headers_charset },
233 { "helo_accept_junk_hosts", opt_stringptr, &helo_accept_junk_hosts },
234 { "helo_allow_chars", opt_stringptr, &helo_allow_chars },
235 { "helo_lookup_domains", opt_stringptr, &helo_lookup_domains },
236 { "helo_try_verify_hosts", opt_stringptr, &helo_try_verify_hosts },
237 { "helo_verify_hosts", opt_stringptr, &helo_verify_hosts },
238 { "hold_domains", opt_stringptr, &hold_domains },
239 { "host_lookup", opt_stringptr, &host_lookup },
240 { "host_lookup_order", opt_stringptr, &host_lookup_order },
241 { "host_reject_connection", opt_stringptr, &host_reject_connection },
242 { "hosts_connection_nolog", opt_stringptr, &hosts_connection_nolog },
243 { "hosts_treat_as_local", opt_stringptr, &hosts_treat_as_local },
244#ifdef LOOKUP_IBASE
245 { "ibase_servers", opt_stringptr, &ibase_servers },
246#endif
247 { "ignore_bounce_errors_after", opt_time, &ignore_bounce_errors_after },
248 { "ignore_fromline_hosts", opt_stringptr, &ignore_fromline_hosts },
249 { "ignore_fromline_local", opt_bool, &ignore_fromline_local },
250 { "keep_malformed", opt_time, &keep_malformed },
251#ifdef LOOKUP_LDAP
252 { "ldap_default_servers", opt_stringptr, &eldap_default_servers },
253 { "ldap_version", opt_int, &eldap_version },
254#endif
255 { "local_from_check", opt_bool, &local_from_check },
256 { "local_from_prefix", opt_stringptr, &local_from_prefix },
257 { "local_from_suffix", opt_stringptr, &local_from_suffix },
258 { "local_interfaces", opt_stringptr, &local_interfaces },
259 { "local_scan_timeout", opt_time, &local_scan_timeout },
260 { "local_sender_retain", opt_bool, &local_sender_retain },
261 { "localhost_number", opt_stringptr, &host_number_string },
262 { "log_file_path", opt_stringptr, &log_file_path },
263 { "log_selector", opt_stringptr, &log_selector_string },
264 { "log_timezone", opt_bool, &log_timezone },
265 { "lookup_open_max", opt_int, &lookup_open_max },
266 { "max_username_length", opt_int, &max_username_length },
267 { "message_body_visible", opt_mkint, &message_body_visible },
268 { "message_id_header_domain", opt_stringptr, &message_id_domain },
269 { "message_id_header_text", opt_stringptr, &message_id_text },
270 { "message_logs", opt_bool, &message_logs },
271 { "message_size_limit", opt_stringptr, &message_size_limit },
272#ifdef SUPPORT_MOVE_FROZEN_MESSAGES
273 { "move_frozen_messages", opt_bool, &move_frozen_messages },
274#endif
275 { "mua_wrapper", opt_bool, &mua_wrapper },
276#ifdef LOOKUP_MYSQL
277 { "mysql_servers", opt_stringptr, &mysql_servers },
278#endif
279 { "never_users", opt_uidlist, &never_users },
280#ifdef LOOKUP_ORACLE
281 { "oracle_servers", opt_stringptr, &oracle_servers },
282#endif
283 { "percent_hack_domains", opt_stringptr, &percent_hack_domains },
284#ifdef EXIM_PERL
285 { "perl_at_start", opt_bool, &opt_perl_at_start },
286 { "perl_startup", opt_stringptr, &opt_perl_startup },
287#endif
288#ifdef LOOKUP_PGSQL
289 { "pgsql_servers", opt_stringptr, &pgsql_servers },
290#endif
291 { "pid_file_path", opt_stringptr, &pid_file_path },
292 { "pipelining_advertise_hosts", opt_stringptr, &pipelining_advertise_hosts },
293 { "preserve_message_logs", opt_bool, &preserve_message_logs },
294 { "primary_hostname", opt_stringptr, &primary_hostname },
295 { "print_topbitchars", opt_bool, &print_topbitchars },
296 { "process_log_path", opt_stringptr, &process_log_path },
297 { "prod_requires_admin", opt_bool, &prod_requires_admin },
298 { "qualify_domain", opt_stringptr, &qualify_domain_sender },
299 { "qualify_recipient", opt_stringptr, &qualify_domain_recipient },
300 { "queue_domains", opt_stringptr, &queue_domains },
301 { "queue_list_requires_admin",opt_bool, &queue_list_requires_admin },
302 { "queue_only", opt_bool, &queue_only },
303 { "queue_only_file", opt_stringptr, &queue_only_file },
304 { "queue_only_load", opt_fixed, &queue_only_load },
305 { "queue_only_override", opt_bool, &queue_only_override },
306 { "queue_run_in_order", opt_bool, &queue_run_in_order },
307 { "queue_run_max", opt_int, &queue_run_max },
308 { "queue_smtp_domains", opt_stringptr, &queue_smtp_domains },
309 { "receive_timeout", opt_time, &receive_timeout },
310 { "received_header_text", opt_stringptr, &received_header_text },
311 { "received_headers_max", opt_int, &received_headers_max },
312 { "recipient_unqualified_hosts", opt_stringptr, &recipient_unqualified_hosts },
313 { "recipients_max", opt_int, &recipients_max },
314 { "recipients_max_reject", opt_bool, &recipients_max_reject },
315 { "remote_max_parallel", opt_int, &remote_max_parallel },
316 { "remote_sort_domains", opt_stringptr, &remote_sort_domains },
317 { "retry_data_expire", opt_time, &retry_data_expire },
318 { "retry_interval_max", opt_time, &retry_interval_max },
319 { "return_path_remove", opt_bool, &return_path_remove },
320 { "return_size_limit", opt_mkint|opt_hidden, &bounce_return_size_limit },
321 { "rfc1413_hosts", opt_stringptr, &rfc1413_hosts },
322 { "rfc1413_query_timeout", opt_time, &rfc1413_query_timeout },
323 { "sender_unqualified_hosts", opt_stringptr, &sender_unqualified_hosts },
324 { "smtp_accept_keepalive", opt_bool, &smtp_accept_keepalive },
325 { "smtp_accept_max", opt_int, &smtp_accept_max },
326 { "smtp_accept_max_nonmail", opt_int, &smtp_accept_max_nonmail },
327 { "smtp_accept_max_nonmail_hosts", opt_stringptr, &smtp_accept_max_nonmail_hosts },
328 { "smtp_accept_max_per_connection", opt_int, &smtp_accept_max_per_connection },
329 { "smtp_accept_max_per_host", opt_stringptr, &smtp_accept_max_per_host },
330 { "smtp_accept_queue", opt_int, &smtp_accept_queue },
331 { "smtp_accept_queue_per_connection", opt_int, &smtp_accept_queue_per_connection },
332 { "smtp_accept_reserve", opt_int, &smtp_accept_reserve },
333 { "smtp_active_hostname", opt_stringptr, &raw_active_hostname },
334 { "smtp_banner", opt_stringptr, &smtp_banner },
335 { "smtp_check_spool_space", opt_bool, &smtp_check_spool_space },
336 { "smtp_connect_backlog", opt_int, &smtp_connect_backlog },
337 { "smtp_enforce_sync", opt_bool, &smtp_enforce_sync },
338 { "smtp_etrn_command", opt_stringptr, &smtp_etrn_command },
339 { "smtp_etrn_serialize", opt_bool, &smtp_etrn_serialize },
340 { "smtp_load_reserve", opt_fixed, &smtp_load_reserve },
341 { "smtp_max_synprot_errors", opt_int, &smtp_max_synprot_errors },
342 { "smtp_max_unknown_commands",opt_int, &smtp_max_unknown_commands },
343 { "smtp_ratelimit_hosts", opt_stringptr, &smtp_ratelimit_hosts },
344 { "smtp_ratelimit_mail", opt_stringptr, &smtp_ratelimit_mail },
345 { "smtp_ratelimit_rcpt", opt_stringptr, &smtp_ratelimit_rcpt },
346 { "smtp_receive_timeout", opt_time, &smtp_receive_timeout },
347 { "smtp_reserve_hosts", opt_stringptr, &smtp_reserve_hosts },
348 { "smtp_return_error_details",opt_bool, &smtp_return_error_details },
8523533c
TK
349#ifdef WITH_CONTENT_SCAN
350 { "spamd_address", opt_stringptr, &spamd_address },
351#endif
059ec3d9
PH
352 { "split_spool_directory", opt_bool, &split_spool_directory },
353 { "spool_directory", opt_stringptr, &spool_directory },
31480e42
PH
354#ifdef LOOKUP_SQLITE
355 { "sqlite_lock_timeout", opt_int, &sqlite_lock_timeout },
356#endif
8523533c
TK
357#ifdef EXPERIMENTAL_SRS
358 { "srs_config", opt_stringptr, &srs_config },
384152a6
TK
359 { "srs_hashlength", opt_int, &srs_hashlength },
360 { "srs_hashmin", opt_int, &srs_hashmin },
361 { "srs_maxage", opt_int, &srs_maxage },
362 { "srs_secrets", opt_stringptr, &srs_secrets },
363 { "srs_usehash", opt_bool, &srs_usehash },
364 { "srs_usetimestamp", opt_bool, &srs_usetimestamp },
8523533c 365#endif
38a0a95f 366 { "strict_acl_vars", opt_bool, &strict_acl_vars },
059ec3d9
PH
367 { "strip_excess_angle_brackets", opt_bool, &strip_excess_angle_brackets },
368 { "strip_trailing_dot", opt_bool, &strip_trailing_dot },
369 { "syslog_duplication", opt_bool, &syslog_duplication },
370 { "syslog_facility", opt_stringptr, &syslog_facility_str },
371 { "syslog_processname", opt_stringptr, &syslog_processname },
372 { "syslog_timestamp", opt_bool, &syslog_timestamp },
373 { "system_filter", opt_stringptr, &system_filter },
374 { "system_filter_directory_transport", opt_stringptr,&system_filter_directory_transport },
375 { "system_filter_file_transport",opt_stringptr,&system_filter_file_transport },
376 { "system_filter_group", opt_gid, &system_filter_gid },
377 { "system_filter_pipe_transport",opt_stringptr,&system_filter_pipe_transport },
378 { "system_filter_reply_transport",opt_stringptr,&system_filter_reply_transport },
379 { "system_filter_user", opt_uid, &system_filter_uid },
380 { "tcp_nodelay", opt_bool, &tcp_nodelay },
381 { "timeout_frozen_after", opt_time, &timeout_frozen_after },
382 { "timezone", opt_stringptr, &timezone_string },
383#ifdef SUPPORT_TLS
384 { "tls_advertise_hosts", opt_stringptr, &tls_advertise_hosts },
385 { "tls_certificate", opt_stringptr, &tls_certificate },
386 { "tls_crl", opt_stringptr, &tls_crl },
387 { "tls_dhparam", opt_stringptr, &tls_dhparam },
388 { "tls_on_connect_ports", opt_stringptr, &tls_on_connect_ports },
389 { "tls_privatekey", opt_stringptr, &tls_privatekey },
390 { "tls_remember_esmtp", opt_bool, &tls_remember_esmtp },
391 { "tls_require_ciphers", opt_stringptr, &tls_require_ciphers },
392 { "tls_try_verify_hosts", opt_stringptr, &tls_try_verify_hosts },
393 { "tls_verify_certificates", opt_stringptr, &tls_verify_certificates },
394 { "tls_verify_hosts", opt_stringptr, &tls_verify_hosts },
395#endif
396 { "trusted_groups", opt_gidlist, &trusted_groups },
397 { "trusted_users", opt_uidlist, &trusted_users },
398 { "unknown_login", opt_stringptr, &unknown_login },
399 { "unknown_username", opt_stringptr, &unknown_username },
400 { "untrusted_set_sender", opt_stringptr, &untrusted_set_sender },
401 { "uucp_from_pattern", opt_stringptr, &uucp_from_pattern },
402 { "uucp_from_sender", opt_stringptr, &uucp_from_sender },
403 { "warn_message_file", opt_stringptr, &warn_message_file },
404 { "write_rejectlog", opt_bool, &write_rejectlog }
405};
406
407static int optionlist_config_size =
408 sizeof(optionlist_config)/sizeof(optionlist);
409
410
411
412/*************************************************
413* Find the name of an option *
414*************************************************/
415
416/* This function is to aid debugging. Various functions take arguments that are
417pointer variables in the options table or in option tables for various drivers.
418For debugging output, it is useful to be able to find the name of the option
419which is currently being processed. This function finds it, if it exists, by
420searching the table(s).
421
422Arguments: a value that is presumed to be in the table above
423Returns: the option name, or an empty string
424*/
425
426uschar *
427readconf_find_option(void *p)
428{
429int i;
430router_instance *r;
431transport_instance *t;
432
433for (i = 0; i < optionlist_config_size; i++)
434 if (p == optionlist_config[i].value) return US optionlist_config[i].name;
435
436for (r = routers; r != NULL; r = r->next)
437 {
438 router_info *ri = r->info;
439 for (i = 0; i < ri->options_count[0]; i++)
440 {
441 if ((ri->options[i].type & opt_mask) != opt_stringptr) continue;
442 if (p == (char *)(r->options_block) + (long int)(ri->options[i].value))
443 return US ri->options[i].name;
444 }
445 }
446
447for (t = transports; t != NULL; t = t->next)
448 {
449 transport_info *ti = t->info;
450 for (i = 0; i < ti->options_count[0]; i++)
451 {
452 if ((ti->options[i].type & opt_mask) != opt_stringptr) continue;
453 if (p == (char *)(t->options_block) + (long int)(ti->options[i].value))
454 return US ti->options[i].name;
455 }
456 }
457
458return US"";
459}
460
461
462
463
cf00dad6
PH
464/*************************************************
465* Deal with an assignment to a macro *
466*************************************************/
467
468/* This function is called when a line that starts with an upper case letter is
469encountered. The argument "line" should contain a complete logical line, and
470start with the first letter of the macro name. The macro name and the
471replacement text are extracted and stored. Redefinition of existing,
472non-command line, macros is permitted using '==' instead of '='.
473
474Arguments:
475 s points to the start of the logical line
476
477Returns: nothing
478*/
479
480static void
481read_macro_assignment(uschar *s)
482{
483uschar name[64];
484int namelen = 0;
485BOOL redef = FALSE;
486macro_item *m;
487macro_item *mlast = NULL;
488
489while (isalnum(*s) || *s == '_')
490 {
491 if (namelen >= sizeof(name) - 1)
492 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
493 "macro name too long (maximum is %d characters)", sizeof(name) - 1);
494 name[namelen++] = *s++;
495 }
496name[namelen] = 0;
497
498while (isspace(*s)) s++;
499if (*s++ != '=')
500 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "malformed macro definition");
501
502if (*s == '=')
503 {
504 redef = TRUE;
505 s++;
506 }
507while (isspace(*s)) s++;
508
509/* If an existing macro of the same name was defined on the command line, we
510just skip this definition. It's an error to attempt to redefine a macro without
511redef set to TRUE, or to redefine a macro when it hasn't been defined earlier.
512It is also an error to define a macro whose name begins with the name of a
513previously defined macro. Note: it is documented that the other way round
514works. */
515
516for (m = macros; m != NULL; m = m->next)
517 {
518 int len = Ustrlen(m->name);
519
520 if (Ustrcmp(m->name, name) == 0)
521 {
522 if (!m->command_line && !redef)
523 log_write(0, LOG_CONFIG|LOG_PANIC_DIE, "macro \"%s\" is already "
524 "defined (use \"==\" if you want to redefine it", name);
525 break;
526 }
527
528 if (len < namelen && Ustrstr(name, m->name) != NULL)
529 log_write(0, LOG_CONFIG|LOG_PANIC_DIE, "\"%s\" cannot be defined as "
530 "a macro because previously defined macro \"%s\" is a substring",
531 name, m->name);
532
533 /* We cannot have this test, because it is documented that a substring
534 macro is permitted (there is even an example).
535 *
536 * if (len > namelen && Ustrstr(m->name, name) != NULL)
537 * log_write(0, LOG_CONFIG|LOG_PANIC_DIE, "\"%s\" cannot be defined as "
538 * "a macro because it is a substring of previously defined macro \"%s\"",
539 * name, m->name);
540 */
541
542 mlast = m;
543 }
544
545/* Check for an overriding command-line definition. */
546
547if (m != NULL && m->command_line) return;
548
549/* Redefinition must refer to an existing macro. */
550
551if (redef)
552 {
553 if (m == NULL)
554 log_write(0, LOG_CONFIG|LOG_PANIC_DIE, "can't redefine an undefined macro "
555 "\"%s\"", name);
556 }
557
558/* We have a new definition. The macro_item structure includes a final vector
559called "name" which is one byte long. Thus, adding "namelen" gives us enough
560room to store the "name" string. */
561
562else
563 {
564 m = store_get(sizeof(macro_item) + namelen);
565 if (macros == NULL) macros = m; else mlast->next = m;
566 Ustrncpy(m->name, name, namelen);
567 m->name[namelen] = 0;
568 m->next = NULL;
569 m->command_line = FALSE;
570 }
571
572/* Set the value of the new or redefined macro */
573
574m->replacement = string_copy(s);
575}
576
577
578
579
059ec3d9
PH
580
581/*************************************************
582* Read configuration line *
583*************************************************/
584
585/* A logical line of text is read from the configuration file into the big
586buffer, taking account of macros, .includes, and continuations. The size of
587big_buffer is increased if necessary. The count of configuration lines is
588maintained. Physical input lines starting with # (ignoring leading white space,
589and after macro replacement) and empty logical lines are always ignored.
590Leading and trailing spaces are removed.
591
592If we hit a line of the form "begin xxxx", the xxxx is placed in the
593next_section vector, and the function returns NULL, indicating the end of a
594configuration section. On end-of-file, NULL is returned with next_section
595empty.
596
597Arguments: none
598
599Returns: a pointer to the first non-blank in the line,
600 or NULL if eof or end of section is reached
601*/
602
603static uschar *
604get_config_line(void)
605{
606int startoffset = 0; /* To first non-blank char in logical line */
607int len = 0; /* Of logical line so far */
608int newlen;
609uschar *s, *ss;
610macro_item *m;
611BOOL macro_found;
612
613/* Loop for handling continuation lines, skipping comments, and dealing with
614.include files. */
615
616for (;;)
617 {
618 if (Ufgets(big_buffer+len, big_buffer_size-len, config_file) == NULL)
619 {
620 if (config_file_stack != NULL) /* EOF inside .include */
621 {
f1e894f3 622 (void)fclose(config_file);
059ec3d9
PH
623 config_file = config_file_stack->file;
624 config_filename = config_file_stack->filename;
625 config_lineno = config_file_stack->lineno;
626 config_file_stack = config_file_stack->next;
627 continue;
628 }
629
630 /* EOF at top level */
631
632 if (cstate_stack_ptr >= 0)
633 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
634 "Unexpected end of configuration file: .endif missing");
635
636 if (len != 0) break; /* EOF after continuation */
637 next_section[0] = 0; /* EOF at start of logical line */
638 return NULL;
639 }
640
641 config_lineno++;
642 newlen = len + Ustrlen(big_buffer + len);
643
644 /* Handle pathologically long physical lines - yes, it did happen - by
645 extending big_buffer at this point. The code also copes with very long
646 logical lines. */
647
648 while (newlen == big_buffer_size - 1 && big_buffer[newlen - 1] != '\n')
649 {
650 uschar *newbuffer;
651 big_buffer_size += BIG_BUFFER_SIZE;
652 newbuffer = store_malloc(big_buffer_size);
653
654 /* This use of strcpy is OK because we know that the string in the old
655 buffer is shorter than the new buffer. */
656
657 Ustrcpy(newbuffer, big_buffer);
658 store_free(big_buffer);
659 big_buffer = newbuffer;
660 if (Ufgets(big_buffer+newlen, big_buffer_size-newlen, config_file) == NULL)
661 break;
662 newlen += Ustrlen(big_buffer + newlen);
663 }
664
665 /* Find the true start of the physical line - leading spaces are always
666 ignored. */
667
668 ss = big_buffer + len;
669 while (isspace(*ss)) ss++;
670
671 /* Process the physical line for macros. If this is the start of the logical
672 line, skip over initial text at the start of the line if it starts with an
673 upper case character followed by a sequence of name characters and an equals
674 sign, because that is the definition of a new macro, and we don't do
675 replacement therein. */
676
677 s = ss;
678 if (len == 0 && isupper(*s))
679 {
680 while (isalnum(*s) || *s == '_') s++;
681 while (isspace(*s)) s++;
682 if (*s != '=') s = ss; /* Not a macro definition */
683 }
684
685 /* For each defined macro, scan the line (from after XXX= if present),
686 replacing all occurrences of the macro. */
687
688 macro_found = FALSE;
689 for (m = macros; m != NULL; m = m->next)
690 {
691 uschar *p, *pp;
692 uschar *t = s;
693
694 while ((p = Ustrstr(t, m->name)) != NULL)
695 {
696 int moveby;
697 int namelen = Ustrlen(m->name);
698 int replen = Ustrlen(m->replacement);
699
700 /* Expand the buffer if necessary */
701
702 while (newlen - namelen + replen + 1 > big_buffer_size)
703 {
704 int newsize = big_buffer_size + BIG_BUFFER_SIZE;
705 uschar *newbuffer = store_malloc(newsize);
706 memcpy(newbuffer, big_buffer, newlen + 1);
707 p = newbuffer + (p - big_buffer);
708 s = newbuffer + (s - big_buffer);
709 ss = newbuffer + (ss - big_buffer);
710 t = newbuffer + (t - big_buffer);
711 big_buffer_size = newsize;
712 store_free(big_buffer);
713 big_buffer = newbuffer;
714 }
715
716 /* Shuffle the remaining characters up or down in the buffer before
717 copying in the replacement text. Don't rescan the replacement for this
718 same macro. */
719
720 pp = p + namelen;
721 moveby = replen - namelen;
722 if (moveby != 0)
723 {
724 memmove(p + replen, pp, (big_buffer + newlen) - pp + 1);
725 newlen += moveby;
726 }
727 Ustrncpy(p, m->replacement, replen);
728 t = p + replen;
729 macro_found = TRUE;
730 }
731 }
732
733 /* An empty macro replacement at the start of a line could mean that ss no
734 longer points to the first non-blank character. */
735
736 while (isspace(*ss)) ss++;
737
738 /* Check for comment lines - these are physical lines. */
739
740 if (*ss == '#') continue;
741
742 /* Handle conditionals, which are also applied to physical lines. Conditions
743 are of the form ".ifdef ANYTEXT" and are treated as true if any macro
744 expansion occured on the rest of the line. A preliminary test for the leading
745 '.' saves effort on most lines. */
746
747 if (*ss == '.')
748 {
749 int i;
750
751 /* Search the list of conditional directives */
752
753 for (i = 0; i < cond_list_size; i++)
754 {
755 int n;
756 cond_item *c = cond_list+i;
757 if (Ustrncmp(ss+1, c->name, c->namelen) != 0) continue;
758
759 /* The following character must be white space or end of string */
760
761 n = ss[1 + c->namelen];
762 if (n != ' ' && n != 't' && n != '\n' && n != 0) break;
763
764 /* .ifdef and .ifndef push the current state onto the stack, then set
765 a new one from the table. Stack overflow is an error */
766
767 if (c->pushpop > 0)
768 {
769 if (cstate_stack_ptr >= CSTATE_STACK_SIZE - 1)
770 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
771 ".%s nested too deeply", c->name);
772 cstate_stack[++cstate_stack_ptr] = cstate;
773 cstate = next_cstate[cstate][macro_found? c->action1 : c->action2];
774 }
775
776 /* For any of the others, stack underflow is an error. The next state
777 comes either from the stack (.endif) or from the table. */
778
779 else
780 {
781 if (cstate_stack_ptr < 0)
782 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
783 ".%s without matching .ifdef", c->name);
784 cstate = (c->pushpop < 0)? cstate_stack[cstate_stack_ptr--] :
785 next_cstate[cstate][macro_found? c->action1 : c->action2];
786 }
787
788 /* Having dealt with a directive, break the loop */
789
790 break;
791 }
792
793 /* If we have handled a conditional directive, continue with the next
794 physical line. Otherwise, fall through. */
795
796 if (i < cond_list_size) continue;
797 }
798
799 /* If the conditional state is not 0 (actively using these lines), ignore
800 this input line. */
801
802 if (cstate != 0) continue; /* Conditional skip */
803
804 /* Handle .include lines - these are also physical lines. */
805
806 if (Ustrncmp(ss, ".include", 8) == 0 &&
807 (isspace(ss[8]) ||
808 (Ustrncmp(ss+8, "_if_exists", 10) == 0 && isspace(ss[18]))))
809 {
810 uschar *t;
811 int include_if_exists = isspace(ss[8])? 0 : 10;
812 config_file_item *save;
813 struct stat statbuf;
814
815 ss += 9 + include_if_exists;
816 while (isspace(*ss)) ss++;
817 t = ss + Ustrlen(ss);
818 while (t > ss && isspace(t[-1])) t--;
819 if (*ss == '\"' && t[-1] == '\"')
820 {
821 ss++;
822 t--;
823 }
824 *t = 0;
825
145396a6
PH
826 if (*ss != '/')
827 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, ".include specifies a non-"
828 "absolute path \"%s\"", ss);
829
059ec3d9
PH
830 if (include_if_exists != 0 && (Ustat(ss, &statbuf) != 0)) continue;
831
832 save = store_get(sizeof(config_file_item));
833 save->next = config_file_stack;
834 config_file_stack = save;
835 save->file = config_file;
836 save->filename = config_filename;
837 save->lineno = config_lineno;
838
839 config_file = Ufopen(ss, "rb");
840 if (config_file == NULL)
841 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "failed to open included "
842 "configuration file %s", ss);
843 config_filename = string_copy(ss);
844 config_lineno = 0;
845 continue;
846 }
847
848 /* If this is the start of the logical line, remember where the non-blank
849 data starts. Otherwise shuffle down continuation lines to remove leading
850 white space. */
851
852 if (len == 0)
853 startoffset = ss - big_buffer;
854 else
855 {
856 s = big_buffer + len;
857 if (ss > s)
858 {
859 memmove(s, ss, (newlen - len) - (ss - s) + 1);
860 newlen -= ss - s;
861 }
862 }
863
864 /* Accept the new addition to the line. Remove trailing white space. */
865
866 len = newlen;
867 while (len > 0 && isspace(big_buffer[len-1])) len--;
868 big_buffer[len] = 0;
869
870 /* We are done if the line does not end in backslash and contains some data.
871 Empty logical lines are ignored. For continuations, remove the backslash and
872 go round the loop to read the continuation line. */
873
874 if (len > 0)
875 {
876 if (big_buffer[len-1] != '\\') break; /* End of logical line */
877 big_buffer[--len] = 0; /* Remove backslash */
878 }
879 } /* Loop for reading multiple physical lines */
880
881/* We now have a logical line. Test for the end of a configuration section (or,
882more accurately, for the start of the next section). Place the name of the next
883section in next_section, and return NULL. If the name given is longer than
884next_section, truncate it. It will be unrecognized later, because all the known
885section names do fit. Leave space for pluralizing. */
886
887s = big_buffer + startoffset; /* First non-space character */
888if (strncmpic(s, US"begin ", 6) == 0)
889 {
890 s += 6;
891 while (isspace(*s)) s++;
892 if (big_buffer + len - s > sizeof(next_section) - 2)
893 s[sizeof(next_section) - 2] = 0;
894 Ustrcpy(next_section, s);
895 return NULL;
896 }
897
898/* Return the first non-blank character. */
899
900return s;
901}
902
903
904
905/*************************************************
906* Read a name *
907*************************************************/
908
909/* The yield is the pointer to the next uschar. Names longer than the
910output space are silently truncated. This function is also used from acl.c when
911parsing ACLs.
912
913Arguments:
914 name where to put the name
915 len length of name
916 s input pointer
917
918Returns: new input pointer
919*/
920
921uschar *
922readconf_readname(uschar *name, int len, uschar *s)
923{
924int p = 0;
925while (isspace(*s)) s++;
926if (isalpha(*s))
927 {
928 while (isalnum(*s) || *s == '_')
929 {
930 if (p < len-1) name[p++] = *s;
931 s++;
932 }
933 }
934name[p] = 0;
935while (isspace(*s)) s++;
936return s;
937}
938
939
940
941
942/*************************************************
943* Read a time value *
944*************************************************/
945
946/* This function is also called from outside, to read argument
947time values. The format of a time value is:
948
949 [<n>w][<n>d][<n>h][<n>m][<n>s]
950
951as long as at least one is present. If a format error is encountered,
952return a negative value. The value must be terminated by the given
953terminator.
954
955Arguments:
956 s input pointer
957 terminator required terminating character
958 return_msec if TRUE, allow fractional seconds and return milliseconds
959
960Returns: the time value, or -1 on syntax error
961 value is seconds if return_msec is FALSE
962 value is milliseconds if return_msec is TRUE
963*/
964
965int
966readconf_readtime(uschar *s, int terminator, BOOL return_msec)
967{
968int yield = 0;
969for (;;)
970 {
971 int value, count;
972 double fraction;
973
974 if (!isdigit(*s)) return -1;
975 (void)sscanf(CS s, "%d%n", &value, &count);
976 s += count;
977
978 switch (*s)
979 {
980 case 'w': value *= 7;
981 case 'd': value *= 24;
982 case 'h': value *= 60;
983 case 'm': value *= 60;
984 case 's': s++;
985 break;
986
987 case '.':
988 if (!return_msec) return -1;
989 (void)sscanf(CS s, "%lf%n", &fraction, &count);
990 s += count;
991 if (*s++ != 's') return -1;
992 yield += (int)(fraction * 1000.0);
993 break;
994
995 default: return -1;
996 }
997
998 if (return_msec) value *= 1000;
999 yield += value;
1000 if (*s == terminator) return yield;
1001 }
1002/* Control never reaches here. */
1003}
1004
1005
1006
1007/*************************************************
1008* Read a fixed point value *
1009*************************************************/
1010
1011/* The value is returned *1000
1012
1013Arguments:
1014 s input pointer
1015 terminator required terminator
1016
1017Returns: the value, or -1 on error
1018*/
1019
1020static int
1021readconf_readfixed(uschar *s, int terminator)
1022{
1023int yield = 0;
1024int value, count;
1025if (!isdigit(*s)) return -1;
1026(void)sscanf(CS s, "%d%n", &value, &count);
1027s += count;
1028yield = value * 1000;
1029if (*s == '.')
1030 {
1031 int m = 100;
1032 while (isdigit((*(++s))))
1033 {
1034 yield += (*s - '0') * m;
1035 m /= 10;
1036 }
1037 }
1038
1039return (*s == terminator)? yield : (-1);
1040}
1041
1042
1043
1044/*************************************************
1045* Find option in list *
1046*************************************************/
1047
1048/* The lists are always in order, so binary chop can be used.
1049
1050Arguments:
1051 name the option name to search for
1052 ol the first entry in the option list
1053 last one more than the offset of the last entry in the option list
1054
1055Returns: pointer to an option entry, or NULL if not found
1056*/
1057
1058static optionlist *
1059find_option(uschar *name, optionlist *ol, int last)
1060{
1061int first = 0;
1062while (last > first)
1063 {
1064 int middle = (first + last)/2;
1065 int c = Ustrcmp(name, ol[middle].name);
1066 if (c == 0) return ol + middle;
1067 else if (c > 0) first = middle + 1;
1068 else last = middle;
1069 }
1070return NULL;
1071}
1072
1073
1074
1075/*************************************************
1076* Find a set flag in option list *
1077*************************************************/
1078
1079/* Because some versions of Unix make no restrictions on the values of uids and
1080gids (even negative ones), we cannot represent "unset" by a special value.
1081There is therefore a separate boolean variable for each one indicating whether
1082a value is set or not. This function returns a pointer to the boolean, given
1083the original option name. It is a major disaster if the flag cannot be found.
1084
1085Arguments:
1086 name the name of the uid or gid option
1087 oltop points to the start of the relevant option list
1088 last one more than the offset of the last item in the option list
1089 data_block NULL when reading main options => data values in the option
1090 list are absolute addresses; otherwise they are byte offsets
1091 in data_block (used for driver options)
1092
1093Returns: a pointer to the boolean flag.
1094*/
1095
1096static BOOL *
1097get_set_flag(uschar *name, optionlist *oltop, int last, void *data_block)
1098{
1099optionlist *ol;
1100uschar name2[64];
1101sprintf(CS name2, "*set_%.50s", name);
1102ol = find_option(name2, oltop, last);
1103if (ol == NULL) log_write(0, LOG_MAIN|LOG_PANIC_DIE,
1104 "Exim internal error: missing set flag for %s", name);
1105return (data_block == NULL)? (BOOL *)(ol->value) :
1106 (BOOL *)((uschar *)data_block + (long int)(ol->value));
1107}
1108
1109
1110
1111
1112/*************************************************
1113* Output extra characters message and die *
1114*************************************************/
1115
1116/* Called when an option line has junk on the end. Sometimes this is because
1117the sysadmin thinks comments are permitted.
1118
1119Arguments:
1120 s points to the extra characters
1121 t1..t3 strings to insert in the log message
1122
1123Returns: doesn't return; dies
1124*/
1125
1126static void
1127extra_chars_error(uschar *s, uschar *t1, uschar *t2, uschar *t3)
1128{
1129uschar *comment = US"";
1130if (*s == '#') comment = US" (# is comment only at line start)";
1131log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1132 "extra characters follow %s%s%s%s", t1, t2, t3, comment);
1133}
1134
1135
1136
1137/*************************************************
1138* Read rewrite information *
1139*************************************************/
1140
1141/* Each line of rewrite information contains:
1142
1143. A complete address in the form user@domain, possibly with
1144 leading * for each part; or alternatively, a regex.
1145
1146. A replacement string (which will be expanded).
1147
1148. An optional sequence of one-letter flags, indicating which
1149 headers etc. to apply this rule to.
1150
1151All this is decoded and placed into a control block. The OR of the flags is
1152maintained in a common word.
1153
1154Arguments:
1155 p points to the string that makes up the rule
1156 existflags points to the overall flag word
1157 isglobal TRUE if reading global rewrite rules
1158
1159Returns: the control block for the parsed rule.
1160*/
1161
1162static rewrite_rule *
1163readconf_one_rewrite(uschar *p, int *existflags, BOOL isglobal)
1164{
1165rewrite_rule *next = store_get(sizeof(rewrite_rule));
1166
1167next->next = NULL;
1168next->key = string_dequote(&p);
1169
1170while (isspace(*p)) p++;
1171if (*p == 0)
1172 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1173 "missing rewrite replacement string");
1174
1175next->flags = 0;
1176next->replacement = string_dequote(&p);
1177
1178while (*p != 0) switch (*p++)
1179 {
1180 case ' ': case '\t': break;
1181
1182 case 'q': next->flags |= rewrite_quit; break;
1183 case 'w': next->flags |= rewrite_whole; break;
1184
1185 case 'h': next->flags |= rewrite_all_headers; break;
1186 case 's': next->flags |= rewrite_sender; break;
1187 case 'f': next->flags |= rewrite_from; break;
1188 case 't': next->flags |= rewrite_to; break;
1189 case 'c': next->flags |= rewrite_cc; break;
1190 case 'b': next->flags |= rewrite_bcc; break;
1191 case 'r': next->flags |= rewrite_replyto; break;
1192
1193 case 'E': next->flags |= rewrite_all_envelope; break;
1194 case 'F': next->flags |= rewrite_envfrom; break;
1195 case 'T': next->flags |= rewrite_envto; break;
1196
1197 case 'Q': next->flags |= rewrite_qualify; break;
1198 case 'R': next->flags |= rewrite_repeat; break;
1199
1200 case 'S':
1201 next->flags |= rewrite_smtp;
1202 if (next->key[0] != '^' && Ustrncmp(next->key, "\\N^", 3) != 0)
1203 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1204 "rewrite rule has the S flag but is not a regular expression");
1205 break;
1206
1207 default:
1208 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1209 "unknown rewrite flag character '%c' "
1210 "(could be missing quotes round replacement item)", p[-1]);
1211 break;
1212 }
1213
1214/* If no action flags are set, set all the "normal" rewrites. */
1215
1216if ((next->flags & (rewrite_all | rewrite_smtp)) == 0)
1217 next->flags |= isglobal? rewrite_all : rewrite_all_headers;
1218
1219/* Remember which exist, for optimization, and return the rule */
1220
1221*existflags |= next->flags;
1222return next;
1223}
1224
1225
1226
1227
1228/*************************************************
1229* Read global rewrite information *
1230*************************************************/
1231
1232/* Each line is a single rewrite rule; it is parsed into a control block
1233by readconf_one_rewrite(), and its flags are ORed into the global flag
1234word rewrite_existflags. */
1235
1236void
1237readconf_rewrites(void)
1238{
1239rewrite_rule **chain = &global_rewrite_rules;
1240uschar *p;
1241
1242while ((p = get_config_line()) != NULL)
1243 {
1244 rewrite_rule *next = readconf_one_rewrite(p, &rewrite_existflags, TRUE);
1245 *chain = next;
1246 chain = &(next->next);
1247 }
1248}
1249
1250
1251
1252/*************************************************
1253* Read a string *
1254*************************************************/
1255
1256/* Strings are read into the normal store pool. As long we aren't too
1257near the end of the current block, the string will just use what is necessary
1258on the top of the stacking pool, because string_cat() uses the extension
1259mechanism.
1260
1261Argument:
1262 s the rest of the input line
1263 name the option name (for errors)
1264
1265Returns: pointer to the string
1266*/
1267
1268static uschar *
1269read_string(uschar *s, uschar *name)
1270{
1271uschar *yield;
1272uschar *ss;
1273
1274if (*s != '\"') return string_copy(s);
1275
1276ss = s;
1277yield = string_dequote(&s);
1278
1279if (s == ss+1 || s[-1] != '\"')
1280 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1281 "missing quote at end of string value for %s", name);
1282
1283if (*s != 0) extra_chars_error(s, US"string value for ", name, US"");
1284
1285return yield;
1286}
1287
1288
1289/*************************************************
1290* Handle option line *
1291*************************************************/
1292
1293/* This function is called from several places to process a line containing the
1294setting of an option. The first argument is the line to be decoded; it has been
1295checked not to be empty and not to start with '#'. Trailing newlines and white
1296space have been removed. The second argument is a pointer to the list of
1297variable names that are to be recognized, together with their types and
1298locations, and the third argument gives the number of entries in the list.
1299
1300The fourth argument is a pointer to a data block. If it is NULL, then the data
1301values in the options list are absolute addresses. Otherwise, they are byte
1302offsets in the data block.
1303
1304String option data may continue onto several lines; this function reads further
1305data from config_file if necessary.
1306
1307The yield of this function is normally zero. If a string continues onto
1308multiple lines, then the data value is permitted to be followed by a comma
1309or a semicolon (for use in drivers) and the yield is that character.
1310
1311Arguments:
1312 buffer contains the configuration line to be handled
1313 oltop points to the start of the relevant option list
1314 last one more than the offset of the last item in the option list
1315 data_block NULL when reading main options => data values in the option
1316 list are absolute addresses; otherwise they are byte offsets
1317 in data_block when they have opt_public set; otherwise
1318 they are byte offsets in data_block->options_block.
1319 unknown_txt format string to use in panic message for unknown option;
1320 must contain %s for option name
1321 if given as NULL, don't panic on unknown option
1322
1323Returns: TRUE if an option was read successfully,
1324 FALSE false for an unknown option if unknown_txt == NULL,
1325 otherwise panic and die on an unknown option
1326*/
1327
1328static BOOL
1329readconf_handle_option(uschar *buffer, optionlist *oltop, int last,
1330 void *data_block, uschar *unknown_txt)
1331{
1332int ptr = 0;
1333int offset = 0;
1334int n, count, type, value;
1335int issecure = 0;
1336uid_t uid;
1337gid_t gid;
1338BOOL boolvalue = TRUE;
1339BOOL freesptr = TRUE;
1340optionlist *ol, *ol2;
1341struct passwd *pw;
1342void *reset_point;
1343int intbase = 0;
1344uschar *inttype = US"";
1345uschar *sptr;
1346uschar *s = buffer;
1347uschar name[64];
1348uschar name2[64];
1349
1350/* There may be leading spaces; thereafter, we expect an option name starting
1351with a letter. */
1352
1353while (isspace(*s)) s++;
1354if (!isalpha(*s))
1355 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "option setting expected: %s", s);
1356
1357/* Read the name of the option, and skip any subsequent white space. If
1358it turns out that what we read was "hide", set the flag indicating that
1359this is a secure option, and loop to read the next word. */
1360
1361for (n = 0; n < 2; n++)
1362 {
1363 while (isalnum(*s) || *s == '_')
1364 {
1365 if (ptr < sizeof(name)-1) name[ptr++] = *s;
1366 s++;
1367 }
1368 name[ptr] = 0;
1369 while (isspace(*s)) s++;
1370 if (Ustrcmp(name, "hide") != 0) break;
1371 issecure = opt_secure;
1372 ptr = 0;
1373 }
1374
1375/* Deal with "no_" or "not_" here for booleans */
1376
1377if (Ustrncmp(name, "no_", 3) == 0)
1378 {
1379 boolvalue = FALSE;
1380 offset = 3;
1381 }
1382
1383if (Ustrncmp(name, "not_", 4) == 0)
1384 {
1385 boolvalue = FALSE;
1386 offset = 4;
1387 }
1388
1389/* Search the list for the given name. A non-existent name, or an option that
1390is set twice, is a disaster. */
1391
1392ol = find_option(name + offset, oltop, last);
1393
1394if (ol == NULL)
1395 {
1396 if (unknown_txt == NULL) return FALSE;
1397 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, CS unknown_txt, name);
1398 }
1399
1400if ((ol->type & opt_set) != 0)
1401 {
1402 uschar *mname = name;
1403 if (Ustrncmp(mname, "no_", 3) == 0) mname += 3;
1404 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1405 "\"%s\" option set for the second time", mname);
1406 }
1407
1408ol->type |= opt_set | issecure;
1409type = ol->type & opt_mask;
1410
1411/* Types with data values must be followed by '='; the "no[t]_" prefix
1412applies only to boolean values. */
1413
1414if (type < opt_bool || type > opt_bool_last)
1415 {
1416 if (offset != 0)
1417 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1418 "negation prefix applied to a non-boolean option");
1419 if (*s == 0)
1420 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1421 "unexpected end of line (data missing) after %s", name);
1422 if (*s != '=')
1423 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "missing \"=\" after %s", name);
1424 }
1425
1426/* If a boolean wasn't preceded by "no[t]_" it can be followed by = and
1427true/false/yes/no, or, in the case of opt_expanded_bool, a general string that
1428ultimately expands to one of those values. */
1429
1430else if (*s != 0 && (offset != 0 || *s != '='))
1431 extra_chars_error(s, US"boolean option ", name, US"");
1432
1433/* Skip white space after = */
1434
1435if (*s == '=') while (isspace((*(++s))));
1436
1437/* If there is a data block and the opt_public flag is not set, change
1438the data block pointer to the private options block. */
1439
1440if (data_block != NULL && (ol->type & opt_public) == 0)
1441 data_block = (void *)(((driver_instance *)data_block)->options_block);
1442
1443/* Now get the data according to the type. */
1444
1445switch (type)
1446 {
1447 /* If a string value is not enclosed in quotes, it consists of
1448 the rest of the current line, verbatim. Otherwise, string escapes
1449 are processed.
1450
1451 A transport is specified as a string, which is then looked up in the
1452 list of transports. A search type is specified as one of a number of
1453 known strings.
1454
1455 A set or rewrite rules for a driver is specified as a string, which is
1456 then parsed into a suitable chain of control blocks.
1457
1458 Uids and gids are specified as strings which are then looked up in the
1459 passwd file. Lists of uids and gids are similarly specified as colon-
1460 separated strings. */
1461
1462 case opt_stringptr:
1463 case opt_uid:
1464 case opt_gid:
1465 case opt_expand_uid:
1466 case opt_expand_gid:
1467 case opt_uidlist:
1468 case opt_gidlist:
1469 case opt_rewrite:
1470
1471 reset_point = sptr = read_string(s, name);
1472
1473 /* Having read a string, we now have several different ways of using it,
1474 depending on the data type, so do another switch. If keeping the actual
1475 string is not required (because it is interpreted), freesptr is set TRUE,
1476 and at the end we reset the pool. */
1477
1478 switch (type)
1479 {
1480 /* If this was a string, set the variable to point to the new string,
1481 and set the flag so its store isn't reclaimed. If it was a list of rewrite
1482 rules, we still keep the string (for printing), and parse the rules into a
1483 control block and flags word. */
1484
1485 case opt_stringptr:
1486 case opt_rewrite:
1487 if (data_block == NULL)
1488 *((uschar **)(ol->value)) = sptr;
1489 else
1490 *((uschar **)((uschar *)data_block + (long int)(ol->value))) = sptr;
1491 freesptr = FALSE;
1492 if (type == opt_rewrite)
1493 {
1494 int sep = 0;
1495 int *flagptr;
1496 uschar *p = sptr;
1497 rewrite_rule **chain;
1498 optionlist *ol3;
1499
1500 sprintf(CS name2, "*%.50s_rules", name);
1501 ol2 = find_option(name2, oltop, last);
1502 sprintf(CS name2, "*%.50s_flags", name);
1503 ol3 = find_option(name2, oltop, last);
1504
1505 if (ol2 == NULL || ol3 == NULL)
1506 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1507 "rewrite rules not available for driver");
1508
1509 if (data_block == NULL)
1510 {
1511 chain = (rewrite_rule **)(ol2->value);
1512 flagptr = (int *)(ol3->value);
1513 }
1514 else
1515 {
1516 chain = (rewrite_rule **)((uschar *)data_block + (long int)(ol2->value));
1517 flagptr = (int *)((uschar *)data_block + (long int)(ol3->value));
1518 }
1519
1520 while ((p = string_nextinlist(&sptr, &sep, big_buffer, BIG_BUFFER_SIZE))
1521 != NULL)
1522 {
1523 rewrite_rule *next = readconf_one_rewrite(p, flagptr, FALSE);
1524 *chain = next;
1525 chain = &(next->next);
1526 }
1527
1528 if ((*flagptr & (rewrite_all_envelope | rewrite_smtp)) != 0)
1529 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "rewrite rule specifies a "
1530 "non-header rewrite - not allowed at transport time -");
1531 }
1532 break;
1533
1534 /* If it was an expanded uid, see if there is any expansion to be
1535 done by checking for the presence of a $ character. If there is, save it
1536 in the corresponding *expand_user option field. Otherwise, fall through
1537 to treat it as a fixed uid. Ensure mutual exclusivity of the two kinds
1538 of data. */
1539
1540 case opt_expand_uid:
1541 sprintf(CS name2, "*expand_%.50s", name);
1542 ol2 = find_option(name2, oltop, last);
1543 if (ol2 != NULL)
1544 {
1545 uschar *ss = (Ustrchr(sptr, '$') != NULL)? sptr : NULL;
1546
1547 if (data_block == NULL)
1548 *((uschar **)(ol2->value)) = ss;
1549 else
1550 *((uschar **)((uschar *)data_block + (long int)(ol2->value))) = ss;
1551
1552 if (ss != NULL)
1553 {
1554 *(get_set_flag(name, oltop, last, data_block)) = FALSE;
1555 freesptr = FALSE;
1556 break;
1557 }
1558 }
1559
1560 /* Look up a fixed uid, and also make use of the corresponding gid
1561 if a passwd entry is returned and the gid has not been set. */
1562
1563 case opt_uid:
1564 if (!route_finduser(sptr, &pw, &uid))
1565 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "user %s was not found", sptr);
1566 if (data_block == NULL)
1567 *((uid_t *)(ol->value)) = uid;
1568 else
1569 *((uid_t *)((uschar *)data_block + (long int)(ol->value))) = uid;
1570
1571 /* Set the flag indicating a fixed value is set */
1572
1573 *(get_set_flag(name, oltop, last, data_block)) = TRUE;
1574
1575 /* Handle matching gid if we have a passwd entry: done by finding the
1576 same name with terminating "user" changed to "group"; if not found,
1577 ignore. Also ignore if the value is already set. */
1578
1579 if (pw == NULL) break;
1580 Ustrcpy(name+Ustrlen(name)-4, "group");
1581 ol2 = find_option(name, oltop, last);
1582 if (ol2 != NULL && ((ol2->type & opt_mask) == opt_gid ||
1583 (ol2->type & opt_mask) == opt_expand_gid))
1584 {
1585 BOOL *set_flag = get_set_flag(name, oltop, last, data_block);
1586 if (! *set_flag)
1587 {
1588 if (data_block == NULL)
1589 *((gid_t *)(ol2->value)) = pw->pw_gid;
1590 else
1591 *((gid_t *)((uschar *)data_block + (long int)(ol2->value))) = pw->pw_gid;
1592 *set_flag = TRUE;
1593 }
1594 }
1595 break;
1596
1597 /* If it was an expanded gid, see if there is any expansion to be
1598 done by checking for the presence of a $ character. If there is, save it
1599 in the corresponding *expand_user option field. Otherwise, fall through
1600 to treat it as a fixed gid. Ensure mutual exclusivity of the two kinds
1601 of data. */
1602
1603 case opt_expand_gid:
1604 sprintf(CS name2, "*expand_%.50s", name);
1605 ol2 = find_option(name2, oltop, last);
1606 if (ol2 != NULL)
1607 {
1608 uschar *ss = (Ustrchr(sptr, '$') != NULL)? sptr : NULL;
1609
1610 if (data_block == NULL)
1611 *((uschar **)(ol2->value)) = ss;
1612 else
1613 *((uschar **)((uschar *)data_block + (long int)(ol2->value))) = ss;
1614
1615 if (ss != NULL)
1616 {
1617 *(get_set_flag(name, oltop, last, data_block)) = FALSE;
1618 freesptr = FALSE;
1619 break;
1620 }
1621 }
1622
1623 /* Handle freestanding gid */
1624
1625 case opt_gid:
1626 if (!route_findgroup(sptr, &gid))
1627 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "group %s was not found", sptr);
1628 if (data_block == NULL)
1629 *((gid_t *)(ol->value)) = gid;
1630 else
1631 *((gid_t *)((uschar *)data_block + (long int)(ol->value))) = gid;
1632 *(get_set_flag(name, oltop, last, data_block)) = TRUE;
1633 break;
1634
1635 /* If it was a uid list, look up each individual entry, and build
1636 a vector of uids, with a count in the first element. Put the vector
1637 in malloc store so we can free the string. (We are reading into
1638 permanent store already.) */
1639
1640 case opt_uidlist:
1641 {
1642 int count = 1;
1643 uid_t *list;
1644 int ptr = 0;
0925ede6
PH
1645 uschar *p;
1646 uschar *op = expand_string (sptr);
1647
1648 if (op == NULL)
1649 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "failed to expand %s: %s",
1650 name, expand_string_message);
059ec3d9 1651
0925ede6 1652 p = op;
059ec3d9 1653 if (*p != 0) count++;
0925ede6 1654 while (*p != 0) if (*p++ == ':' && *p != 0) count++;
059ec3d9
PH
1655 list = store_malloc(count*sizeof(uid_t));
1656 list[ptr++] = (uid_t)(count - 1);
1657
1658 if (data_block == NULL)
1659 *((uid_t **)(ol->value)) = list;
1660 else
1661 *((uid_t **)((uschar *)data_block + (long int)(ol->value))) = list;
1662
0925ede6 1663 p = op;
059ec3d9
PH
1664 while (count-- > 1)
1665 {
1666 int sep = 0;
1667 (void)string_nextinlist(&p, &sep, big_buffer, BIG_BUFFER_SIZE);
1668 if (!route_finduser(big_buffer, NULL, &uid))
1669 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "user %s was not found",
1670 big_buffer);
1671 list[ptr++] = uid;
1672 }
1673 }
1674 break;
1675
1676 /* If it was a gid list, look up each individual entry, and build
1677 a vector of gids, with a count in the first element. Put the vector
1678 in malloc store so we can free the string. (We are reading into permanent
1679 store already.) */
1680
1681 case opt_gidlist:
1682 {
1683 int count = 1;
1684 gid_t *list;
1685 int ptr = 0;
0925ede6
PH
1686 uschar *p;
1687 uschar *op = expand_string (sptr);
1688
1689 if (op == NULL)
1690 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "failed to expand %s: %s",
1691 name, expand_string_message);
059ec3d9 1692
0925ede6 1693 p = op;
059ec3d9 1694 if (*p != 0) count++;
0925ede6 1695 while (*p != 0) if (*p++ == ':' && *p != 0) count++;
059ec3d9
PH
1696 list = store_malloc(count*sizeof(gid_t));
1697 list[ptr++] = (gid_t)(count - 1);
1698
1699 if (data_block == NULL)
1700 *((gid_t **)(ol->value)) = list;
1701 else
1702 *((gid_t **)((uschar *)data_block + (long int)(ol->value))) = list;
1703
0925ede6 1704 p = op;
059ec3d9
PH
1705 while (count-- > 1)
1706 {
1707 int sep = 0;
1708 (void)string_nextinlist(&p, &sep, big_buffer, BIG_BUFFER_SIZE);
1709 if (!route_findgroup(big_buffer, &gid))
1710 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "group %s was not found",
1711 big_buffer);
1712 list[ptr++] = gid;
1713 }
1714 }
1715 break;
1716 }
1717
1718 /* Release store if the value of the string doesn't need to be kept. */
1719
1720 if (freesptr) store_reset(reset_point);
1721 break;
1722
1723 /* Expanded boolean: if no characters follow, or if there are no dollar
1724 characters, this is a fixed-valued boolean, and we fall through. Otherwise,
1725 save the string for later expansion in the alternate place. */
1726
1727 case opt_expand_bool:
1728 if (*s != 0 && Ustrchr(s, '$') != 0)
1729 {
1730 sprintf(CS name2, "*expand_%.50s", name);
1731 ol2 = find_option(name2, oltop, last);
1732 if (ol2 != NULL)
1733 {
1734 reset_point = sptr = read_string(s, name);
1735 if (data_block == NULL)
1736 *((uschar **)(ol2->value)) = sptr;
1737 else
1738 *((uschar **)((uschar *)data_block + (long int)(ol2->value))) = sptr;
1739 freesptr = FALSE;
1740 break;
1741 }
1742 }
1743 /* Fall through */
1744
1745 /* Boolean: if no characters follow, the value is boolvalue. Otherwise
1746 look for yes/not/true/false. Some booleans are stored in a single bit in
1747 a single int. There's a special fudge for verify settings; without a suffix
1748 they set both xx_sender and xx_recipient. The table points to the sender
1749 value; search subsequently for the recipient. There's another special case:
1750 opt_bool_set also notes when a boolean has been set. */
1751
1752 case opt_bool:
1753 case opt_bit:
1754 case opt_bool_verify:
1755 case opt_bool_set:
1756 if (*s != 0)
1757 {
1758 s = readconf_readname(name2, 64, s);
1759 if (strcmpic(name2, US"true") == 0 || strcmpic(name2, US"yes") == 0)
1760 boolvalue = TRUE;
1761 else if (strcmpic(name2, US"false") == 0 || strcmpic(name2, US"no") == 0)
1762 boolvalue = FALSE;
1763 else log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1764 "\"%s\" is not a valid value for the \"%s\" option", name2, name);
1765 if (*s != 0) extra_chars_error(s, string_sprintf("\"%s\" ", name2),
1766 US"for boolean option ", name);
1767 }
1768
1769 /* Handle single-bit type. */
1770
1771 if (type == opt_bit)
1772 {
1773 int bit = 1 << ((ol->type >> 16) & 31);
1774 int *ptr = (data_block == NULL)?
1775 (int *)(ol->value) :
1776 (int *)((uschar *)data_block + (long int)ol->value);
1777 if (boolvalue) *ptr |= bit; else *ptr &= ~bit;
1778 break;
1779 }
1780
1781 /* Handle full BOOL types */
1782
1783 if (data_block == NULL)
1784 *((BOOL *)(ol->value)) = boolvalue;
1785 else
1786 *((BOOL *)((uschar *)data_block + (long int)(ol->value))) = boolvalue;
1787
1788 /* Verify fudge */
1789
1790 if (type == opt_bool_verify)
1791 {
1792 sprintf(CS name2, "%.50s_recipient", name + offset);
1793 ol2 = find_option(name2, oltop, last);
1794 if (ol2 != NULL)
1795 {
1796 if (data_block == NULL)
1797 *((BOOL *)(ol2->value)) = boolvalue;
1798 else
1799 *((BOOL *)((uschar *)data_block + (long int)(ol2->value))) = boolvalue;
1800 }
1801 }
1802
1803 /* Note that opt_bool_set type is set, if there is somewhere to do so */
1804
1805 else if (type == opt_bool_set)
1806 {
1807 sprintf(CS name2, "*set_%.50s", name + offset);
1808 ol2 = find_option(name2, oltop, last);
1809 if (ol2 != NULL)
1810 {
1811 if (data_block == NULL)
1812 *((BOOL *)(ol2->value)) = TRUE;
1813 else
1814 *((BOOL *)((uschar *)data_block + (long int)(ol2->value))) = TRUE;
1815 }
1816 }
1817 break;
1818
1819 /* Octal integer */
1820
1821 case opt_octint:
1822 intbase = 8;
1823 inttype = US"octal ";
1824
1825 /* Integer: a simple(ish) case; allow octal and hex formats, and
1826 suffixes K and M. The different types affect output, not input. */
1827
1828 case opt_mkint:
1829 case opt_int:
1830 {
1831 uschar *endptr;
1832 errno = 0;
1833 value = strtol(CS s, CSS &endptr, intbase);
1834
1835 if (endptr == s)
1836 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "%sinteger expected for %s",
1837 inttype, name);
1838
1839 if (errno != ERANGE)
1840 {
1841 if (tolower(*endptr) == 'k')
1842 {
1843 if (value > INT_MAX/1024 || value < INT_MIN/1024) errno = ERANGE;
1844 else value *= 1024;
1845 endptr++;
1846 }
1847 else if (tolower(*endptr) == 'm')
1848 {
1849 if (value > INT_MAX/(1024*1024) || value < INT_MIN/(1024*1024))
1850 errno = ERANGE;
1851 else value *= 1024*1024;
1852 endptr++;
1853 }
1854 }
1855
1856 if (errno == ERANGE) log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1857 "absolute value of integer \"%s\" is too large (overflow)", s);
1858
1859 while (isspace(*endptr)) endptr++;
1860 if (*endptr != 0)
1861 extra_chars_error(endptr, inttype, US"integer value for ", name);
1862 }
1863
1864 if (data_block == NULL)
1865 *((int *)(ol->value)) = value;
1866 else
1867 *((int *)((uschar *)data_block + (long int)(ol->value))) = value;
1868 break;
1869
1870 /* Integer held in K: again, allow octal and hex formats, and suffixes K and
1871 M. */
1872
1873 case opt_Kint:
1874 {
1875 uschar *endptr;
1876 errno = 0;
1877 value = strtol(CS s, CSS &endptr, intbase);
1878
1879 if (endptr == s)
1880 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "%sinteger expected for %s",
1881 inttype, name);
1882
1883 if (errno != ERANGE)
1884 {
1885 if (tolower(*endptr) == 'm')
1886 {
1887 if (value > INT_MAX/1024 || value < INT_MIN/1024) errno = ERANGE;
1888 else value *= 1024;
1889 endptr++;
1890 }
1891 else if (tolower(*endptr) == 'k')
1892 {
1893 endptr++;
1894 }
1895 else
1896 {
1897 value = (value + 512)/1024;
1898 }
1899 }
1900
1901 if (errno == ERANGE) log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1902 "absolute value of integer \"%s\" is too large (overflow)", s);
1903
1904 while (isspace(*endptr)) endptr++;
1905 if (*endptr != 0)
1906 extra_chars_error(endptr, inttype, US"integer value for ", name);
1907 }
1908
1909 if (data_block == NULL)
1910 *((int *)(ol->value)) = value;
1911 else
1912 *((int *)((uschar *)data_block + (long int)(ol->value))) = value;
1913 break;
1914
1915 /* Fixed-point number: held to 3 decimal places. */
1916
1917 case opt_fixed:
1918 if (sscanf(CS s, "%d%n", &value, &count) != 1)
1919 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1920 "fixed-point number expected for %s", name);
1921
1922 if (value < 0) log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1923 "integer \"%s\" is too large (overflow)", s);
1924
1925 value *= 1000;
1926
1927 if (value < 0) log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1928 "integer \"%s\" is too large (overflow)", s);
1929
1930 if (s[count] == '.')
1931 {
1932 int d = 100;
1933 while (isdigit(s[++count]))
1934 {
1935 value += (s[count] - '0') * d;
1936 d /= 10;
1937 }
1938 }
1939
1940 while (isspace(s[count])) count++;
1941
1942 if (s[count] != 0)
1943 extra_chars_error(s+count, US"fixed-point value for ", name, US"");
1944
1945 if (data_block == NULL)
1946 *((int *)(ol->value)) = value;
1947 else
1948 *((int *)((uschar *)data_block + (long int)(ol->value))) = value;
1949 break;
1950
1951 /* There's a special routine to read time values. */
1952
1953 case opt_time:
1954 value = readconf_readtime(s, 0, FALSE);
1955 if (value < 0)
1956 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "invalid time value for %s",
1957 name);
1958 if (data_block == NULL)
1959 *((int *)(ol->value)) = value;
1960 else
1961 *((int *)((uschar *)data_block + (long int)(ol->value))) = value;
1962 break;
1963
1964 /* A time list is a list of colon-separated times, with the first
1965 element holding the size of the list and the second the number of
1966 entries used. */
1967
1968 case opt_timelist:
1969 {
1970 int count = 0;
1971 int *list = (data_block == NULL)?
1972 (int *)(ol->value) :
1973 (int *)((uschar *)data_block + (long int)(ol->value));
1974
1975 if (*s != 0) for (count = 1; count <= list[0] - 2; count++)
1976 {
1977 int terminator = 0;
1978 uschar *snext = Ustrchr(s, ':');
1979 if (snext != NULL)
1980 {
1981 uschar *ss = snext;
1982 while (ss > s && isspace(ss[-1])) ss--;
1983 terminator = *ss;
1984 }
1985 value = readconf_readtime(s, terminator, FALSE);
1986 if (value < 0)
1987 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "invalid time value for %s",
1988 name);
1989 if (count > 1 && value <= list[count])
1990 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1991 "time value out of order for %s", name);
1992 list[count+1] = value;
1993 if (snext == NULL) break;
1994 s = snext + 1;
1995 while (isspace(*s)) s++;
1996 }
1997
1998 if (count > list[0] - 2)
1999 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "too many time values for %s",
2000 name);
2001 if (count > 0 && list[2] == 0) count = 0;
2002 list[1] = count;
2003 }
2004
2005 break;
2006 }
2007
2008return TRUE;
2009}
2010
2011
2012
2013/*************************************************
2014* Print a time value *
2015*************************************************/
2016
2017/*
2018Argument: a time value in seconds
2019Returns: pointer to a fixed buffer containing the time as a string,
2020 in readconf_readtime() format
2021*/
2022
2023uschar *
2024readconf_printtime(int t)
2025{
2026int s, m, h, d, w;
2027uschar *p = time_buffer;
2028
ea49d0e1
PH
2029if (t < 0)
2030 {
2031 *p++ = '-';
2032 t = -t;
2033 }
2034
059ec3d9
PH
2035s = t % 60;
2036t /= 60;
2037m = t % 60;
2038t /= 60;
2039h = t % 24;
2040t /= 24;
2041d = t % 7;
2042w = t/7;
2043
2044if (w > 0) { sprintf(CS p, "%dw", w); while (*p) p++; }
2045if (d > 0) { sprintf(CS p, "%dd", d); while (*p) p++; }
2046if (h > 0) { sprintf(CS p, "%dh", h); while (*p) p++; }
2047if (m > 0) { sprintf(CS p, "%dm", m); while (*p) p++; }
2048if (s > 0 || p == time_buffer) sprintf(CS p, "%ds", s);
2049
2050return time_buffer;
2051}
2052
2053
2054
2055/*************************************************
2056* Print an individual option value *
2057*************************************************/
2058
2059/* This is used by the -bP option, so prints to the standard output.
2060The entire options list is passed in as an argument, because some options come
2061in pairs - typically uid/gid settings, which can either be explicit numerical
2062values, or strings to be expanded later. If the numerical value is unset,
2063search for "*expand_<name>" to see if there is a string equivalent.
2064
2065Arguments:
2066 ol option entry, or NULL for an unknown option
2067 name option name
2068 options_block NULL for main configuration options; otherwise points to
2069 a driver block; if the option doesn't have opt_public
2070 set, then options_block->options_block is where the item
2071 resides.
2072 oltop points to the option list in which ol exists
2073 last one more than the offset of the last entry in optop
2074
2075Returns: nothing
2076*/
2077
2078static void
2079print_ol(optionlist *ol, uschar *name, void *options_block,
2080 optionlist *oltop, int last)
2081{
2082struct passwd *pw;
2083struct group *gr;
2084optionlist *ol2;
2085void *value;
2086uid_t *uidlist;
2087gid_t *gidlist;
2088uschar *s;
2089uschar name2[64];
2090
2091if (ol == NULL)
2092 {
2093 printf("%s is not a known option\n", name);
2094 return;
2095 }
2096
2097/* Non-admin callers cannot see options that have been flagged secure by the
2098"hide" prefix. */
2099
2100if (!admin_user && (ol->type & opt_secure) != 0)
2101 {
2102 printf("%s = <value not displayable>\n", name);
2103 return;
2104 }
2105
2106/* Else show the value of the option */
2107
2108value = ol->value;
2109if (options_block != NULL)
2110 {
2111 if ((ol->type & opt_public) == 0)
2112 options_block = (void *)(((driver_instance *)options_block)->options_block);
2113 value = (void *)((uschar *)options_block + (long int)value);
2114 }
2115
2116switch(ol->type & opt_mask)
2117 {
2118 case opt_stringptr:
2119 case opt_rewrite: /* Show the text value */
2120 s = *((uschar **)value);
2121 printf("%s = %s\n", name, (s == NULL)? US"" : string_printing2(s, FALSE));
2122 break;
2123
2124 case opt_int:
2125 printf("%s = %d\n", name, *((int *)value));
2126 break;
2127
2128 case opt_mkint:
2129 {
2130 int x = *((int *)value);
2131 if (x != 0 && (x & 1023) == 0)
2132 {
2133 int c = 'K';
2134 x >>= 10;
2135 if ((x & 1023) == 0)
2136 {
2137 c = 'M';
2138 x >>= 10;
2139 }
2140 printf("%s = %d%c\n", name, x, c);
2141 }
2142 else printf("%s = %d\n", name, x);
2143 }
2144 break;
2145
2146 case opt_Kint:
2147 {
2148 int x = *((int *)value);
2149 if (x == 0) printf("%s = 0\n", name);
2150 else if ((x & 1023) == 0) printf("%s = %dM\n", name, x >> 10);
2151 else printf("%s = %dK\n", name, x);
2152 }
2153 break;
2154
2155 case opt_octint:
2156 printf("%s = %#o\n", name, *((int *)value));
2157 break;
2158
2159 /* Can be negative only when "unset", in which case integer */
2160
2161 case opt_fixed:
2162 {
2163 int x = *((int *)value);
2164 int f = x % 1000;
2165 int d = 100;
2166 if (x < 0) printf("%s =\n", name); else
2167 {
2168 printf("%s = %d.", name, x/1000);
2169 do
2170 {
2171 printf("%d", f/d);
2172 f %= d;
2173 d /= 10;
2174 }
2175 while (f != 0);
2176 printf("\n");
2177 }
2178 }
2179 break;
2180
2181 /* If the numerical value is unset, try for the string value */
2182
2183 case opt_expand_uid:
2184 if (! *get_set_flag(name, oltop, last, options_block))
2185 {
2186 sprintf(CS name2, "*expand_%.50s", name);
2187 ol2 = find_option(name2, oltop, last);
2188 if (ol2 != NULL)
2189 {
2190 void *value2 = ol2->value;
2191 if (options_block != NULL)
2192 value2 = (void *)((uschar *)options_block + (long int)value2);
2193 s = *((uschar **)value2);
2194 printf("%s = %s\n", name, (s == NULL)? US"" : string_printing(s));
2195 break;
2196 }
2197 }
2198
2199 /* Else fall through */
2200
2201 case opt_uid:
2202 if (! *get_set_flag(name, oltop, last, options_block))
2203 printf("%s =\n", name);
2204 else
2205 {
2206 pw = getpwuid(*((uid_t *)value));
2207 if (pw == NULL)
2208 printf("%s = %ld\n", name, (long int)(*((uid_t *)value)));
2209 else printf("%s = %s\n", name, pw->pw_name);
2210 }
2211 break;
2212
2213 /* If the numerical value is unset, try for the string value */
2214
2215 case opt_expand_gid:
2216 if (! *get_set_flag(name, oltop, last, options_block))
2217 {
2218 sprintf(CS name2, "*expand_%.50s", name);
2219 ol2 = find_option(name2, oltop, last);
2220 if (ol2 != NULL && (ol2->type & opt_mask) == opt_stringptr)
2221 {
2222 void *value2 = ol2->value;
2223 if (options_block != NULL)
2224 value2 = (void *)((uschar *)options_block + (long int)value2);
2225 s = *((uschar **)value2);
2226 printf("%s = %s\n", name, (s == NULL)? US"" : string_printing(s));
2227 break;
2228 }
2229 }
2230
2231 /* Else fall through */
2232
2233 case opt_gid:
2234 if (! *get_set_flag(name, oltop, last, options_block))
2235 printf("%s =\n", name);
2236 else
2237 {
2238 gr = getgrgid(*((int *)value));
2239 if (gr == NULL)
2240 printf("%s = %ld\n", name, (long int)(*((int *)value)));
2241 else printf("%s = %s\n", name, gr->gr_name);
2242 }
2243 break;
2244
2245 case opt_uidlist:
2246 uidlist = *((uid_t **)value);
2247 printf("%s =", name);
2248 if (uidlist != NULL)
2249 {
2250 int i;
2251 uschar sep = ' ';
2252 for (i = 1; i <= (int)(uidlist[0]); i++)
2253 {
2254 uschar *name = NULL;
2255 pw = getpwuid(uidlist[i]);
2256 if (pw != NULL) name = US pw->pw_name;
2257 if (name != NULL) printf("%c%s", sep, name);
2258 else printf("%c%ld", sep, (long int)(uidlist[i]));
2259 sep = ':';
2260 }
2261 }
2262 printf("\n");
2263 break;
2264
2265 case opt_gidlist:
2266 gidlist = *((gid_t **)value);
2267 printf("%s =", name);
2268 if (gidlist != NULL)
2269 {
2270 int i;
2271 uschar sep = ' ';
2272 for (i = 1; i <= (int)(gidlist[0]); i++)
2273 {
2274 uschar *name = NULL;
2275 gr = getgrgid(gidlist[i]);
2276 if (gr != NULL) name = US gr->gr_name;
2277 if (name != NULL) printf("%c%s", sep, name);
2278 else printf("%c%ld", sep, (long int)(gidlist[i]));
2279 sep = ':';
2280 }
2281 }
2282 printf("\n");
2283 break;
2284
2285 case opt_time:
2286 printf("%s = %s\n", name, readconf_printtime(*((int *)value)));
2287 break;
2288
2289 case opt_timelist:
2290 {
2291 int i;
2292 int *list = (int *)value;
2293 printf("%s = ", name);
2294 for (i = 0; i < list[1]; i++)
2295 printf("%s%s", (i == 0)? "" : ":", readconf_printtime(list[i+2]));
2296 printf("\n");
2297 }
2298 break;
2299
2300 case opt_bit:
2301 printf("%s%s\n", ((*((int *)value)) & (1 << ((ol->type >> 16) & 31)))?
2302 "" : "no_", name);
2303 break;
2304
2305 case opt_expand_bool:
2306 sprintf(CS name2, "*expand_%.50s", name);
2307 ol2 = find_option(name2, oltop, last);
2308 if (ol2 != NULL && ol2->value != NULL)
2309 {
2310 void *value2 = ol2->value;
2311 if (options_block != NULL)
2312 value2 = (void *)((uschar *)options_block + (long int)value2);
2313 s = *((uschar **)value2);
2314 if (s != NULL)
2315 {
2316 printf("%s = %s\n", name, string_printing(s));
2317 break;
2318 }
2319 /* s == NULL => string not set; fall through */
2320 }
2321
2322 /* Fall through */
2323
2324 case opt_bool:
2325 case opt_bool_verify:
2326 case opt_bool_set:
2327 printf("%s%s\n", (*((BOOL *)value))? "" : "no_", name);
2328 break;
2329 }
2330}
2331
2332
2333
2334/*************************************************
2335* Print value from main configuration *
2336*************************************************/
2337
2338/* This function, called as a result of encountering the -bP option,
2339causes the value of any main configuration variable to be output if the
2340second argument is NULL. There are some special values:
2341
2342 all print all main configuration options
2343 configure_file print the name of the configuration file
2344 routers print the routers' configurations
2345 transports print the transports' configuration
2346 authenticators print the authenticators' configuration
2347 router_list print a list of router names
2348 transport_list print a list of transport names
2349 authenticator_list print a list of authentication mechanism names
2350 +name print a named list item
2351 local_scan print the local_scan options
2352
2353If the second argument is not NULL, it must be one of "router", "transport", or
2354"authenticator" in which case the first argument identifies the driver whose
2355options are to be printed.
2356
2357Arguments:
2358 name option name if type == NULL; else driver name
2359 type NULL or driver type name, as described above
2360
2361Returns: nothing
2362*/
2363
2364void
2365readconf_print(uschar *name, uschar *type)
2366{
2367BOOL names_only = FALSE;
2368optionlist *ol;
2369optionlist *ol2 = NULL;
2370driver_instance *d = NULL;
2371int size = 0;
2372
2373if (type == NULL)
2374 {
2375 if (*name == '+')
2376 {
2377 int i;
2378 tree_node *t;
2379 BOOL found = FALSE;
2380 static uschar *types[] = { US"address", US"domain", US"host",
2381 US"localpart" };
2382 static tree_node **anchors[] = { &addresslist_anchor, &domainlist_anchor,
2383 &hostlist_anchor, &localpartlist_anchor };
2384
2385 for (i = 0; i < 4; i++)
2386 {
2387 t = tree_search(*(anchors[i]), name+1);
2388 if (t != NULL)
2389 {
2390 found = TRUE;
2391 printf("%slist %s = %s\n", types[i], name+1,
2392 ((namedlist_block *)(t->data.ptr))->string);
2393 }
2394 }
2395
2396 if (!found)
2397 printf("no address, domain, host, or local part list called \"%s\" "
2398 "exists\n", name+1);
2399
2400 return;
2401 }
2402
2403 if (Ustrcmp(name, "configure_file") == 0)
2404 {
2405 printf("%s\n", CS config_main_filename);
2406 return;
2407 }
2408
2409 if (Ustrcmp(name, "all") == 0)
2410 {
2411 for (ol = optionlist_config;
2412 ol < optionlist_config + optionlist_config_size; ol++)
2413 {
2414 if ((ol->type & opt_hidden) == 0)
2415 print_ol(ol, US ol->name, NULL, optionlist_config, optionlist_config_size);
2416 }
2417 return;
2418 }
2419
2420 if (Ustrcmp(name, "local_scan") == 0)
2421 {
2422 #ifndef LOCAL_SCAN_HAS_OPTIONS
2423 printf("local_scan() options are not supported\n");
2424 #else
2425 for (ol = local_scan_options;
2426 ol < local_scan_options + local_scan_options_count; ol++)
2427 {
2428 print_ol(ol, US ol->name, NULL, local_scan_options,
2429 local_scan_options_count);
2430 }
2431 #endif
2432 return;
2433 }
2434
2435 if (Ustrcmp(name, "routers") == 0)
2436 {
2437 type = US"router";
2438 name = NULL;
2439 }
2440 else if (Ustrcmp(name, "transports") == 0)
2441 {
2442 type = US"transport";
2443 name = NULL;
2444 }
2445
2446 else if (Ustrcmp(name, "authenticators") == 0)
2447 {
2448 type = US"authenticator";
2449 name = NULL;
2450 }
2451
2452 else if (Ustrcmp(name, "authenticator_list") == 0)
2453 {
2454 type = US"authenticator";
2455 name = NULL;
2456 names_only = TRUE;
2457 }
2458
2459 else if (Ustrcmp(name, "router_list") == 0)
2460 {
2461 type = US"router";
2462 name = NULL;
2463 names_only = TRUE;
2464 }
2465 else if (Ustrcmp(name, "transport_list") == 0)
2466 {
2467 type = US"transport";
2468 name = NULL;
2469 names_only = TRUE;
2470 }
2471 else
2472 {
2473 print_ol(find_option(name, optionlist_config, optionlist_config_size),
2474 name, NULL, optionlist_config, optionlist_config_size);
2475 return;
2476 }
2477 }
2478
2479/* Handle the options for a router or transport. Skip options that are flagged
2480as hidden. Some of these are options with names starting with '*', used for
2481internal alternative representations of other options (which the printing
2482function will sort out). Others are synonyms kept for backward compatibility.
2483*/
2484
2485if (Ustrcmp(type, "router") == 0)
2486 {
2487 d = (driver_instance *)routers;
2488 ol2 = optionlist_routers;
2489 size = optionlist_routers_size;
2490 }
2491else if (Ustrcmp(type, "transport") == 0)
2492 {
2493 d = (driver_instance *)transports;
2494 ol2 = optionlist_transports;
2495 size = optionlist_transports_size;
2496 }
2497else if (Ustrcmp(type, "authenticator") == 0)
2498 {
2499 d = (driver_instance *)auths;
2500 ol2 = optionlist_auths;
2501 size = optionlist_auths_size;
2502 }
2503
2504if (names_only)
2505 {
2506 for (; d != NULL; d = d->next) printf("%s\n", CS d->name);
2507 return;
2508 }
2509
2510/* Either search for a given driver, or print all of them */
2511
2512for (; d != NULL; d = d->next)
2513 {
2514 if (name == NULL)
2515 printf("\n%s %s:\n", d->name, type);
2516 else if (Ustrcmp(d->name, name) != 0) continue;
2517
2518 for (ol = ol2; ol < ol2 + size; ol++)
2519 {
2520 if ((ol->type & opt_hidden) == 0)
2521 print_ol(ol, US ol->name, d, ol2, size);
2522 }
2523
2524 for (ol = d->info->options;
2525 ol < d->info->options + *(d->info->options_count); ol++)
2526 {
2527 if ((ol->type & opt_hidden) == 0)
2528 print_ol(ol, US ol->name, d, d->info->options, *(d->info->options_count));
2529 }
2530 if (name != NULL) return;
2531 }
2532if (name != NULL) printf("%s %s not found\n", type, name);
2533}
2534
2535
2536
2537/*************************************************
2538* Read a named list item *
2539*************************************************/
2540
2541/* This function reads a name and a list (i.e. string). The name is used to
2542save the list in a tree, sorted by its name. Each entry also has a number,
2543which can be used for caching tests, but if the string contains any expansion
2544items other than $key, the number is set negative to inhibit caching. This
2545mechanism is used for domain, host, and address lists that are referenced by
2546the "+name" syntax.
2547
2548Arguments:
2549 anchorp points to the tree anchor
2550 numberp points to the current number for this tree
2551 max the maximum number permitted
2552 s the text of the option line, starting immediately after the name
2553 of the list type
2554 tname the name of the list type, for messages
2555
2556Returns: nothing
2557*/
2558
2559static void
2560read_named_list(tree_node **anchorp, int *numberp, int max, uschar *s,
2561 uschar *tname)
2562{
2563BOOL forcecache = FALSE;
2564uschar *ss;
2565tree_node *t;
2566namedlist_block *nb = store_get(sizeof(namedlist_block));
2567
2568if (Ustrncmp(s, "_cache", 6) == 0)
2569 {
2570 forcecache = TRUE;
2571 s += 6;
2572 }
2573
2574if (!isspace(*s))
2575 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "unrecognized configuration line");
2576
2577if (*numberp >= max)
2578 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "too many named %ss (max is %d)\n",
2579 tname, max);
2580
2581while (isspace(*s)) s++;
2582ss = s;
2583while (isalnum(*s) || *s == '_') s++;
2584t = store_get(sizeof(tree_node) + s-ss);
2585Ustrncpy(t->name, ss, s-ss);
2586t->name[s-ss] = 0;
2587while (isspace(*s)) s++;
2588
2589if (!tree_insertnode(anchorp, t))
2590 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
2591 "duplicate name \"%s\" for a named %s", t->name, tname);
2592
2593t->data.ptr = nb;
2594nb->number = *numberp;
2595*numberp += 1;
2596
2597if (*s++ != '=') log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
2598 "missing '=' after \"%s\"", t->name);
2599while (isspace(*s)) s++;
2600nb->string = read_string(s, t->name);
2601nb->cache_data = NULL;
2602
2603/* Check the string for any expansions; if any are found, mark this list
2604uncacheable unless the user has explicited forced caching. */
2605
2606if (!forcecache && Ustrchr(nb->string, '$') != NULL) nb->number = -1;
2607}
2608
2609
2610
2611
2612/*************************************************
2613* Unpick data for a rate limit *
2614*************************************************/
2615
2616/* This function is called to unpick smtp_ratelimit_{mail,rcpt} into four
2617separate values.
2618
2619Arguments:
2620 s string, in the form t,b,f,l
2621 where t is the threshold (integer)
2622 b is the initial delay (time)
2623 f is the multiplicative factor (fixed point)
2624 k is the maximum time (time)
2625 threshold where to store threshold
2626 base where to store base in milliseconds
2627 factor where to store factor in milliseconds
2628 limit where to store limit
2629
2630Returns: nothing (panics on error)
2631*/
2632
2633static void
2634unpick_ratelimit(uschar *s, int *threshold, int *base, double *factor,
2635 int *limit)
2636{
2637uschar bstring[16], lstring[16];
2638
2639if (sscanf(CS s, "%d, %15[0123456789smhdw.], %lf, %15s", threshold, bstring,
2640 factor, lstring) == 4)
2641 {
2642 *base = readconf_readtime(bstring, 0, TRUE);
2643 *limit = readconf_readtime(lstring, 0, TRUE);
2644 if (*base >= 0 && *limit >= 0) return;
2645 }
2646log_write(0, LOG_MAIN|LOG_PANIC_DIE, "malformed ratelimit data: %s", s);
2647}
2648
2649
2650
2651
2652/*************************************************
2653* Read main configuration options *
2654*************************************************/
2655
2656/* This function is the first to be called for configuration reading. It
2657opens the configuration file and reads general configuration settings until
2658it reaches the end of the configuration section. The file is then left open so
2659that the remaining configuration data can subsequently be read if needed for
2660this run of Exim.
2661
2662The configuration file must be owned either by root or exim, and be writeable
2663only by root or uid/gid exim. The values for Exim's uid and gid can be changed
2664in the config file, so the test is done on the compiled in values. A slight
2665anomaly, to be carefully documented.
2666
2667The name of the configuration file is taken from a list that is included in the
2668binary of Exim. It can be altered from the command line, but if that is done,
2669root privilege is immediately withdrawn unless the caller is root or exim.
2670The first file on the list that exists is used.
2671
2672For use on multiple systems that share file systems, first look for a
2673configuration file whose name has the current node name on the end. If that is
2674not found, try the generic name. For really contorted configurations, that run
2675multiple Exims with different uid settings, first try adding the effective uid
2676before the node name. These complications are going to waste resources on most
2677systems. Therefore they are available only when requested by compile-time
2678options. */
2679
2680void
2681readconf_main(void)
2682{
2683int sep = 0;
2684struct stat statbuf;
2685uschar *s, *filename;
2686uschar *list = config_main_filelist;
2687
2688/* Loop through the possible file names */
2689
2690while((filename = string_nextinlist(&list, &sep, big_buffer, big_buffer_size))
2691 != NULL)
2692 {
2693 /* Cut out all the fancy processing unless specifically wanted */
2694
2695 #if defined(CONFIGURE_FILE_USE_NODE) || defined(CONFIGURE_FILE_USE_EUID)
2696 uschar *suffix = filename + Ustrlen(filename);
2697
2698 /* Try for the node-specific file if a node name exists */
2699
2700 #ifdef CONFIGURE_FILE_USE_NODE
2701 struct utsname uts;
2702 if (uname(&uts) >= 0)
2703 {
2704 #ifdef CONFIGURE_FILE_USE_EUID
2705 sprintf(CS suffix, ".%ld.%.256s", (long int)original_euid, uts.nodename);
2706 config_file = Ufopen(filename, "rb");
2707 if (config_file == NULL)
2708 #endif /* CONFIGURE_FILE_USE_EUID */
2709 {
2710 sprintf(CS suffix, ".%.256s", uts.nodename);
2711 config_file = Ufopen(filename, "rb");
2712 }
2713 }
2714 #endif /* CONFIGURE_FILE_USE_NODE */
2715
2716 /* Otherwise, try the generic name, possibly with the euid added */
2717
2718 #ifdef CONFIGURE_FILE_USE_EUID
2719 if (config_file == NULL)
2720 {
2721 sprintf(CS suffix, ".%ld", (long int)original_euid);
2722 config_file = Ufopen(filename, "rb");
2723 }
2724 #endif /* CONFIGURE_FILE_USE_EUID */
2725
2726 /* Finally, try the unadorned name */
2727
2728 if (config_file == NULL)
2729 {
2730 *suffix = 0;
2731 config_file = Ufopen(filename, "rb");
2732 }
2733 #else /* if neither defined */
2734
2735 /* This is the common case when the fancy processing is not included. */
2736
2737 config_file = Ufopen(filename, "rb");
2738 #endif
2739
2740 /* If the file does not exist, continue to try any others. For any other
2741 error, break out (and die). */
2742
2743 if (config_file != NULL || errno != ENOENT) break;
2744 }
2745
2746/* On success, save the name for verification; config_filename is used when
2747logging configuration errors (it changes for .included files) whereas
2748config_main_filename is the name shown by -bP. Failure to open a configuration
2749file is a serious disaster. */
2750
2751if (config_file != NULL)
2752 {
2753 config_filename = config_main_filename = string_copy(filename);
2754 }
2755else
2756 {
2757 if (filename == NULL)
2758 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "non-existent configuration file(s): "
2759 "%s", config_main_filelist);
2760 else
2761 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "%s", string_open_failed(errno,
2762 "configuration file %s", filename));
2763 }
2764
2765/* Check the status of the file we have opened, unless it was specified on
2766the command line, in which case privilege was given away at the start. */
2767
2768if (!config_changed)
2769 {
2770 if (fstat(fileno(config_file), &statbuf) != 0)
2771 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "failed to stat configuration file %s",
2772 big_buffer);
2773
2774 if ((statbuf.st_uid != root_uid && /* owner not root */
2775 statbuf.st_uid != exim_uid /* owner not exim */
2776 #ifdef CONFIGURE_OWNER
2777 && statbuf.st_uid != config_uid /* owner not the special one */
2778 #endif
2779 ) || /* or */
35edf2ff
PH
2780 (statbuf.st_gid != exim_gid /* group not exim & */
2781 #ifdef CONFIGURE_GROUP
2782 && statbuf.st_gid != config_gid /* group not the special one */
8e669ac1 2783 #endif
35edf2ff 2784 && (statbuf.st_mode & 020) != 0) || /* group writeable */
059ec3d9
PH
2785 /* or */
2786 ((statbuf.st_mode & 2) != 0)) /* world writeable */
2787
2788 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Exim configuration file %s has the "
2789 "wrong owner, group, or mode", big_buffer);
2790 }
2791
2792/* Process the main configuration settings. They all begin with a lower case
2793letter. If we see something starting with an upper case letter, it is taken as
2794a macro definition. */
2795
2796while ((s = get_config_line()) != NULL)
2797 {
cf00dad6 2798 if (isupper(s[0])) read_macro_assignment(s);
059ec3d9
PH
2799
2800 else if (Ustrncmp(s, "domainlist", 10) == 0)
2801 read_named_list(&domainlist_anchor, &domainlist_count,
2802 MAX_NAMED_LIST, s+10, US"domain list");
2803
2804 else if (Ustrncmp(s, "hostlist", 8) == 0)
2805 read_named_list(&hostlist_anchor, &hostlist_count,
2806 MAX_NAMED_LIST, s+8, US"host list");
2807
2808 else if (Ustrncmp(s, US"addresslist", 11) == 0)
2809 read_named_list(&addresslist_anchor, &addresslist_count,
2810 MAX_NAMED_LIST, s+11, US"address list");
2811
2812 else if (Ustrncmp(s, US"localpartlist", 13) == 0)
2813 read_named_list(&localpartlist_anchor, &localpartlist_count,
2814 MAX_NAMED_LIST, s+13, US"local part list");
2815
2816 else
2817 (void) readconf_handle_option(s, optionlist_config, optionlist_config_size,
2818 NULL, US"main option \"%s\" unknown");
2819 }
2820
2821
2822/* If local_sender_retain is set, local_from_check must be unset. */
2823
2824if (local_sender_retain && local_from_check)
2825 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "both local_from_check and "
2826 "local_sender_retain are set; this combination is not allowed");
2827
2828/* If the timezone string is empty, set it to NULL, implying no TZ variable
2829wanted. */
2830
2831if (timezone_string != NULL && *timezone_string == 0) timezone_string = NULL;
2832
944a9c55
PH
2833/* The max retry interval must not be greater than 24 hours. */
2834
2835if (retry_interval_max > 24*60*60) retry_interval_max = 24*60*60;
2836
059ec3d9
PH
2837/* remote_max_parallel must be > 0 */
2838
2839if (remote_max_parallel <= 0) remote_max_parallel = 1;
2840
6a3f1455
PH
2841/* Save the configured setting of freeze_tell, so we can re-instate it at the
2842start of a new SMTP message. */
2843
2844freeze_tell_config = freeze_tell;
2845
059ec3d9
PH
2846/* The primary host name may be required for expansion of spool_directory
2847and log_file_path, so make sure it is set asap. It is obtained from uname(),
2848but if that yields an unqualified value, make a FQDN by using gethostbyname to
2849canonize it. Some people like upper case letters in their host names, so we
2850don't force the case. */
2851
2852if (primary_hostname == NULL)
2853 {
2854 uschar *hostname;
2855 struct utsname uts;
2856 if (uname(&uts) < 0)
2857 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "uname() failed to yield host name");
2858 hostname = US uts.nodename;
2859
2860 if (Ustrchr(hostname, '.') == NULL)
2861 {
2862 int af = AF_INET;
2863 struct hostent *hostdata;
2864
2865 #if HAVE_IPV6
7e66e54d 2866 if (!disable_ipv6 && (dns_ipv4_lookup == NULL ||
059ec3d9 2867 match_isinlist(hostname, &dns_ipv4_lookup, 0, NULL, NULL, MCL_DOMAIN,
7e66e54d 2868 TRUE, NULL) != OK))
059ec3d9
PH
2869 af = AF_INET6;
2870 #else
2871 af = AF_INET;
2872 #endif
2873
2874 for (;;)
2875 {
2876 #if HAVE_IPV6
2877 #if HAVE_GETIPNODEBYNAME
2878 int error_num;
2879 hostdata = getipnodebyname(CS hostname, af, 0, &error_num);
2880 #else
2881 hostdata = gethostbyname2(CS hostname, af);
2882 #endif
2883 #else
2884 hostdata = gethostbyname(CS hostname);
2885 #endif
2886
2887 if (hostdata != NULL)
2888 {
2889 hostname = US hostdata->h_name;
2890 break;
2891 }
2892
2893 if (af == AF_INET) break;
2894 af = AF_INET;
2895 }
2896 }
2897
2898 primary_hostname = string_copy(hostname);
2899 }
2900
2901/* Set up default value for smtp_active_hostname */
2902
2903smtp_active_hostname = primary_hostname;
2904
2905/* If spool_directory wasn't set in the build-time configuration, it must have
2906got set above. Of course, writing to the log may not work if log_file_path is
2907not set, but it will at least get to syslog or somewhere, with any luck. */
2908
2909if (*spool_directory == 0)
2910 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "spool_directory undefined: cannot "
2911 "proceed");
2912
2913/* Expand the spool directory name; it may, for example, contain the primary
2914host name. Same comment about failure. */
2915
2916s = expand_string(spool_directory);
2917if (s == NULL)
2918 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "failed to expand spool_directory "
2919 "\"%s\": %s", spool_directory, expand_string_message);
2920spool_directory = s;
2921
2922/* Expand log_file_path, which must contain "%s" in any component that isn't
2923the null string or "syslog". It is also allowed to contain one instance of %D.
2924However, it must NOT contain % followed by anything else. */
2925
2926if (*log_file_path != 0)
2927 {
2928 uschar *ss, *sss;
2929 int sep = ':'; /* Fixed for log file path */
2930 s = expand_string(log_file_path);
2931 if (s == NULL)
2932 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "failed to expand log_file_path "
2933 "\"%s\": %s", log_file_path, expand_string_message);
2934
2935 ss = s;
2936 while ((sss = string_nextinlist(&ss,&sep,big_buffer,big_buffer_size)) != NULL)
2937 {
2938 uschar *t;
2939 if (sss[0] == 0 || Ustrcmp(sss, "syslog") == 0) continue;
2940 t = Ustrstr(sss, "%s");
2941 if (t == NULL)
2942 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "log_file_path \"%s\" does not "
2943 "contain \"%%s\"", sss);
2944 *t = 'X';
2945 t = Ustrchr(sss, '%');
2946 if (t != NULL)
2947 {
2948 if (t[1] != 'D' || Ustrchr(t+2, '%') != NULL)
2949 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "log_file_path \"%s\" contains "
2950 "unexpected \"%%\" character", s);
2951 }
2952 }
2953
2954 log_file_path = s;
2955 }
2956
2957/* Interpret syslog_facility into an integer argument for 'ident' param to
2958openlog(). Default is LOG_MAIL set in globals.c. Allow the user to omit the
2959leading "log_". */
2960
2961if (syslog_facility_str != NULL)
2962 {
2963 int i;
2964 uschar *s = syslog_facility_str;
2965
2966 if ((Ustrlen(syslog_facility_str) >= 4) &&
2967 (strncmpic(syslog_facility_str, US"log_", 4) == 0))
2968 s += 4;
2969
2970 for (i = 0; i < syslog_list_size; i++)
2971 {
2972 if (strcmpic(s, syslog_list[i].name) == 0)
2973 {
2974 syslog_facility = syslog_list[i].value;
2975 break;
2976 }
2977 }
2978
2979 if (i >= syslog_list_size)
2980 {
2981 log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
2982 "failed to interpret syslog_facility \"%s\"", syslog_facility_str);
2983 }
2984 }
2985
2986/* Expand pid_file_path */
2987
2988if (*pid_file_path != 0)
2989 {
2990 s = expand_string(pid_file_path);
2991 if (s == NULL)
2992 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "failed to expand pid_file_path "
2993 "\"%s\": %s", pid_file_path, expand_string_message);
2994 pid_file_path = s;
2995 }
2996
2997/* Compile the regex for matching a UUCP-style "From_" line in an incoming
2998message. */
2999
3000regex_From = regex_must_compile(uucp_from_pattern, FALSE, TRUE);
3001
3002/* Unpick the SMTP rate limiting options, if set */
3003
3004if (smtp_ratelimit_mail != NULL)
3005 {
3006 unpick_ratelimit(smtp_ratelimit_mail, &smtp_rlm_threshold,
3007 &smtp_rlm_base, &smtp_rlm_factor, &smtp_rlm_limit);
3008 }
3009
3010if (smtp_ratelimit_rcpt != NULL)
3011 {
3012 unpick_ratelimit(smtp_ratelimit_rcpt, &smtp_rlr_threshold,
3013 &smtp_rlr_base, &smtp_rlr_factor, &smtp_rlr_limit);
3014 }
3015
3016/* The qualify domains default to the primary host name */
3017
3018if (qualify_domain_sender == NULL)
3019 qualify_domain_sender = primary_hostname;
3020if (qualify_domain_recipient == NULL)
3021 qualify_domain_recipient = qualify_domain_sender;
3022
3023/* Setting system_filter_user in the configuration sets the gid as well if a
3024name is given, but a numerical value does not. */
3025
3026if (system_filter_uid_set && !system_filter_gid_set)
3027 {
3028 struct passwd *pw = getpwuid(system_filter_uid);
3029 if (pw == NULL)
3030 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Failed to look up uid %ld",
3031 (long int)system_filter_uid);
3032 system_filter_gid = pw->pw_gid;
3033 system_filter_gid_set = TRUE;
3034 }
3035
3036/* If the errors_reply_to field is set, check that it is syntactically valid
3037and ensure it contains a domain. */
3038
3039if (errors_reply_to != NULL)
3040 {
3041 uschar *errmess;
3042 int start, end, domain;
3043 uschar *recipient = parse_extract_address(errors_reply_to, &errmess,
3044 &start, &end, &domain, FALSE);
3045
3046 if (recipient == NULL)
3047 log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3048 "error in errors_reply_to (%s): %s", errors_reply_to, errmess);
3049
3050 if (domain == 0)
3051 log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3052 "errors_reply_to (%s) does not contain a domain", errors_reply_to);
3053 }
3054
3055/* If smtp_accept_queue or smtp_accept_max_per_host is set, then
3056smtp_accept_max must also be set. */
3057
3058if (smtp_accept_max == 0 &&
3059 (smtp_accept_queue > 0 || smtp_accept_max_per_host != NULL))
3060 log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3061 "smtp_accept_max must be set if smtp_accept_queue or "
3062 "smtp_accept_max_per_host is set");
3063
3064/* Set up the host number if anything is specified. It is an expanded string
3065so that it can be computed from the host name, for example. We do this last
3066so as to ensure that everything else is set up before the expansion. */
3067
3068if (host_number_string != NULL)
3069 {
3070 uschar *end;
3071 uschar *s = expand_string(host_number_string);
3072 long int n = Ustrtol(s, &end, 0);
3073 while (isspace(*end)) end++;
3074 if (*end != 0)
3075 log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3076 "localhost_number value is not a number: %s", s);
3077 if (n > LOCALHOST_MAX)
3078 log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3079 "localhost_number is greater than the maximum allowed value (%d)",
3080 LOCALHOST_MAX);
3081 host_number = n;
3082 }
3083
3084#ifdef SUPPORT_TLS
3085/* If tls_verify_hosts is set, tls_verify_certificates must also be set */
3086
3087if ((tls_verify_hosts != NULL || tls_try_verify_hosts != NULL) &&
3088 tls_verify_certificates == NULL)
3089 log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3090 "tls_%sverify_hosts is set, but tls_verify_certificates is not set",
3091 (tls_verify_hosts != NULL)? "" : "try_");
3092#endif
3093}
3094
3095
3096
3097/*************************************************
3098* Initialize one driver *
3099*************************************************/
3100
3101/* This is called once the driver's generic options, if any, have been read.
3102We can now find the driver, set up defaults for the private options, and
3103unset any "set" bits in the private options table (which might have been
3104set by another incarnation of the same driver).
3105
3106Arguments:
3107 d pointer to driver instance block, with generic
3108 options filled in
3109 drivers_available vector of available drivers
3110 size_of_info size of each block in drivers_available
3111 class class of driver, for error message
3112
3113Returns: pointer to the driver info block
3114*/
3115
3116static driver_info *
3117init_driver(driver_instance *d, driver_info *drivers_available,
3118 int size_of_info, uschar *class)
3119{
3120driver_info *dd;
3121
3122for (dd = drivers_available; dd->driver_name[0] != 0;
3123 dd = (driver_info *)(((uschar *)dd) + size_of_info))
3124 {
3125 if (Ustrcmp(d->driver_name, dd->driver_name) == 0)
3126 {
3127 int i;
3128 int len = dd->options_len;
3129 d->info = dd;
3130 d->options_block = store_get(len);
3131 memcpy(d->options_block, dd->options_block, len);
3132 for (i = 0; i < *(dd->options_count); i++)
3133 dd->options[i].type &= ~opt_set;
3134 return dd;
3135 }
3136 }
3137
3138log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
3139 "%s %s: cannot find %s driver \"%s\"", class, d->name, class, d->driver_name);
3140
3141return NULL; /* never obeyed */
3142}
3143
3144
3145
3146
3147/*************************************************
3148* Initialize driver list *
3149*************************************************/
3150
3151/* This function is called for routers, transports, and authentication
3152mechanisms. It reads the data from the current point in the configuration file
3153up to the end of the section, and sets up a chain of instance blocks according
3154to the file's contents. The file will already have been opened by a call to
3155readconf_main, and must be left open for subsequent reading of further data.
3156
3157Any errors cause a panic crash. Note that the blocks with names driver_info and
3158driver_instance must map the first portions of all the _info and _instance
3159blocks for this shared code to work.
3160
3161Arguments:
3162 class "router", "transport", or "authenticator"
3163 anchor &routers, &transports, &auths
3164 drivers_available available drivers
3165 size_of_info size of each info block
3166 instance_default points to default data for an instance
3167 instance_size size of instance block
3168 driver_optionlist generic option list
3169 driver_optionlist_count count of generic option list
3170
3171Returns: nothing
3172*/
3173
3174void
3175readconf_driver_init(
3176 uschar *class,
3177 driver_instance **anchor,
3178 driver_info *drivers_available,
3179 int size_of_info,
3180 void *instance_default,
3181 int instance_size,
3182 optionlist *driver_optionlist,
3183 int driver_optionlist_count)
3184{
3185driver_instance **p = anchor;
3186driver_instance *d = NULL;
3187uschar *buffer;
3188
059ec3d9
PH
3189while ((buffer = get_config_line()) != NULL)
3190 {
3191 uschar name[64];
cf00dad6 3192 uschar *s;
059ec3d9 3193
cf00dad6
PH
3194 /* Read the first name on the line and test for the start of a new driver. A
3195 macro definition indicates the end of the previous driver. If this isn't the
3196 start of a new driver, the line will be re-read. */
059ec3d9 3197
cf00dad6
PH
3198 s = readconf_readname(name, sizeof(name), buffer);
3199
3200 /* Handle macro definition, first finishing off the initialization of the
3201 previous driver, if any. */
3202
3203 if (isupper(*name) && *s == '=')
3204 {
3205 if (d != NULL)
3206 {
3207 if (d->driver_name == NULL)
3208 log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3209 "no driver defined for %s \"%s\"", class, d->name);
3210 (d->info->init)(d);
3211 d = NULL;
3212 }
3213 read_macro_assignment(buffer);
3214 continue;
3215 }
059ec3d9
PH
3216
3217 /* If the line starts with a name terminated by a colon, we are at the
3218 start of the definition of a new driver. The rest of the line must be
3219 blank. */
3220
3221 if (*s++ == ':')
3222 {
3223 int i;
3224
3225 /* Finish off initializing the previous driver. */
3226
3227 if (d != NULL)
3228 {
3229 if (d->driver_name == NULL)
3230 log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3231 "no driver defined for %s \"%s\"", class, d->name);
3232 (d->info->init)(d);
3233 }
3234
3235 /* Check that we haven't already got a driver of this name */
3236
3237 for (d = *anchor; d != NULL; d = d->next)
3238 if (Ustrcmp(name, d->name) == 0)
3239 log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3240 "there are two %ss called \"%s\"", class, name);
3241
3242 /* Set up a new driver instance data block on the chain, with
3243 its default values installed. */
3244
3245 d = store_get(instance_size);
3246 memcpy(d, instance_default, instance_size);
3247 *p = d;
3248 p = &(d->next);
3249 d->name = string_copy(name);
3250
3251 /* Clear out the "set" bits in the generic options */
3252
3253 for (i = 0; i < driver_optionlist_count; i++)
3254 driver_optionlist[i].type &= ~opt_set;
3255
3256 /* Check nothing more on this line, then do the next loop iteration. */
3257
3258 while (isspace(*s)) s++;
3259 if (*s != 0) extra_chars_error(s, US"driver name ", name, US"");
3260 continue;
3261 }
3262
cf00dad6
PH
3263 /* Not the start of a new driver. Give an error if we have not set up a
3264 current driver yet. */
059ec3d9
PH
3265
3266 if (d == NULL) log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
3267 "%s name missing", class);
3268
3269 /* First look to see if this is a generic option; if it is "driver",
3270 initialize the driver. If is it not a generic option, we can look for a
3271 private option provided that the driver has been previously set up. */
3272
3273 if (readconf_handle_option(buffer, driver_optionlist,
3274 driver_optionlist_count, d, NULL))
3275 {
3276 if (d->info == NULL && d->driver_name != NULL)
3277 init_driver(d, drivers_available, size_of_info, class);
3278 }
3279
3280 /* Handle private options - pass the generic block because some may
3281 live therein. A flag with each option indicates if it is in the public
3282 block. */
3283
3284 else if (d->info != NULL)
3285 {
3286 readconf_handle_option(buffer, d->info->options,
3287 *(d->info->options_count), d, US"option \"%s\" unknown");
3288 }
3289
3290 /* The option is not generic and the driver name has not yet been given. */
3291
3292 else log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "option \"%s\" unknown "
3293 "(\"driver\" must be specified before any private options)", name);
3294 }
3295
3296/* Run the initialization function for the final driver. */
3297
3298if (d != NULL)
3299 {
3300 if (d->driver_name == NULL)
3301 log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3302 "no driver defined for %s \"%s\"", class, d->name);
3303 (d->info->init)(d);
3304 }
3305}
3306
3307
3308
3309/*************************************************
3310* Check driver dependency *
3311*************************************************/
3312
3313/* This function is passed a driver instance and a string. It checks whether
3314any of the string options for the driver contains the given string as an
3315expansion variable.
3316
3317Arguments:
3318 d points to a driver instance block
3319 s the string to search for
3320
3321Returns: TRUE if a dependency is found
3322*/
3323
3324BOOL
3325readconf_depends(driver_instance *d, uschar *s)
3326{
3327int count = *(d->info->options_count);
3328optionlist *ol;
3329uschar *ss;
3330
3331for (ol = d->info->options; ol < d->info->options + count; ol++)
3332 {
3333 void *options_block;
3334 uschar *value;
3335 int type = ol->type & opt_mask;
3336 if (type != opt_stringptr) continue;
3337 options_block = ((ol->type & opt_public) == 0)? d->options_block : (void *)d;
3338 value = *(uschar **)((uschar *)options_block + (long int)(ol->value));
3339 if (value != NULL && (ss = Ustrstr(value, s)) != NULL)
3340 {
3341 if (ss <= value || (ss[-1] != '$' && ss[-1] != '{') ||
3342 isalnum(ss[Ustrlen(s)])) continue;
3343 DEBUG(D_transport) debug_printf("driver %s: \"%s\" option depends on %s\n",
3344 d->name, ol->name, s);
3345 return TRUE;
3346 }
3347 }
3348
3349DEBUG(D_transport) debug_printf("driver %s does not depend on %s\n", d->name, s);
3350return FALSE;
3351}
3352
3353
3354
3355
3356/*************************************************
3357* Decode an error type for retries *
3358*************************************************/
3359
3360/* This function is global because it is also called from the main
3361program when testing retry information. It decodes strings such as "quota_7d"
3362into numerical error codes.
3363
3364Arguments:
3365 pp points to start of text
3366 p points past end of text
3367 basic_errno points to an int to receive the main error number
3368 more_errno points to an int to receive the secondary error data
3369
3370Returns: NULL if decoded correctly; else points to error text
3371*/
3372
3373uschar *
3374readconf_retry_error(uschar *pp, uschar *p, int *basic_errno, int *more_errno)
3375{
3376int len;
3377uschar *q = pp;
3378while (q < p && *q != '_') q++;
3379len = q - pp;
3380
3381if (len == 5 && strncmpic(pp, US"quota", len) == 0)
3382 {
3383 *basic_errno = ERRNO_EXIMQUOTA;
3384 if (q != p && (*more_errno = readconf_readtime(q+1, *p, FALSE)) < 0)
3385 return US"bad time value";
3386 }
3387
3388else if (len == 7 && strncmpic(pp, US"refused", len) == 0)
3389 {
3390 *basic_errno = ECONNREFUSED;
3391 if (q != p)
3392 {
3393 if (strncmpic(q+1, US"MX", p-q-1) == 0) *more_errno = 'M';
3394 else if (strncmpic(q+1, US"A", p-q-1) == 0) *more_errno = 'A';
3395 else return US"A or MX expected after \"refused\"";
3396 }
3397 }
3398
3399else if (len == 7 && strncmpic(pp, US"timeout", len) == 0)
3400 {
3401 *basic_errno = ETIMEDOUT;
3402 if (q != p)
3403 {
3404 int i;
3405 int xlen = p - q - 1;
3406 uschar *x = q + 1;
3407
3408 static uschar *extras[] =
3409 { US"A", US"MX", US"connect", US"connect_A", US"connect_MX" };
3410 static int values[] =
3411 { 'A', 'M', RTEF_CTOUT, RTEF_CTOUT|'A', RTEF_CTOUT|'M' };
3412
3413 for (i = 0; i < sizeof(extras)/sizeof(uschar *); i++)
3414 {
3415 if (strncmpic(x, extras[i], xlen) == 0)
3416 {
3417 *more_errno = values[i];
3418 break;
3419 }
3420 }
3421
3422 if (i >= sizeof(extras)/sizeof(uschar *))
3423 {
3424 if (strncmpic(x, US"DNS", xlen) == 0)
3425 {
3426 log_write(0, LOG_MAIN|LOG_PANIC, "\"timeout_dns\" is no longer "
3427 "available in retry rules (it has never worked) - treated as "
3428 "\"timeout\"");
3429 }
3430 else return US"\"A\", \"MX\", or \"connect\" expected after \"timeout\"";
3431 }
3432 }
3433 }
3434
e97957bc
PH
3435else if (strncmpic(pp, US"mail_4", 6) == 0 ||
3436 strncmpic(pp, US"rcpt_4", 6) == 0 ||
3437 strncmpic(pp, US"data_4", 6) == 0)
059ec3d9
PH
3438 {
3439 BOOL bad = FALSE;
3440 int x = 255; /* means "any 4xx code" */
3441 if (p != pp + 8) bad = TRUE; else
3442 {
3443 int a = pp[6], b = pp[7];
3444 if (isdigit(a))
3445 {
3446 x = (a - '0') * 10;
3447 if (isdigit(b)) x += b - '0';
3448 else if (b == 'x') x += 100;
3449 else bad = TRUE;
3450 }
3451 else if (a != 'x' || b != 'x') bad = TRUE;
3452 }
3453
e97957bc
PH
3454 if (bad)
3455 return string_sprintf("%.4s_4 must be followed by xx, dx, or dd, where "
3456 "x is literal and d is any digit", pp);
059ec3d9 3457
e97957bc
PH
3458 *basic_errno = (*pp == 'm')? ERRNO_MAIL4XX :
3459 (*pp == 'r')? ERRNO_RCPT4XX : ERRNO_DATA4XX;
059ec3d9
PH
3460 *more_errno = x << 8;
3461 }
3462
3463else if (len == 4 && strncmpic(pp, US"auth", len) == 0 &&
3464 strncmpic(q+1, US"failed", p-q-1) == 0)
059ec3d9 3465 *basic_errno = ERRNO_AUTHFAIL;
e97957bc 3466
48da4259 3467else if (strncmpic(pp, US"lost_connection", p - pp) == 0)
e97957bc
PH
3468 *basic_errno = ERRNO_SMTPCLOSED;
3469
48da4259 3470else if (strncmpic(pp, US"tls_required", p - pp) == 0)
e97957bc 3471 *basic_errno = ERRNO_TLSREQUIRED;
059ec3d9
PH
3472
3473else if (len != 1 || Ustrncmp(pp, "*", 1) != 0)
3474 return string_sprintf("unknown or malformed retry error \"%.*s\"", p-pp, pp);
3475
3476return NULL;
3477}
3478
3479
3480
3481
3482/*************************************************
3483* Read retry information *
3484*************************************************/
3485
3486/* Each line of retry information contains:
3487
3488. A domain name pattern or an address pattern;
3489
3490. An error name, possibly with additional data, or *;
3491
3492. An optional sequence of retry items, each consisting of an identifying
3493 letter, a cutoff time, and optional parameters.
3494
3495All this is decoded and placed into a control block. */
3496
3497
3498/* Subroutine to read an argument, preceded by a comma and terminated
3499by comma, semicolon, whitespace, or newline. The types are: 0 = time value,
35001 = fixed point number (returned *1000).
3501
3502Arguments:
3503 paddr pointer to pointer to current character; updated
3504 type 0 => read a time; 1 => read a fixed point number
3505
3506Returns: time in seconds or fixed point number * 1000
3507*/
3508
3509static int
3510retry_arg(uschar **paddr, int type)
3511{
3512uschar *p = *paddr;
3513uschar *pp;
3514
3515if (*p++ != ',') log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "comma expected");
3516
3517while (isspace(*p)) p++;
3518pp = p;
3519while (isalnum(*p) || (type == 1 && *p == '.')) p++;
3520
3521if (*p != 0 && !isspace(*p) && *p != ',' && *p != ';')
3522 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "comma or semicolon expected");
3523
3524*paddr = p;
3525switch (type)
3526 {
3527 case 0:
3528 return readconf_readtime(pp, *p, FALSE);
3529 case 1:
3530 return readconf_readfixed(pp, *p);
3531 }
3532return 0; /* Keep picky compilers happy */
3533}
3534
3535/* The function proper */
3536
3537void
3538readconf_retries(void)
3539{
3540retry_config **chain = &retries;
3541retry_config *next;
3542uschar *p;
3543
3544while ((p = get_config_line()) != NULL)
3545 {
3546 retry_rule **rchain;
3547 uschar *pp, *error;
3548
3549 next = store_get(sizeof(retry_config));
3550 next->next = NULL;
3551 *chain = next;
3552 chain = &(next->next);
3553 next->basic_errno = next->more_errno = 0;
3554 next->senders = NULL;
3555 next->rules = NULL;
3556 rchain = &(next->rules);
3557
3558 next->pattern = string_dequote(&p);
3559 while (isspace(*p)) p++;
3560 pp = p;
3561 while (mac_isgraph(*p)) p++;
3562 if (p - pp <= 0) log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
3563 "missing error type");
3564
3565 /* Test error names for things we understand. */
3566
3567 if ((error = readconf_retry_error(pp, p, &(next->basic_errno),
3568 &(next->more_errno))) != NULL)
3569 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "%s", error);
3570
3571 /* There may be an optional address list of senders to be used as another
3572 constraint on the rule. This was added later, so the syntax is a bit of a
3573 fudge. Anything that is not a retry rule starting "F," or "G," is treated as
3574 an address list. */
3575
3576 while (isspace(*p)) p++;
3577 if (Ustrncmp(p, "senders", 7) == 0)
3578 {
3579 p += 7;
3580 while (isspace(*p)) p++;
3581 if (*p++ != '=') log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
3582 "\"=\" expected after \"senders\" in retry rule");
3583 while (isspace(*p)) p++;
3584 next->senders = string_dequote(&p);
3585 }
3586
3587 /* Now the retry rules. Keep the maximum timeout encountered. */
3588
3589 while (isspace(*p)) p++;
3590
3591 while (*p != 0)
3592 {
3593 retry_rule *rule = store_get(sizeof(retry_rule));
3594 *rchain = rule;
3595 rchain = &(rule->next);
3596 rule->next = NULL;
3597 rule->rule = toupper(*p++);
3598 rule->timeout = retry_arg(&p, 0);
3599 if (rule->timeout > retry_maximum_timeout)
3600 retry_maximum_timeout = rule->timeout;
3601
3602 switch (rule->rule)
3603 {
3604 case 'F': /* Fixed interval */
3605 rule->p1 = retry_arg(&p, 0);
3606 break;
3607
3608 case 'G': /* Geometrically increasing intervals */
6af56900 3609 case 'H': /* Ditto, but with randomness */
059ec3d9
PH
3610 rule->p1 = retry_arg(&p, 0);
3611 rule->p2 = retry_arg(&p, 1);
3612 break;
3613
3614 default:
3615 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "unknown retry rule letter");
3616 break;
3617 }
3618
3619 if (rule->timeout <= 0 || rule->p1 <= 0 ||
6af56900 3620 (rule->rule != 'F' && rule->p2 < 1000))
059ec3d9
PH
3621 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
3622 "bad parameters for retry rule");
3623
3624 while (isspace(*p)) p++;
3625 if (*p == ';')
3626 {
3627 p++;
3628 while (isspace(*p)) p++;
3629 }
3630 else if (*p != 0)
3631 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "semicolon expected");
3632 }
3633 }
3634}
3635
3636
3637
3638/*************************************************
3639* Initialize authenticators *
3640*************************************************/
3641
3642/* Read the authenticators section of the configuration file.
3643
3644Arguments: none
3645Returns: nothing
3646*/
3647
3648static void
3649auths_init(void)
3650{
3651auth_instance *au, *bu;
3652readconf_driver_init(US"authenticator",
3653 (driver_instance **)(&auths), /* chain anchor */
3654 (driver_info *)auths_available, /* available drivers */
3655 sizeof(auth_info), /* size of info block */
3656 &auth_defaults, /* default values for generic options */
3657 sizeof(auth_instance), /* size of instance block */
3658 optionlist_auths, /* generic options */
3659 optionlist_auths_size);
3660
3661for (au = auths; au != NULL; au = au->next)
3662 {
3663 if (au->public_name == NULL)
3664 log_write(0, LOG_PANIC_DIE|LOG_CONFIG, "no public name specified for "
3665 "the %s authenticator", au->name);
3666 for (bu = au->next; bu != NULL; bu = bu->next)
3667 {
3668 if (strcmpic(au->public_name, bu->public_name) == 0)
3669 {
3670 if ((au->client && bu->client) || (au->server && bu->server))
3671 log_write(0, LOG_PANIC_DIE|LOG_CONFIG, "two %s authenticators "
3672 "(%s and %s) have the same public name (%s)",
3673 (au->client)? US"client" : US"server", au->name, bu->name,
3674 au->public_name);
3675 }
3676 }
3677 }
3678}
3679
3680
3681
3682
3683/*************************************************
3684* Read ACL information *
3685*************************************************/
3686
3687/* If this run of Exim is not doing something that involves receiving a
3688message, we can just skip over the ACL information. No need to parse it.
3689
3690First, we have a function for acl_read() to call back to get the next line. We
3691need to remember the line we passed, because at the end it will contain the
3692name of the next ACL. */
3693
3694static uschar *acl_line;
3695
3696static uschar *
3697acl_callback(void)
3698{
3699acl_line = get_config_line();
3700return acl_line;
3701}
3702
3703
3704/* Now the main function:
3705
3706Arguments:
3707 skip TRUE when this Exim process is doing something that will
3708 not need the ACL data
3709
3710Returns: nothing
3711*/
3712
3713static void
3714readconf_acl(BOOL skip)
3715{
3716uschar *p;
3717
3718/* Not receiving messages, don't need to parse the ACL data */
3719
3720if (skip)
3721 {
3722 DEBUG(D_acl) debug_printf("skipping ACL configuration - not needed\n");
3723 while ((p = get_config_line()) != NULL);
3724 return;
3725 }
3726
cf00dad6
PH
3727/* Read each ACL and add it into the tree. Macro (re)definitions are allowed
3728between ACLs. */
059ec3d9
PH
3729
3730acl_line = get_config_line();
3731
3732while(acl_line != NULL)
3733 {
3734 uschar name[64];
3735 tree_node *node;
3736 uschar *error;
3737
3738 p = readconf_readname(name, sizeof(name), acl_line);
cf00dad6
PH
3739 if (isupper(*name) && *p == '=')
3740 {
3741 read_macro_assignment(acl_line);
3742 acl_line = get_config_line();
3743 continue;
3744 }
3745
3746 if (*p != ':' || name[0] == 0)
3747 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "missing or malformed ACL name");
059ec3d9
PH
3748
3749 node = store_get(sizeof(tree_node) + Ustrlen(name));
3750 Ustrcpy(node->name, name);
3751 if (!tree_insertnode(&acl_anchor, node))
3752 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
3753 "there are two ACLs called \"%s\"", name);
3754
3755 node->data.ptr = acl_read(acl_callback, &error);
3756
3757 if (node->data.ptr == NULL && error != NULL)
3758 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "error in ACL: %s", error);
3759 }
3760}
3761
3762
3763
3764/*************************************************
3765* Read configuration for local_scan() *
3766*************************************************/
3767
3768/* This function is called after "begin local_scan" is encountered in the
3769configuration file. If the local_scan() function allows for configuration
3770options, we can process them. Otherwise, we expire in a panic.
3771
3772Arguments: none
3773Returns: nothing
3774*/
3775
3776static void
3777local_scan_init(void)
3778{
3779#ifndef LOCAL_SCAN_HAS_OPTIONS
3780log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "local_scan() options not supported: "
3781 "(LOCAL_SCAN_HAS_OPTIONS not defined in Local/Makefile)");
3782#else
3783
3784uschar *p;
3785while ((p = get_config_line()) != NULL)
3786 {
3787 (void) readconf_handle_option(p, local_scan_options, local_scan_options_count,
3788 NULL, US"local_scan option \"%s\" unknown");
3789 }
3790#endif
3791}
3792
3793
3794
3795/*************************************************
3796* Read rest of configuration (after main) *
3797*************************************************/
3798
3799/* This function reads the rest of the runtime configuration, after the main
3800configuration. It is called only when actually needed. Each subsequent section
3801of the configuration starts with a line of the form
3802
3803 begin name
3804
3805where the name is "routers", "transports", etc. A section is terminated by
3806hitting the next "begin" line, and the next name is left in next_section.
3807Because it may confuse people as to whether the names are singular or plural,
3808we add "s" if it's missing. There is always enough room in next_section for
3809this. This function is basically just a switch.
3810
3811Arguments:
3812 skip_acl TRUE if ACL information is not needed
3813
3814Returns: nothing
3815*/
3816
3817static uschar *section_list[] = {
3818 US"acls",
3819 US"authenticators",
3820 US"local_scans",
3821 US"retrys",
3822 US"rewrites",
3823 US"routers",
3824 US"transports"};
3825
3826void
3827readconf_rest(BOOL skip_acl)
3828{
3829int had = 0;
3830
3831while(next_section[0] != 0)
3832 {
3833 int bit;
3834 int first = 0;
3835 int last = sizeof(section_list) / sizeof(uschar *);
3836 int mid = last/2;
3837 int n = Ustrlen(next_section);
3838
3839 if (tolower(next_section[n-1]) != 's') Ustrcpy(next_section+n, "s");
3840
3841 for (;;)
3842 {
3843 int c = strcmpic(next_section, section_list[mid]);
3844 if (c == 0) break;
3845 if (c > 0) first = mid + 1; else last = mid;
3846 if (first >= last)
3847 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
3848 "\"%.*s\" is not a known configuration section name", n, next_section);
3849 mid = (last + first)/2;
3850 }
3851
3852 bit = 1 << mid;
3853 if (((had ^= bit) & bit) == 0)
3854 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
3855 "\"%.*s\" section is repeated in the configuration file", n,
3856 next_section);
3857
3858 switch(mid)
3859 {
3860 case 0: readconf_acl(skip_acl); break;
3861 case 1: auths_init(); break;
3862 case 2: local_scan_init(); break;
3863 case 3: readconf_retries(); break;
3864 case 4: readconf_rewrites(); break;
3865 case 5: route_init(); break;
3866 case 6: transport_init(); break;
3867 }
3868 }
3869
f1e894f3 3870(void)fclose(config_file);
059ec3d9
PH
3871}
3872
3873/* End of readconf.c */