2e18b670e71e4855b4b2b6e31470d3176b6c69be
[exim.git] / src / src / readconf.c
1 /*************************************************
2 * Exim - an Internet mail transport agent *
3 *************************************************/
4
5 /* Copyright (c) University of Cambridge 1995 - 2014 */
6 /* See the file NOTICE for conditions of use and distribution. */
7
8 /* Functions for reading the configuration file, and for displaying
9 overall configuration values. Thanks to Brian Candler for the original
10 implementation 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
19 typedef 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
28 typedef 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
38 typedef struct syslog_fac_item {
39 uschar *name;
40 int value;
41 } syslog_fac_item;
42
43
44 /* Static variables */
45
46 static config_file_item *config_file_stack = NULL; /* For includes */
47
48 static uschar *syslog_facility_str = NULL;
49 static uschar next_section[24];
50 static uschar time_buffer[24];
51
52 /* State variables for conditional loading (.ifdef / .else / .endif) */
53
54 static int cstate = 0;
55 static int cstate_stack_ptr = -1;
56 static int cstate_stack[CSTATE_STACK_SIZE];
57
58 /* Table of state transitions for handling conditional inclusions. There are
59 four 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
68 static 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
79 values: the length of the name (to save computing it each time), the state to
80 set if a macro was found in the line, the state to set if a macro was not found
81 in 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
88 static 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
97 static int cond_list_size = sizeof(cond_list)/sizeof(cond_item);
98
99 /* Table of syslog facility names and their values */
100
101 static 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
117 static 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
127 must be in alphabetic order because it is searched by binary chop. */
128
129 static 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 },
136 #ifdef WITH_CONTENT_SCAN
137 { "acl_not_smtp_mime", opt_stringptr, &acl_not_smtp_mime },
138 #endif
139 { "acl_not_smtp_start", opt_stringptr, &acl_not_smtp_start },
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 },
143 #ifndef DISABLE_PRDR
144 { "acl_smtp_data_prdr", opt_stringptr, &acl_smtp_data_prdr },
145 #endif
146 #ifndef DISABLE_DKIM
147 { "acl_smtp_dkim", opt_stringptr, &acl_smtp_dkim },
148 #endif
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 },
154 #ifdef WITH_CONTENT_SCAN
155 { "acl_smtp_mime", opt_stringptr, &acl_smtp_mime },
156 #endif
157 { "acl_smtp_notquit", opt_stringptr, &acl_smtp_notquit },
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 },
171 #ifdef WITH_CONTENT_SCAN
172 { "av_scanner", opt_stringptr, &av_scanner },
173 #endif
174 { "bi_command", opt_stringptr, &bi_command },
175 #ifdef EXPERIMENTAL_BRIGHTMAIL
176 { "bmi_config_file", opt_stringptr, &bmi_config_file },
177 #endif
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 },
191 { "check_rfc2047_length", opt_bool, &check_rfc2047_length },
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 },
196 { "daemon_startup_retries", opt_int, &daemon_startup_retries },
197 { "daemon_startup_sleep", opt_time, &daemon_startup_sleep },
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
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 },
208 #ifdef EXPERIMENTAL_TPDA
209 { "delivery_event_action", opt_stringptr, &delivery_event_action },
210 #endif
211 #ifdef ENABLE_DISABLE_FSYNC
212 { "disable_fsync", opt_bool, &disable_fsync },
213 #endif
214 { "disable_ipv6", opt_bool, &disable_ipv6 },
215 #ifndef DISABLE_DKIM
216 { "dkim_verify_signers", opt_stringptr, &dkim_verify_signers },
217 #endif
218 #ifdef EXPERIMENTAL_DMARC
219 { "dmarc_forensic_sender", opt_stringptr, &dmarc_forensic_sender },
220 { "dmarc_history_file", opt_stringptr, &dmarc_history_file },
221 { "dmarc_tld_file", opt_stringptr, &dmarc_tld_file },
222 #endif
223 { "dns_again_means_nonexist", opt_stringptr, &dns_again_means_nonexist },
224 { "dns_check_names_pattern", opt_stringptr, &check_dns_names_pattern },
225 { "dns_csa_search_limit", opt_int, &dns_csa_search_limit },
226 { "dns_csa_use_reverse", opt_bool, &dns_csa_use_reverse },
227 { "dns_dnssec_ok", opt_int, &dns_dnssec_ok },
228 { "dns_ipv4_lookup", opt_stringptr, &dns_ipv4_lookup },
229 { "dns_retrans", opt_time, &dns_retrans },
230 { "dns_retry", opt_int, &dns_retry },
231 { "dns_use_edns0", opt_int, &dns_use_edns0 },
232 /* This option is now a no-op, retained for compability */
233 { "drop_cr", opt_bool, &drop_cr },
234 /*********************************************************/
235 #ifdef EXPERIMENTAL_DSN
236 { "dsn_advertise_hosts", opt_stringptr, &dsn_advertise_hosts },
237 #endif
238 { "dsn_from", opt_stringptr, &dsn_from },
239 { "envelope_to_remove", opt_bool, &envelope_to_remove },
240 { "errors_copy", opt_stringptr, &errors_copy },
241 { "errors_reply_to", opt_stringptr, &errors_reply_to },
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 },
251 #ifdef SUPPORT_TLS
252 { "gnutls_allow_auto_pkcs11", opt_bool, &gnutls_allow_auto_pkcs11 },
253 { "gnutls_compat_mode", opt_bool, &gnutls_compat_mode },
254 /* These three gnutls_require_* options stopped working in Exim 4.80 */
255 /* From 4.83 we log a warning; a future relase will remove them */
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
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
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 },
287 { "ldap_default_servers", opt_stringptr, &eldap_default_servers },
288 { "ldap_require_cert", opt_stringptr, &eldap_require_cert },
289 { "ldap_start_tls", opt_bool, &eldap_start_tls },
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 },
304 { "message_body_newlines", opt_bool, &message_body_newlines },
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 },
318 #ifdef SUPPORT_TLS
319 { "openssl_options", opt_stringptr, &openssl_options },
320 #endif
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 },
334 #ifndef DISABLE_PRDR
335 { "prdr_enable", opt_bool, &prdr_enable },
336 #endif
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 },
342 #ifdef EXPERIMENTAL_PROXY
343 { "proxy_required_hosts", opt_stringptr, &proxy_required_hosts },
344 #endif
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 },
352 { "queue_only_load_latch", opt_bool, &queue_only_load_latch },
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 },
363 #ifdef EXPERIMENTAL_REDIS
364 { "redis_servers", opt_stringptr, &redis_servers },
365 #endif
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 },
400 #ifdef WITH_CONTENT_SCAN
401 { "spamd_address", opt_stringptr, &spamd_address },
402 #endif
403 #ifdef EXPERIMENTAL_SPF
404 { "spf_guess", opt_stringptr, &spf_guess },
405 #endif
406 { "split_spool_directory", opt_bool, &split_spool_directory },
407 { "spool_directory", opt_stringptr, &spool_directory },
408 #ifdef LOOKUP_SQLITE
409 { "sqlite_lock_timeout", opt_int, &sqlite_lock_timeout },
410 #endif
411 #ifdef EXPERIMENTAL_SRS
412 { "srs_config", opt_stringptr, &srs_config },
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 },
419 #endif
420 { "strict_acl_vars", opt_bool, &strict_acl_vars },
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 },
435 #ifdef USE_TCP_WRAPPERS
436 { "tcp_wrappers_daemon_name", opt_stringptr, &tcp_wrappers_daemon_name },
437 #endif
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 },
444 { "tls_dh_max_bits", opt_int, &tls_dh_max_bits },
445 { "tls_dhparam", opt_stringptr, &tls_dhparam },
446 # ifndef DISABLE_OCSP
447 { "tls_ocsp_file", opt_stringptr, &tls_ocsp_file },
448 # endif
449 { "tls_on_connect_ports", opt_stringptr, &tls_in.on_connect_ports },
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
468 static 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
478 pointer variables in the options table or in option tables for various drivers.
479 For debugging output, it is useful to be able to find the name of the option
480 which is currently being processed. This function finds it, if it exists, by
481 searching the table(s).
482
483 Arguments: a value that is presumed to be in the table above
484 Returns: the option name, or an empty string
485 */
486
487 uschar *
488 readconf_find_option(void *p)
489 {
490 int i;
491 router_instance *r;
492 transport_instance *t;
493
494 for (i = 0; i < optionlist_config_size; i++)
495 if (p == optionlist_config[i].value) return US optionlist_config[i].name;
496
497 for (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
508 for (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
519 return US"";
520 }
521
522
523
524
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
530 encountered. The argument "line" should contain a complete logical line, and
531 start with the first letter of the macro name. The macro name and the
532 replacement text are extracted and stored. Redefinition of existing,
533 non-command line, macros is permitted using '==' instead of '='.
534
535 Arguments:
536 s points to the start of the logical line
537
538 Returns: nothing
539 */
540
541 static void
542 read_macro_assignment(uschar *s)
543 {
544 uschar name[64];
545 int namelen = 0;
546 BOOL redef = FALSE;
547 macro_item *m;
548 macro_item *mlast = NULL;
549
550 while (isalnum(*s) || *s == '_')
551 {
552 if (namelen >= sizeof(name) - 1)
553 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
554 "macro name too long (maximum is " SIZE_T_FMT " characters)", sizeof(name) - 1);
555 name[namelen++] = *s++;
556 }
557 name[namelen] = 0;
558
559 while (isspace(*s)) s++;
560 if (*s++ != '=')
561 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "malformed macro definition");
562
563 if (*s == '=')
564 {
565 redef = TRUE;
566 s++;
567 }
568 while (isspace(*s)) s++;
569
570 /* If an existing macro of the same name was defined on the command line, we
571 just skip this definition. It's an error to attempt to redefine a macro without
572 redef set to TRUE, or to redefine a macro when it hasn't been defined earlier.
573 It is also an error to define a macro whose name begins with the name of a
574 previously defined macro. Note: it is documented that the other way round
575 works. */
576
577 for (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
608 if (m != NULL && m->command_line) return;
609
610 /* Redefinition must refer to an existing macro. */
611
612 if (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
620 called "name" which is one byte long. Thus, adding "namelen" gives us enough
621 room to store the "name" string. */
622
623 else
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
635 m->replacement = string_copy(s);
636 }
637
638
639
640
641
642 /*************************************************
643 * Read configuration line *
644 *************************************************/
645
646 /* A logical line of text is read from the configuration file into the big
647 buffer, taking account of macros, .includes, and continuations. The size of
648 big_buffer is increased if necessary. The count of configuration lines is
649 maintained. Physical input lines starting with # (ignoring leading white space,
650 and after macro replacement) and empty logical lines are always ignored.
651 Leading and trailing spaces are removed.
652
653 If we hit a line of the form "begin xxxx", the xxxx is placed in the
654 next_section vector, and the function returns NULL, indicating the end of a
655 configuration section. On end-of-file, NULL is returned with next_section
656 empty.
657
658 Arguments: none
659
660 Returns: a pointer to the first non-blank in the line,
661 or NULL if eof or end of section is reached
662 */
663
664 static uschar *
665 get_config_line(void)
666 {
667 int startoffset = 0; /* To first non-blank char in logical line */
668 int len = 0; /* Of logical line so far */
669 int newlen;
670 uschar *s, *ss;
671 macro_item *m;
672 BOOL macro_found;
673
674 /* Loop for handling continuation lines, skipping comments, and dealing with
675 .include files. */
676
677 for (;;)
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 {
683 (void)fclose(config_file);
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
887 if (*ss != '/')
888 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, ".include specifies a non-"
889 "absolute path \"%s\"", ss);
890
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,
943 more accurately, for the start of the next section). Place the name of the next
944 section in next_section, and return NULL. If the name given is longer than
945 next_section, truncate it. It will be unrecognized later, because all the known
946 section names do fit. Leave space for pluralizing. */
947
948 s = big_buffer + startoffset; /* First non-space character */
949 if (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
961 return 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
971 output space are silently truncated. This function is also used from acl.c when
972 parsing ACLs.
973
974 Arguments:
975 name where to put the name
976 len length of name
977 s input pointer
978
979 Returns: new input pointer
980 */
981
982 uschar *
983 readconf_readname(uschar *name, int len, uschar *s)
984 {
985 int p = 0;
986 while (isspace(*s)) s++;
987 if (isalpha(*s))
988 {
989 while (isalnum(*s) || *s == '_')
990 {
991 if (p < len-1) name[p++] = *s;
992 s++;
993 }
994 }
995 name[p] = 0;
996 while (isspace(*s)) s++;
997 return 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
1008 time values. The format of a time value is:
1009
1010 [<n>w][<n>d][<n>h][<n>m][<n>s]
1011
1012 as long as at least one is present. If a format error is encountered,
1013 return a negative value. The value must be terminated by the given
1014 terminator.
1015
1016 Arguments:
1017 s input pointer
1018 terminator required terminating character
1019 return_msec if TRUE, allow fractional seconds and return milliseconds
1020
1021 Returns: 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
1026 int
1027 readconf_readtime(uschar *s, int terminator, BOOL return_msec)
1028 {
1029 int yield = 0;
1030 for (;;)
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
1074 Arguments:
1075 s input pointer
1076 terminator required terminator
1077
1078 Returns: the value, or -1 on error
1079 */
1080
1081 static int
1082 readconf_readfixed(uschar *s, int terminator)
1083 {
1084 int yield = 0;
1085 int value, count;
1086 if (!isdigit(*s)) return -1;
1087 (void)sscanf(CS s, "%d%n", &value, &count);
1088 s += count;
1089 yield = value * 1000;
1090 if (*s == '.')
1091 {
1092 int m = 100;
1093 while (isdigit((*(++s))))
1094 {
1095 yield += (*s - '0') * m;
1096 m /= 10;
1097 }
1098 }
1099
1100 return (*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
1111 Arguments:
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
1116 Returns: pointer to an option entry, or NULL if not found
1117 */
1118
1119 static optionlist *
1120 find_option(uschar *name, optionlist *ol, int last)
1121 {
1122 int first = 0;
1123 while (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 }
1131 return 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
1141 gids (even negative ones), we cannot represent "unset" by a special value.
1142 There is therefore a separate boolean variable for each one indicating whether
1143 a value is set or not. This function returns a pointer to the boolean, given
1144 the original option name. It is a major disaster if the flag cannot be found.
1145
1146 Arguments:
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
1154 Returns: a pointer to the boolean flag.
1155 */
1156
1157 static BOOL *
1158 get_set_flag(uschar *name, optionlist *oltop, int last, void *data_block)
1159 {
1160 optionlist *ol;
1161 uschar name2[64];
1162 sprintf(CS name2, "*set_%.50s", name);
1163 ol = find_option(name2, oltop, last);
1164 if (ol == NULL) log_write(0, LOG_MAIN|LOG_PANIC_DIE,
1165 "Exim internal error: missing set flag for %s", name);
1166 return (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
1178 the sysadmin thinks comments are permitted.
1179
1180 Arguments:
1181 s points to the extra characters
1182 t1..t3 strings to insert in the log message
1183
1184 Returns: doesn't return; dies
1185 */
1186
1187 static void
1188 extra_chars_error(uschar *s, uschar *t1, uschar *t2, uschar *t3)
1189 {
1190 uschar *comment = US"";
1191 if (*s == '#') comment = US" (# is comment only at line start)";
1192 log_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
1212 All this is decoded and placed into a control block. The OR of the flags is
1213 maintained in a common word.
1214
1215 Arguments:
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
1220 Returns: the control block for the parsed rule.
1221 */
1222
1223 static rewrite_rule *
1224 readconf_one_rewrite(uschar *p, int *existflags, BOOL isglobal)
1225 {
1226 rewrite_rule *next = store_get(sizeof(rewrite_rule));
1227
1228 next->next = NULL;
1229 next->key = string_dequote(&p);
1230
1231 while (isspace(*p)) p++;
1232 if (*p == 0)
1233 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1234 "missing rewrite replacement string");
1235
1236 next->flags = 0;
1237 next->replacement = string_dequote(&p);
1238
1239 while (*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
1277 if ((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;
1283 return 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
1294 by readconf_one_rewrite(), and its flags are ORed into the global flag
1295 word rewrite_existflags. */
1296
1297 void
1298 readconf_rewrites(void)
1299 {
1300 rewrite_rule **chain = &global_rewrite_rules;
1301 uschar *p;
1302
1303 while ((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
1318 near the end of the current block, the string will just use what is necessary
1319 on the top of the stacking pool, because string_cat() uses the extension
1320 mechanism.
1321
1322 Argument:
1323 s the rest of the input line
1324 name the option name (for errors)
1325
1326 Returns: pointer to the string
1327 */
1328
1329 static uschar *
1330 read_string(uschar *s, uschar *name)
1331 {
1332 uschar *yield;
1333 uschar *ss;
1334
1335 if (*s != '\"') return string_copy(s);
1336
1337 ss = s;
1338 yield = string_dequote(&s);
1339
1340 if (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
1344 if (*s != 0) extra_chars_error(s, US"string value for ", name, US"");
1345
1346 return 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
1355 setting of an option. The first argument is the line to be decoded; it has been
1356 checked not to be empty and not to start with '#'. Trailing newlines and white
1357 space have been removed. The second argument is a pointer to the list of
1358 variable names that are to be recognized, together with their types and
1359 locations, and the third argument gives the number of entries in the list.
1360
1361 The fourth argument is a pointer to a data block. If it is NULL, then the data
1362 values in the options list are absolute addresses. Otherwise, they are byte
1363 offsets in the data block.
1364
1365 String option data may continue onto several lines; this function reads further
1366 data from config_file if necessary.
1367
1368 The yield of this function is normally zero. If a string continues onto
1369 multiple lines, then the data value is permitted to be followed by a comma
1370 or a semicolon (for use in drivers) and the yield is that character.
1371
1372 Arguments:
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
1384 Returns: 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
1389 static BOOL
1390 readconf_handle_option(uschar *buffer, optionlist *oltop, int last,
1391 void *data_block, uschar *unknown_txt)
1392 {
1393 int ptr = 0;
1394 int offset = 0;
1395 int n, count, type, value;
1396 int issecure = 0;
1397 uid_t uid;
1398 gid_t gid;
1399 BOOL boolvalue = TRUE;
1400 BOOL freesptr = TRUE;
1401 optionlist *ol, *ol2;
1402 struct passwd *pw;
1403 void *reset_point;
1404 int intbase = 0;
1405 uschar *inttype = US"";
1406 uschar *sptr;
1407 uschar *s = buffer;
1408 uschar *saved_condition, *strtemp;
1409 uschar **str_target;
1410 uschar name[64];
1411 uschar name2[64];
1412
1413 /* There may be leading spaces; thereafter, we expect an option name starting
1414 with a letter. */
1415
1416 while (isspace(*s)) s++;
1417 if (!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
1421 it turns out that what we read was "hide", set the flag indicating that
1422 this is a secure option, and loop to read the next word. */
1423
1424 for (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
1440 if (Ustrncmp(name, "no_", 3) == 0)
1441 {
1442 boolvalue = FALSE;
1443 offset = 3;
1444 }
1445
1446 if (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
1453 is set twice, is a disaster. */
1454
1455 ol = find_option(name + offset, oltop, last);
1456
1457 if (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
1463 if ((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);
1466
1467 ol->type |= opt_set | issecure;
1468 type = ol->type & opt_mask;
1469
1470 /* Types with data values must be followed by '='; the "no[t]_" prefix
1471 applies only to boolean values. */
1472
1473 if (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
1486 true/false/yes/no, or, in the case of opt_expanded_bool, a general string that
1487 ultimately expands to one of those values. */
1488
1489 else if (*s != 0 && (offset != 0 || *s != '='))
1490 extra_chars_error(s, US"boolean option ", name, US"");
1491
1492 /* Skip white space after = */
1493
1494 if (*s == '=') while (isspace((*(++s))));
1495
1496 /* If there is a data block and the opt_public flag is not set, change
1497 the data block pointer to the private options block. */
1498
1499 if (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
1504 switch (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:
1545 if (data_block == NULL)
1546 str_target = (uschar **)(ol->value);
1547 else
1548 str_target = (uschar **)((uschar *)data_block + (long int)(ol->value));
1549 if (ol->type & opt_rep_con)
1550 {
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. */
1554 saved_condition = *str_target;
1555 strtemp = string_sprintf("${if and{{bool_lax{%s}}{bool_lax{%s}}}}",
1556 saved_condition, sptr);
1557 *str_target = string_copy_malloc(strtemp);
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.
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. */
1571 }
1572 else if (ol->type & opt_rep_str)
1573 {
1574 uschar sep = Ustrncmp(name, "headers_add", 11)==0 ? '\n' : ':';
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 }
1587 else
1588 {
1589 *str_target = sptr;
1590 freesptr = FALSE;
1591 }
1592 break;
1593
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;
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);
1759
1760 p = op;
1761 if (*p != 0) count++;
1762 while (*p != 0) if (*p++ == ':' && *p != 0) count++;
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
1771 p = op;
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;
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);
1800
1801 p = op;
1802 if (*p != 0) count++;
1803 while (*p != 0) if (*p++ == ':' && *p != 0) count++;
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
1812 p = op;
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;
1940 long int lvalue;
1941
1942 errno = 0;
1943 lvalue = strtol(CS s, CSS &endptr, intbase);
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 {
1953 if (lvalue > INT_MAX/1024 || lvalue < INT_MIN/1024) errno = ERANGE;
1954 else lvalue *= 1024;
1955 endptr++;
1956 }
1957 else if (tolower(*endptr) == 'm')
1958 {
1959 if (lvalue > INT_MAX/(1024*1024) || lvalue < INT_MIN/(1024*1024))
1960 errno = ERANGE;
1961 else lvalue *= 1024*1024;
1962 endptr++;
1963 }
1964 }
1965
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);
1969
1970 while (isspace(*endptr)) endptr++;
1971 if (*endptr != 0)
1972 extra_chars_error(endptr, inttype, US"integer value for ", name);
1973
1974 value = (int)lvalue;
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
2121 return TRUE;
2122 }
2123
2124
2125
2126 /*************************************************
2127 * Print a time value *
2128 *************************************************/
2129
2130 /*
2131 Argument: a time value in seconds
2132 Returns: pointer to a fixed buffer containing the time as a string,
2133 in readconf_readtime() format
2134 */
2135
2136 uschar *
2137 readconf_printtime(int t)
2138 {
2139 int s, m, h, d, w;
2140 uschar *p = time_buffer;
2141
2142 if (t < 0)
2143 {
2144 *p++ = '-';
2145 t = -t;
2146 }
2147
2148 s = t % 60;
2149 t /= 60;
2150 m = t % 60;
2151 t /= 60;
2152 h = t % 24;
2153 t /= 24;
2154 d = t % 7;
2155 w = t/7;
2156
2157 if (w > 0) { sprintf(CS p, "%dw", w); while (*p) p++; }
2158 if (d > 0) { sprintf(CS p, "%dd", d); while (*p) p++; }
2159 if (h > 0) { sprintf(CS p, "%dh", h); while (*p) p++; }
2160 if (m > 0) { sprintf(CS p, "%dm", m); while (*p) p++; }
2161 if (s > 0 || p == time_buffer) sprintf(CS p, "%ds", s);
2162
2163 return 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.
2173 The entire options list is passed in as an argument, because some options come
2174 in pairs - typically uid/gid settings, which can either be explicit numerical
2175 values, or strings to be expanded later. If the numerical value is unset,
2176 search for "*expand_<name>" to see if there is a string equivalent.
2177
2178 Arguments:
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
2187 no_labels do not show "foo = " at the start.
2188
2189 Returns: nothing
2190 */
2191
2192 static void
2193 print_ol(optionlist *ol, uschar *name, void *options_block,
2194 optionlist *oltop, int last, BOOL no_labels)
2195 {
2196 struct passwd *pw;
2197 struct group *gr;
2198 optionlist *ol2;
2199 void *value;
2200 uid_t *uidlist;
2201 gid_t *gidlist;
2202 uschar *s;
2203 uschar name2[64];
2204
2205 if (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
2214 if (!admin_user && (ol->type & opt_secure) != 0)
2215 {
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);
2221 return;
2222 }
2223
2224 /* Else show the value of the option */
2225
2226 value = ol->value;
2227 if (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
2234 switch(ol->type & opt_mask)
2235 {
2236 case opt_stringptr:
2237 case opt_rewrite: /* Show the text value */
2238 s = *((uschar **)value);
2239 if (!no_labels) printf("%s = ", name);
2240 printf("%s\n", (s == NULL)? US"" : string_printing2(s, FALSE));
2241 break;
2242
2243 case opt_int:
2244 if (!no_labels) printf("%s = ", name);
2245 printf("%d\n", *((int *)value));
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 }
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);
2267 }
2268 }
2269 break;
2270
2271 case opt_Kint:
2272 {
2273 int x = *((int *)value);
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);
2278 }
2279 break;
2280
2281 case opt_octint:
2282 if (!no_labels) printf("%s = ", name);
2283 printf("%#o\n", *((int *)value));
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 {
2295 if (!no_labels) printf("%s = ", name);
2296 printf("%d.", x/1000);
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);
2322 if (!no_labels) printf("%s = ", name);
2323 printf("%s\n", (s == NULL)? US"" : string_printing(s));
2324 break;
2325 }
2326 }
2327
2328 /* Else fall through */
2329
2330 case opt_uid:
2331 if (!no_labels) printf("%s = ", name);
2332 if (! *get_set_flag(name, oltop, last, options_block))
2333 printf("\n");
2334 else
2335 {
2336 pw = getpwuid(*((uid_t *)value));
2337 if (pw == NULL)
2338 printf("%ld\n", (long int)(*((uid_t *)value)));
2339 else printf("%s\n", pw->pw_name);
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);
2356 if (!no_labels) printf("%s = ", name);
2357 printf("%s\n", (s == NULL)? US"" : string_printing(s));
2358 break;
2359 }
2360 }
2361
2362 /* Else fall through */
2363
2364 case opt_gid:
2365 if (!no_labels) printf("%s = ", name);
2366 if (! *get_set_flag(name, oltop, last, options_block))
2367 printf("\n");
2368 else
2369 {
2370 gr = getgrgid(*((int *)value));
2371 if (gr == NULL)
2372 printf("%ld\n", (long int)(*((int *)value)));
2373 else printf("%s\n", gr->gr_name);
2374 }
2375 break;
2376
2377 case opt_uidlist:
2378 uidlist = *((uid_t **)value);
2379 if (!no_labels) printf("%s =", name);
2380 if (uidlist != NULL)
2381 {
2382 int i;
2383 uschar sep = ' ';
2384 if (no_labels) sep = '\0';
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;
2390 if (sep != '\0') printf("%c", sep);
2391 if (name != NULL) printf("%s", name);
2392 else printf("%ld", (long int)(uidlist[i]));
2393 sep = ':';
2394 }
2395 }
2396 printf("\n");
2397 break;
2398
2399 case opt_gidlist:
2400 gidlist = *((gid_t **)value);
2401 if (!no_labels) printf("%s =", name);
2402 if (gidlist != NULL)
2403 {
2404 int i;
2405 uschar sep = ' ';
2406 if (no_labels) sep = '\0';
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;
2412 if (sep != '\0') printf("%c", sep);
2413 if (name != NULL) printf("%s", name);
2414 else printf("%ld", (long int)(gidlist[i]));
2415 sep = ':';
2416 }
2417 }
2418 printf("\n");
2419 break;
2420
2421 case opt_time:
2422 if (!no_labels) printf("%s = ", name);
2423 printf("%s\n", readconf_printtime(*((int *)value)));
2424 break;
2425
2426 case opt_timelist:
2427 {
2428 int i;
2429 int *list = (int *)value;
2430 if (!no_labels) printf("%s = ", name);
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 {
2453 if (!no_labels) printf("%s = ", name);
2454 printf("%s\n", string_printing(s));
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,
2477 causes the value of any main configuration variable to be output if the
2478 second 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
2485 macros print the macros' configuration
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
2489 macro_list print a list of macro names
2490 +name print a named list item
2491 local_scan print the local_scan options
2492
2493 If 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
2495 driver whose options are to be printed.
2496
2497 Arguments:
2498 name option name if type == NULL; else driver name
2499 type NULL or driver type name, as described above
2500 no_labels avoid the "foo = " at the start of an item
2501
2502 Returns: nothing
2503 */
2504
2505 void
2506 readconf_print(uschar *name, uschar *type, BOOL no_labels)
2507 {
2508 BOOL names_only = FALSE;
2509 optionlist *ol;
2510 optionlist *ol2 = NULL;
2511 driver_instance *d = NULL;
2512 macro_item *m;
2513 int size = 0;
2514
2515 if (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;
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);
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)
2560 print_ol(ol, US ol->name, NULL,
2561 optionlist_config, optionlist_config_size,
2562 no_labels);
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,
2576 local_scan_options_count, no_labels);
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
2599 else if (Ustrcmp(name, "macros") == 0)
2600 {
2601 type = US"macro";
2602 name = NULL;
2603 }
2604
2605 else if (Ustrcmp(name, "router_list") == 0)
2606 {
2607 type = US"router";
2608 name = NULL;
2609 names_only = TRUE;
2610 }
2611
2612 else if (Ustrcmp(name, "transport_list") == 0)
2613 {
2614 type = US"transport";
2615 name = NULL;
2616 names_only = TRUE;
2617 }
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
2633 else
2634 {
2635 print_ol(find_option(name, optionlist_config, optionlist_config_size),
2636 name, NULL, optionlist_config, optionlist_config_size, no_labels);
2637 return;
2638 }
2639 }
2640
2641 /* Handle the options for a router or transport. Skip options that are flagged
2642 as hidden. Some of these are options with names starting with '*', used for
2643 internal alternative representations of other options (which the printing
2644 function will sort out). Others are synonyms kept for backward compatibility.
2645 */
2646
2647 if (Ustrcmp(type, "router") == 0)
2648 {
2649 d = (driver_instance *)routers;
2650 ol2 = optionlist_routers;
2651 size = optionlist_routers_size;
2652 }
2653 else if (Ustrcmp(type, "transport") == 0)
2654 {
2655 d = (driver_instance *)transports;
2656 ol2 = optionlist_transports;
2657 size = optionlist_transports_size;
2658 }
2659 else if (Ustrcmp(type, "authenticator") == 0)
2660 {
2661 d = (driver_instance *)auths;
2662 ol2 = optionlist_auths;
2663 size = optionlist_auths_size;
2664 }
2665
2666 else 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
2692 if (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
2700 for (; 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)
2709 print_ol(ol, US ol->name, d, ol2, size, no_labels);
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)
2716 print_ol(ol, US ol->name, d, d->info->options, *(d->info->options_count), no_labels);
2717 }
2718 if (name != NULL) return;
2719 }
2720 if (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
2730 save the list in a tree, sorted by its name. Each entry also has a number,
2731 which can be used for caching tests, but if the string contains any expansion
2732 items other than $key, the number is set negative to inhibit caching. This
2733 mechanism is used for domain, host, and address lists that are referenced by
2734 the "+name" syntax.
2735
2736 Arguments:
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
2744 Returns: nothing
2745 */
2746
2747 static void
2748 read_named_list(tree_node **anchorp, int *numberp, int max, uschar *s,
2749 uschar *tname)
2750 {
2751 BOOL forcecache = FALSE;
2752 uschar *ss;
2753 tree_node *t;
2754 namedlist_block *nb = store_get(sizeof(namedlist_block));
2755
2756 if (Ustrncmp(s, "_cache", 6) == 0)
2757 {
2758 forcecache = TRUE;
2759 s += 6;
2760 }
2761
2762 if (!isspace(*s))
2763 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "unrecognized configuration line");
2764
2765 if (*numberp >= max)
2766 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "too many named %ss (max is %d)\n",
2767 tname, max);
2768
2769 while (isspace(*s)) s++;
2770 ss = s;
2771 while (isalnum(*s) || *s == '_') s++;
2772 t = store_get(sizeof(tree_node) + s-ss);
2773 Ustrncpy(t->name, ss, s-ss);
2774 t->name[s-ss] = 0;
2775 while (isspace(*s)) s++;
2776
2777 if (!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
2781 t->data.ptr = nb;
2782 nb->number = *numberp;
2783 *numberp += 1;
2784
2785 if (*s++ != '=') log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
2786 "missing '=' after \"%s\"", t->name);
2787 while (isspace(*s)) s++;
2788 nb->string = read_string(s, t->name);
2789 nb->cache_data = NULL;
2790
2791 /* Check the string for any expansions; if any are found, mark this list
2792 uncacheable unless the user has explicited forced caching. */
2793
2794 if (!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
2805 separate values.
2806
2807 Arguments:
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
2818 Returns: nothing (panics on error)
2819 */
2820
2821 static void
2822 unpick_ratelimit(uschar *s, int *threshold, int *base, double *factor,
2823 int *limit)
2824 {
2825 uschar bstring[16], lstring[16];
2826
2827 if (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 }
2834 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "malformed ratelimit data: %s", s);
2835 }
2836
2837
2838
2839
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
2845 root when we call into the TLS library, in case of library linkage errors
2846 which cause segfaults; before this check, those were always done as the Exim
2847 runtime user and it makes sense to continue with that.
2848
2849 Assumes: 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
2853 Returns: bool for "okay"; false will cause caller to immediately exit.
2854 */
2855
2856 #ifdef SUPPORT_TLS
2857 static BOOL
2858 tls_dropprivs_validate_require_cipher(void)
2859 {
2860 const uschar *errmsg;
2861 pid_t pid;
2862 int rc, status;
2863 void (*oldsignal)(int);
2864
2865 oldsignal = signal(SIGCHLD, SIG_DFL);
2866
2867 fflush(NULL);
2868 if ((pid = fork()) < 0)
2869 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "fork failed for TLS check");
2870
2871 if (pid == 0)
2872 {
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");
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
2888 do {
2889 rc = waitpid(pid, &status, 0);
2890 } while (rc < 0 && errno == EINTR);
2891
2892 DEBUG(D_tls)
2893 debug_printf("tls_validate_require_cipher child %d ended: status=0x%x\n",
2894 (int)pid, status);
2895
2896 signal(SIGCHLD, oldsignal);
2897
2898 return status == 0;
2899 }
2900 #endif /* SUPPORT_TLS */
2901
2902
2903
2904
2905 /*************************************************
2906 * Read main configuration options *
2907 *************************************************/
2908
2909 /* This function is the first to be called for configuration reading. It
2910 opens the configuration file and reads general configuration settings until
2911 it reaches the end of the configuration section. The file is then left open so
2912 that the remaining configuration data can subsequently be read if needed for
2913 this run of Exim.
2914
2915 The configuration file must be owned either by root or exim, and be writeable
2916 only by root or uid/gid exim. The values for Exim's uid and gid can be changed
2917 in the config file, so the test is done on the compiled in values. A slight
2918 anomaly, to be carefully documented.
2919
2920 The name of the configuration file is taken from a list that is included in the
2921 binary of Exim. It can be altered from the command line, but if that is done,
2922 root privilege is immediately withdrawn unless the caller is root or exim.
2923 The first file on the list that exists is used.
2924
2925 For use on multiple systems that share file systems, first look for a
2926 configuration file whose name has the current node name on the end. If that is
2927 not found, try the generic name. For really contorted configurations, that run
2928 multiple Exims with different uid settings, first try adding the effective uid
2929 before the node name. These complications are going to waste resources on most
2930 systems. Therefore they are available only when requested by compile-time
2931 options. */
2932
2933 void
2934 readconf_main(void)
2935 {
2936 int sep = 0;
2937 struct stat statbuf;
2938 uschar *s, *filename;
2939 uschar *list = config_main_filelist;
2940
2941 /* Loop through the possible file names */
2942
2943 while((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
3000 logging configuration errors (it changes for .included files) whereas
3001 config_main_filename is the name shown by -bP. Failure to open a configuration
3002 file is a serious disaster. */
3003
3004 if (config_file != NULL)
3005 {
3006 config_filename = config_main_filename = string_copy(filename);
3007 }
3008 else
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
3018 /* Check the status of the file we have opened, if we have retained root
3019 privileges and the file isn't /dev/null (which *should* be 0666). */
3020
3021 if (trusted_config && Ustrcmp(filename, US"/dev/null"))
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
3027 if ((statbuf.st_uid != root_uid /* owner not root */
3028 #ifdef CONFIGURE_OWNER
3029 && statbuf.st_uid != config_uid /* owner not the special one */
3030 #endif
3031 ) || /* or */
3032 (statbuf.st_gid != root_gid /* group not root & */
3033 #ifdef CONFIGURE_GROUP
3034 && statbuf.st_gid != config_gid /* group not the special one */
3035 #endif
3036 && (statbuf.st_mode & 020) != 0) || /* group writeable */
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
3045 letter. If we see something starting with an upper case letter, it is taken as
3046 a macro definition. */
3047
3048 while ((s = get_config_line()) != NULL)
3049 {
3050 if (isupper(s[0])) read_macro_assignment(s);
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
3076 if (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
3081 wanted. */
3082
3083 if (timezone_string != NULL && *timezone_string == 0) timezone_string = NULL;
3084
3085 /* The max retry interval must not be greater than 24 hours. */
3086
3087 if (retry_interval_max > 24*60*60) retry_interval_max = 24*60*60;
3088
3089 /* remote_max_parallel must be > 0 */
3090
3091 if (remote_max_parallel <= 0) remote_max_parallel = 1;
3092
3093 /* Save the configured setting of freeze_tell, so we can re-instate it at the
3094 start of a new SMTP message. */
3095
3096 freeze_tell_config = freeze_tell;
3097
3098 /* The primary host name may be required for expansion of spool_directory
3099 and log_file_path, so make sure it is set asap. It is obtained from uname(),
3100 but if that yields an unqualified value, make a FQDN by using gethostbyname to
3101 canonize it. Some people like upper case letters in their host names, so we
3102 don't force the case. */
3103
3104 if (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
3118 if (!disable_ipv6 && (dns_ipv4_lookup == NULL ||
3119 match_isinlist(hostname, &dns_ipv4_lookup, 0, NULL, NULL, MCL_DOMAIN,
3120 TRUE, NULL) != OK))
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
3155 smtp_active_hostname = primary_hostname;
3156
3157 /* If spool_directory wasn't set in the build-time configuration, it must have
3158 got set above. Of course, writing to the log may not work if log_file_path is
3159 not set, but it will at least get to syslog or somewhere, with any luck. */
3160
3161 if (*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
3166 host name. Same comment about failure. */
3167
3168 s = expand_string(spool_directory);
3169 if (s == NULL)
3170 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "failed to expand spool_directory "
3171 "\"%s\": %s", spool_directory, expand_string_message);
3172 spool_directory = s;
3173
3174 /* Expand log_file_path, which must contain "%s" in any component that isn't
3175 the null string or "syslog". It is also allowed to contain one instance of %D
3176 or %M. However, it must NOT contain % followed by anything else. */
3177
3178 if (*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 {
3200 if ((t[1] != 'D' && t[1] != 'M') || Ustrchr(t+2, '%') != NULL)
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
3210 openlog(). Default is LOG_MAIL set in globals.c. Allow the user to omit the
3211 leading "log_". */
3212
3213 if (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
3240 if (*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
3249 /* Set default value of process_log_path */
3250
3251 if (process_log_path == NULL || *process_log_path =='\0')
3252 process_log_path = string_sprintf("%s/exim-process.info", spool_directory);
3253
3254 /* Compile the regex for matching a UUCP-style "From_" line in an incoming
3255 message. */
3256
3257 regex_From = regex_must_compile(uucp_from_pattern, FALSE, TRUE);
3258
3259 /* Unpick the SMTP rate limiting options, if set */
3260
3261 if (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
3267 if (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
3275 if (qualify_domain_sender == NULL)
3276 qualify_domain_sender = primary_hostname;
3277 if (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
3281 name is given, but a numerical value does not. */
3282
3283 if (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
3294 and ensure it contains a domain. */
3295
3296 if (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
3313 smtp_accept_max must also be set. */
3314
3315 if (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
3322 so that it can be computed from the host name, for example. We do this last
3323 so as to ensure that everything else is set up before the expansion. */
3324
3325 if (host_number_string != NULL)
3326 {
3327 long int n;
3328 uschar *end;
3329 uschar *s = expand_string(host_number_string);
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);
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
3349 if ((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_");
3354
3355 /* This also checks that the library linkage is working and we can call
3356 routines in it, so call even if tls_require_ciphers is unset */
3357 if (!tls_dropprivs_validate_require_cipher())
3358 exit(1);
3359
3360 /* Magic number: at time of writing, 1024 has been the long-standing value
3361 used by so many clients, and what Exim used to use always, that it makes
3362 sense to just min-clamp this max-clamp at that. */
3363 if (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
3367 /* If openssl_options is set, validate it */
3368 if (openssl_options != NULL)
3369 {
3370 # ifdef USE_GNUTLS
3371 log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3372 "openssl_options is set but we're using GnuTLS");
3373 # else
3374 long dummy;
3375 if (!(tls_openssl_options_parse(openssl_options, &dummy)))
3376 log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3377 "openssl_options parse error: %s", openssl_options);
3378 # endif
3379 }
3380
3381 if (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");
3385 #endif /*SUPPORT_TLS*/
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.
3395 We can now find the driver, set up defaults for the private options, and
3396 unset any "set" bits in the private options table (which might have been
3397 set by another incarnation of the same driver).
3398
3399 Arguments:
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
3406 Returns: pointer to the driver info block
3407 */
3408
3409 static driver_info *
3410 init_driver(driver_instance *d, driver_info *drivers_available,
3411 int size_of_info, uschar *class)
3412 {
3413 driver_info *dd;
3414
3415 for (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
3431 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
3432 "%s %s: cannot find %s driver \"%s\"", class, d->name, class, d->driver_name);
3433
3434 return 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
3445 mechanisms. It reads the data from the current point in the configuration file
3446 up to the end of the section, and sets up a chain of instance blocks according
3447 to the file's contents. The file will already have been opened by a call to
3448 readconf_main, and must be left open for subsequent reading of further data.
3449
3450 Any errors cause a panic crash. Note that the blocks with names driver_info and
3451 driver_instance must map the first portions of all the _info and _instance
3452 blocks for this shared code to work.
3453
3454 Arguments:
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
3464 Returns: nothing
3465 */
3466
3467 void
3468 readconf_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 {
3478 driver_instance **p = anchor;
3479 driver_instance *d = NULL;
3480 uschar *buffer;
3481
3482 while ((buffer = get_config_line()) != NULL)
3483 {
3484 uschar name[64];
3485 uschar *s;
3486
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. */
3490
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 }
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
3556 /* Not the start of a new driver. Give an error if we have not set up a
3557 current driver yet. */
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
3591 if (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
3607 any of the string options for the driver contains the given string as an
3608 expansion variable.
3609
3610 Arguments:
3611 d points to a driver instance block
3612 s the string to search for
3613
3614 Returns: TRUE if a dependency is found
3615 */
3616
3617 BOOL
3618 readconf_depends(driver_instance *d, uschar *s)
3619 {
3620 int count = *(d->info->options_count);
3621 optionlist *ol;
3622 uschar *ss;
3623
3624 for (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
3642 DEBUG(D_transport) debug_printf("driver %s does not depend on %s\n", d->name, s);
3643 return 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
3654 program when testing retry information. It decodes strings such as "quota_7d"
3655 into numerical error codes.
3656
3657 Arguments:
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
3663 Returns: NULL if decoded correctly; else points to error text
3664 */
3665
3666 uschar *
3667 readconf_retry_error(uschar *pp, uschar *p, int *basic_errno, int *more_errno)
3668 {
3669 int len;
3670 uschar *q = pp;
3671 while (q < p && *q != '_') q++;
3672 len = q - pp;
3673
3674 if (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
3681 else 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
3692 else 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
3728 else if (strncmpic(pp, US"mail_4", 6) == 0 ||
3729 strncmpic(pp, US"rcpt_4", 6) == 0 ||
3730 strncmpic(pp, US"data_4", 6) == 0)
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
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);
3750
3751 *basic_errno = (*pp == 'm')? ERRNO_MAIL4XX :
3752 (*pp == 'r')? ERRNO_RCPT4XX : ERRNO_DATA4XX;
3753 *more_errno = x << 8;
3754 }
3755
3756 else if (len == 4 && strncmpic(pp, US"auth", len) == 0 &&
3757 strncmpic(q+1, US"failed", p-q-1) == 0)
3758 *basic_errno = ERRNO_AUTHFAIL;
3759
3760 else if (strncmpic(pp, US"lost_connection", p - pp) == 0)
3761 *basic_errno = ERRNO_SMTPCLOSED;
3762
3763 else if (strncmpic(pp, US"tls_required", p - pp) == 0)
3764 *basic_errno = ERRNO_TLSREQUIRED;
3765
3766 else if (len != 1 || Ustrncmp(pp, "*", 1) != 0)
3767 return string_sprintf("unknown or malformed retry error \"%.*s\"", (int) (p-pp), pp);
3768
3769 return 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
3788 All this is decoded and placed into a control block. */
3789
3790
3791 /* Subroutine to read an argument, preceded by a comma and terminated
3792 by comma, semicolon, whitespace, or newline. The types are: 0 = time value,
3793 1 = fixed point number (returned *1000).
3794
3795 Arguments:
3796 paddr pointer to pointer to current character; updated
3797 type 0 => read a time; 1 => read a fixed point number
3798
3799 Returns: time in seconds or fixed point number * 1000
3800 */
3801
3802 static int
3803 retry_arg(uschar **paddr, int type)
3804 {
3805 uschar *p = *paddr;
3806 uschar *pp;
3807
3808 if (*p++ != ',') log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "comma expected");
3809
3810 while (isspace(*p)) p++;
3811 pp = p;
3812 while (isalnum(*p) || (type == 1 && *p == '.')) p++;
3813
3814 if (*p != 0 && !isspace(*p) && *p != ',' && *p != ';')
3815 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "comma or semicolon expected");
3816
3817 *paddr = p;
3818 switch (type)
3819 {
3820 case 0:
3821 return readconf_readtime(pp, *p, FALSE);
3822 case 1:
3823 return readconf_readfixed(pp, *p);
3824 }
3825 return 0; /* Keep picky compilers happy */
3826 }
3827
3828 /* The function proper */
3829
3830 void
3831 readconf_retries(void)
3832 {
3833 retry_config **chain = &retries;
3834 retry_config *next;
3835 uschar *p;
3836
3837 while ((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,
3856 "missing error type in retry rule");
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 */
3902 case 'H': /* Ditto, but with randomness */
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 ||
3913 (rule->rule != 'F' && rule->p2 < 1000))
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
3937 Arguments: none
3938 Returns: nothing
3939 */
3940
3941 static void
3942 auths_init(void)
3943 {
3944 auth_instance *au, *bu;
3945 readconf_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
3954 for (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
3981 message, we can just skip over the ACL information. No need to parse it.
3982
3983 First, we have a function for acl_read() to call back to get the next line. We
3984 need to remember the line we passed, because at the end it will contain the
3985 name of the next ACL. */
3986
3987 static uschar *acl_line;
3988
3989 static uschar *
3990 acl_callback(void)
3991 {
3992 acl_line = get_config_line();
3993 return acl_line;
3994 }
3995
3996
3997 /* Now the main function:
3998
3999 Arguments: none
4000 Returns: nothing
4001 */
4002
4003 static void
4004 readconf_acl(void)
4005 {
4006 uschar *p;
4007
4008 /* Read each ACL and add it into the tree. Macro (re)definitions are allowed
4009 between ACLs. */
4010
4011 acl_line = get_config_line();
4012
4013 while(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);
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");
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
4050 configuration file. If the local_scan() function allows for configuration
4051 options, we can process them. Otherwise, we expire in a panic.
4052
4053 Arguments: none
4054 Returns: nothing
4055 */
4056
4057 static void
4058 local_scan_init(void)
4059 {
4060 #ifndef LOCAL_SCAN_HAS_OPTIONS
4061 log_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
4065 uschar *p;
4066 while ((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
4081 configuration. It is called only when actually needed. Each subsequent section
4082 of the configuration starts with a line of the form
4083
4084 begin name
4085
4086 where the name is "routers", "transports", etc. A section is terminated by
4087 hitting the next "begin" line, and the next name is left in next_section.
4088 Because it may confuse people as to whether the names are singular or plural,
4089 we add "s" if it's missing. There is always enough room in next_section for
4090 this. This function is basically just a switch.
4091
4092 Arguments: none
4093 Returns: nothing
4094 */
4095
4096 static 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
4105 void
4106 readconf_rest(void)
4107 {
4108 int had = 0;
4109
4110 while(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 {
4139 case 0: readconf_acl(); break;
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
4149 (void)fclose(config_file);
4150 }
4151
4152 /* vi: aw ai sw=2
4153 */
4154 /* End of readconf.c */