Convert more cases of list-walking to use self-assigned memory for the list-item
[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   { "local_from_check",         opt_bool,        {&local_from_check} },
205   { "local_from_prefix",        opt_stringptr,   {&local_from_prefix} },
206   { "local_from_suffix",        opt_stringptr,   {&local_from_suffix} },
207   { "local_interfaces",         opt_stringptr,   {&local_interfaces} },
208 #ifdef HAVE_LOCAL_SCAN
209   { "local_scan_timeout",       opt_time,        {&local_scan_timeout} },
210 #endif
211   { "local_sender_retain",      opt_bool,        {&local_sender_retain} },
212   { "localhost_number",         opt_stringptr,   {&host_number_string} },
213   { "log_file_path",            opt_stringptr,   {&log_file_path} },
214   { "log_selector",             opt_stringptr,   {&log_selector_string} },
215   { "log_timezone",             opt_bool,        {&log_timezone} },
216   { "lookup_open_max",          opt_int,         {&lookup_open_max} },
217   { "max_username_length",      opt_int,         {&max_username_length} },
218   { "message_body_newlines",    opt_bool,        {&message_body_newlines} },
219   { "message_body_visible",     opt_mkint,       {&message_body_visible} },
220   { "message_id_header_domain", opt_stringptr,   {&message_id_domain} },
221   { "message_id_header_text",   opt_stringptr,   {&message_id_text} },
222   { "message_logs",             opt_bool,        {&message_logs} },
223   { "message_size_limit",       opt_stringptr,   {&message_size_limit} },
224 #ifdef SUPPORT_MOVE_FROZEN_MESSAGES
225   { "move_frozen_messages",     opt_bool,        {&move_frozen_messages} },
226 #endif
227   { "mua_wrapper",              opt_bool,        {&mua_wrapper} },
228 #ifdef LOOKUP_MYSQL
229   { "mysql_servers",            opt_stringptr,   {&mysql_servers} },
230 #endif
231   { "never_users",              opt_uidlist,     {&never_users} },
232   { "notifier_socket",          opt_stringptr,   {&notifier_socket} },
233 #ifndef DISABLE_TLS
234   { "openssl_options",          opt_stringptr,   {&openssl_options} },
235 #endif
236 #ifdef LOOKUP_ORACLE
237   { "oracle_servers",           opt_stringptr,   {&oracle_servers} },
238 #endif
239   { "percent_hack_domains",     opt_stringptr,   {&percent_hack_domains} },
240 #ifdef EXIM_PERL
241   { "perl_at_start",            opt_bool,        {&opt_perl_at_start} },
242   { "perl_startup",             opt_stringptr,   {&opt_perl_startup} },
243   { "perl_taintmode",           opt_bool,        {&opt_perl_taintmode} },
244 #endif
245 #ifdef LOOKUP_PGSQL
246   { "pgsql_servers",            opt_stringptr,   {&pgsql_servers} },
247 #endif
248   { "pid_file_path",            opt_stringptr,   {&pid_file_path} },
249   { "pipelining_advertise_hosts", opt_stringptr, {&pipelining_advertise_hosts} },
250 #ifndef DISABLE_PIPE_CONNECT
251   { "pipelining_connect_advertise_hosts", opt_stringptr,
252                                                  {&pipe_connect_advertise_hosts} },
253 #endif
254 #ifndef DISABLE_PRDR
255   { "prdr_enable",              opt_bool,        {&prdr_enable} },
256 #endif
257   { "preserve_message_logs",    opt_bool,        {&preserve_message_logs} },
258   { "primary_hostname",         opt_stringptr,   {&primary_hostname} },
259   { "print_topbitchars",        opt_bool,        {&print_topbitchars} },
260   { "process_log_path",         opt_stringptr,   {&process_log_path} },
261   { "prod_requires_admin",      opt_bool,        {&prod_requires_admin} },
262 #ifdef SUPPORT_PROXY
263   { "proxy_protocol_timeout",   opt_time,        {&proxy_protocol_timeout} },
264 #endif
265   { "qualify_domain",           opt_stringptr,   {&qualify_domain_sender} },
266   { "qualify_recipient",        opt_stringptr,   {&qualify_domain_recipient} },
267   { "queue_domains",            opt_stringptr,   {&queue_domains} },
268 #ifndef DISABLE_QUEUE_RAMP
269   { "queue_fast_ramp",          opt_bool,        {&queue_fast_ramp} },
270 #endif
271   { "queue_list_requires_admin",opt_bool,        {&queue_list_requires_admin} },
272   { "queue_only",               opt_bool,        {&queue_only} },
273   { "queue_only_file",          opt_stringptr,   {&queue_only_file} },
274   { "queue_only_load",          opt_fixed,       {&queue_only_load} },
275   { "queue_only_load_latch",    opt_bool,        {&queue_only_load_latch} },
276   { "queue_only_override",      opt_bool,        {&queue_only_override} },
277   { "queue_run_in_order",       opt_bool,        {&queue_run_in_order} },
278   { "queue_run_max",            opt_stringptr,   {&queue_run_max} },
279   { "queue_smtp_domains",       opt_stringptr,   {&queue_smtp_domains} },
280   { "receive_timeout",          opt_time,        {&receive_timeout} },
281   { "received_header_text",     opt_stringptr,   {&received_header_text} },
282   { "received_headers_max",     opt_int,         {&received_headers_max} },
283   { "recipient_unqualified_hosts", opt_stringptr, {&recipient_unqualified_hosts} },
284   { "recipients_max",           opt_int,         {&recipients_max} },
285   { "recipients_max_reject",    opt_bool,        {&recipients_max_reject} },
286 #ifdef LOOKUP_REDIS
287   { "redis_servers",            opt_stringptr,   {&redis_servers} },
288 #endif
289   { "remote_max_parallel",      opt_int,         {&remote_max_parallel} },
290   { "remote_sort_domains",      opt_stringptr,   {&remote_sort_domains} },
291   { "retry_data_expire",        opt_time,        {&retry_data_expire} },
292   { "retry_interval_max",       opt_time,        {&retry_interval_max} },
293   { "return_path_remove",       opt_bool,        {&return_path_remove} },
294   { "return_size_limit",        opt_mkint|opt_hidden, {&bounce_return_size_limit} },
295   { "rfc1413_hosts",            opt_stringptr,   {&rfc1413_hosts} },
296   { "rfc1413_query_timeout",    opt_time,        {&rfc1413_query_timeout} },
297   { "sender_unqualified_hosts", opt_stringptr,   {&sender_unqualified_hosts} },
298   { "slow_lookup_log",          opt_int,         {&slow_lookup_log} },
299   { "smtp_accept_keepalive",    opt_bool,        {&smtp_accept_keepalive} },
300   { "smtp_accept_max",          opt_int,         {&smtp_accept_max} },
301   { "smtp_accept_max_nonmail",  opt_int,         {&smtp_accept_max_nonmail} },
302   { "smtp_accept_max_nonmail_hosts", opt_stringptr, {&smtp_accept_max_nonmail_hosts} },
303   { "smtp_accept_max_per_connection", opt_int,   {&smtp_accept_max_per_connection} },
304   { "smtp_accept_max_per_host", opt_stringptr,   {&smtp_accept_max_per_host} },
305   { "smtp_accept_queue",        opt_int,         {&smtp_accept_queue} },
306   { "smtp_accept_queue_per_connection", opt_int, {&smtp_accept_queue_per_connection} },
307   { "smtp_accept_reserve",      opt_int,         {&smtp_accept_reserve} },
308   { "smtp_active_hostname",     opt_stringptr,   {&raw_active_hostname} },
309   { "smtp_banner",              opt_stringptr,   {&smtp_banner} },
310   { "smtp_check_spool_space",   opt_bool,        {&smtp_check_spool_space} },
311   { "smtp_connect_backlog",     opt_int,         {&smtp_connect_backlog} },
312   { "smtp_enforce_sync",        opt_bool,        {&smtp_enforce_sync} },
313   { "smtp_etrn_command",        opt_stringptr,   {&smtp_etrn_command} },
314   { "smtp_etrn_serialize",      opt_bool,        {&smtp_etrn_serialize} },
315   { "smtp_load_reserve",        opt_fixed,       {&smtp_load_reserve} },
316   { "smtp_max_synprot_errors",  opt_int,         {&smtp_max_synprot_errors} },
317   { "smtp_max_unknown_commands",opt_int,         {&smtp_max_unknown_commands} },
318   { "smtp_ratelimit_hosts",     opt_stringptr,   {&smtp_ratelimit_hosts} },
319   { "smtp_ratelimit_mail",      opt_stringptr,   {&smtp_ratelimit_mail} },
320   { "smtp_ratelimit_rcpt",      opt_stringptr,   {&smtp_ratelimit_rcpt} },
321   { "smtp_receive_timeout",     opt_func,        {.fn = &fn_smtp_receive_timeout} },
322   { "smtp_reserve_hosts",       opt_stringptr,   {&smtp_reserve_hosts} },
323   { "smtp_return_error_details",opt_bool,        {&smtp_return_error_details} },
324 #ifdef SUPPORT_I18N
325   { "smtputf8_advertise_hosts", opt_stringptr,   {&smtputf8_advertise_hosts} },
326 #endif
327 #ifdef WITH_CONTENT_SCAN
328   { "spamd_address",            opt_stringptr,   {&spamd_address} },
329 #endif
330 #ifdef SUPPORT_SPF
331   { "spf_guess",                opt_stringptr,   {&spf_guess} },
332   { "spf_smtp_comment_template",opt_stringptr,   {&spf_smtp_comment_template} },
333 #endif
334   { "split_spool_directory",    opt_bool,        {&split_spool_directory} },
335   { "spool_directory",          opt_stringptr,   {&spool_directory} },
336   { "spool_wireformat",         opt_bool,        {&spool_wireformat} },
337 #ifdef LOOKUP_SQLITE
338   { "sqlite_dbfile",            opt_stringptr,   {&sqlite_dbfile} },
339   { "sqlite_lock_timeout",      opt_int,         {&sqlite_lock_timeout} },
340 #endif
341 #ifdef EXPERIMENTAL_SRS_ALT
342   { "srs_config",               opt_stringptr,   {&srs_config} },
343   { "srs_hashlength",           opt_int,         {&srs_hashlength} },
344   { "srs_hashmin",              opt_int,         {&srs_hashmin} },
345   { "srs_maxage",               opt_int,         {&srs_maxage} },
346   { "srs_secrets",              opt_stringptr,   {&srs_secrets} },
347   { "srs_usehash",              opt_bool,        {&srs_usehash} },
348   { "srs_usetimestamp",         opt_bool,        {&srs_usetimestamp} },
349 #endif
350   { "strict_acl_vars",          opt_bool,        {&strict_acl_vars} },
351   { "strip_excess_angle_brackets", opt_bool,     {&strip_excess_angle_brackets} },
352   { "strip_trailing_dot",       opt_bool,        {&strip_trailing_dot} },
353   { "syslog_duplication",       opt_bool,        {&syslog_duplication} },
354   { "syslog_facility",          opt_stringptr,   {&syslog_facility_str} },
355   { "syslog_pid",               opt_bool,        {&syslog_pid} },
356   { "syslog_processname",       opt_stringptr,   {&syslog_processname} },
357   { "syslog_timestamp",         opt_bool,        {&syslog_timestamp} },
358   { "system_filter",            opt_stringptr,   {&system_filter} },
359   { "system_filter_directory_transport", opt_stringptr,{&system_filter_directory_transport} },
360   { "system_filter_file_transport",opt_stringptr,{&system_filter_file_transport} },
361   { "system_filter_group",      opt_gid,         {&system_filter_gid} },
362   { "system_filter_pipe_transport",opt_stringptr,{&system_filter_pipe_transport} },
363   { "system_filter_reply_transport",opt_stringptr,{&system_filter_reply_transport} },
364   { "system_filter_user",       opt_uid,         {&system_filter_uid} },
365   { "tcp_nodelay",              opt_bool,        {&tcp_nodelay} },
366 #ifdef USE_TCP_WRAPPERS
367   { "tcp_wrappers_daemon_name", opt_stringptr,   {&tcp_wrappers_daemon_name} },
368 #endif
369   { "timeout_frozen_after",     opt_time,        {&timeout_frozen_after} },
370   { "timezone",                 opt_stringptr,   {&timezone_string} },
371   { "tls_advertise_hosts",      opt_stringptr,   {&tls_advertise_hosts} },
372 #ifndef DISABLE_TLS
373   { "tls_certificate",          opt_stringptr,   {&tls_certificate} },
374   { "tls_crl",                  opt_stringptr,   {&tls_crl} },
375   { "tls_dh_max_bits",          opt_int,         {&tls_dh_max_bits} },
376   { "tls_dhparam",              opt_stringptr,   {&tls_dhparam} },
377   { "tls_eccurve",              opt_stringptr,   {&tls_eccurve} },
378 # ifndef DISABLE_OCSP
379   { "tls_ocsp_file",            opt_stringptr,   {&tls_ocsp_file} },
380 # endif
381   { "tls_on_connect_ports",     opt_stringptr,   {&tls_in.on_connect_ports} },
382   { "tls_privatekey",           opt_stringptr,   {&tls_privatekey} },
383   { "tls_remember_esmtp",       opt_bool,        {&tls_remember_esmtp} },
384   { "tls_require_ciphers",      opt_stringptr,   {&tls_require_ciphers} },
385 # ifndef DISABLE_TLS_RESUME
386   { "tls_resumption_hosts",     opt_stringptr,   {&tls_resumption_hosts} },
387 # endif
388   { "tls_try_verify_hosts",     opt_stringptr,   {&tls_try_verify_hosts} },
389   { "tls_verify_certificates",  opt_stringptr,   {&tls_verify_certificates} },
390   { "tls_verify_hosts",         opt_stringptr,   {&tls_verify_hosts} },
391 #endif
392   { "trusted_groups",           opt_gidlist,     {&trusted_groups} },
393   { "trusted_users",            opt_uidlist,     {&trusted_users} },
394   { "unknown_login",            opt_stringptr,   {&unknown_login} },
395   { "unknown_username",         opt_stringptr,   {&unknown_username} },
396   { "untrusted_set_sender",     opt_stringptr,   {&untrusted_set_sender} },
397   { "uucp_from_pattern",        opt_stringptr,   {&uucp_from_pattern} },
398   { "uucp_from_sender",         opt_stringptr,   {&uucp_from_sender} },
399   { "warn_message_file",        opt_stringptr,   {&warn_message_file} },
400   { "write_rejectlog",          opt_bool,        {&write_rejectlog} }
401 };
402
403 #ifndef MACRO_PREDEF
404 static int optionlist_config_size = nelem(optionlist_config);
405 #endif
406
407
408 #ifdef MACRO_PREDEF
409
410 static void
411 fn_smtp_receive_timeout(const uschar * name, const uschar * str, unsigned flags) {/*Dummy*/}
412
413 void
414 options_main(void)
415 {
416 options_from_list(optionlist_config, nelem(optionlist_config), US"MAIN", NULL);
417 }
418
419 void
420 options_auths(void)
421 {
422 uschar buf[64];
423
424 options_from_list(optionlist_auths, optionlist_auths_size, US"AUTHENTICATORS", NULL);
425
426 for (struct auth_info * ai = auths_available; ai->driver_name[0]; ai++)
427   {
428   spf(buf, sizeof(buf), US"_DRIVER_AUTHENTICATOR_%T", ai->driver_name);
429   builtin_macro_create(buf);
430   options_from_list(ai->options, (unsigned)*ai->options_count, US"AUTHENTICATOR", ai->driver_name);
431
432   if (ai->macros_create) (ai->macros_create)();
433   }
434 }
435
436 void
437 options_logging(void)
438 {
439 uschar buf[64];
440
441 for (bit_table * bp = log_options; bp < log_options + log_options_count; bp++)
442   {
443   spf(buf, sizeof(buf), US"_LOG_%T", bp->name);
444   builtin_macro_create(buf);
445   }
446 }
447
448
449 #else   /*!MACRO_PREDEF*/
450
451 extern char **environ;
452
453 static void save_config_line(const uschar* line);
454 static void save_config_position(const uschar *file, int line);
455 static void print_config(BOOL admin, BOOL terse);
456
457
458 #define CSTATE_STACK_SIZE 10
459
460 const uschar *config_directory = NULL;
461
462
463 /* Structure for chain (stack) of .included files */
464
465 typedef struct config_file_item {
466   struct config_file_item *next;
467   const uschar *filename;
468   const uschar *directory;
469   FILE *file;
470   int lineno;
471 } config_file_item;
472
473 /* Structure for chain of configuration lines (-bP config) */
474
475 typedef struct config_line_item {
476   struct config_line_item *next;
477   uschar *line;
478 } config_line_item;
479
480 static config_line_item* config_lines;
481
482 /* Structure of table of conditional words and their state transitions */
483
484 typedef struct cond_item {
485   uschar *name;
486   int    namelen;
487   int    action1;
488   int    action2;
489   int    pushpop;
490 } cond_item;
491
492 /* Structure of table of syslog facility names and values */
493
494 typedef struct syslog_fac_item {
495   uschar *name;
496   int    value;
497 } syslog_fac_item;
498
499 /* constants */
500 static const uschar * const hidden = US"<value not displayable>";
501
502 /* Static variables */
503
504 static config_file_item *config_file_stack = NULL;  /* For includes */
505
506 static uschar *syslog_facility_str  = NULL;
507 static uschar next_section[24];
508 static uschar time_buffer[24];
509
510 /* State variables for conditional loading (.ifdef / .else / .endif) */
511
512 static int cstate = 0;
513 static int cstate_stack_ptr = -1;
514 static int cstate_stack[CSTATE_STACK_SIZE];
515
516 /* Table of state transitions for handling conditional inclusions. There are
517 four possible state transitions:
518
519   .ifdef true
520   .ifdef false
521   .elifdef true  (or .else)
522   .elifdef false
523
524 .endif just causes the previous cstate to be popped off the stack */
525
526 static int next_cstate[3][4] =
527   {
528   /* State 0: reading from file, or reading until next .else or .endif */
529   { 0, 1, 2, 2 },
530   /* State 1: condition failed, skipping until next .else or .endif */
531   { 2, 2, 0, 1 },
532   /* State 2: skipping until .endif */
533   { 2, 2, 2, 2 },
534   };
535
536 /* Table of conditionals and the states to set. For each name, there are four
537 values: the length of the name (to save computing it each time), the state to
538 set if a macro was found in the line, the state to set if a macro was not found
539 in the line, and a stack manipulation setting which is:
540
541   -1   pull state value off the stack
542    0   don't alter the stack
543   +1   push value onto stack, before setting new state
544 */
545
546 static cond_item cond_list[] = {
547   { US"ifdef",    5, 0, 1,  1 },
548   { US"ifndef",   6, 1, 0,  1 },
549   { US"elifdef",  7, 2, 3,  0 },
550   { US"elifndef", 8, 3, 2,  0 },
551   { US"else",     4, 2, 2,  0 },
552   { US"endif",    5, 0, 0, -1 }
553 };
554
555 static int cond_list_size = sizeof(cond_list)/sizeof(cond_item);
556
557 /* Table of syslog facility names and their values */
558
559 static syslog_fac_item syslog_list[] = {
560   { US"mail",   LOG_MAIL },
561   { US"user",   LOG_USER },
562   { US"news",   LOG_NEWS },
563   { US"uucp",   LOG_UUCP },
564   { US"local0", LOG_LOCAL0 },
565   { US"local1", LOG_LOCAL1 },
566   { US"local2", LOG_LOCAL2 },
567   { US"local3", LOG_LOCAL3 },
568   { US"local4", LOG_LOCAL4 },
569   { US"local5", LOG_LOCAL5 },
570   { US"local6", LOG_LOCAL6 },
571   { US"local7", LOG_LOCAL7 },
572   { US"daemon", LOG_DAEMON }
573 };
574
575 static int syslog_list_size = sizeof(syslog_list)/sizeof(syslog_fac_item);
576
577
578 #define opt_fn_print            BIT(0)
579 #define opt_fn_print_label      BIT(1)
580
581
582 /*************************************************
583 *         Find the name of an option             *
584 *************************************************/
585
586 /* This function is to aid debugging. Various functions take arguments that are
587 pointer variables in the options table or in option tables for various drivers.
588 For debugging output, it is useful to be able to find the name of the option
589 which is currently being processed. This function finds it, if it exists, by
590 searching the table(s).
591
592 Arguments:   a value that is presumed to be in the table above
593 Returns:     the option name, or an empty string
594 */
595
596 uschar *
597 readconf_find_option(void *p)
598 {
599 for (int i = 0; i < nelem(optionlist_config); i++)
600   if (p == optionlist_config[i].v.value) return US optionlist_config[i].name;
601
602 for (router_instance * r = routers; r; r = r->next)
603   {
604   router_info *ri = r->info;
605   for (int i = 0; i < *ri->options_count; i++)
606     {
607     if ((ri->options[i].type & opt_mask) != opt_stringptr) continue;
608     if (p == CS (r->options_block) + ri->options[i].v.offset)
609       return US ri->options[i].name;
610     }
611   }
612
613 for (transport_instance * t = transports; t; t = t->next)
614   {
615   transport_info *ti = t->info;
616   for (int i = 0; i < *ti->options_count; i++)
617     {
618     optionlist * op = &ti->options[i];
619     if ((op->type & opt_mask) != opt_stringptr) continue;
620     if (p == (  op->type & opt_public
621              ? CS t
622              : CS t->options_block
623              )
624              + op->v.offset)
625         return US op->name;
626     }
627   }
628
629 return US"";
630 }
631
632
633
634
635 /*************************************************
636 *       Deal with an assignment to a macro       *
637 *************************************************/
638
639 /* We have a new definition; append to the list.
640
641 Args:
642  name   Name of the macro; will be copied
643  val    Expansion result for the macro; will be copied
644 */
645
646 macro_item *
647 macro_create(const uschar * name, const uschar * val, BOOL command_line)
648 {
649 macro_item * m = store_get(sizeof(macro_item), FALSE);
650
651 READCONF_DEBUG fprintf(stderr, "%s: '%s' '%s'\n", __FUNCTION__, name, val);
652 m->next = NULL;
653 m->command_line = command_line;
654 m->namelen = Ustrlen(name);
655 m->replen = Ustrlen(val);
656 m->name = string_copy(name);
657 m->replacement = string_copy(val);
658 if (mlast)
659   mlast->next = m;
660 else
661   macros = m;
662 mlast = m;
663 if (!macros_user)
664   macros_user = m;
665 return m;
666 }
667
668
669 /* This function is called when a line that starts with an upper case letter is
670 encountered. The argument "line" should contain a complete logical line, and
671 start with the first letter of the macro name. The macro name and the
672 replacement text are extracted and stored. Redefinition of existing,
673 non-command line, macros is permitted using '==' instead of '='.
674
675 Arguments:
676   s            points to the start of the logical line
677
678 Returns:       FALSE iff fatal error
679 */
680
681 BOOL
682 macro_read_assignment(uschar *s)
683 {
684 uschar name[64];
685 int namelen = 0;
686 BOOL redef = FALSE;
687 macro_item *m;
688
689 while (isalnum(*s) || *s == '_')
690   {
691   if (namelen >= sizeof(name) - 1)
692     {
693     log_write(0, LOG_PANIC|LOG_CONFIG_IN,
694       "macro name too long (maximum is " SIZE_T_FMT " characters)", sizeof(name) - 1);
695     return FALSE;
696     }
697   name[namelen++] = *s++;
698   }
699 name[namelen] = 0;
700
701 Uskip_whitespace(&s);
702 if (*s++ != '=')
703   {
704   log_write(0, LOG_PANIC|LOG_CONFIG_IN, "malformed macro definition");
705   return FALSE;
706   }
707
708 if (*s == '=')
709   {
710   redef = TRUE;
711   s++;
712   }
713 Uskip_whitespace(&s);
714
715 /* If an existing macro of the same name was defined on the command line, we
716 just skip this definition. It's an error to attempt to redefine a macro without
717 redef set to TRUE, or to redefine a macro when it hasn't been defined earlier.
718 It is also an error to define a macro whose name begins with the name of a
719 previously defined macro.  This is the requirement that make using a tree
720 for macros hard; we must check all macros for the substring.  Perhaps a
721 sorted list, and a bsearch, would work?
722 Note: it is documented that the other way round works. */
723
724 for (m = macros; m; m = m->next)
725   {
726   if (Ustrcmp(m->name, name) == 0)
727     {
728     if (!m->command_line && !redef)
729       {
730       log_write(0, LOG_CONFIG|LOG_PANIC, "macro \"%s\" is already "
731        "defined (use \"==\" if you want to redefine it)", name);
732       return FALSE;
733       }
734     break;
735     }
736
737   if (m->namelen < namelen && Ustrstr(name, m->name) != NULL)
738     {
739     log_write(0, LOG_CONFIG|LOG_PANIC, "\"%s\" cannot be defined as "
740       "a macro because previously defined macro \"%s\" is a substring",
741       name, m->name);
742     return FALSE;
743     }
744
745   /* We cannot have this test, because it is documented that a substring
746   macro is permitted (there is even an example).
747   *
748   * if (m->namelen > namelen && Ustrstr(m->name, name) != NULL)
749   *   log_write(0, LOG_CONFIG|LOG_PANIC_DIE, "\"%s\" cannot be defined as "
750   *     "a macro because it is a substring of previously defined macro \"%s\"",
751   *     name, m->name);
752   */
753   }
754
755 /* Check for an overriding command-line definition. */
756
757 if (m && m->command_line) return TRUE;
758
759 /* Redefinition must refer to an existing macro. */
760
761 if (redef)
762   if (m)
763     {
764     m->replen = Ustrlen(s);
765     m->replacement = string_copy(s);
766     }
767   else
768     {
769     log_write(0, LOG_CONFIG|LOG_PANIC, "can't redefine an undefined macro "
770       "\"%s\"", name);
771     return FALSE;
772     }
773
774 /* We have a new definition. */
775 else
776   (void) macro_create(name, s, FALSE);
777 return TRUE;
778 }
779
780
781
782
783
784 /* Process line for macros. The line is in big_buffer starting at offset len.
785 Expand big_buffer if needed.  Handle definitions of new macros, and
786 macro expansions, rewriting the line in the buffer.
787
788 Arguments:
789  len            Offset in buffer of start of line
790  newlen         Pointer to offset of end of line, updated on return
791  macro_found    Pointer to return that a macro was expanded
792
793 Return: pointer to first nonblank char in line
794 */
795
796 uschar *
797 macros_expand(int len, int * newlen, BOOL * macro_found)
798 {
799 uschar * ss = big_buffer + len;
800 uschar * s;
801
802 /* Find the true start of the physical line - leading spaces are always
803 ignored. */
804
805 Uskip_whitespace(&ss);
806
807 /* Process the physical line for macros. If this is the start of the logical
808 line, skip over initial text at the start of the line if it starts with an
809 upper case character followed by a sequence of name characters and an equals
810 sign, because that is the definition of a new macro, and we don't do
811 replacement therein. */
812
813 s = ss;
814 if (len == 0 && isupper(*s))
815   {
816   while (isalnum(*s) || *s == '_') s++;
817   if (Uskip_whitespace(&s) != '=') s = ss;          /* Not a macro definition */
818   }
819
820 /* Skip leading chars which cannot start a macro name, to avoid multiple
821 pointless rescans in Ustrstr calls. */
822
823 while (*s && !isupper(*s) && !(*s == '_' && isupper(s[1]))) s++;
824
825 /* For each defined macro, scan the line (from after XXX= if present),
826 replacing all occurrences of the macro. */
827
828 *macro_found = FALSE;
829 if (*s) for (macro_item * m = *s == '_' ? macros : macros_user; m; m = m->next)
830   {
831   uschar * p, *pp;
832   uschar * t;
833
834   while (*s && !isupper(*s) && !(*s == '_' && isupper(s[1]))) s++;
835   if (!*s) break;
836
837   t = s;
838   while ((p = Ustrstr(t, m->name)) != NULL)
839     {
840     int moveby;
841
842     READCONF_DEBUG fprintf(stderr, "%s: matched '%s' in '%.*s'\n", __FUNCTION__,
843       m->name, (int) Ustrlen(ss)-1, ss);
844     /* Expand the buffer if necessary */
845
846     while (*newlen - m->namelen + m->replen + 1 > big_buffer_size)
847       {
848       int newsize = big_buffer_size + BIG_BUFFER_SIZE;
849       uschar *newbuffer = store_malloc(newsize);
850       memcpy(newbuffer, big_buffer, *newlen + 1);
851       p = newbuffer  + (p - big_buffer);
852       s = newbuffer  + (s - big_buffer);
853       ss = newbuffer + (ss - big_buffer);
854       t = newbuffer  + (t - big_buffer);
855       big_buffer_size = newsize;
856       store_free(big_buffer);
857       big_buffer = newbuffer;
858       }
859
860     /* Shuffle the remaining characters up or down in the buffer before
861     copying in the replacement text. Don't rescan the replacement for this
862     same macro. */
863
864     pp = p + m->namelen;
865     if ((moveby = m->replen - m->namelen) != 0)
866       {
867       memmove(p + m->replen, pp, (big_buffer + *newlen) - pp + 1);
868       *newlen += moveby;
869       }
870     Ustrncpy(p, m->replacement, m->replen);
871     t = p + m->replen;
872     while (*t && !isupper(*t) && !(*t == '_' && isupper(t[1]))) t++;
873     *macro_found = TRUE;
874     }
875   }
876
877 /* An empty macro replacement at the start of a line could mean that ss no
878 longer points to the first non-blank character. */
879
880 Uskip_whitespace(&ss);
881 return ss;
882 }
883
884 /*************************************************
885 *            Read configuration line             *
886 *************************************************/
887
888 /* A logical line of text is read from the configuration file into the big
889 buffer, taking account of macros, .includes, and continuations. The size of
890 big_buffer is increased if necessary. The count of configuration lines is
891 maintained. Physical input lines starting with # (ignoring leading white space,
892 and after macro replacement) and empty logical lines are always ignored.
893 Leading and trailing spaces are removed.
894
895 If we hit a line of the form "begin xxxx", the xxxx is placed in the
896 next_section vector, and the function returns NULL, indicating the end of a
897 configuration section. On end-of-file, NULL is returned with next_section
898 empty.
899
900 Arguments:      none
901
902 Returns:        a pointer to the first non-blank in the line,
903                 or NULL if eof or end of section is reached
904 */
905
906 static uschar *
907 get_config_line(void)
908 {
909 int startoffset = 0;         /* To first non-blank char in logical line */
910 int len = 0;                 /* Of logical line so far */
911 int newlen;
912 uschar *s, *ss;
913 BOOL macro_found;
914
915 /* Loop for handling continuation lines, skipping comments, and dealing with
916 .include files. */
917
918 for (;;)
919   {
920   if (Ufgets(big_buffer+len, big_buffer_size-len, config_file) == NULL)
921     {
922     if (config_file_stack != NULL)    /* EOF inside .include */
923       {
924       (void)fclose(config_file);
925       config_file = config_file_stack->file;
926       config_filename = config_file_stack->filename;
927       config_directory = config_file_stack->directory;
928       config_lineno = config_file_stack->lineno;
929       config_file_stack = config_file_stack->next;
930       if (config_lines)
931         save_config_position(config_filename, config_lineno);
932       continue;
933       }
934
935     /* EOF at top level */
936
937     if (cstate_stack_ptr >= 0)
938       log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
939         "Unexpected end of configuration file: .endif missing");
940
941     if (len != 0) break;        /* EOF after continuation */
942     next_section[0] = 0;        /* EOF at start of logical line */
943     return NULL;
944     }
945
946   config_lineno++;
947   newlen = len + Ustrlen(big_buffer + len);
948
949   if (config_lines && config_lineno == 1)
950     save_config_position(config_filename, config_lineno);
951
952   /* Handle pathologically long physical lines - yes, it did happen - by
953   extending big_buffer at this point. The code also copes with very long
954   logical lines. */
955
956   while (newlen == big_buffer_size - 1 && big_buffer[newlen - 1] != '\n')
957     {
958     uschar *newbuffer;
959     big_buffer_size += BIG_BUFFER_SIZE;
960     newbuffer = store_malloc(big_buffer_size);
961
962     /* This use of strcpy is OK because we know that the string in the old
963     buffer is shorter than the new buffer. */
964
965     Ustrcpy(newbuffer, big_buffer);
966     store_free(big_buffer);
967     big_buffer = newbuffer;
968     if (Ufgets(big_buffer+newlen, big_buffer_size-newlen, config_file) == NULL)
969       break;
970     newlen += Ustrlen(big_buffer + newlen);
971     }
972
973   ss = macros_expand(len, &newlen, &macro_found);
974
975   /* Check for comment lines - these are physical lines. */
976
977   if (*ss == '#') continue;
978
979   /* Handle conditionals, which are also applied to physical lines. Conditions
980   are of the form ".ifdef ANYTEXT" and are treated as true if any macro
981   expansion occurred on the rest of the line. A preliminary test for the leading
982   '.' saves effort on most lines. */
983
984   if (*ss == '.')
985     {
986     int i;
987
988     /* Search the list of conditional directives */
989
990     for (i = 0; i < cond_list_size; i++)
991       {
992       int n;
993       cond_item *c = cond_list+i;
994       if (Ustrncmp(ss+1, c->name, c->namelen) != 0) continue;
995
996       /* The following character must be white space or end of string */
997
998       n = ss[1 + c->namelen];
999       if (n != ' ' && n != 't' && n != '\n' && n != 0) break;
1000
1001       /* .ifdef and .ifndef push the current state onto the stack, then set
1002       a new one from the table. Stack overflow is an error */
1003
1004       if (c->pushpop > 0)
1005         {
1006         if (cstate_stack_ptr >= CSTATE_STACK_SIZE - 1)
1007           log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1008             ".%s nested too deeply", c->name);
1009         cstate_stack[++cstate_stack_ptr] = cstate;
1010         cstate = next_cstate[cstate][macro_found? c->action1 : c->action2];
1011         }
1012
1013       /* For any of the others, stack underflow is an error. The next state
1014       comes either from the stack (.endif) or from the table. */
1015
1016       else
1017         {
1018         if (cstate_stack_ptr < 0)
1019           log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1020             ".%s without matching .ifdef", c->name);
1021         cstate = (c->pushpop < 0)? cstate_stack[cstate_stack_ptr--] :
1022           next_cstate[cstate][macro_found? c->action1 : c->action2];
1023         }
1024
1025       /* Having dealt with a directive, break the loop */
1026
1027       break;
1028       }
1029
1030     /* If we have handled a conditional directive, continue with the next
1031     physical line. Otherwise, fall through. */
1032
1033     if (i < cond_list_size) continue;
1034     }
1035
1036   /* If the conditional state is not 0 (actively using these lines), ignore
1037   this input line. */
1038
1039   if (cstate != 0) continue;  /* Conditional skip */
1040
1041   /* Handle .include lines - these are also physical lines. */
1042
1043   if (Ustrncmp(ss, ".include", 8) == 0 &&
1044        (isspace(ss[8]) ||
1045          (Ustrncmp(ss+8, "_if_exists", 10) == 0 && isspace(ss[18]))))
1046     {
1047     uschar *t;
1048     int include_if_exists = isspace(ss[8])? 0 : 10;
1049     config_file_item *save;
1050     struct stat statbuf;
1051
1052     ss += 9 + include_if_exists;
1053     Uskip_whitespace(&ss);
1054     t = ss + Ustrlen(ss);
1055     while (t > ss && isspace(t[-1])) t--;
1056     if (*ss == '\"' && t[-1] == '\"')
1057       {
1058       ss++;
1059       t--;
1060       }
1061     *t = 0;
1062
1063     /* We allow relative file names. For security reasons currently
1064     relative names not allowed with .include_if_exists. For .include_if_exists
1065     we need to check the permissions/ownership of the containing folder */
1066     if (*ss != '/')
1067       if (include_if_exists) log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, ".include specifies a non-"
1068           "absolute path \"%s\"", ss);
1069       else
1070         {
1071         gstring * g = string_append(NULL, 3, config_directory, "/", ss);
1072         ss = string_from_gstring(g);
1073         }
1074
1075     if (include_if_exists != 0 && (Ustat(ss, &statbuf) != 0)) continue;
1076
1077     if (config_lines)
1078       save_config_position(config_filename, config_lineno);
1079     save = store_get(sizeof(config_file_item), FALSE);
1080     save->next = config_file_stack;
1081     config_file_stack = save;
1082     save->file = config_file;
1083     save->filename = config_filename;
1084     save->directory = config_directory;
1085     save->lineno = config_lineno;
1086
1087     if (!(config_file = Ufopen(ss, "rb")))
1088       log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "failed to open included "
1089         "configuration file %s", ss);
1090
1091     config_filename = string_copy(ss);
1092     config_directory = string_copyn(ss, CUstrrchr(ss, '/') - ss);
1093     config_lineno = 0;
1094     continue;
1095     }
1096
1097   /* If this is the start of the logical line, remember where the non-blank
1098   data starts. Otherwise shuffle down continuation lines to remove leading
1099   white space. */
1100
1101   if (len == 0)
1102     startoffset = ss - big_buffer;
1103   else
1104     {
1105     s = big_buffer + len;
1106     if (ss > s)
1107       {
1108       memmove(s, ss, (newlen - len) -  (ss - s) + 1);
1109       newlen -= ss - s;
1110       }
1111     }
1112
1113   /* Accept the new addition to the line. Remove trailing white space. */
1114
1115   len = newlen;
1116   while (len > 0 && isspace(big_buffer[len-1])) len--;
1117   big_buffer[len] = 0;
1118
1119   /* We are done if the line does not end in backslash and contains some data.
1120   Empty logical lines are ignored. For continuations, remove the backslash and
1121   go round the loop to read the continuation line. */
1122
1123   if (len > 0)
1124     {
1125     if (big_buffer[len-1] != '\\') break;   /* End of logical line */
1126     big_buffer[--len] = 0;                  /* Remove backslash */
1127     }
1128   }     /* Loop for reading multiple physical lines */
1129
1130 /* We now have a logical line. Test for the end of a configuration section (or,
1131 more accurately, for the start of the next section). Place the name of the next
1132 section in next_section, and return NULL. If the name given is longer than
1133 next_section, truncate it. It will be unrecognized later, because all the known
1134 section names do fit. Leave space for pluralizing. */
1135
1136 s = big_buffer + startoffset;            /* First non-space character */
1137
1138 if (config_lines)
1139   save_config_line(s);
1140
1141 if (strncmpic(s, US"begin ", 6) == 0)
1142   {
1143   s += 6;
1144   Uskip_whitespace(&s);
1145   if (big_buffer + len - s > sizeof(next_section) - 2)
1146     s[sizeof(next_section) - 2] = 0;
1147   Ustrcpy(next_section, s);
1148   return NULL;
1149   }
1150
1151 /* Return the first non-blank character. */
1152
1153 return s;
1154 }
1155
1156
1157
1158 /*************************************************
1159 *             Read a name                        *
1160 *************************************************/
1161
1162 /* The yield is the pointer to the next uschar. Names longer than the
1163 output space are silently truncated. This function is also used from acl.c when
1164 parsing ACLs.
1165
1166 Arguments:
1167   name      where to put the name
1168   len       length of name
1169   s         input pointer
1170
1171 Returns:    new input pointer
1172 */
1173
1174 uschar *
1175 readconf_readname(uschar *name, int len, uschar *s)
1176 {
1177 int p = 0;
1178
1179 if (isalpha(Uskip_whitespace(&s)))
1180   while (isalnum(*s) || *s == '_')
1181     {
1182     if (p < len-1) name[p++] = *s;
1183     s++;
1184     }
1185
1186 name[p] = 0;
1187 Uskip_whitespace(&s);
1188 return s;
1189 }
1190
1191
1192
1193
1194 /*************************************************
1195 *          Read a time value                     *
1196 *************************************************/
1197
1198 /* This function is also called from outside, to read argument
1199 time values. The format of a time value is:
1200
1201   [<n>w][<n>d][<n>h][<n>m][<n>s]
1202
1203 as long as at least one is present. If a format error is encountered,
1204 return a negative value. The value must be terminated by the given
1205 terminator.
1206
1207 Arguments:
1208   s             input pointer
1209   terminator    required terminating character
1210   return_msec   if TRUE, allow fractional seconds and return milliseconds
1211
1212 Returns:        the time value, or -1 on syntax error
1213                 value is seconds if return_msec is FALSE
1214                 value is milliseconds if return_msec is TRUE
1215 */
1216
1217 int
1218 readconf_readtime(const uschar *s, int terminator, BOOL return_msec)
1219 {
1220 int yield = 0;
1221 for (;;)
1222   {
1223   int value, count;
1224   double fraction;
1225
1226   if (!isdigit(*s)) return -1;
1227   (void)sscanf(CCS s, "%d%n", &value, &count);
1228   s += count;
1229
1230   switch (*s)
1231     {
1232     case 'w': value *= 7;
1233     case 'd': value *= 24;
1234     case 'h': value *= 60;
1235     case 'm': value *= 60;
1236     case 's': s++;
1237     break;
1238
1239     case '.':
1240     if (!return_msec) return -1;
1241     (void)sscanf(CCS s, "%lf%n", &fraction, &count);
1242     s += count;
1243     if (*s++ != 's') return -1;
1244     yield += (int)(fraction * 1000.0);
1245     break;
1246
1247     default: return -1;
1248     }
1249
1250   if (return_msec) value *= 1000;
1251   yield += value;
1252   if (*s == terminator) return yield;
1253   }
1254 /* Control never reaches here. */
1255 }
1256
1257
1258
1259 /*************************************************
1260 *          Read a fixed point value              *
1261 *************************************************/
1262
1263 /* The value is returned *1000
1264
1265 Arguments:
1266   s           input pointer
1267   terminator  required terminator
1268
1269 Returns:      the value, or -1 on error
1270 */
1271
1272 static int
1273 readconf_readfixed(const uschar *s, int terminator)
1274 {
1275 int yield = 0;
1276 int value, count;
1277 if (!isdigit(*s)) return -1;
1278 (void)sscanf(CS  s, "%d%n", &value, &count);
1279 s += count;
1280 yield = value * 1000;
1281 if (*s == '.')
1282   {
1283   int m = 100;
1284   while (isdigit((*(++s))))
1285     {
1286     yield += (*s - '0') * m;
1287     m /= 10;
1288     }
1289   }
1290
1291 return (*s == terminator)? yield : (-1);
1292 }
1293
1294
1295
1296 /*************************************************
1297 *            Find option in list                 *
1298 *************************************************/
1299
1300 /* The lists are always in order, so binary chop can be used.
1301
1302 Arguments:
1303   name      the option name to search for
1304   ol        the first entry in the option list
1305   last      one more than the offset of the last entry in the option list
1306
1307 Returns:    pointer to an option entry, or NULL if not found
1308 */
1309
1310 static optionlist *
1311 find_option(uschar *name, optionlist *ol, int last)
1312 {
1313 int first = 0;
1314 while (last > first)
1315   {
1316   int middle = (first + last)/2;
1317   int c = Ustrcmp(name, ol[middle].name);
1318
1319   if (c == 0) return ol + middle;
1320   else if (c > 0) first = middle + 1;
1321   else last = middle;
1322   }
1323 return NULL;
1324 }
1325
1326
1327
1328 /*************************************************
1329 *      Find a set flag in option list            *
1330 *************************************************/
1331
1332 /* Because some versions of Unix make no restrictions on the values of uids and
1333 gids (even negative ones), we cannot represent "unset" by a special value.
1334 There is therefore a separate boolean variable for each one indicating whether
1335 a value is set or not. This function returns a pointer to the boolean, given
1336 the original option name. It is a major disaster if the flag cannot be found.
1337
1338 Arguments:
1339   name          the name of the uid or gid option
1340   oltop         points to the start of the relevant option list
1341   last          one more than the offset of the last item in the option list
1342   data_block    NULL when reading main options => data values in the option
1343                   list are absolute addresses; otherwise they are byte offsets
1344                   in data_block (used for driver options)
1345
1346 Returns:        a pointer to the boolean flag.
1347 */
1348
1349 static BOOL *
1350 get_set_flag(uschar *name, optionlist *oltop, int last, void *data_block)
1351 {
1352 optionlist *ol;
1353 uschar name2[64];
1354 sprintf(CS name2, "*set_%.50s", name);
1355 if (!(ol = find_option(name2, oltop, last)))
1356   log_write(0, LOG_MAIN|LOG_PANIC_DIE,
1357     "Exim internal error: missing set flag for %s", name);
1358 return data_block
1359   ? (BOOL *)(US data_block + ol->v.offset) : (BOOL *)ol->v.value;
1360 }
1361
1362
1363
1364
1365 /*************************************************
1366 *    Output extra characters message and die     *
1367 *************************************************/
1368
1369 /* Called when an option line has junk on the end. Sometimes this is because
1370 the sysadmin thinks comments are permitted.
1371
1372 Arguments:
1373   s          points to the extra characters
1374   t1..t3     strings to insert in the log message
1375
1376 Returns:     doesn't return; dies
1377 */
1378
1379 static void
1380 extra_chars_error(const uschar *s, const uschar *t1, const uschar *t2, const uschar *t3)
1381 {
1382 uschar *comment = US"";
1383 if (*s == '#') comment = US" (# is comment only at line start)";
1384 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1385   "extra characters follow %s%s%s%s", t1, t2, t3, comment);
1386 }
1387
1388
1389
1390 /*************************************************
1391 *              Read rewrite information          *
1392 *************************************************/
1393
1394 /* Each line of rewrite information contains:
1395
1396 .  A complete address in the form user@domain, possibly with
1397    leading * for each part; or alternatively, a regex.
1398
1399 .  A replacement string (which will be expanded).
1400
1401 .  An optional sequence of one-letter flags, indicating which
1402    headers etc. to apply this rule to.
1403
1404 All this is decoded and placed into a control block. The OR of the flags is
1405 maintained in a common word.
1406
1407 Arguments:
1408   p           points to the string that makes up the rule
1409   existflags  points to the overall flag word
1410   isglobal    TRUE if reading global rewrite rules
1411
1412 Returns:      the control block for the parsed rule.
1413 */
1414
1415 static rewrite_rule *
1416 readconf_one_rewrite(const uschar *p, int *existflags, BOOL isglobal)
1417 {
1418 rewrite_rule *next = store_get(sizeof(rewrite_rule), FALSE);
1419
1420 next->next = NULL;
1421 next->key = string_dequote(&p);
1422
1423 Uskip_whitespace(&p);
1424 if (!*p)
1425   log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1426     "missing rewrite replacement string");
1427
1428 next->flags = 0;
1429 next->replacement = string_dequote(&p);
1430
1431 while (*p) switch (*p++)
1432   {
1433   case ' ': case '\t': break;
1434
1435   case 'q': next->flags |= rewrite_quit; break;
1436   case 'w': next->flags |= rewrite_whole; break;
1437
1438   case 'h': next->flags |= rewrite_all_headers; break;
1439   case 's': next->flags |= rewrite_sender; break;
1440   case 'f': next->flags |= rewrite_from; break;
1441   case 't': next->flags |= rewrite_to;   break;
1442   case 'c': next->flags |= rewrite_cc;   break;
1443   case 'b': next->flags |= rewrite_bcc;  break;
1444   case 'r': next->flags |= rewrite_replyto; break;
1445
1446   case 'E': next->flags |= rewrite_all_envelope; break;
1447   case 'F': next->flags |= rewrite_envfrom; break;
1448   case 'T': next->flags |= rewrite_envto; break;
1449
1450   case 'Q': next->flags |= rewrite_qualify; break;
1451   case 'R': next->flags |= rewrite_repeat; break;
1452
1453   case 'S':
1454   next->flags |= rewrite_smtp;
1455   if (next->key[0] != '^' && Ustrncmp(next->key, "\\N^", 3) != 0)
1456     log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1457       "rewrite rule has the S flag but is not a regular expression");
1458   break;
1459
1460   default:
1461   log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1462     "unknown rewrite flag character '%c' "
1463     "(could be missing quotes round replacement item)", p[-1]);
1464   break;
1465   }
1466
1467 /* If no action flags are set, set all the "normal" rewrites. */
1468
1469 if ((next->flags & (rewrite_all | rewrite_smtp)) == 0)
1470   next->flags |= isglobal? rewrite_all : rewrite_all_headers;
1471
1472 /* Remember which exist, for optimization, and return the rule */
1473
1474 *existflags |= next->flags;
1475 return next;
1476 }
1477
1478
1479
1480
1481 /*************************************************
1482 *          Read global rewrite information       *
1483 *************************************************/
1484
1485 /* Each line is a single rewrite rule; it is parsed into a control block
1486 by readconf_one_rewrite(), and its flags are ORed into the global flag
1487 word rewrite_existflags. */
1488
1489 void
1490 readconf_rewrites(void)
1491 {
1492 rewrite_rule **chain = &global_rewrite_rules;
1493 uschar *p;
1494
1495 while ((p = get_config_line()) != NULL)
1496   {
1497   rewrite_rule *next = readconf_one_rewrite(p, &rewrite_existflags, TRUE);
1498   *chain = next;
1499   chain = &(next->next);
1500   }
1501 }
1502
1503
1504
1505 /*************************************************
1506 *               Read a string                    *
1507 *************************************************/
1508
1509 /* Strings are read into the normal store pool. As long we aren't too
1510 near the end of the current block, the string will just use what is necessary
1511 on the top of the stacking pool, because string_cat() uses the extension
1512 mechanism.
1513
1514 Argument:
1515   s         the rest of the input line
1516   name      the option name (for errors)
1517
1518 Returns:    pointer to the string
1519 */
1520
1521 static uschar *
1522 read_string(const uschar *s, const uschar *name)
1523 {
1524 uschar *yield;
1525 const uschar *ss;
1526
1527 if (*s != '\"') return string_copy(s);
1528
1529 ss = s;
1530 yield = string_dequote(&s);
1531
1532 if (s == ss+1 || s[-1] != '\"')
1533   log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1534     "missing quote at end of string value for %s", name);
1535
1536 if (*s != 0) extra_chars_error(s, US"string value for ", name, US"");
1537
1538 return yield;
1539 }
1540
1541
1542 /*************************************************
1543 *            Custom-handler options              *
1544 *************************************************/
1545 static void
1546 fn_smtp_receive_timeout(const uschar * name, const uschar * str, unsigned flags)
1547 {
1548 if (flags & opt_fn_print)
1549   {
1550   if (flags & opt_fn_print_label) printf("%s = ", name);
1551   printf("%s\n", smtp_receive_timeout_s
1552     ? string_printing2(smtp_receive_timeout_s, SP_TAB)
1553     : readconf_printtime(smtp_receive_timeout));
1554   }
1555 else if (*str == '$')
1556   smtp_receive_timeout_s = string_copy(str);
1557 else
1558   {
1559   /* "smtp_receive_timeout",     opt_time,        &smtp_receive_timeout */
1560   smtp_receive_timeout = readconf_readtime(str, 0, FALSE);
1561   if (smtp_receive_timeout < 0)
1562     log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "invalid time value for %s",
1563       name);
1564   }
1565 }
1566
1567 /*************************************************
1568 *            Handle option line                  *
1569 *************************************************/
1570
1571 /* This function is called from several places to process a line containing the
1572 setting of an option. The first argument is the line to be decoded; it has been
1573 checked not to be empty and not to start with '#'. Trailing newlines and white
1574 space have been removed. The second argument is a pointer to the list of
1575 variable names that are to be recognized, together with their types and
1576 locations, and the third argument gives the number of entries in the list.
1577
1578 The fourth argument is a pointer to a data block. If it is NULL, then the data
1579 values in the options list are absolute addresses. Otherwise, they are byte
1580 offsets in the data block.
1581
1582 String option data may continue onto several lines; this function reads further
1583 data from config_file if necessary.
1584
1585 The yield of this function is normally zero. If a string continues onto
1586 multiple lines, then the data value is permitted to be followed by a comma
1587 or a semicolon (for use in drivers) and the yield is that character.
1588
1589 Arguments:
1590   buffer        contains the configuration line to be handled
1591   oltop         points to the start of the relevant option list
1592   last          one more than the offset of the last item in the option list
1593   data_block    NULL when reading main options => data values in the option
1594                   list are absolute addresses; otherwise they are byte offsets
1595                   in data_block when they have opt_public set; otherwise
1596                   they are byte offsets in data_block->options_block.
1597   unknown_txt   format string to use in panic message for unknown option;
1598                   must contain %s for option name
1599                 if given as NULL, don't panic on unknown option
1600
1601 Returns:        TRUE if an option was read successfully,
1602                 FALSE false for an unknown option if unknown_txt == NULL,
1603                   otherwise panic and die on an unknown option
1604 */
1605
1606 static BOOL
1607 readconf_handle_option(uschar *buffer, optionlist *oltop, int last,
1608   void *data_block, uschar *unknown_txt)
1609 {
1610 int ptr = 0;
1611 int offset = 0;
1612 int count, type, value;
1613 int issecure = 0;
1614 uid_t uid;
1615 gid_t gid;
1616 BOOL boolvalue = TRUE;
1617 BOOL freesptr = TRUE;
1618 optionlist *ol, *ol2;
1619 struct passwd *pw;
1620 rmark reset_point;
1621 int intbase = 0;
1622 uschar *inttype = US"";
1623 uschar *sptr;
1624 uschar *s = buffer;
1625 uschar **str_target;
1626 uschar name[64];
1627 uschar name2[64];
1628
1629 /* There may be leading spaces; thereafter, we expect an option name starting
1630 with a letter. */
1631
1632 while (isspace(*s)) s++;
1633 if (!isalpha(*s))
1634   log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "option setting expected: %s", s);
1635
1636 /* Read the name of the option, and skip any subsequent white space. If
1637 it turns out that what we read was "hide", set the flag indicating that
1638 this is a secure option, and loop to read the next word. */
1639
1640 for (int n = 0; n < 2; n++)
1641   {
1642   while (isalnum(*s) || *s == '_')
1643     {
1644     if (ptr < sizeof(name)-1) name[ptr++] = *s;
1645     s++;
1646     }
1647   name[ptr] = 0;
1648   while (isspace(*s)) s++;
1649   if (Ustrcmp(name, "hide") != 0) break;
1650   issecure = opt_secure;
1651   ptr = 0;
1652   }
1653
1654 /* Deal with "no_" or "not_" here for booleans */
1655
1656 if (Ustrncmp(name, "no_", 3) == 0)
1657   {
1658   boolvalue = FALSE;
1659   offset = 3;
1660   }
1661
1662 if (Ustrncmp(name, "not_", 4) == 0)
1663   {
1664   boolvalue = FALSE;
1665   offset = 4;
1666   }
1667
1668 /* Search the list for the given name. A non-existent name, or an option that
1669 is set twice, is a disaster. */
1670
1671 if (!(ol = find_option(name + offset, oltop, last)))
1672   {
1673   if (!unknown_txt) return FALSE;
1674   log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, CS unknown_txt, name);
1675   }
1676
1677 if ((ol->type & opt_set)  && !(ol->type & (opt_rep_con | opt_rep_str)))
1678   log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1679     "\"%s\" option set for the second time", name);
1680
1681 ol->type |= opt_set | issecure;
1682 type = ol->type & opt_mask;
1683
1684 /* Types with data values must be followed by '='; the "no[t]_" prefix
1685 applies only to boolean values. */
1686
1687 if (type < opt_bool || type > opt_bool_last)
1688   {
1689   if (offset != 0)
1690     log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1691       "negation prefix applied to a non-boolean option");
1692   if (!*s)
1693     log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1694       "unexpected end of line (data missing) after %s", name);
1695   if (*s != '=')
1696     log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "missing \"=\" after %s", name);
1697   }
1698
1699 /* If a boolean wasn't preceded by "no[t]_" it can be followed by = and
1700 true/false/yes/no, or, in the case of opt_expand_bool, a general string that
1701 ultimately expands to one of those values. */
1702
1703 else if (*s && (offset != 0 || *s != '='))
1704   extra_chars_error(s, US"boolean option ", name, US"");
1705
1706 /* Skip white space after = */
1707
1708 if (*s == '=') while (isspace((*(++s))));
1709
1710 /* If there is a data block and the opt_public flag is not set, change
1711 the data block pointer to the private options block. */
1712
1713 if (data_block && !(ol->type & opt_public))
1714   data_block = (void *)(((driver_instance *)data_block)->options_block);
1715
1716 /* Now get the data according to the type. */
1717
1718 switch (type)
1719   {
1720   /* If a string value is not enclosed in quotes, it consists of
1721   the rest of the current line, verbatim. Otherwise, string escapes
1722   are processed.
1723
1724   A transport is specified as a string, which is then looked up in the
1725   list of transports. A search type is specified as one of a number of
1726   known strings.
1727
1728   A set or rewrite rules for a driver is specified as a string, which is
1729   then parsed into a suitable chain of control blocks.
1730
1731   Uids and gids are specified as strings which are then looked up in the
1732   passwd file. Lists of uids and gids are similarly specified as colon-
1733   separated strings. */
1734
1735   case opt_stringptr:
1736   case opt_uid:
1737   case opt_gid:
1738   case opt_expand_uid:
1739   case opt_expand_gid:
1740   case opt_uidlist:
1741   case opt_gidlist:
1742   case opt_rewrite:
1743
1744   reset_point = store_mark();
1745   sptr = read_string(s, name);
1746
1747   /* Having read a string, we now have several different ways of using it,
1748   depending on the data type, so do another switch. If keeping the actual
1749   string is not required (because it is interpreted), freesptr is set TRUE,
1750   and at the end we reset the pool. */
1751
1752   switch (type)
1753     {
1754     /* If this was a string, set the variable to point to the new string,
1755     and set the flag so its store isn't reclaimed. If it was a list of rewrite
1756     rules, we still keep the string (for printing), and parse the rules into a
1757     control block and flags word. */
1758
1759     case opt_stringptr:
1760     str_target = data_block ? USS (US data_block + ol->v.offset)
1761                             : USS ol->v.value;
1762     if (ol->type & opt_rep_con)
1763       {
1764       uschar * saved_condition;
1765       /* We already have a condition, we're conducting a crude hack to let
1766       multiple condition rules be chained together, despite storing them in
1767       text form. */
1768       *str_target = string_copy_perm( (saved_condition = *str_target)
1769         ? string_sprintf("${if and{{bool_lax{%s}}{bool_lax{%s}}}}",
1770             saved_condition, sptr)
1771         : sptr,
1772         FALSE);
1773       /* TODO(pdp): there is a memory leak here and just below
1774       when we set 3 or more conditions; I still don't
1775       understand the store mechanism enough to know
1776       what's the safe way to free content from an earlier store.
1777       AFAICT, stores stack, so freeing an early stored item also stores
1778       all data alloc'd after it.  If we knew conditions were adjacent,
1779       we could survive that, but we don't.  So I *think* we need to take
1780       another bit from opt_type to indicate "malloced"; this seems like
1781       quite a hack, especially for this one case.  It also means that
1782       we can't ever reclaim the store from the *first* condition.
1783
1784       Because we only do this once, near process start-up, I'm prepared to
1785       let this slide for the time being, even though it rankles.  */
1786       }
1787     else if (ol->type & opt_rep_str)
1788       {
1789       uschar sep_o =
1790         Ustrncmp(name, "headers_add", 11) == 0  ? '\n'
1791         : Ustrncmp(name, "set", 3) == 0         ? ';'
1792         : ':';
1793       int    sep_i = -(int)sep_o;
1794       const uschar * list = sptr;
1795       uschar * s;
1796       gstring * list_o = NULL;
1797
1798       if (*str_target)
1799         {
1800         list_o = string_get(Ustrlen(*str_target) + Ustrlen(sptr));
1801         list_o = string_cat(list_o, *str_target);
1802         }
1803
1804       while ((s = string_nextinlist(&list, &sep_i, NULL, 0)))
1805         list_o = string_append_listele(list_o, sep_o, s);
1806
1807       if (list_o)
1808         *str_target = string_copy_perm(string_from_gstring(list_o), FALSE);
1809       }
1810     else
1811       {
1812       *str_target = sptr;
1813       freesptr = FALSE;
1814       }
1815     break;
1816
1817     case opt_rewrite:
1818     if (data_block)
1819       *USS (US data_block + ol->v.offset) = sptr;
1820     else
1821       *USS ol->v.value = sptr;
1822     freesptr = FALSE;
1823     if (type == opt_rewrite)
1824       {
1825       int sep = 0;
1826       int *flagptr;
1827       uschar *p = sptr;
1828       rewrite_rule **chain;
1829       optionlist *ol3;
1830
1831       sprintf(CS name2, "*%.50s_rules", name);
1832       ol2 = find_option(name2, oltop, last);
1833       sprintf(CS name2, "*%.50s_flags", name);
1834       ol3 = find_option(name2, oltop, last);
1835
1836       if (!ol2 || !ol3)
1837         log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1838           "rewrite rules not available for driver");
1839
1840       if (data_block)
1841         {
1842         chain = (rewrite_rule **)(US data_block + ol2->v.offset);
1843         flagptr = (int *)(US data_block + ol3->v.offset);
1844         }
1845       else
1846         {
1847         chain = (rewrite_rule **)ol2->v.value;
1848         flagptr = (int *)ol3->v.value;
1849         }
1850
1851       /* This will trap if sptr is tainted. Not sure if that can happen */
1852       while ((p = string_nextinlist(CUSS &sptr, &sep, big_buffer, BIG_BUFFER_SIZE)))
1853         {
1854         rewrite_rule *next = readconf_one_rewrite(p, flagptr, FALSE);
1855         *chain = next;
1856         chain = &(next->next);
1857         }
1858
1859       if ((*flagptr & (rewrite_all_envelope | rewrite_smtp)) != 0)
1860         log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "rewrite rule specifies a "
1861           "non-header rewrite - not allowed at transport time -");
1862       }
1863     break;
1864
1865     /* If it was an expanded uid, see if there is any expansion to be
1866     done by checking for the presence of a $ character. If there is, save it
1867     in the corresponding *expand_user option field. Otherwise, fall through
1868     to treat it as a fixed uid. Ensure mutual exclusivity of the two kinds
1869     of data. */
1870
1871     case opt_expand_uid:
1872     sprintf(CS name2, "*expand_%.50s", name);
1873     if ((ol2 = find_option(name2, oltop, last)))
1874       {
1875       uschar *ss = (Ustrchr(sptr, '$') != NULL) ? sptr : NULL;
1876
1877       if (data_block)
1878         *(USS(US data_block + ol2->v.offset)) = ss;
1879       else
1880         *(USS ol2->v.value) = ss;
1881
1882       if (ss)
1883         {
1884         *(get_set_flag(name, oltop, last, data_block)) = FALSE;
1885         freesptr = FALSE;
1886         break;
1887         }
1888       }
1889
1890     /* Look up a fixed uid, and also make use of the corresponding gid
1891     if a passwd entry is returned and the gid has not been set. */
1892
1893     case opt_uid:
1894     if (!route_finduser(sptr, &pw, &uid))
1895       log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "user %s was not found", sptr);
1896     if (data_block)
1897       *(uid_t *)(US data_block + ol->v.offset) = uid;
1898     else
1899       *(uid_t *)ol->v.value = uid;
1900
1901     /* Set the flag indicating a fixed value is set */
1902
1903     *(get_set_flag(name, oltop, last, data_block)) = TRUE;
1904
1905     /* Handle matching gid if we have a passwd entry: done by finding the
1906     same name with terminating "user" changed to "group"; if not found,
1907     ignore. Also ignore if the value is already set. */
1908
1909     if (pw == NULL) break;
1910     Ustrcpy(name+Ustrlen(name)-4, US"group");
1911     ol2 = find_option(name, oltop, last);
1912     if (ol2 && ((ol2->type & opt_mask) == opt_gid ||
1913         (ol2->type & opt_mask) == opt_expand_gid))
1914       {
1915       BOOL *set_flag = get_set_flag(name, oltop, last, data_block);
1916       if (!*set_flag)
1917         {
1918         if (data_block)
1919           *((gid_t *)(US data_block + ol2->v.offset)) = pw->pw_gid;
1920         else
1921           *((gid_t *)ol2->v.value) = pw->pw_gid;
1922         *set_flag = TRUE;
1923         }
1924       }
1925     break;
1926
1927     /* If it was an expanded gid, see if there is any expansion to be
1928     done by checking for the presence of a $ character. If there is, save it
1929     in the corresponding *expand_user option field. Otherwise, fall through
1930     to treat it as a fixed gid. Ensure mutual exclusivity of the two kinds
1931     of data. */
1932
1933     case opt_expand_gid:
1934     sprintf(CS name2, "*expand_%.50s", name);
1935     if ((ol2 = find_option(name2, oltop, last)))
1936       {
1937       uschar *ss = (Ustrchr(sptr, '$') != NULL) ? sptr : NULL;
1938
1939       if (data_block)
1940         *(USS(US data_block + ol2->v.offset)) = ss;
1941       else
1942         *(USS ol2->v.value) = ss;
1943
1944       if (ss)
1945         {
1946         *(get_set_flag(name, oltop, last, data_block)) = FALSE;
1947         freesptr = FALSE;
1948         break;
1949         }
1950       }
1951
1952     /* Handle freestanding gid */
1953
1954     case opt_gid:
1955     if (!route_findgroup(sptr, &gid))
1956       log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "group %s was not found", sptr);
1957     if (data_block)
1958       *((gid_t *)(US data_block + ol->v.offset)) = gid;
1959     else
1960       *((gid_t *)ol->v.value) = gid;
1961     *(get_set_flag(name, oltop, last, data_block)) = TRUE;
1962     break;
1963
1964     /* If it was a uid list, look up each individual entry, and build
1965     a vector of uids, with a count in the first element. Put the vector
1966     in malloc store so we can free the string. (We are reading into
1967     permanent store already.) */
1968
1969     case opt_uidlist:
1970       {
1971       int count = 1;
1972       uid_t *list;
1973       int ptr = 0;
1974       const uschar *p;
1975       const uschar *op = expand_string (sptr);
1976
1977       if (op == NULL)
1978         log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "failed to expand %s: %s",
1979           name, expand_string_message);
1980
1981       p = op;
1982       if (*p != 0) count++;
1983       while (*p != 0) if (*p++ == ':' && *p != 0) count++;
1984       list = store_malloc(count*sizeof(uid_t));
1985       list[ptr++] = (uid_t)(count - 1);
1986
1987       if (data_block)
1988         *((uid_t **)(US data_block + ol->v.offset)) = list;
1989       else
1990         *((uid_t **)ol->v.value) = list;
1991
1992       p = op;
1993       while (count-- > 1)
1994         {
1995         int sep = 0;
1996         /* If p is tainted we trap.  Not sure that can happen */
1997         (void)string_nextinlist(&p, &sep, big_buffer, BIG_BUFFER_SIZE);
1998         if (!route_finduser(big_buffer, NULL, &uid))
1999           log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "user %s was not found",
2000             big_buffer);
2001         list[ptr++] = uid;
2002         }
2003       }
2004     break;
2005
2006     /* If it was a gid list, look up each individual entry, and build
2007     a vector of gids, with a count in the first element. Put the vector
2008     in malloc store so we can free the string. (We are reading into permanent
2009     store already.) */
2010
2011     case opt_gidlist:
2012       {
2013       int count = 1;
2014       gid_t *list;
2015       int ptr = 0;
2016       const uschar *p;
2017       const uschar *op = expand_string (sptr);
2018
2019       if (!op)
2020         log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "failed to expand %s: %s",
2021           name, expand_string_message);
2022
2023       p = op;
2024       if (*p != 0) count++;
2025       while (*p != 0) if (*p++ == ':' && *p != 0) count++;
2026       list = store_malloc(count*sizeof(gid_t));
2027       list[ptr++] = (gid_t)(count - 1);
2028
2029       if (data_block)
2030         *((gid_t **)(US data_block + ol->v.offset)) = list;
2031       else
2032         *((gid_t **)ol->v.value) = list;
2033
2034       p = op;
2035       while (count-- > 1)
2036         {
2037         int sep = 0;
2038         /* If p is tainted we trap.  Not sure that can happen */
2039         (void)string_nextinlist(&p, &sep, big_buffer, BIG_BUFFER_SIZE);
2040         if (!route_findgroup(big_buffer, &gid))
2041           log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "group %s was not found",
2042             big_buffer);
2043         list[ptr++] = gid;
2044         }
2045       }
2046     break;
2047     }
2048
2049   /* Release store if the value of the string doesn't need to be kept. */
2050
2051   if (freesptr) reset_point = store_reset(reset_point);
2052   break;
2053
2054   /* Expanded boolean: if no characters follow, or if there are no dollar
2055   characters, this is a fixed-valued boolean, and we fall through. Otherwise,
2056   save the string for later expansion in the alternate place. */
2057
2058   case opt_expand_bool:
2059   if (*s && Ustrchr(s, '$') != 0)
2060     {
2061     sprintf(CS name2, "*expand_%.50s", name);
2062     if ((ol2 = find_option(name2, oltop, last)))
2063       {
2064       reset_point = store_mark();
2065       sptr = read_string(s, name);
2066       if (data_block)
2067         *(USS(US data_block + ol2->v.offset)) = sptr;
2068       else
2069         *(USS ol2->v.value) = sptr;
2070       freesptr = FALSE;
2071       break;
2072       }
2073     }
2074   /* Fall through */
2075
2076   /* Boolean: if no characters follow, the value is boolvalue. Otherwise
2077   look for yes/not/true/false. Some booleans are stored in a single bit in
2078   a single int. There's a special fudge for verify settings; without a suffix
2079   they set both xx_sender and xx_recipient. The table points to the sender
2080   value; search subsequently for the recipient. There's another special case:
2081   opt_bool_set also notes when a boolean has been set. */
2082
2083   case opt_bool:
2084   case opt_bit:
2085   case opt_bool_verify:
2086   case opt_bool_set:
2087   if (*s != 0)
2088     {
2089     s = readconf_readname(name2, 64, s);
2090     if (strcmpic(name2, US"true") == 0 || strcmpic(name2, US"yes") == 0)
2091       boolvalue = TRUE;
2092     else if (strcmpic(name2, US"false") == 0 || strcmpic(name2, US"no") == 0)
2093       boolvalue = FALSE;
2094     else log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
2095       "\"%s\" is not a valid value for the \"%s\" option", name2, name);
2096     if (*s != 0) extra_chars_error(s, string_sprintf("\"%s\" ", name2),
2097       US"for boolean option ", name);
2098     }
2099
2100   /* Handle single-bit type. */
2101
2102   if (type == opt_bit)
2103     {
2104     int bit = 1 << ((ol->type >> 16) & 31);
2105     int * ptr = data_block
2106       ? (int *)(US data_block + ol->v.offset)
2107       : (int *)ol->v.value;
2108     if (boolvalue) *ptr |= bit; else *ptr &= ~bit;
2109     break;
2110     }
2111
2112   /* Handle full BOOL types */
2113
2114   if (data_block)
2115     *((BOOL *)(US data_block + ol->v.offset)) = boolvalue;
2116   else
2117     *((BOOL *)ol->v.value) = boolvalue;
2118
2119   /* Verify fudge */
2120
2121   if (type == opt_bool_verify)
2122     {
2123     sprintf(CS name2, "%.50s_recipient", name + offset);
2124     if ((ol2 = find_option(name2, oltop, last)))
2125       if (data_block)
2126         *((BOOL *)(US data_block + ol2->v.offset)) = boolvalue;
2127       else
2128         *((BOOL *)ol2->v.value) = boolvalue;
2129     }
2130
2131   /* Note that opt_bool_set type is set, if there is somewhere to do so */
2132
2133   else if (type == opt_bool_set)
2134     {
2135     sprintf(CS name2, "*set_%.50s", name + offset);
2136     if ((ol2 = find_option(name2, oltop, last)))
2137       if (data_block)
2138         *((BOOL *)(US data_block + ol2->v.offset)) = TRUE;
2139       else
2140         *((BOOL *)ol2->v.value) = TRUE;
2141     }
2142   break;
2143
2144   /* Octal integer */
2145
2146   case opt_octint:
2147   intbase = 8;
2148   inttype = US"octal ";
2149
2150   /*  Integer: a simple(ish) case; allow octal and hex formats, and
2151   suffixes K, M, G, and T.  The different types affect output, not input. */
2152
2153   case opt_mkint:
2154   case opt_int:
2155     {
2156     uschar *endptr;
2157     long int lvalue;
2158
2159     errno = 0;
2160     lvalue = strtol(CS s, CSS &endptr, intbase);
2161
2162     if (endptr == s)
2163       log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "%sinteger expected for %s",
2164         inttype, name);
2165
2166     if (errno != ERANGE && *endptr)
2167       {
2168       uschar * mp = US"TtGgMmKk\0";     /* YyZzEePpTtGgMmKk */
2169
2170       if ((mp = Ustrchr(mp, *endptr)))
2171         {
2172         endptr++;
2173         do
2174           {
2175           if (lvalue > INT_MAX/1024 || lvalue < INT_MIN/1024)
2176             {
2177             errno = ERANGE;
2178             break;
2179             }
2180           lvalue *= 1024;
2181           }
2182         while (*(mp += 2));
2183         }
2184       }
2185
2186     if (errno == ERANGE || lvalue > INT_MAX || lvalue < INT_MIN)
2187       log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
2188         "absolute value of integer \"%s\" is too large (overflow)", s);
2189
2190     while (isspace(*endptr)) endptr++;
2191     if (*endptr)
2192       extra_chars_error(endptr, inttype, US"integer value for ", name);
2193
2194     value = (int)lvalue;
2195     }
2196
2197   if (data_block)
2198     *(int *)(US data_block + ol->v.offset) = value;
2199   else
2200     *(int *)ol->v.value = value;
2201   break;
2202
2203   /*  Integer held in K: again, allow formats and suffixes as above. */
2204
2205   case opt_Kint:
2206     {
2207     uschar *endptr;
2208     errno = 0;
2209     int_eximarith_t lvalue = strtol(CS s, CSS &endptr, intbase);
2210
2211     if (endptr == s)
2212       log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "%sinteger expected for %s",
2213         inttype, name);
2214
2215     if (errno != ERANGE && *endptr)
2216       {
2217       uschar * mp = US"ZzEePpTtGgMmKk\0";       /* YyZzEePpTtGgMmKk */
2218
2219       if ((mp = Ustrchr(mp, *endptr)))
2220         {
2221         endptr++;
2222         while (*(mp += 2))
2223           {
2224           if (lvalue > EXIM_ARITH_MAX/1024 || lvalue < EXIM_ARITH_MIN/1024)
2225             {
2226             errno = ERANGE;
2227             break;
2228             }
2229           lvalue *= 1024;
2230           }
2231         }
2232       else
2233         lvalue = (lvalue + 512)/1024;
2234       }
2235
2236     if (errno == ERANGE) log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
2237       "absolute value of integer \"%s\" is too large (overflow)", s);
2238
2239     while (isspace(*endptr)) endptr++;
2240     if (*endptr != 0)
2241       extra_chars_error(endptr, inttype, US"integer value for ", name);
2242
2243     if (data_block)
2244       *(int_eximarith_t *)(US data_block + ol->v.offset) = lvalue;
2245     else
2246       *(int_eximarith_t *)ol->v.value = lvalue;
2247     break;
2248     }
2249
2250   /*  Fixed-point number: held to 3 decimal places. */
2251
2252   case opt_fixed:
2253   if (sscanf(CS s, "%d%n", &value, &count) != 1)
2254     log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
2255       "fixed-point number expected for %s", name);
2256
2257   if (value < 0) log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
2258     "integer \"%s\" is too large (overflow)", s);
2259
2260   value *= 1000;
2261
2262   if (value < 0) log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
2263     "integer \"%s\" is too large (overflow)", s);
2264
2265   /* We get a coverity error here for using count, as it derived
2266   from the tainted buffer pointed to by s, as parsed by sscanf().
2267   By the definition of sscanf we must be accessing between start
2268   and end of s (assuming it is nul-terminated...) so ignore the error.  */
2269   /* coverity[tainted_data] */
2270   if (s[count] == '.')
2271     {
2272     int d = 100;
2273     while (isdigit(s[++count]))
2274       {
2275       value += (s[count] - '0') * d;
2276       d /= 10;
2277       }
2278     }
2279
2280   while (isspace(s[count])) count++;
2281
2282   if (s[count] != 0)
2283     extra_chars_error(s+count, US"fixed-point value for ", name, US"");
2284
2285   if (data_block)
2286     *((int *)(US data_block + ol->v.offset)) = value;
2287   else
2288     *((int *)ol->v.value) = value;
2289   break;
2290
2291   /* There's a special routine to read time values. */
2292
2293   case opt_time:
2294   value = readconf_readtime(s, 0, FALSE);
2295   if (value < 0)
2296     log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "invalid time value for %s",
2297       name);
2298   if (data_block)
2299     *((int *)(US data_block + ol->v.offset)) = value;
2300   else
2301     *((int *)ol->v.value) = value;
2302   break;
2303
2304   /* A time list is a list of colon-separated times, with the first
2305   element holding the size of the list and the second the number of
2306   entries used. */
2307
2308   case opt_timelist:
2309     {
2310     int count = 0;
2311     int * list = data_block
2312       ? (int *)(US data_block + ol->v.offset)
2313       : (int *)ol->v.value;
2314
2315     if (*s != 0) for (count = 1; count <= list[0] - 2; count++)
2316       {
2317       int terminator = 0;
2318       uschar *snext = Ustrchr(s, ':');
2319       if (snext != NULL)
2320         {
2321         uschar *ss = snext;
2322         while (ss > s && isspace(ss[-1])) ss--;
2323         terminator = *ss;
2324         }
2325       value = readconf_readtime(s, terminator, FALSE);
2326       if (value < 0)
2327         log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "invalid time value for %s",
2328           name);
2329       if (count > 1 && value <= list[count])
2330         log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
2331           "time value out of order for %s", name);
2332       list[count+1] = value;
2333       if (snext == NULL) break;
2334       s = snext + 1;
2335       while (isspace(*s)) s++;
2336       }
2337
2338     if (count > list[0] - 2)
2339       log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "too many time values for %s",
2340         name);
2341     if (count > 0 && list[2] == 0) count = 0;
2342     list[1] = count;
2343     break;
2344     }
2345
2346   case opt_func:
2347     {
2348     void (*fn)() = ol->v.fn;
2349     fn(name, s, 0);
2350     break;
2351     }
2352   }
2353
2354 return TRUE;
2355 }
2356
2357
2358
2359 /*************************************************
2360 *               Print a time value               *
2361 *************************************************/
2362
2363 /*
2364 Argument:  a time value in seconds
2365 Returns:   pointer to a fixed buffer containing the time as a string,
2366            in readconf_readtime() format
2367 */
2368
2369 uschar *
2370 readconf_printtime(int t)
2371 {
2372 int s, m, h, d, w;
2373 uschar *p = time_buffer;
2374
2375 if (t < 0)
2376   {
2377   *p++ = '-';
2378   t = -t;
2379   }
2380
2381 s = t % 60;
2382 t /= 60;
2383 m = t % 60;
2384 t /= 60;
2385 h = t % 24;
2386 t /= 24;
2387 d = t % 7;
2388 w = t/7;
2389
2390 if (w > 0) p += sprintf(CS p, "%dw", w);
2391 if (d > 0) p += sprintf(CS p, "%dd", d);
2392 if (h > 0) p += sprintf(CS p, "%dh", h);
2393 if (m > 0) p += sprintf(CS p, "%dm", m);
2394 if (s > 0 || p == time_buffer) sprintf(CS p, "%ds", s);
2395
2396 return time_buffer;
2397 }
2398
2399
2400
2401 /*************************************************
2402 *      Print an individual option value          *
2403 *************************************************/
2404
2405 /* This is used by the -bP option, so prints to the standard output.
2406 The entire options list is passed in as an argument, because some options come
2407 in pairs - typically uid/gid settings, which can either be explicit numerical
2408 values, or strings to be expanded later. If the numerical value is unset,
2409 search for "*expand_<name>" to see if there is a string equivalent.
2410
2411 Arguments:
2412   ol             option entry, or NULL for an unknown option
2413   name           option name
2414   options_block  NULL for main configuration options; otherwise points to
2415                    a driver block; if the option doesn't have opt_public
2416                    set, then options_block->options_block is where the item
2417                    resides.
2418   oltop          points to the option list in which ol exists
2419   last           one more than the offset of the last entry in optop
2420   no_labels      do not show "foo = " at the start.
2421
2422 Returns:         boolean success
2423 */
2424
2425 static BOOL
2426 print_ol(optionlist *ol, uschar *name, void *options_block,
2427   optionlist *oltop, int last, BOOL no_labels)
2428 {
2429 struct passwd *pw;
2430 struct group *gr;
2431 optionlist *ol2;
2432 void *value;
2433 uid_t *uidlist;
2434 gid_t *gidlist;
2435 uschar *s;
2436 uschar name2[64];
2437
2438 if (!ol)
2439   {
2440   printf("%s is not a known option\n", name);
2441   return FALSE;
2442   }
2443
2444 /* Non-admin callers cannot see options that have been flagged secure by the
2445 "hide" prefix. */
2446
2447 if (!f.admin_user && ol->type & opt_secure)
2448   {
2449   if (no_labels)
2450     printf("%s\n", CCS hidden);
2451   else
2452     printf("%s = %s\n", name, CCS hidden);
2453   return TRUE;
2454   }
2455
2456 /* Else show the value of the option */
2457
2458 value = ol->v.value;
2459 if (options_block)
2460   {
2461   if (!(ol->type & opt_public))
2462     options_block = (void *)(((driver_instance *)options_block)->options_block);
2463   value = (void *)(US options_block + (long int)value);
2464   }
2465
2466 switch(ol->type & opt_mask)
2467   {
2468   case opt_stringptr:
2469   case opt_rewrite:        /* Show the text value */
2470     s = *(USS value);
2471     if (!no_labels) printf("%s = ", name);
2472     printf("%s\n", s ? string_printing2(s, SP_TAB) : US"");
2473     break;
2474
2475   case opt_int:
2476     if (!no_labels) printf("%s = ", name);
2477     printf("%d\n", *((int *)value));
2478     break;
2479
2480   case opt_mkint:
2481     {
2482     int x = *((int *)value);
2483     if (x != 0 && (x & 1023) == 0)
2484       {
2485       int c = 'K';
2486       x >>= 10;
2487       if ((x & 1023) == 0)
2488         {
2489         c = 'M';
2490         x >>= 10;
2491         }
2492       if (!no_labels) printf("%s = ", name);
2493       printf("%d%c\n", x, c);
2494       }
2495     else
2496       {
2497       if (!no_labels) printf("%s = ", name);
2498       printf("%d\n", x);
2499       }
2500     }
2501     break;
2502
2503   case opt_Kint:
2504     {
2505     int_eximarith_t x = *((int_eximarith_t *)value);
2506     if (!no_labels) printf("%s = ", name);
2507     if (x == 0) printf("0\n");
2508     else if ((x & ((1<<30)-1)) == 0) printf(PR_EXIM_ARITH "T\n", x >> 30);
2509     else if ((x & ((1<<20)-1)) == 0) printf(PR_EXIM_ARITH "G\n", x >> 20);
2510     else if ((x & ((1<<10)-1)) == 0) printf(PR_EXIM_ARITH "M\n", x >> 10);
2511     else printf(PR_EXIM_ARITH "K\n", x);
2512     }
2513     break;
2514
2515   case opt_octint:
2516     if (!no_labels) printf("%s = ", name);
2517     printf("%#o\n", *((int *)value));
2518     break;
2519
2520   /* Can be negative only when "unset", in which case integer */
2521
2522   case opt_fixed:
2523     {
2524     int x = *((int *)value);
2525     int f = x % 1000;
2526     int d = 100;
2527     if (x < 0) printf("%s =\n", name); else
2528       {
2529       if (!no_labels) printf("%s = ", name);
2530       printf("%d.", x/1000);
2531       do
2532         {
2533         printf("%d", f/d);
2534         f %= d;
2535         d /= 10;
2536         }
2537       while (f != 0);
2538       printf("\n");
2539       }
2540     }
2541     break;
2542
2543   /* If the numerical value is unset, try for the string value */
2544
2545   case opt_expand_uid:
2546     if (! *get_set_flag(name, oltop, last, options_block))
2547       {
2548       sprintf(CS name2, "*expand_%.50s", name);
2549       if ((ol2 = find_option(name2, oltop, last)))
2550         {
2551         if (options_block)
2552           s = *USS (US options_block + ol2->v.offset);
2553         else
2554           s = *USS ol2->v.value;
2555         if (!no_labels) printf("%s = ", name);
2556         printf("%s\n", s ? string_printing(s) : US"");
2557         break;
2558         }
2559       }
2560
2561     /* Else fall through */
2562
2563   case opt_uid:
2564     if (!no_labels) printf("%s = ", name);
2565     if (! *get_set_flag(name, oltop, last, options_block))
2566       printf("\n");
2567     else
2568       if ((pw = getpwuid(*((uid_t *)value))))
2569         printf("%s\n", pw->pw_name);
2570       else
2571         printf("%ld\n", (long int)(*((uid_t *)value)));
2572     break;
2573
2574   /* If the numerical value is unset, try for the string value */
2575
2576   case opt_expand_gid:
2577     if (! *get_set_flag(name, oltop, last, options_block))
2578       {
2579       sprintf(CS name2, "*expand_%.50s", name);
2580       if (  (ol2 = find_option(name2, oltop, last))
2581          && (ol2->type & opt_mask) == opt_stringptr)
2582         {
2583         if (options_block)
2584           s = *USS (US options_block + ol2->v.offset);
2585         else
2586           s = *USS ol2->v.value;
2587         if (!no_labels) printf("%s = ", name);
2588         printf("%s\n", s ? string_printing(s) : US"");
2589         break;
2590         }
2591       }
2592
2593     /* Else fall through */
2594
2595   case opt_gid:
2596     if (!no_labels) printf("%s = ", name);
2597     if (! *get_set_flag(name, oltop, last, options_block))
2598       printf("\n");
2599     else
2600       if ((gr = getgrgid(*((int *)value))))
2601         printf("%s\n", gr->gr_name);
2602       else
2603          printf("%ld\n", (long int)(*((int *)value)));
2604     break;
2605
2606   case opt_uidlist:
2607     uidlist = *((uid_t **)value);
2608     if (!no_labels) printf("%s =", name);
2609     if (uidlist)
2610       {
2611       uschar sep = no_labels ? '\0' : ' ';
2612       for (int i = 1; i <= (int)(uidlist[0]); i++)
2613         {
2614         uschar *name = NULL;
2615         if ((pw = getpwuid(uidlist[i]))) name = US pw->pw_name;
2616         if (sep != '\0') printf("%c", sep);
2617         if (name) printf("%s", name);
2618         else printf("%ld", (long int)(uidlist[i]));
2619         sep = ':';
2620         }
2621       }
2622     printf("\n");
2623     break;
2624
2625   case opt_gidlist:
2626     gidlist = *((gid_t **)value);
2627     if (!no_labels) printf("%s =", name);
2628     if (gidlist)
2629       {
2630       uschar sep = no_labels ? '\0' : ' ';
2631       for (int i = 1; i <= (int)(gidlist[0]); i++)
2632         {
2633         uschar *name = NULL;
2634         if ((gr = getgrgid(gidlist[i]))) name = US gr->gr_name;
2635         if (sep != '\0') printf("%c", sep);
2636         if (name) printf("%s", name);
2637         else printf("%ld", (long int)(gidlist[i]));
2638         sep = ':';
2639         }
2640       }
2641     printf("\n");
2642     break;
2643
2644   case opt_time:
2645     if (!no_labels) printf("%s = ", name);
2646     printf("%s\n", readconf_printtime(*((int *)value)));
2647     break;
2648
2649   case opt_timelist:
2650     {
2651     int *list = (int *)value;
2652     if (!no_labels) printf("%s = ", name);
2653     for (int i = 0; i < list[1]; i++)
2654       printf("%s%s", i == 0 ? "" : ":", readconf_printtime(list[i+2]));
2655     printf("\n");
2656     }
2657     break;
2658
2659   case opt_bit:
2660     printf("%s%s\n", ((*((int *)value)) & (1 << ((ol->type >> 16) & 31)))?
2661       "" : "no_", name);
2662     break;
2663
2664   case opt_expand_bool:
2665     sprintf(CS name2, "*expand_%.50s", name);
2666     if ((ol2 = find_option(name2, oltop, last)) && ol2->v.value)
2667       {
2668       if (options_block)
2669         s = *USS (US options_block + ol2->v.offset);
2670       else
2671         s = *USS ol2->v.value;
2672       if (s)
2673         {
2674         if (!no_labels) printf("%s = ", name);
2675         printf("%s\n", string_printing(s));
2676         break;
2677         }
2678       /* s == NULL => string not set; fall through */
2679       }
2680
2681     /* Fall through */
2682
2683   case opt_bool:
2684   case opt_bool_verify:
2685   case opt_bool_set:
2686     printf("%s%s\n", (*((BOOL *)value))? "" : "no_", name);
2687     break;
2688
2689   case opt_func:
2690     ol->v.fn(name, NULL, no_labels ? opt_fn_print : opt_fn_print|opt_fn_print_label);
2691     break;
2692   }
2693 return TRUE;
2694 }
2695
2696
2697
2698 /*************************************************
2699 *        Print value from main configuration     *
2700 *************************************************/
2701
2702 /* This function, called as a result of encountering the -bP option,
2703 causes the value of any main configuration variable to be output if the
2704 second argument is NULL. There are some special values:
2705
2706   all                print all main configuration options
2707   config_file        print the name of the configuration file
2708                      (configure_file will still work, for backward
2709                      compatibility)
2710   routers            print the routers' configurations
2711   transports         print the transports' configuration
2712   authenticators     print the authenticators' configuration
2713   macros             print the macros' configuration
2714   router_list        print a list of router names
2715   transport_list     print a list of transport names
2716   authenticator_list print a list of authentication mechanism names
2717   macro_list         print a list of macro names
2718   +name              print a named list item
2719   local_scan         print the local_scan options
2720   config             print the configuration as it is parsed
2721   environment        print the used execution environment
2722
2723 If the second argument is not NULL, it must be one of "router", "transport",
2724 "authenticator" or "macro" in which case the first argument identifies the
2725 driver whose options are to be printed.
2726
2727 Arguments:
2728   name        option name if type == NULL; else driver name
2729   type        NULL or driver type name, as described above
2730   no_labels   avoid the "foo = " at the start of an item
2731
2732 Returns:      Boolean success
2733 */
2734
2735 BOOL
2736 readconf_print(uschar *name, uschar *type, BOOL no_labels)
2737 {
2738 BOOL names_only = FALSE;
2739 optionlist *ol2 = NULL;
2740 driver_instance *d = NULL;
2741 int size = 0;
2742
2743 if (!type)
2744   {
2745   if (*name == '+')
2746     {
2747     tree_node *t;
2748     BOOL found = FALSE;
2749     static uschar *types[] = { US"address", US"domain", US"host",
2750       US"localpart" };
2751     static tree_node **anchors[] = { &addresslist_anchor, &domainlist_anchor,
2752       &hostlist_anchor, &localpartlist_anchor };
2753
2754     for (int i = 0; i < 4; i++)
2755       if ((t = tree_search(*(anchors[i]), name+1)))
2756         {
2757         namedlist_block * nb = t->data.ptr;
2758         const uschar * s = nb->hide ? hidden : nb->string;
2759         found = TRUE;
2760         if (no_labels)
2761           printf("%s\n", CCS s);
2762         else
2763           printf("%slist %s = %s\n", types[i], name+1, CCS s);
2764         }
2765
2766     if (!found)
2767       printf("no address, domain, host, or local part list called \"%s\" "
2768         "exists\n", name+1);
2769
2770     return found;
2771     }
2772
2773   if (  Ustrcmp(name, "configure_file") == 0
2774      || Ustrcmp(name, "config_file") == 0)
2775     {
2776     printf("%s\n", CS config_main_filename);
2777     return TRUE;
2778     }
2779
2780   if (Ustrcmp(name, "all") == 0)
2781     {
2782     for (optionlist * ol = optionlist_config;
2783          ol < optionlist_config + nelem(optionlist_config); ol++)
2784       if (!(ol->type & opt_hidden))
2785         (void) print_ol(ol, US ol->name, NULL,
2786                   optionlist_config, nelem(optionlist_config),
2787                   no_labels);
2788     return TRUE;
2789     }
2790
2791   if (Ustrcmp(name, "local_scan") == 0)
2792     {
2793 #ifndef LOCAL_SCAN_HAS_OPTIONS
2794     printf("local_scan() options are not supported\n");
2795     return FALSE;
2796 #else
2797     for (optionlist * ol = local_scan_options;
2798          ol < local_scan_options + local_scan_options_count; ol++)
2799       (void) print_ol(ol, US ol->name, NULL, local_scan_options,
2800                   local_scan_options_count, no_labels);
2801     return TRUE;
2802 #endif
2803     }
2804
2805   if (Ustrcmp(name, "config") == 0)
2806     {
2807     print_config(f.admin_user, no_labels);
2808     return TRUE;
2809     }
2810
2811   if (Ustrcmp(name, "routers") == 0)
2812     {
2813     type = US"router";
2814     name = NULL;
2815     }
2816   else if (Ustrcmp(name, "transports") == 0)
2817     {
2818     type = US"transport";
2819     name = NULL;
2820     }
2821   else if (Ustrcmp(name, "authenticators") == 0)
2822     {
2823     type = US"authenticator";
2824     name = NULL;
2825     }
2826   else if (Ustrcmp(name, "macros") == 0)
2827     {
2828     type = US"macro";
2829     name = NULL;
2830     }
2831   else if (Ustrcmp(name, "router_list") == 0)
2832     {
2833     type = US"router";
2834     name = NULL;
2835     names_only = TRUE;
2836     }
2837   else if (Ustrcmp(name, "transport_list") == 0)
2838     {
2839     type = US"transport";
2840     name = NULL;
2841     names_only = TRUE;
2842     }
2843   else if (Ustrcmp(name, "authenticator_list") == 0)
2844     {
2845     type = US"authenticator";
2846     name = NULL;
2847     names_only = TRUE;
2848     }
2849   else if (Ustrcmp(name, "macro_list") == 0)
2850     {
2851     type = US"macro";
2852     name = NULL;
2853     names_only = TRUE;
2854     }
2855   else if (Ustrcmp(name, "environment") == 0)
2856     {
2857     if (environ)
2858       {
2859       uschar ** p;
2860       for (p = USS environ; *p; p++) ;
2861       qsort(environ, p - USS environ, sizeof(*p), string_compare_by_pointer);
2862
2863       for (p = USS environ; *p; p++)
2864         {
2865         uschar * q;
2866         if (no_labels && (q = Ustrchr(*p, '='))) *q  = '\0';
2867         puts(CS *p);
2868         }
2869       }
2870     return TRUE;
2871     }
2872
2873   else
2874     return print_ol(find_option(name,
2875       optionlist_config, nelem(optionlist_config)),
2876       name, NULL, optionlist_config, nelem(optionlist_config), no_labels);
2877   }
2878
2879 /* Handle the options for a router or transport. Skip options that are flagged
2880 as hidden. Some of these are options with names starting with '*', used for
2881 internal alternative representations of other options (which the printing
2882 function will sort out). Others are synonyms kept for backward compatibility.
2883 */
2884
2885 if (Ustrcmp(type, "router") == 0)
2886   {
2887   d = (driver_instance *)routers;
2888   ol2 = optionlist_routers;
2889   size = optionlist_routers_size;
2890   }
2891 else if (Ustrcmp(type, "transport") == 0)
2892   {
2893   d = (driver_instance *)transports;
2894   ol2 = optionlist_transports;
2895   size = optionlist_transports_size;
2896   }
2897 else if (Ustrcmp(type, "authenticator") == 0)
2898   {
2899   d = (driver_instance *)auths;
2900   ol2 = optionlist_auths;
2901   size = optionlist_auths_size;
2902   }
2903
2904 else if (Ustrcmp(type, "macro") == 0)
2905   {
2906   /* People store passwords in macros and they were previously not available
2907   for printing.  So we have an admin_users restriction. */
2908   if (!f.admin_user)
2909     {
2910     fprintf(stderr, "exim: permission denied\n");
2911     return FALSE;
2912     }
2913   for (macro_item * m = macros; m; m = m->next)
2914     if (!name || Ustrcmp(name, m->name) == 0)
2915       {
2916       if (names_only)
2917         printf("%s\n", CS m->name);
2918       else if (no_labels)
2919         printf("%s\n", CS m->replacement);
2920       else
2921         printf("%s=%s\n", CS m->name, CS m->replacement);
2922       if (name)
2923         return TRUE;
2924       }
2925   if (!name) return TRUE;
2926
2927   printf("%s %s not found\n", type, name);
2928   return FALSE;
2929   }
2930
2931 if (names_only)
2932   {
2933   for (; d; d = d->next) printf("%s\n", CS d->name);
2934   return TRUE;
2935   }
2936
2937 /* Either search for a given driver, or print all of them */
2938
2939 for (; d; d = d->next)
2940   {
2941   BOOL rc = FALSE;
2942   if (!name)
2943     printf("\n%s %s:\n", d->name, type);
2944   else if (Ustrcmp(d->name, name) != 0) continue;
2945
2946   for (optionlist * ol = ol2; ol < ol2 + size; ol++)
2947     if (!(ol->type & opt_hidden))
2948       rc |= print_ol(ol, US ol->name, d, ol2, size, no_labels);
2949
2950   for (optionlist * ol = d->info->options;
2951        ol < d->info->options + *(d->info->options_count); ol++)
2952     if (!(ol->type & opt_hidden))
2953       rc |= print_ol(ol, US ol->name, d, d->info->options,
2954                     *d->info->options_count, no_labels);
2955
2956   if (name) return rc;
2957   }
2958 if (!name) return TRUE;
2959
2960 printf("%s %s not found\n", type, name);
2961 return FALSE;
2962 }
2963
2964
2965
2966 /*************************************************
2967 *          Read a named list item                *
2968 *************************************************/
2969
2970 /* This function reads a name and a list (i.e. string). The name is used to
2971 save the list in a tree, sorted by its name. Each entry also has a number,
2972 which can be used for caching tests, but if the string contains any expansion
2973 items other than $key, the number is set negative to inhibit caching. This
2974 mechanism is used for domain, host, and address lists that are referenced by
2975 the "+name" syntax.
2976
2977 Arguments:
2978   anchorp     points to the tree anchor
2979   numberp     points to the current number for this tree
2980   max         the maximum number permitted
2981   s           the text of the option line, starting immediately after the name
2982                 of the list type
2983   tname       the name of the list type, for messages
2984   hide        do not output value on "-bP"
2985
2986 Returns:      nothing
2987 */
2988
2989 static void
2990 read_named_list(tree_node **anchorp, int *numberp, int max, uschar *s,
2991   uschar *tname, BOOL hide)
2992 {
2993 BOOL forcecache = FALSE;
2994 uschar *ss;
2995 tree_node *t;
2996 namedlist_block * nb = store_get(sizeof(namedlist_block), FALSE);
2997
2998 if (Ustrncmp(s, "_cache", 6) == 0)
2999   {
3000   forcecache = TRUE;
3001   s += 6;
3002   }
3003
3004 if (!isspace(*s))
3005   log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "unrecognized configuration line");
3006
3007 if (*numberp >= max)
3008  log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "too many named %ss (max is %d)\n",
3009    tname, max);
3010
3011 Uskip_whitespace(&s);
3012 ss = s;
3013 while (isalnum(*s) || *s == '_') s++;
3014 t = store_get(sizeof(tree_node) + s-ss, is_tainted(ss));
3015 Ustrncpy(t->name, ss, s-ss);
3016 t->name[s-ss] = 0;
3017 Uskip_whitespace(&s);
3018
3019 if (!tree_insertnode(anchorp, t))
3020   log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
3021     "duplicate name \"%s\" for a named %s", t->name, tname);
3022
3023 t->data.ptr = nb;
3024 nb->number = *numberp;
3025 *numberp += 1;
3026 nb->hide = hide;
3027
3028 if (*s++ != '=') log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
3029   "missing '=' after \"%s\"", t->name);
3030 Uskip_whitespace(&s);
3031 nb->string = read_string(s, t->name);
3032 nb->cache_data = NULL;
3033
3034 /* Check the string for any expansions; if any are found, mark this list
3035 uncacheable unless the user has explicited forced caching. */
3036
3037 if (!forcecache && Ustrchr(nb->string, '$') != NULL) nb->number = -1;
3038 }
3039
3040
3041
3042
3043 /*************************************************
3044 *        Unpick data for a rate limit            *
3045 *************************************************/
3046
3047 /* This function is called to unpick smtp_ratelimit_{mail,rcpt} into four
3048 separate values.
3049
3050 Arguments:
3051   s            string, in the form t,b,f,l
3052                where t is the threshold (integer)
3053                b is the initial delay (time)
3054                f is the multiplicative factor (fixed point)
3055                k is the maximum time (time)
3056   threshold    where to store threshold
3057   base         where to store base in milliseconds
3058   factor       where to store factor in milliseconds
3059   limit        where to store limit
3060
3061 Returns:       nothing (panics on error)
3062 */
3063
3064 static void
3065 unpick_ratelimit(uschar *s, int *threshold, int *base, double *factor,
3066   int *limit)
3067 {
3068 uschar bstring[16], lstring[16];
3069
3070 if (sscanf(CS s, "%d, %15[0123456789smhdw.], %lf, %15s", threshold, bstring,
3071     factor, lstring) == 4)
3072   {
3073   *base = readconf_readtime(bstring, 0, TRUE);
3074   *limit = readconf_readtime(lstring, 0, TRUE);
3075   if (*base >= 0 && *limit >= 0) return;
3076   }
3077 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "malformed ratelimit data: %s", s);
3078 }
3079
3080
3081
3082
3083 /*************************************************
3084 *         Read main configuration options        *
3085 *************************************************/
3086
3087 /* This function is the first to be called for configuration reading. It
3088 opens the configuration file and reads general configuration settings until
3089 it reaches the end of the configuration section. The file is then left open so
3090 that the remaining configuration data can subsequently be read if needed for
3091 this run of Exim.
3092
3093 The configuration file must be owned either by root or exim, and be writeable
3094 only by root or uid/gid exim. The values for Exim's uid and gid can be changed
3095 in the config file, so the test is done on the compiled in values. A slight
3096 anomaly, to be carefully documented.
3097
3098 The name of the configuration file is taken from a list that is included in the
3099 binary of Exim. It can be altered from the command line, but if that is done,
3100 root privilege is immediately withdrawn unless the caller is root or exim.
3101 The first file on the list that exists is used.
3102
3103 For use on multiple systems that share file systems, first look for a
3104 configuration file whose name has the current node name on the end. If that is
3105 not found, try the generic name. For really contorted configurations, that run
3106 multiple Exims with different uid settings, first try adding the effective uid
3107 before the node name. These complications are going to waste resources on most
3108 systems. Therefore they are available only when requested by compile-time
3109 options. */
3110
3111 void
3112 readconf_main(BOOL nowarn)
3113 {
3114 int sep = 0;
3115 struct stat statbuf;
3116 uschar *s, *filename;
3117 const uschar *list = config_main_filelist;
3118
3119 /* Loop through the possible file names */
3120
3121 /* Should never be a tainted list */
3122 while((filename = string_nextinlist(&list, &sep, big_buffer, big_buffer_size)))
3123   {
3124
3125   /* Cut out all the fancy processing unless specifically wanted */
3126
3127   #if defined(CONFIGURE_FILE_USE_NODE) || defined(CONFIGURE_FILE_USE_EUID)
3128   uschar *suffix = filename + Ustrlen(filename);
3129
3130   /* Try for the node-specific file if a node name exists */
3131
3132   #ifdef CONFIGURE_FILE_USE_NODE
3133   struct utsname uts;
3134   if (uname(&uts) >= 0)
3135     {
3136     #ifdef CONFIGURE_FILE_USE_EUID
3137     sprintf(CS suffix, ".%ld.%.256s", (long int)original_euid, uts.nodename);
3138     config_file = Ufopen(filename, "rb");
3139     if (config_file == NULL)
3140     #endif  /* CONFIGURE_FILE_USE_EUID */
3141       {
3142       sprintf(CS suffix, ".%.256s", uts.nodename);
3143       config_file = Ufopen(filename, "rb");
3144       }
3145     }
3146   #endif  /* CONFIGURE_FILE_USE_NODE */
3147
3148   /* Otherwise, try the generic name, possibly with the euid added */
3149
3150   #ifdef CONFIGURE_FILE_USE_EUID
3151   if (config_file == NULL)
3152     {
3153     sprintf(CS suffix, ".%ld", (long int)original_euid);
3154     config_file = Ufopen(filename, "rb");
3155     }
3156   #endif  /* CONFIGURE_FILE_USE_EUID */
3157
3158   /* Finally, try the unadorned name */
3159
3160   if (config_file == NULL)
3161     {
3162     *suffix = 0;
3163     config_file = Ufopen(filename, "rb");
3164     }
3165   #else  /* if neither defined */
3166
3167   /* This is the common case when the fancy processing is not included. */
3168
3169   config_file = Ufopen(filename, "rb");
3170   #endif
3171
3172   /* If the file does not exist, continue to try any others. For any other
3173   error, break out (and die). */
3174
3175   if (config_file != NULL || errno != ENOENT) break;
3176   }
3177
3178 /* On success, save the name for verification; config_filename is used when
3179 logging configuration errors (it changes for .included files) whereas
3180 config_main_filename is the name shown by -bP. Failure to open a configuration
3181 file is a serious disaster. */
3182
3183 if (config_file)
3184   {
3185   uschar *last_slash = Ustrrchr(filename, '/');
3186   config_filename = config_main_filename = string_copy(filename);
3187
3188   /* The config_main_directory we need for the $config_dir expansion.
3189   config_main_filename we need for $config_file expansion.
3190   And config_dir is the directory of the current configuration, used for
3191   relative .includes. We do need to know it's name, as we change our working
3192   directory later. */
3193
3194   if (filename[0] == '/')
3195     config_main_directory = last_slash == filename ? US"/" : string_copyn(filename, last_slash - filename);
3196   else
3197     {
3198       /* relative configuration file name: working dir + / + basename(filename) */
3199
3200       uschar buf[PATH_MAX];
3201       gstring * g;
3202
3203       if (os_getcwd(buf, PATH_MAX) == NULL)
3204         {
3205         perror("exim: getcwd");
3206         exit(EXIT_FAILURE);
3207         }
3208       g = string_cat(NULL, buf);
3209
3210       /* If the dir does not end with a "/", append one */
3211       if (g->s[g->ptr-1] != '/')
3212         g = string_catn(g, US"/", 1);
3213
3214       /* If the config file contains a "/", extract the directory part */
3215       if (last_slash)
3216         g = string_catn(g, filename, last_slash - filename);
3217
3218       config_main_directory = string_from_gstring(g);
3219     }
3220   config_directory = config_main_directory;
3221   }
3222 else
3223   {
3224   if (!filename)
3225     log_write(0, LOG_MAIN|LOG_PANIC_DIE, "non-existent configuration file(s): "
3226       "%s", config_main_filelist);
3227   else
3228     log_write(0, LOG_MAIN|LOG_PANIC_DIE, "%s",
3229       string_open_failed("configuration file %s", filename));
3230   }
3231
3232 /* Now, once we found and opened our configuration file, we change the directory
3233 to a safe place. Later we change to $spool_directory. */
3234
3235 if (Uchdir("/") < 0)
3236   {
3237   perror("exim: chdir `/': ");
3238   exit(EXIT_FAILURE);
3239   }
3240
3241 /* Check the status of the file we have opened, if we have retained root
3242 privileges and the file isn't /dev/null (which *should* be 0666). */
3243
3244 if (f.trusted_config && Ustrcmp(filename, US"/dev/null"))
3245   {
3246   if (fstat(fileno(config_file), &statbuf) != 0)
3247     log_write(0, LOG_MAIN|LOG_PANIC_DIE, "failed to stat configuration file %s",
3248       big_buffer);
3249
3250   if ((statbuf.st_uid != root_uid                /* owner not root */
3251        #ifdef CONFIGURE_OWNER
3252        && statbuf.st_uid != config_uid           /* owner not the special one */
3253        #endif
3254          ) ||                                    /* or */
3255       (statbuf.st_gid != root_gid                /* group not root & */
3256        #ifdef CONFIGURE_GROUP
3257        && statbuf.st_gid != config_gid           /* group not the special one */
3258        #endif
3259        && (statbuf.st_mode & 020) != 0) ||       /* group writeable  */
3260                                                  /* or */
3261       ((statbuf.st_mode & 2) != 0))              /* world writeable  */
3262
3263     log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Exim configuration file %s has the "
3264       "wrong owner, group, or mode", big_buffer);
3265
3266   /* Do a dummy store-allocation of a size related to the (toplevel) file size.
3267   This assumes we will need this much storage to handle all the allocations
3268   during startup; it won't help when .include is being used.  When it does, it
3269   will cut down on the number of store blocks (and malloc calls, and sbrk
3270   syscalls).  It also assume we're on the relevant pool. */
3271
3272   if (statbuf.st_size > 8192)
3273     {
3274     rmark r = store_mark();
3275     void * dummy = store_get((int)statbuf.st_size, FALSE);
3276     store_reset(r);
3277     }
3278   }
3279
3280 /* Process the main configuration settings. They all begin with a lower case
3281 letter. If we see something starting with an upper case letter, it is taken as
3282 a macro definition. */
3283
3284 while ((s = get_config_line()))
3285   {
3286   BOOL hide;
3287   uschar * t;
3288
3289   if (config_lineno == 1 && Ustrstr(s, "\xef\xbb\xbf") == s)
3290     log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
3291       "found unexpected BOM (Byte Order Mark)");
3292
3293   if (isupper(*s))
3294     {
3295     if (!macro_read_assignment(s)) exim_exit(EXIT_FAILURE);
3296     continue;
3297     }
3298
3299   t = (hide = Ustrncmp(s, "hide", 4) == 0 && isspace(s[4])) ? s + 5 : s;
3300
3301   if (Ustrncmp(t, "domainlist", 10) == 0)
3302     read_named_list(&domainlist_anchor, &domainlist_count,
3303       MAX_NAMED_LIST, t+10, US"domain list", hide);
3304
3305   else if (Ustrncmp(t, "hostlist", 8) == 0)
3306     read_named_list(&hostlist_anchor, &hostlist_count,
3307       MAX_NAMED_LIST, t+8, US"host list", hide);
3308
3309   else if (Ustrncmp(t, US"addresslist", 11) == 0)
3310     read_named_list(&addresslist_anchor, &addresslist_count,
3311       MAX_NAMED_LIST, t+11, US"address list", hide);
3312
3313   else if (Ustrncmp(t, US"localpartlist", 13) == 0)
3314     read_named_list(&localpartlist_anchor, &localpartlist_count,
3315       MAX_NAMED_LIST, t+13, US"local part list", hide);
3316
3317   else
3318     (void) readconf_handle_option(s, optionlist_config, optionlist_config_size,
3319       NULL, US"main option \"%s\" unknown");
3320   }
3321
3322
3323 /* If local_sender_retain is set, local_from_check must be unset. */
3324
3325 if (local_sender_retain && local_from_check)
3326   log_write(0, LOG_MAIN|LOG_PANIC_DIE, "both local_from_check and "
3327     "local_sender_retain are set; this combination is not allowed");
3328
3329 /* If the timezone string is empty, set it to NULL, implying no TZ variable
3330 wanted. */
3331
3332 if (timezone_string != NULL && *timezone_string == 0) timezone_string = NULL;
3333
3334 /* The max retry interval must not be greater than 24 hours. */
3335
3336 if (retry_interval_max > 24*60*60) retry_interval_max = 24*60*60;
3337
3338 /* remote_max_parallel must be > 0 */
3339
3340 if (remote_max_parallel <= 0) remote_max_parallel = 1;
3341
3342 /* Save the configured setting of freeze_tell, so we can re-instate it at the
3343 start of a new SMTP message. */
3344
3345 freeze_tell_config = freeze_tell;
3346
3347 /* The primary host name may be required for expansion of spool_directory
3348 and log_file_path, so make sure it is set asap. It is obtained from uname(),
3349 but if that yields an unqualified value, make a FQDN by using gethostbyname to
3350 canonize it. Some people like upper case letters in their host names, so we
3351 don't force the case. */
3352
3353 if (primary_hostname == NULL)
3354   {
3355   const uschar *hostname;
3356   struct utsname uts;
3357   if (uname(&uts) < 0)
3358     log_write(0, LOG_MAIN|LOG_PANIC_DIE, "uname() failed to yield host name");
3359   hostname = US uts.nodename;
3360
3361   if (Ustrchr(hostname, '.') == NULL)
3362     {
3363     int af = AF_INET;
3364     struct hostent *hostdata;
3365
3366     #if HAVE_IPV6
3367     if (!disable_ipv6 && (dns_ipv4_lookup == NULL ||
3368          match_isinlist(hostname, CUSS &dns_ipv4_lookup, 0, NULL, NULL,
3369             MCL_DOMAIN, TRUE, NULL) != OK))
3370       af = AF_INET6;
3371     #else
3372     af = AF_INET;
3373     #endif
3374
3375     for (;;)
3376       {
3377       #if HAVE_IPV6
3378         #if HAVE_GETIPNODEBYNAME
3379         int error_num;
3380         hostdata = getipnodebyname(CS hostname, af, 0, &error_num);
3381         #else
3382         hostdata = gethostbyname2(CS hostname, af);
3383         #endif
3384       #else
3385       hostdata = gethostbyname(CS hostname);
3386       #endif
3387
3388       if (hostdata != NULL)
3389         {
3390         hostname = US hostdata->h_name;
3391         break;
3392         }
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 */