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