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