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