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