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