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