Fix null-indirection in certextract expansion
[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_expanded_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   config_filename = config_main_filename = string_copy(filename);
3012   }
3013 else
3014   {
3015   if (filename == NULL)
3016     log_write(0, LOG_MAIN|LOG_PANIC_DIE, "non-existent configuration file(s): "
3017       "%s", config_main_filelist);
3018   else
3019     log_write(0, LOG_MAIN|LOG_PANIC_DIE, "%s", string_open_failed(errno,
3020       "configuration file %s", filename));
3021   }
3022
3023 /* Check the status of the file we have opened, if we have retained root
3024 privileges and the file isn't /dev/null (which *should* be 0666). */
3025
3026 if (trusted_config && Ustrcmp(filename, US"/dev/null"))
3027   {
3028   if (fstat(fileno(config_file), &statbuf) != 0)
3029     log_write(0, LOG_MAIN|LOG_PANIC_DIE, "failed to stat configuration file %s",
3030       big_buffer);
3031
3032   if ((statbuf.st_uid != root_uid                /* owner not root */
3033        #ifdef CONFIGURE_OWNER
3034        && statbuf.st_uid != config_uid           /* owner not the special one */
3035        #endif
3036          ) ||                                    /* or */
3037       (statbuf.st_gid != root_gid                /* group not root & */
3038        #ifdef CONFIGURE_GROUP
3039        && statbuf.st_gid != config_gid           /* group not the special one */
3040        #endif
3041        && (statbuf.st_mode & 020) != 0) ||       /* group writeable  */
3042                                                  /* or */
3043       ((statbuf.st_mode & 2) != 0))              /* world writeable  */
3044
3045     log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Exim configuration file %s has the "
3046       "wrong owner, group, or mode", big_buffer);
3047   }
3048
3049 /* Process the main configuration settings. They all begin with a lower case
3050 letter. If we see something starting with an upper case letter, it is taken as
3051 a macro definition. */
3052
3053 while ((s = get_config_line()) != NULL)
3054   {
3055   if (isupper(s[0])) read_macro_assignment(s);
3056
3057   else if (Ustrncmp(s, "domainlist", 10) == 0)
3058     read_named_list(&domainlist_anchor, &domainlist_count,
3059       MAX_NAMED_LIST, s+10, US"domain list");
3060
3061   else if (Ustrncmp(s, "hostlist", 8) == 0)
3062     read_named_list(&hostlist_anchor, &hostlist_count,
3063       MAX_NAMED_LIST, s+8, US"host list");
3064
3065   else if (Ustrncmp(s, US"addresslist", 11) == 0)
3066     read_named_list(&addresslist_anchor, &addresslist_count,
3067       MAX_NAMED_LIST, s+11, US"address list");
3068
3069   else if (Ustrncmp(s, US"localpartlist", 13) == 0)
3070     read_named_list(&localpartlist_anchor, &localpartlist_count,
3071       MAX_NAMED_LIST, s+13, US"local part list");
3072
3073   else
3074     (void) readconf_handle_option(s, optionlist_config, optionlist_config_size,
3075       NULL, US"main option \"%s\" unknown");
3076   }
3077
3078
3079 /* If local_sender_retain is set, local_from_check must be unset. */
3080
3081 if (local_sender_retain && local_from_check)
3082   log_write(0, LOG_MAIN|LOG_PANIC_DIE, "both local_from_check and "
3083     "local_sender_retain are set; this combination is not allowed");
3084
3085 /* If the timezone string is empty, set it to NULL, implying no TZ variable
3086 wanted. */
3087
3088 if (timezone_string != NULL && *timezone_string == 0) timezone_string = NULL;
3089
3090 /* The max retry interval must not be greater than 24 hours. */
3091
3092 if (retry_interval_max > 24*60*60) retry_interval_max = 24*60*60;
3093
3094 /* remote_max_parallel must be > 0 */
3095
3096 if (remote_max_parallel <= 0) remote_max_parallel = 1;
3097
3098 /* Save the configured setting of freeze_tell, so we can re-instate it at the
3099 start of a new SMTP message. */
3100
3101 freeze_tell_config = freeze_tell;
3102
3103 /* The primary host name may be required for expansion of spool_directory
3104 and log_file_path, so make sure it is set asap. It is obtained from uname(),
3105 but if that yields an unqualified value, make a FQDN by using gethostbyname to
3106 canonize it. Some people like upper case letters in their host names, so we
3107 don't force the case. */
3108
3109 if (primary_hostname == NULL)
3110   {
3111   uschar *hostname;
3112   struct utsname uts;
3113   if (uname(&uts) < 0)
3114     log_write(0, LOG_MAIN|LOG_PANIC_DIE, "uname() failed to yield host name");
3115   hostname = US uts.nodename;
3116
3117   if (Ustrchr(hostname, '.') == NULL)
3118     {
3119     int af = AF_INET;
3120     struct hostent *hostdata;
3121
3122     #if HAVE_IPV6
3123     if (!disable_ipv6 && (dns_ipv4_lookup == NULL ||
3124          match_isinlist(hostname, &dns_ipv4_lookup, 0, NULL, NULL, MCL_DOMAIN,
3125            TRUE, NULL) != OK))
3126       af = AF_INET6;
3127     #else
3128     af = AF_INET;
3129     #endif
3130
3131     for (;;)
3132       {
3133       #if HAVE_IPV6
3134         #if HAVE_GETIPNODEBYNAME
3135         int error_num;
3136         hostdata = getipnodebyname(CS hostname, af, 0, &error_num);
3137         #else
3138         hostdata = gethostbyname2(CS hostname, af);
3139         #endif
3140       #else
3141       hostdata = gethostbyname(CS hostname);
3142       #endif
3143
3144       if (hostdata != NULL)
3145         {
3146         hostname = US hostdata->h_name;
3147         break;
3148         }
3149
3150       if (af == AF_INET) break;
3151       af = AF_INET;
3152       }
3153     }
3154
3155   primary_hostname = string_copy(hostname);
3156   }
3157
3158 /* Set up default value for smtp_active_hostname */
3159
3160 smtp_active_hostname = primary_hostname;
3161
3162 /* If spool_directory wasn't set in the build-time configuration, it must have
3163 got set above. Of course, writing to the log may not work if log_file_path is
3164 not set, but it will at least get to syslog or somewhere, with any luck. */
3165
3166 if (*spool_directory == 0)
3167   log_write(0, LOG_MAIN|LOG_PANIC_DIE, "spool_directory undefined: cannot "
3168     "proceed");
3169
3170 /* Expand the spool directory name; it may, for example, contain the primary
3171 host name. Same comment about failure. */
3172
3173 s = expand_string(spool_directory);
3174 if (s == NULL)
3175   log_write(0, LOG_MAIN|LOG_PANIC_DIE, "failed to expand spool_directory "
3176     "\"%s\": %s", spool_directory, expand_string_message);
3177 spool_directory = s;
3178
3179 /* Expand log_file_path, which must contain "%s" in any component that isn't
3180 the null string or "syslog". It is also allowed to contain one instance of %D
3181 or %M. However, it must NOT contain % followed by anything else. */
3182
3183 if (*log_file_path != 0)
3184   {
3185   uschar *ss, *sss;
3186   int sep = ':';                       /* Fixed for log file path */
3187   s = expand_string(log_file_path);
3188   if (s == NULL)
3189     log_write(0, LOG_MAIN|LOG_PANIC_DIE, "failed to expand log_file_path "
3190       "\"%s\": %s", log_file_path, expand_string_message);
3191
3192   ss = s;
3193   while ((sss = string_nextinlist(&ss,&sep,big_buffer,big_buffer_size)) != NULL)
3194     {
3195     uschar *t;
3196     if (sss[0] == 0 || Ustrcmp(sss, "syslog") == 0) continue;
3197     t = Ustrstr(sss, "%s");
3198     if (t == NULL)
3199       log_write(0, LOG_MAIN|LOG_PANIC_DIE, "log_file_path \"%s\" does not "
3200         "contain \"%%s\"", sss);
3201     *t = 'X';
3202     t = Ustrchr(sss, '%');
3203     if (t != NULL)
3204       {
3205       if ((t[1] != 'D' && t[1] != 'M') || Ustrchr(t+2, '%') != NULL)
3206         log_write(0, LOG_MAIN|LOG_PANIC_DIE, "log_file_path \"%s\" contains "
3207           "unexpected \"%%\" character", s);
3208       }
3209     }
3210
3211   log_file_path = s;
3212   }
3213
3214 /* Interpret syslog_facility into an integer argument for 'ident' param to
3215 openlog(). Default is LOG_MAIL set in globals.c. Allow the user to omit the
3216 leading "log_". */
3217
3218 if (syslog_facility_str != NULL)
3219   {
3220   int i;
3221   uschar *s = syslog_facility_str;
3222
3223   if ((Ustrlen(syslog_facility_str) >= 4) &&
3224         (strncmpic(syslog_facility_str, US"log_", 4) == 0))
3225     s += 4;
3226
3227   for (i = 0; i < syslog_list_size; i++)
3228     {
3229     if (strcmpic(s, syslog_list[i].name) == 0)
3230       {
3231       syslog_facility = syslog_list[i].value;
3232       break;
3233       }
3234     }
3235
3236   if (i >= syslog_list_size)
3237     {
3238     log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3239       "failed to interpret syslog_facility \"%s\"", syslog_facility_str);
3240     }
3241   }
3242
3243 /* Expand pid_file_path */
3244
3245 if (*pid_file_path != 0)
3246   {
3247   s = expand_string(pid_file_path);
3248   if (s == NULL)
3249     log_write(0, LOG_MAIN|LOG_PANIC_DIE, "failed to expand pid_file_path "
3250       "\"%s\": %s", pid_file_path, expand_string_message);
3251   pid_file_path = s;
3252   }
3253
3254 /* Set default value of process_log_path */
3255
3256 if (process_log_path == NULL || *process_log_path =='\0')
3257   process_log_path = string_sprintf("%s/exim-process.info", spool_directory);
3258
3259 /* Compile the regex for matching a UUCP-style "From_" line in an incoming
3260 message. */
3261
3262 regex_From = regex_must_compile(uucp_from_pattern, FALSE, TRUE);
3263
3264 /* Unpick the SMTP rate limiting options, if set */
3265
3266 if (smtp_ratelimit_mail != NULL)
3267   {
3268   unpick_ratelimit(smtp_ratelimit_mail, &smtp_rlm_threshold,
3269     &smtp_rlm_base, &smtp_rlm_factor, &smtp_rlm_limit);
3270   }
3271
3272 if (smtp_ratelimit_rcpt != NULL)
3273   {
3274   unpick_ratelimit(smtp_ratelimit_rcpt, &smtp_rlr_threshold,
3275     &smtp_rlr_base, &smtp_rlr_factor, &smtp_rlr_limit);
3276   }
3277
3278 /* The qualify domains default to the primary host name */
3279
3280 if (qualify_domain_sender == NULL)
3281   qualify_domain_sender = primary_hostname;
3282 if (qualify_domain_recipient == NULL)
3283   qualify_domain_recipient = qualify_domain_sender;
3284
3285 /* Setting system_filter_user in the configuration sets the gid as well if a
3286 name is given, but a numerical value does not. */
3287
3288 if (system_filter_uid_set && !system_filter_gid_set)
3289   {
3290   struct passwd *pw = getpwuid(system_filter_uid);
3291   if (pw == NULL)
3292     log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Failed to look up uid %ld",
3293       (long int)system_filter_uid);
3294   system_filter_gid = pw->pw_gid;
3295   system_filter_gid_set = TRUE;
3296   }
3297
3298 /* If the errors_reply_to field is set, check that it is syntactically valid
3299 and ensure it contains a domain. */
3300
3301 if (errors_reply_to != NULL)
3302   {
3303   uschar *errmess;
3304   int start, end, domain;
3305   uschar *recipient = parse_extract_address(errors_reply_to, &errmess,
3306     &start, &end, &domain, FALSE);
3307
3308   if (recipient == NULL)
3309     log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3310       "error in errors_reply_to (%s): %s", errors_reply_to, errmess);
3311
3312   if (domain == 0)
3313     log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3314       "errors_reply_to (%s) does not contain a domain", errors_reply_to);
3315   }
3316
3317 /* If smtp_accept_queue or smtp_accept_max_per_host is set, then
3318 smtp_accept_max must also be set. */
3319
3320 if (smtp_accept_max == 0 &&
3321     (smtp_accept_queue > 0 || smtp_accept_max_per_host != NULL))
3322   log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3323     "smtp_accept_max must be set if smtp_accept_queue or "
3324     "smtp_accept_max_per_host is set");
3325
3326 /* Set up the host number if anything is specified. It is an expanded string
3327 so that it can be computed from the host name, for example. We do this last
3328 so as to ensure that everything else is set up before the expansion. */
3329
3330 if (host_number_string != NULL)
3331   {
3332   long int n;
3333   uschar *end;
3334   uschar *s = expand_string(host_number_string);
3335   if (s == NULL)
3336     log_write(0, LOG_MAIN|LOG_PANIC_DIE,
3337         "failed to expand localhost_number \"%s\": %s",
3338         host_number_string, expand_string_message);
3339   n = Ustrtol(s, &end, 0);
3340   while (isspace(*end)) end++;
3341   if (*end != 0)
3342     log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3343       "localhost_number value is not a number: %s", s);
3344   if (n > LOCALHOST_MAX)
3345     log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3346       "localhost_number is greater than the maximum allowed value (%d)",
3347         LOCALHOST_MAX);
3348   host_number = n;
3349   }
3350
3351 #ifdef SUPPORT_TLS
3352 /* If tls_verify_hosts is set, tls_verify_certificates must also be set */
3353
3354 if ((tls_verify_hosts != NULL || tls_try_verify_hosts != NULL) &&
3355      tls_verify_certificates == NULL)
3356   log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3357     "tls_%sverify_hosts is set, but tls_verify_certificates is not set",
3358     (tls_verify_hosts != NULL)? "" : "try_");
3359
3360 /* This also checks that the library linkage is working and we can call
3361 routines in it, so call even if tls_require_ciphers is unset */
3362 if (!tls_dropprivs_validate_require_cipher())
3363   exit(1);
3364
3365 /* Magic number: at time of writing, 1024 has been the long-standing value
3366 used by so many clients, and what Exim used to use always, that it makes
3367 sense to just min-clamp this max-clamp at that. */
3368 if (tls_dh_max_bits < 1024)
3369   log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3370       "tls_dh_max_bits is too small, must be at least 1024 for interop");
3371
3372 /* If openssl_options is set, validate it */
3373 if (openssl_options != NULL)
3374   {
3375 # ifdef USE_GNUTLS
3376   log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3377     "openssl_options is set but we're using GnuTLS");
3378 # else
3379   long dummy;
3380   if (!(tls_openssl_options_parse(openssl_options, &dummy)))
3381     log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3382       "openssl_options parse error: %s", openssl_options);
3383 # endif
3384   }
3385
3386 if (gnutls_require_kx || gnutls_require_mac || gnutls_require_proto)
3387   log_write(0, LOG_MAIN, "WARNING: main options"
3388       " gnutls_require_kx, gnutls_require_mac and gnutls_require_protocols"
3389       " are obsolete\n");
3390 #endif  /*SUPPORT_TLS*/
3391 }
3392
3393
3394
3395 /*************************************************
3396 *          Initialize one driver                 *
3397 *************************************************/
3398
3399 /* This is called once the driver's generic options, if any, have been read.
3400 We can now find the driver, set up defaults for the private options, and
3401 unset any "set" bits in the private options table (which might have been
3402 set by another incarnation of the same driver).
3403
3404 Arguments:
3405   d                   pointer to driver instance block, with generic
3406                         options filled in
3407   drivers_available   vector of available drivers
3408   size_of_info        size of each block in drivers_available
3409   class               class of driver, for error message
3410
3411 Returns:              pointer to the driver info block
3412 */
3413
3414 static driver_info *
3415 init_driver(driver_instance *d, driver_info *drivers_available,
3416   int size_of_info, uschar *class)
3417 {
3418 driver_info *dd;
3419
3420 for (dd = drivers_available; dd->driver_name[0] != 0;
3421      dd = (driver_info *)(((uschar *)dd) + size_of_info))
3422   {
3423   if (Ustrcmp(d->driver_name, dd->driver_name) == 0)
3424     {
3425     int i;
3426     int len = dd->options_len;
3427     d->info = dd;
3428     d->options_block = store_get(len);
3429     memcpy(d->options_block, dd->options_block, len);
3430     for (i = 0; i < *(dd->options_count); i++)
3431       dd->options[i].type &= ~opt_set;
3432     return dd;
3433     }
3434   }
3435
3436 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
3437   "%s %s: cannot find %s driver \"%s\"", class, d->name, class, d->driver_name);
3438
3439 return NULL;   /* never obeyed */
3440 }
3441
3442
3443
3444
3445 /*************************************************
3446 *             Initialize driver list             *
3447 *************************************************/
3448
3449 /* This function is called for routers, transports, and authentication
3450 mechanisms. It reads the data from the current point in the configuration file
3451 up to the end of the section, and sets up a chain of instance blocks according
3452 to the file's contents. The file will already have been opened by a call to
3453 readconf_main, and must be left open for subsequent reading of further data.
3454
3455 Any errors cause a panic crash. Note that the blocks with names driver_info and
3456 driver_instance must map the first portions of all the _info and _instance
3457 blocks for this shared code to work.
3458
3459 Arguments:
3460   class                      "router", "transport", or "authenticator"
3461   anchor                     &routers, &transports, &auths
3462   drivers_available          available drivers
3463   size_of_info               size of each info block
3464   instance_default           points to default data for an instance
3465   instance_size              size of instance block
3466   driver_optionlist          generic option list
3467   driver_optionlist_count    count of generic option list
3468
3469 Returns:                     nothing
3470 */
3471
3472 void
3473 readconf_driver_init(
3474   uschar *class,
3475   driver_instance **anchor,
3476   driver_info *drivers_available,
3477   int size_of_info,
3478   void *instance_default,
3479   int  instance_size,
3480   optionlist *driver_optionlist,
3481   int  driver_optionlist_count)
3482 {
3483 driver_instance **p = anchor;
3484 driver_instance *d = NULL;
3485 uschar *buffer;
3486
3487 while ((buffer = get_config_line()) != NULL)
3488   {
3489   uschar name[64];
3490   uschar *s;
3491
3492   /* Read the first name on the line and test for the start of a new driver. A
3493   macro definition indicates the end of the previous driver. If this isn't the
3494   start of a new driver, the line will be re-read. */
3495
3496   s = readconf_readname(name, sizeof(name), buffer);
3497
3498   /* Handle macro definition, first finishing off the initialization of the
3499   previous driver, if any. */
3500
3501   if (isupper(*name) && *s == '=')
3502     {
3503     if (d != NULL)
3504       {
3505       if (d->driver_name == NULL)
3506         log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3507           "no driver defined for %s \"%s\"", class, d->name);
3508       (d->info->init)(d);
3509       d = NULL;
3510       }
3511     read_macro_assignment(buffer);
3512     continue;
3513     }
3514
3515   /* If the line starts with a name terminated by a colon, we are at the
3516   start of the definition of a new driver. The rest of the line must be
3517   blank. */
3518
3519   if (*s++ == ':')
3520     {
3521     int i;
3522
3523     /* Finish off initializing the previous driver. */
3524
3525     if (d != NULL)
3526       {
3527       if (d->driver_name == NULL)
3528         log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3529           "no driver defined for %s \"%s\"", class, d->name);
3530       (d->info->init)(d);
3531       }
3532
3533     /* Check that we haven't already got a driver of this name */
3534
3535     for (d = *anchor; d != NULL; d = d->next)
3536       if (Ustrcmp(name, d->name) == 0)
3537         log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3538           "there are two %ss called \"%s\"", class, name);
3539
3540     /* Set up a new driver instance data block on the chain, with
3541     its default values installed. */
3542
3543     d = store_get(instance_size);
3544     memcpy(d, instance_default, instance_size);
3545     *p = d;
3546     p = &(d->next);
3547     d->name = string_copy(name);
3548
3549     /* Clear out the "set" bits in the generic options */
3550
3551     for (i = 0; i < driver_optionlist_count; i++)
3552       driver_optionlist[i].type &= ~opt_set;
3553
3554     /* Check nothing more on this line, then do the next loop iteration. */
3555
3556     while (isspace(*s)) s++;
3557     if (*s != 0) extra_chars_error(s, US"driver name ", name, US"");
3558     continue;
3559     }
3560
3561   /* Not the start of a new driver. Give an error if we have not set up a
3562   current driver yet. */
3563
3564   if (d == NULL) log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
3565     "%s name missing", class);
3566
3567   /* First look to see if this is a generic option; if it is "driver",
3568   initialize the driver. If is it not a generic option, we can look for a
3569   private option provided that the driver has been previously set up. */
3570
3571   if (readconf_handle_option(buffer, driver_optionlist,
3572         driver_optionlist_count, d, NULL))
3573     {
3574     if (d->info == NULL && d->driver_name != NULL)
3575       init_driver(d, drivers_available, size_of_info, class);
3576     }
3577
3578   /* Handle private options - pass the generic block because some may
3579   live therein. A flag with each option indicates if it is in the public
3580   block. */
3581
3582   else if (d->info != NULL)
3583     {
3584     readconf_handle_option(buffer, d->info->options,
3585       *(d->info->options_count), d, US"option \"%s\" unknown");
3586     }
3587
3588   /* The option is not generic and the driver name has not yet been given. */
3589
3590   else log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "option \"%s\" unknown "
3591     "(\"driver\" must be specified before any private options)", name);
3592   }
3593
3594 /* Run the initialization function for the final driver. */
3595
3596 if (d != NULL)
3597   {
3598   if (d->driver_name == NULL)
3599     log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3600       "no driver defined for %s \"%s\"", class, d->name);
3601   (d->info->init)(d);
3602   }
3603 }
3604
3605
3606
3607 /*************************************************
3608 *            Check driver dependency             *
3609 *************************************************/
3610
3611 /* This function is passed a driver instance and a string. It checks whether
3612 any of the string options for the driver contains the given string as an
3613 expansion variable.
3614
3615 Arguments:
3616   d        points to a driver instance block
3617   s        the string to search for
3618
3619 Returns:   TRUE if a dependency is found
3620 */
3621
3622 BOOL
3623 readconf_depends(driver_instance *d, uschar *s)
3624 {
3625 int count = *(d->info->options_count);
3626 optionlist *ol;
3627 uschar *ss;
3628
3629 for (ol = d->info->options; ol < d->info->options + count; ol++)
3630   {
3631   void *options_block;
3632   uschar *value;
3633   int type = ol->type & opt_mask;
3634   if (type != opt_stringptr) continue;
3635   options_block = ((ol->type & opt_public) == 0)? d->options_block : (void *)d;
3636   value = *(uschar **)((uschar *)options_block + (long int)(ol->value));
3637   if (value != NULL && (ss = Ustrstr(value, s)) != NULL)
3638     {
3639     if (ss <= value || (ss[-1] != '$' && ss[-1] != '{') ||
3640       isalnum(ss[Ustrlen(s)])) continue;
3641     DEBUG(D_transport) debug_printf("driver %s: \"%s\" option depends on %s\n",
3642       d->name, ol->name, s);
3643     return TRUE;
3644     }
3645   }
3646
3647 DEBUG(D_transport) debug_printf("driver %s does not depend on %s\n", d->name, s);
3648 return FALSE;
3649 }
3650
3651
3652
3653
3654 /*************************************************
3655 *      Decode an error type for retries          *
3656 *************************************************/
3657
3658 /* This function is global because it is also called from the main
3659 program when testing retry information. It decodes strings such as "quota_7d"
3660 into numerical error codes.
3661
3662 Arguments:
3663   pp           points to start of text
3664   p            points past end of text
3665   basic_errno  points to an int to receive the main error number
3666   more_errno   points to an int to receive the secondary error data
3667
3668 Returns:       NULL if decoded correctly; else points to error text
3669 */
3670
3671 uschar *
3672 readconf_retry_error(uschar *pp, uschar *p, int *basic_errno, int *more_errno)
3673 {
3674 int len;
3675 uschar *q = pp;
3676 while (q < p && *q != '_') q++;
3677 len = q - pp;
3678
3679 if (len == 5 && strncmpic(pp, US"quota", len) == 0)
3680   {
3681   *basic_errno = ERRNO_EXIMQUOTA;
3682   if (q != p && (*more_errno = readconf_readtime(q+1, *p, FALSE)) < 0)
3683       return US"bad time value";
3684   }
3685
3686 else if (len == 7 && strncmpic(pp, US"refused", len) == 0)
3687   {
3688   *basic_errno = ECONNREFUSED;
3689   if (q != p)
3690     {
3691     if (strncmpic(q+1, US"MX", p-q-1) == 0) *more_errno = 'M';
3692     else if (strncmpic(q+1, US"A", p-q-1) == 0) *more_errno = 'A';
3693     else return US"A or MX expected after \"refused\"";
3694     }
3695   }
3696
3697 else if (len == 7 && strncmpic(pp, US"timeout", len) == 0)
3698   {
3699   *basic_errno = ETIMEDOUT;
3700   if (q != p)
3701     {
3702     int i;
3703     int xlen = p - q - 1;
3704     uschar *x = q + 1;
3705
3706     static uschar *extras[] =
3707       { US"A", US"MX", US"connect", US"connect_A",  US"connect_MX" };
3708     static int values[] =
3709       { 'A',   'M',    RTEF_CTOUT,  RTEF_CTOUT|'A', RTEF_CTOUT|'M' };
3710
3711     for (i = 0; i < sizeof(extras)/sizeof(uschar *); i++)
3712       {
3713       if (strncmpic(x, extras[i], xlen) == 0)
3714         {
3715         *more_errno = values[i];
3716         break;
3717         }
3718       }
3719
3720     if (i >= sizeof(extras)/sizeof(uschar *))
3721       {
3722       if (strncmpic(x, US"DNS", xlen) == 0)
3723         {
3724         log_write(0, LOG_MAIN|LOG_PANIC, "\"timeout_dns\" is no longer "
3725           "available in retry rules (it has never worked) - treated as "
3726           "\"timeout\"");
3727         }
3728       else return US"\"A\", \"MX\", or \"connect\" expected after \"timeout\"";
3729       }
3730     }
3731   }
3732
3733 else if (strncmpic(pp, US"mail_4", 6) == 0 ||
3734          strncmpic(pp, US"rcpt_4", 6) == 0 ||
3735          strncmpic(pp, US"data_4", 6) == 0)
3736   {
3737   BOOL bad = FALSE;
3738   int x = 255;                           /* means "any 4xx code" */
3739   if (p != pp + 8) bad = TRUE; else
3740     {
3741     int a = pp[6], b = pp[7];
3742     if (isdigit(a))
3743       {
3744       x = (a - '0') * 10;
3745       if (isdigit(b)) x += b - '0';
3746       else if (b == 'x') x += 100;
3747       else bad = TRUE;
3748       }
3749     else if (a != 'x' || b != 'x') bad = TRUE;
3750     }
3751
3752   if (bad)
3753     return string_sprintf("%.4s_4 must be followed by xx, dx, or dd, where "
3754       "x is literal and d is any digit", pp);
3755
3756   *basic_errno = (*pp == 'm')? ERRNO_MAIL4XX :
3757                  (*pp == 'r')? ERRNO_RCPT4XX : ERRNO_DATA4XX;
3758   *more_errno = x << 8;
3759   }
3760
3761 else if (len == 4 && strncmpic(pp, US"auth", len) == 0 &&
3762          strncmpic(q+1, US"failed", p-q-1) == 0)
3763   *basic_errno = ERRNO_AUTHFAIL;
3764
3765 else if (strncmpic(pp, US"lost_connection", p - pp) == 0)
3766   *basic_errno = ERRNO_SMTPCLOSED;
3767
3768 else if (strncmpic(pp, US"tls_required", p - pp) == 0)
3769   *basic_errno = ERRNO_TLSREQUIRED;
3770
3771 else if (len != 1 || Ustrncmp(pp, "*", 1) != 0)
3772   return string_sprintf("unknown or malformed retry error \"%.*s\"", (int) (p-pp), pp);
3773
3774 return NULL;
3775 }
3776
3777
3778
3779
3780 /*************************************************
3781 *                Read retry information          *
3782 *************************************************/
3783
3784 /* Each line of retry information contains:
3785
3786 .  A domain name pattern or an address pattern;
3787
3788 .  An error name, possibly with additional data, or *;
3789
3790 .  An optional sequence of retry items, each consisting of an identifying
3791    letter, a cutoff time, and optional parameters.
3792
3793 All this is decoded and placed into a control block. */
3794
3795
3796 /* Subroutine to read an argument, preceded by a comma and terminated
3797 by comma, semicolon, whitespace, or newline. The types are: 0 = time value,
3798 1 = fixed point number (returned *1000).
3799
3800 Arguments:
3801   paddr     pointer to pointer to current character; updated
3802   type      0 => read a time; 1 => read a fixed point number
3803
3804 Returns:    time in seconds or fixed point number * 1000
3805 */
3806
3807 static int
3808 retry_arg(uschar **paddr, int type)
3809 {
3810 uschar *p = *paddr;
3811 uschar *pp;
3812
3813 if (*p++ != ',') log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "comma expected");
3814
3815 while (isspace(*p)) p++;
3816 pp = p;
3817 while (isalnum(*p) || (type == 1 && *p == '.')) p++;
3818
3819 if (*p != 0 && !isspace(*p) && *p != ',' && *p != ';')
3820   log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "comma or semicolon expected");
3821
3822 *paddr = p;
3823 switch (type)
3824   {
3825   case 0:
3826   return readconf_readtime(pp, *p, FALSE);
3827   case 1:
3828   return readconf_readfixed(pp, *p);
3829   }
3830 return 0;    /* Keep picky compilers happy */
3831 }
3832
3833 /* The function proper */
3834
3835 void
3836 readconf_retries(void)
3837 {
3838 retry_config **chain = &retries;
3839 retry_config *next;
3840 uschar *p;
3841
3842 while ((p = get_config_line()) != NULL)
3843   {
3844   retry_rule **rchain;
3845   uschar *pp, *error;
3846
3847   next = store_get(sizeof(retry_config));
3848   next->next = NULL;
3849   *chain = next;
3850   chain = &(next->next);
3851   next->basic_errno = next->more_errno = 0;
3852   next->senders = NULL;
3853   next->rules = NULL;
3854   rchain = &(next->rules);
3855
3856   next->pattern = string_dequote(&p);
3857   while (isspace(*p)) p++;
3858   pp = p;
3859   while (mac_isgraph(*p)) p++;
3860   if (p - pp <= 0) log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
3861     "missing error type in retry rule");
3862
3863   /* Test error names for things we understand. */
3864
3865   if ((error = readconf_retry_error(pp, p, &(next->basic_errno),
3866        &(next->more_errno))) != NULL)
3867     log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "%s", error);
3868
3869   /* There may be an optional address list of senders to be used as another
3870   constraint on the rule. This was added later, so the syntax is a bit of a
3871   fudge. Anything that is not a retry rule starting "F," or "G," is treated as
3872   an address list. */
3873
3874   while (isspace(*p)) p++;
3875   if (Ustrncmp(p, "senders", 7) == 0)
3876     {
3877     p += 7;
3878     while (isspace(*p)) p++;
3879     if (*p++ != '=') log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
3880       "\"=\" expected after \"senders\" in retry rule");
3881     while (isspace(*p)) p++;
3882     next->senders = string_dequote(&p);
3883     }
3884
3885   /* Now the retry rules. Keep the maximum timeout encountered. */
3886
3887   while (isspace(*p)) p++;
3888
3889   while (*p != 0)
3890     {
3891     retry_rule *rule = store_get(sizeof(retry_rule));
3892     *rchain = rule;
3893     rchain = &(rule->next);
3894     rule->next = NULL;
3895     rule->rule = toupper(*p++);
3896     rule->timeout = retry_arg(&p, 0);
3897     if (rule->timeout > retry_maximum_timeout)
3898       retry_maximum_timeout = rule->timeout;
3899
3900     switch (rule->rule)
3901       {
3902       case 'F':   /* Fixed interval */
3903       rule->p1 = retry_arg(&p, 0);
3904       break;
3905
3906       case 'G':   /* Geometrically increasing intervals */
3907       case 'H':   /* Ditto, but with randomness */
3908       rule->p1 = retry_arg(&p, 0);
3909       rule->p2 = retry_arg(&p, 1);
3910       break;
3911
3912       default:
3913       log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "unknown retry rule letter");
3914       break;
3915       }
3916
3917     if (rule->timeout <= 0 || rule->p1 <= 0 ||
3918           (rule->rule != 'F' && rule->p2 < 1000))
3919       log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
3920         "bad parameters for retry rule");
3921
3922     while (isspace(*p)) p++;
3923     if (*p == ';')
3924       {
3925       p++;
3926       while (isspace(*p)) p++;
3927       }
3928     else if (*p != 0)
3929       log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "semicolon expected");
3930     }
3931   }
3932 }
3933
3934
3935
3936 /*************************************************
3937 *         Initialize authenticators              *
3938 *************************************************/
3939
3940 /* Read the authenticators section of the configuration file.
3941
3942 Arguments:   none
3943 Returns:     nothing
3944 */
3945
3946 static void
3947 auths_init(void)
3948 {
3949 auth_instance *au, *bu;
3950 readconf_driver_init(US"authenticator",
3951   (driver_instance **)(&auths),      /* chain anchor */
3952   (driver_info *)auths_available,    /* available drivers */
3953   sizeof(auth_info),                 /* size of info block */
3954   &auth_defaults,                    /* default values for generic options */
3955   sizeof(auth_instance),             /* size of instance block */
3956   optionlist_auths,                  /* generic options */
3957   optionlist_auths_size);
3958
3959 for (au = auths; au != NULL; au = au->next)
3960   {
3961   if (au->public_name == NULL)
3962     log_write(0, LOG_PANIC_DIE|LOG_CONFIG, "no public name specified for "
3963       "the %s authenticator", au->name);
3964   for (bu = au->next; bu != NULL; bu = bu->next)
3965     {
3966     if (strcmpic(au->public_name, bu->public_name) == 0)
3967       {
3968       if ((au->client && bu->client) || (au->server && bu->server))
3969         log_write(0, LOG_PANIC_DIE|LOG_CONFIG, "two %s authenticators "
3970           "(%s and %s) have the same public name (%s)",
3971           (au->client)? US"client" : US"server", au->name, bu->name,
3972           au->public_name);
3973       }
3974     }
3975   }
3976 }
3977
3978
3979
3980
3981 /*************************************************
3982 *             Read ACL information               *
3983 *************************************************/
3984
3985 /* If this run of Exim is not doing something that involves receiving a
3986 message, we can just skip over the ACL information. No need to parse it.
3987
3988 First, we have a function for acl_read() to call back to get the next line. We
3989 need to remember the line we passed, because at the end it will contain the
3990 name of the next ACL. */
3991
3992 static uschar *acl_line;
3993
3994 static uschar *
3995 acl_callback(void)
3996 {
3997 acl_line = get_config_line();
3998 return acl_line;
3999 }
4000
4001
4002 /* Now the main function:
4003
4004 Arguments:    none
4005 Returns:      nothing
4006 */
4007
4008 static void
4009 readconf_acl(void)
4010 {
4011 uschar *p;
4012
4013 /* Read each ACL and add it into the tree. Macro (re)definitions are allowed
4014 between ACLs. */
4015
4016 acl_line = get_config_line();
4017
4018 while(acl_line != NULL)
4019   {
4020   uschar name[64];
4021   tree_node *node;
4022   uschar *error;
4023
4024   p = readconf_readname(name, sizeof(name), acl_line);
4025   if (isupper(*name) && *p == '=')
4026     {
4027     read_macro_assignment(acl_line);
4028     acl_line = get_config_line();
4029     continue;
4030     }
4031
4032   if (*p != ':' || name[0] == 0)
4033     log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "missing or malformed ACL name");
4034
4035   node = store_get(sizeof(tree_node) + Ustrlen(name));
4036   Ustrcpy(node->name, name);
4037   if (!tree_insertnode(&acl_anchor, node))
4038     log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
4039       "there are two ACLs called \"%s\"", name);
4040
4041   node->data.ptr = acl_read(acl_callback, &error);
4042
4043   if (node->data.ptr == NULL && error != NULL)
4044     log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "error in ACL: %s", error);
4045   }
4046 }
4047
4048
4049
4050 /*************************************************
4051 *     Read configuration for local_scan()        *
4052 *************************************************/
4053
4054 /* This function is called after "begin local_scan" is encountered in the
4055 configuration file. If the local_scan() function allows for configuration
4056 options, we can process them. Otherwise, we expire in a panic.
4057
4058 Arguments:  none
4059 Returns:    nothing
4060 */
4061
4062 static void
4063 local_scan_init(void)
4064 {
4065 #ifndef LOCAL_SCAN_HAS_OPTIONS
4066 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "local_scan() options not supported: "
4067   "(LOCAL_SCAN_HAS_OPTIONS not defined in Local/Makefile)");
4068 #else
4069
4070 uschar *p;
4071 while ((p = get_config_line()) != NULL)
4072   {
4073   (void) readconf_handle_option(p, local_scan_options, local_scan_options_count,
4074     NULL, US"local_scan option \"%s\" unknown");
4075   }
4076 #endif
4077 }
4078
4079
4080
4081 /*************************************************
4082 *     Read rest of configuration (after main)    *
4083 *************************************************/
4084
4085 /* This function reads the rest of the runtime configuration, after the main
4086 configuration. It is called only when actually needed. Each subsequent section
4087 of the configuration starts with a line of the form
4088
4089   begin name
4090
4091 where the name is "routers", "transports", etc. A section is terminated by
4092 hitting the next "begin" line, and the next name is left in next_section.
4093 Because it may confuse people as to whether the names are singular or plural,
4094 we add "s" if it's missing. There is always enough room in next_section for
4095 this. This function is basically just a switch.
4096
4097 Arguments:   none
4098 Returns:     nothing
4099 */
4100
4101 static uschar *section_list[] = {
4102   US"acls",
4103   US"authenticators",
4104   US"local_scans",
4105   US"retrys",
4106   US"rewrites",
4107   US"routers",
4108   US"transports"};
4109
4110 void
4111 readconf_rest(void)
4112 {
4113 int had = 0;
4114
4115 while(next_section[0] != 0)
4116   {
4117   int bit;
4118   int first = 0;
4119   int last = sizeof(section_list) / sizeof(uschar *);
4120   int mid = last/2;
4121   int n = Ustrlen(next_section);
4122
4123   if (tolower(next_section[n-1]) != 's') Ustrcpy(next_section+n, "s");
4124
4125   for (;;)
4126     {
4127     int c = strcmpic(next_section, section_list[mid]);
4128     if (c == 0) break;
4129     if (c > 0) first = mid + 1; else last = mid;
4130     if (first >= last)
4131       log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
4132         "\"%.*s\" is not a known configuration section name", n, next_section);
4133     mid = (last + first)/2;
4134     }
4135
4136   bit = 1 << mid;
4137   if (((had ^= bit) & bit) == 0)
4138     log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
4139       "\"%.*s\" section is repeated in the configuration file", n,
4140         next_section);
4141
4142   switch(mid)
4143     {
4144     case 0: readconf_acl(); break;
4145     case 1: auths_init(); break;
4146     case 2: local_scan_init(); break;
4147     case 3: readconf_retries(); break;
4148     case 4: readconf_rewrites(); break;
4149     case 5: route_init(); break;
4150     case 6: transport_init(); break;
4151     }
4152   }
4153
4154 (void)fclose(config_file);
4155 }
4156
4157 /* vi: aw ai sw=2
4158 */
4159 /* End of readconf.c */