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