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