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