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