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