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