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