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