1 /*************************************************
2 * Exim - an Internet mail transport agent *
3 *************************************************/
5 /* Copyright (c) The Exim Maintainers 2020 - 2024 */
6 /* Copyright (c) University of Cambridge 1995 - 2018 */
7 /* See the file NOTICE for conditions of use and distribution. */
8 /* SPDX-License-Identifier: GPL-2.0-or-later */
10 /* Functions for reading the configuration file, and for displaying
11 overall configuration values. Thanks to Brian Candler for the original
12 implementation of the conditional .ifdef etc. */
17 # include "macro_predef.h"
20 #define READCONF_DEBUG if (FALSE) /* Change to TRUE to enable */
23 static uschar * syslog_facility_str;
24 static void fn_smtp_receive_timeout(const uschar *, const uschar *, unsigned);
26 /*************************************************
27 * Main configuration options *
28 *************************************************/
30 /* The list of options that can be set in the main configuration file. This
31 must be in alphabetic order because it is searched by binary chop. */
33 static optionlist optionlist_config[] = {
34 { "*set_exim_group", opt_bool|opt_hidden, {&exim_gid_set} },
35 { "*set_exim_user", opt_bool|opt_hidden, {&exim_uid_set} },
36 { "*set_system_filter_group", opt_bool|opt_hidden, {&system_filter_gid_set} },
37 { "*set_system_filter_user", opt_bool|opt_hidden, {&system_filter_uid_set} },
38 { "accept_8bitmime", opt_bool, {&accept_8bitmime} },
39 { "acl_not_smtp", opt_stringptr, {&acl_not_smtp} },
40 #ifdef WITH_CONTENT_SCAN
41 { "acl_not_smtp_mime", opt_stringptr, {&acl_not_smtp_mime} },
43 { "acl_not_smtp_start", opt_stringptr, {&acl_not_smtp_start} },
44 { "acl_smtp_auth", opt_stringptr, {&acl_smtp_auth} },
45 { "acl_smtp_connect", opt_stringptr, {&acl_smtp_connect} },
46 { "acl_smtp_data", opt_stringptr, {&acl_smtp_data} },
48 { "acl_smtp_data_prdr", opt_stringptr, {&acl_smtp_data_prdr} },
51 { "acl_smtp_dkim", opt_stringptr, {&acl_smtp_dkim} },
53 { "acl_smtp_etrn", opt_stringptr, {&acl_smtp_etrn} },
54 { "acl_smtp_expn", opt_stringptr, {&acl_smtp_expn} },
55 { "acl_smtp_helo", opt_stringptr, {&acl_smtp_helo} },
56 { "acl_smtp_mail", opt_stringptr, {&acl_smtp_mail} },
57 { "acl_smtp_mailauth", opt_stringptr, {&acl_smtp_mailauth} },
58 #ifdef WITH_CONTENT_SCAN
59 { "acl_smtp_mime", opt_stringptr, {&acl_smtp_mime} },
61 { "acl_smtp_notquit", opt_stringptr, {&acl_smtp_notquit} },
62 { "acl_smtp_predata", opt_stringptr, {&acl_smtp_predata} },
63 { "acl_smtp_quit", opt_stringptr, {&acl_smtp_quit} },
64 { "acl_smtp_rcpt", opt_stringptr, {&acl_smtp_rcpt} },
66 { "acl_smtp_starttls", opt_stringptr, {&acl_smtp_starttls} },
68 { "acl_smtp_vrfy", opt_stringptr, {&acl_smtp_vrfy} },
69 #ifndef DISABLE_WELLKNOWN
70 { "acl_smtp_wellknown", opt_stringptr, {&acl_smtp_wellknown} },
72 { "add_environment", opt_stringptr, {&add_environment} },
73 { "admin_groups", opt_gidlist, {&admin_groups} },
74 { "allow_domain_literals", opt_bool, {&allow_domain_literals} },
75 { "allow_mx_to_ip", opt_bool, {&allow_mx_to_ip} },
76 { "allow_utf8_domains", opt_bool, {&allow_utf8_domains} },
77 { "auth_advertise_hosts", opt_stringptr, {&auth_advertise_hosts} },
78 { "auto_thaw", opt_time, {&auto_thaw} },
79 #ifdef WITH_CONTENT_SCAN
80 { "av_scanner", opt_stringptr, {&av_scanner} },
82 { "bi_command", opt_stringptr, {&bi_command} },
83 #ifdef EXPERIMENTAL_BRIGHTMAIL
84 { "bmi_config_file", opt_stringptr, {&bmi_config_file} },
86 { "bounce_message_file", opt_stringptr, {&bounce_message_file} },
87 { "bounce_message_text", opt_stringptr, {&bounce_message_text} },
88 { "bounce_return_body", opt_bool, {&bounce_return_body} },
89 { "bounce_return_linesize_limit", opt_mkint, {&bounce_return_linesize_limit} },
90 { "bounce_return_message", opt_bool, {&bounce_return_message} },
91 { "bounce_return_size_limit", opt_mkint, {&bounce_return_size_limit} },
92 { "bounce_sender_authentication",opt_stringptr,{&bounce_sender_authentication} },
93 { "callout_domain_negative_expire", opt_time, {&callout_cache_domain_negative_expire} },
94 { "callout_domain_positive_expire", opt_time, {&callout_cache_domain_positive_expire} },
95 { "callout_negative_expire", opt_time, {&callout_cache_negative_expire} },
96 { "callout_positive_expire", opt_time, {&callout_cache_positive_expire} },
97 { "callout_random_local_part",opt_stringptr, {&callout_random_local_part} },
98 { "check_log_inodes", opt_int, {&check_log_inodes} },
99 { "check_log_space", opt_Kint, {&check_log_space} },
100 { "check_rfc2047_length", opt_bool, {&check_rfc2047_length} },
101 { "check_spool_inodes", opt_int, {&check_spool_inodes} },
102 { "check_spool_space", opt_Kint, {&check_spool_space} },
103 { "chunking_advertise_hosts", opt_stringptr, {&chunking_advertise_hosts} },
104 { "commandline_checks_require_admin", opt_bool,{&commandline_checks_require_admin} },
105 { "daemon_smtp_port", opt_stringptr|opt_hidden, {&daemon_smtp_port} },
106 { "daemon_smtp_ports", opt_stringptr, {&daemon_smtp_port} },
107 { "daemon_startup_retries", opt_int, {&daemon_startup_retries} },
108 { "daemon_startup_sleep", opt_time, {&daemon_startup_sleep} },
109 #ifdef EXPERIMENTAL_DCC
110 { "dcc_direct_add_header", opt_bool, {&dcc_direct_add_header} },
111 { "dccifd_address", opt_stringptr, {&dccifd_address} },
112 { "dccifd_options", opt_stringptr, {&dccifd_options} },
114 { "debug_store", opt_bool, {&debug_store} },
115 { "delay_warning", opt_timelist, {&delay_warning} },
116 { "delay_warning_condition", opt_stringptr, {&delay_warning_condition} },
117 { "deliver_drop_privilege", opt_bool, {&deliver_drop_privilege} },
118 { "deliver_queue_load_max", opt_fixed, {&deliver_queue_load_max} },
119 { "delivery_date_remove", opt_bool, {&delivery_date_remove} },
120 #ifdef ENABLE_DISABLE_FSYNC
121 { "disable_fsync", opt_bool, {&disable_fsync} },
123 { "disable_ipv6", opt_bool, {&disable_ipv6} },
125 { "dkim_verify_hashes", opt_stringptr, {&dkim_verify_hashes} },
126 { "dkim_verify_keytypes", opt_stringptr, {&dkim_verify_keytypes} },
127 { "dkim_verify_min_keysizes", opt_stringptr, {&dkim_verify_min_keysizes} },
128 { "dkim_verify_minimal", opt_bool, {&dkim_verify_minimal} },
129 { "dkim_verify_signers", opt_stringptr, {&dkim_verify_signers} },
132 { "dmarc_forensic_sender", opt_stringptr, {&dmarc_forensic_sender} },
133 { "dmarc_history_file", opt_stringptr, {&dmarc_history_file} },
134 { "dmarc_tld_file", opt_stringptr, {&dmarc_tld_file} },
136 { "dns_again_means_nonexist", opt_stringptr, {&dns_again_means_nonexist} },
137 { "dns_check_names_pattern", opt_stringptr, {&check_dns_names_pattern} },
138 { "dns_cname_loops", opt_int, {&dns_cname_loops} },
139 { "dns_csa_search_limit", opt_int, {&dns_csa_search_limit} },
140 { "dns_csa_use_reverse", opt_bool, {&dns_csa_use_reverse} },
141 { "dns_dnssec_ok", opt_int, {&dns_dnssec_ok} },
142 { "dns_ipv4_lookup", opt_stringptr, {&dns_ipv4_lookup} },
143 { "dns_retrans", opt_time, {&dns_retrans} },
144 { "dns_retry", opt_int, {&dns_retry} },
145 { "dns_trust_aa", opt_stringptr, {&dns_trust_aa} },
146 { "dns_use_edns0", opt_int, {&dns_use_edns0} },
147 /* This option is now a no-op, retained for compatibility */
148 { "drop_cr", opt_bool, {&drop_cr} },
149 /*********************************************************/
150 { "dsn_advertise_hosts", opt_stringptr, {&dsn_advertise_hosts} },
151 { "dsn_from", opt_stringptr, {&dsn_from} },
152 { "envelope_to_remove", opt_bool, {&envelope_to_remove} },
153 { "errors_copy", opt_stringptr, {&errors_copy} },
154 { "errors_reply_to", opt_stringptr, {&errors_reply_to} },
155 #ifndef DISABLE_EVENT
156 { "event_action", opt_stringptr, {&event_action} },
158 { "exim_group", opt_gid, {&exim_gid} },
159 { "exim_path", opt_stringptr, {&exim_path} },
160 { "exim_user", opt_uid, {&exim_uid} },
161 { "exim_version", opt_stringptr, {&version_string} },
162 { "extra_local_interfaces", opt_stringptr, {&extra_local_interfaces} },
163 { "extract_addresses_remove_arguments", opt_bool, {&extract_addresses_remove_arguments} },
164 { "finduser_retries", opt_int, {&finduser_retries} },
165 { "freeze_tell", opt_stringptr, {&freeze_tell} },
166 { "gecos_name", opt_stringptr, {&gecos_name} },
167 { "gecos_pattern", opt_stringptr, {&gecos_pattern} },
169 { "gnutls_allow_auto_pkcs11", opt_bool, {&gnutls_allow_auto_pkcs11} },
170 { "gnutls_compat_mode", opt_bool, {&gnutls_compat_mode} },
172 { "header_line_maxsize", opt_int, {&header_line_maxsize} },
173 { "header_maxsize", opt_int, {&header_maxsize} },
174 { "headers_charset", opt_stringptr, {&headers_charset} },
175 { "helo_accept_junk_hosts", opt_stringptr, {&helo_accept_junk_hosts} },
176 { "helo_allow_chars", opt_stringptr, {&helo_allow_chars} },
177 { "helo_lookup_domains", opt_stringptr, {&helo_lookup_domains} },
178 { "helo_try_verify_hosts", opt_stringptr, {&helo_try_verify_hosts} },
179 { "helo_verify_hosts", opt_stringptr, {&helo_verify_hosts} },
180 { "hold_domains", opt_stringptr, {&hold_domains} },
181 { "host_lookup", opt_stringptr, {&host_lookup} },
182 { "host_lookup_order", opt_stringptr, {&host_lookup_order} },
183 { "host_reject_connection", opt_stringptr, {&host_reject_connection} },
184 { "hosts_connection_nolog", opt_stringptr, {&hosts_connection_nolog} },
186 { "hosts_proxy", opt_stringptr, {&hosts_proxy} },
189 { "hosts_require_alpn", opt_stringptr, {&hosts_require_alpn} },
191 { "hosts_require_helo", opt_stringptr, {&hosts_require_helo} },
192 { "hosts_treat_as_local", opt_stringptr, {&hosts_treat_as_local} },
193 #ifdef EXPERIMENTAL_XCLIENT
194 { "hosts_xclient", opt_stringptr, {&hosts_xclient} },
197 { "ibase_servers", opt_stringptr, {&ibase_servers} },
199 { "ignore_bounce_errors_after", opt_time, {&ignore_bounce_errors_after} },
200 { "ignore_fromline_hosts", opt_stringptr, {&ignore_fromline_hosts} },
201 { "ignore_fromline_local", opt_bool, {&ignore_fromline_local} },
202 { "keep_environment", opt_stringptr, {&keep_environment} },
203 { "keep_malformed", opt_time, {&keep_malformed} },
205 { "ldap_ca_cert_dir", opt_stringptr, {&eldap_ca_cert_dir} },
206 { "ldap_ca_cert_file", opt_stringptr, {&eldap_ca_cert_file} },
207 { "ldap_cert_file", opt_stringptr, {&eldap_cert_file} },
208 { "ldap_cert_key", opt_stringptr, {&eldap_cert_key} },
209 { "ldap_cipher_suite", opt_stringptr, {&eldap_cipher_suite} },
210 { "ldap_default_servers", opt_stringptr, {&eldap_default_servers} },
211 { "ldap_require_cert", opt_stringptr, {&eldap_require_cert} },
212 { "ldap_start_tls", opt_bool, {&eldap_start_tls} },
213 { "ldap_version", opt_int, {&eldap_version} },
215 #ifndef DISABLE_ESMTP_LIMITS
216 { "limits_advertise_hosts", opt_stringptr, {&limits_advertise_hosts} },
218 { "local_from_check", opt_bool, {&local_from_check} },
219 { "local_from_prefix", opt_stringptr, {&local_from_prefix} },
220 { "local_from_suffix", opt_stringptr, {&local_from_suffix} },
221 { "local_interfaces", opt_stringptr, {&local_interfaces} },
222 #ifdef HAVE_LOCAL_SCAN
223 { "local_scan_timeout", opt_time, {&local_scan_timeout} },
225 { "local_sender_retain", opt_bool, {&local_sender_retain} },
226 { "localhost_number", opt_stringptr, {&host_number_string} },
227 { "log_file_path", opt_stringptr, {&log_file_path} },
228 { "log_selector", opt_stringptr, {&log_selector_string} },
229 { "log_timezone", opt_bool, {&log_timezone} },
230 { "lookup_open_max", opt_int, {&lookup_open_max} },
231 { "max_username_length", opt_int, {&max_username_length} },
232 { "message_body_newlines", opt_bool, {&message_body_newlines} },
233 { "message_body_visible", opt_mkint, {&message_body_visible} },
234 { "message_id_header_domain", opt_stringptr, {&message_id_domain} },
235 { "message_id_header_text", opt_stringptr, {&message_id_text} },
236 { "message_logs", opt_bool, {&message_logs} },
237 { "message_size_limit", opt_stringptr, {&message_size_limit} },
238 #ifdef SUPPORT_MOVE_FROZEN_MESSAGES
239 { "move_frozen_messages", opt_bool, {&move_frozen_messages} },
241 { "mua_wrapper", opt_bool, {&mua_wrapper} },
243 { "mysql_servers", opt_stringptr, {&mysql_servers} },
245 { "never_users", opt_uidlist, {&never_users} },
246 { "notifier_socket", opt_stringptr, {¬ifier_socket} },
248 { "openssl_options", opt_stringptr, {&openssl_options} },
251 { "oracle_servers", opt_stringptr, {&oracle_servers} },
253 { "panic_coredump", opt_bool, {&panic_coredump} },
254 { "percent_hack_domains", opt_stringptr, {&percent_hack_domains} },
256 { "perl_at_start", opt_bool, {&opt_perl_at_start} },
257 { "perl_startup", opt_stringptr, {&opt_perl_startup} },
258 { "perl_taintmode", opt_bool, {&opt_perl_taintmode} },
261 { "pgsql_servers", opt_stringptr, {&pgsql_servers} },
263 { "pid_file_path", opt_stringptr, {&pid_file_path} },
264 { "pipelining_advertise_hosts", opt_stringptr, {&pipelining_advertise_hosts} },
265 #ifndef DISABLE_PIPE_CONNECT
266 { "pipelining_connect_advertise_hosts", opt_stringptr,
267 {&pipe_connect_advertise_hosts} },
270 { "prdr_enable", opt_bool, {&prdr_enable} },
272 { "preserve_message_logs", opt_bool, {&preserve_message_logs} },
273 { "primary_hostname", opt_stringptr, {&primary_hostname} },
274 { "print_topbitchars", opt_bool, {&print_topbitchars} },
275 { "process_log_path", opt_stringptr, {&process_log_path} },
276 { "prod_requires_admin", opt_bool, {&prod_requires_admin} },
278 { "proxy_protocol_timeout", opt_time, {&proxy_protocol_timeout} },
280 { "qualify_domain", opt_stringptr, {&qualify_domain_sender} },
281 { "qualify_recipient", opt_stringptr, {&qualify_domain_recipient} },
282 { "queue_domains", opt_stringptr, {&queue_domains} },
283 #ifndef DISABLE_QUEUE_RAMP
284 { "queue_fast_ramp", opt_bool, {&queue_fast_ramp} },
286 { "queue_list_requires_admin",opt_bool, {&queue_list_requires_admin} },
287 { "queue_only", opt_bool, {&queue_only} },
288 { "queue_only_file", opt_stringptr, {&queue_only_file} },
289 { "queue_only_load", opt_fixed, {&queue_only_load} },
290 { "queue_only_load_latch", opt_bool, {&queue_only_load_latch} },
291 { "queue_only_override", opt_bool, {&queue_only_override} },
292 { "queue_run_in_order", opt_bool, {&queue_run_in_order} },
293 { "queue_run_max", opt_stringptr, {&queue_run_max} },
294 { "queue_smtp_domains", opt_stringptr, {&queue_smtp_domains} },
295 { "receive_timeout", opt_time, {&receive_timeout} },
296 { "received_header_text", opt_stringptr, {&received_header_text} },
297 { "received_headers_max", opt_int, {&received_headers_max} },
298 { "recipient_unqualified_hosts", opt_stringptr, {&recipient_unqualified_hosts} },
299 { "recipients_max", opt_stringptr, {&recipients_max} },
300 { "recipients_max_reject", opt_bool, {&recipients_max_reject} },
302 { "redis_servers", opt_stringptr, {&redis_servers} },
304 { "remote_max_parallel", opt_int, {&remote_max_parallel} },
305 { "remote_sort_domains", opt_stringptr, {&remote_sort_domains} },
306 { "retry_data_expire", opt_time, {&retry_data_expire} },
307 { "retry_interval_max", opt_time, {&retry_interval_max} },
308 { "return_path_remove", opt_bool, {&return_path_remove} },
309 { "return_size_limit", opt_mkint|opt_hidden, {&bounce_return_size_limit} },
310 { "rfc1413_hosts", opt_stringptr, {&rfc1413_hosts} },
311 { "rfc1413_query_timeout", opt_time, {&rfc1413_query_timeout} },
312 { "sender_unqualified_hosts", opt_stringptr, {&sender_unqualified_hosts} },
313 { "slow_lookup_log", opt_int, {&slow_lookup_log} },
314 { "smtp_accept_keepalive", opt_bool, {&smtp_accept_keepalive} },
315 { "smtp_accept_max", opt_int, {&smtp_accept_max} },
316 { "smtp_accept_max_nonmail", opt_int, {&smtp_accept_max_nonmail} },
317 { "smtp_accept_max_nonmail_hosts", opt_stringptr, {&smtp_accept_max_nonmail_hosts} },
318 { "smtp_accept_max_per_connection", opt_stringptr, {&smtp_accept_max_per_connection} },
319 { "smtp_accept_max_per_host", opt_stringptr, {&smtp_accept_max_per_host} },
320 { "smtp_accept_queue", opt_int, {&smtp_accept_queue} },
321 { "smtp_accept_queue_per_connection", opt_int, {&smtp_accept_queue_per_connection} },
322 { "smtp_accept_reserve", opt_int, {&smtp_accept_reserve} },
323 { "smtp_active_hostname", opt_stringptr, {&raw_active_hostname} },
324 { "smtp_backlog_monitor", opt_int, {&smtp_backlog_monitor} },
325 { "smtp_banner", opt_stringptr, {&smtp_banner} },
326 { "smtp_check_spool_space", opt_bool, {&smtp_check_spool_space} },
327 { "smtp_connect_backlog", opt_int, {&smtp_connect_backlog} },
328 { "smtp_enforce_sync", opt_bool, {&smtp_enforce_sync} },
329 { "smtp_etrn_command", opt_stringptr, {&smtp_etrn_command} },
330 { "smtp_etrn_serialize", opt_bool, {&smtp_etrn_serialize} },
331 { "smtp_load_reserve", opt_fixed, {&smtp_load_reserve} },
332 { "smtp_max_synprot_errors", opt_int, {&smtp_max_synprot_errors} },
333 { "smtp_max_unknown_commands",opt_int, {&smtp_max_unknown_commands} },
334 { "smtp_ratelimit_hosts", opt_stringptr, {&smtp_ratelimit_hosts} },
335 { "smtp_ratelimit_mail", opt_stringptr, {&smtp_ratelimit_mail} },
336 { "smtp_ratelimit_rcpt", opt_stringptr, {&smtp_ratelimit_rcpt} },
337 { "smtp_receive_timeout", opt_func, {.fn = &fn_smtp_receive_timeout} },
338 { "smtp_reserve_hosts", opt_stringptr, {&smtp_reserve_hosts} },
339 { "smtp_return_error_details",opt_bool, {&smtp_return_error_details} },
341 { "smtputf8_advertise_hosts", opt_stringptr, {&smtputf8_advertise_hosts} },
343 #ifdef WITH_CONTENT_SCAN
344 { "spamd_address", opt_stringptr, {&spamd_address} },
347 { "spf_guess", opt_stringptr, {&spf_guess} },
348 { "spf_smtp_comment_template",opt_stringptr, {&spf_smtp_comment_template} },
350 { "split_spool_directory", opt_bool, {&split_spool_directory} },
351 { "spool_directory", opt_stringptr, {&spool_directory} },
352 { "spool_wireformat", opt_bool, {&spool_wireformat} },
354 { "sqlite_dbfile", opt_stringptr, {&sqlite_dbfile} },
355 { "sqlite_lock_timeout", opt_int, {&sqlite_lock_timeout} },
357 { "strict_acl_vars", opt_bool, {&strict_acl_vars} },
358 { "strip_excess_angle_brackets", opt_bool, {&strip_excess_angle_brackets} },
359 { "strip_trailing_dot", opt_bool, {&strip_trailing_dot} },
360 { "syslog_duplication", opt_bool, {&syslog_duplication} },
361 { "syslog_facility", opt_stringptr, {&syslog_facility_str} },
362 { "syslog_pid", opt_bool, {&syslog_pid} },
363 { "syslog_processname", opt_stringptr, {&syslog_processname} },
364 { "syslog_timestamp", opt_bool, {&syslog_timestamp} },
365 { "system_filter", opt_stringptr, {&system_filter} },
366 { "system_filter_directory_transport", opt_stringptr,{&system_filter_directory_transport} },
367 { "system_filter_file_transport",opt_stringptr,{&system_filter_file_transport} },
368 { "system_filter_group", opt_gid, {&system_filter_gid} },
369 { "system_filter_pipe_transport",opt_stringptr,{&system_filter_pipe_transport} },
370 { "system_filter_reply_transport",opt_stringptr,{&system_filter_reply_transport} },
371 { "system_filter_user", opt_uid, {&system_filter_uid} },
372 { "tcp_nodelay", opt_bool, {&tcp_nodelay} },
373 #ifdef USE_TCP_WRAPPERS
374 { "tcp_wrappers_daemon_name", opt_stringptr, {&tcp_wrappers_daemon_name} },
376 { "timeout_frozen_after", opt_time, {&timeout_frozen_after} },
377 { "timezone", opt_stringptr, {&timezone_string} },
378 { "tls_advertise_hosts", opt_stringptr, {&tls_advertise_hosts} },
380 { "tls_alpn", opt_stringptr, {&tls_alpn} },
381 { "tls_certificate", opt_stringptr, {&tls_certificate} },
382 { "tls_crl", opt_stringptr, {&tls_crl} },
383 { "tls_dh_max_bits", opt_int, {&tls_dh_max_bits} },
384 { "tls_dhparam", opt_stringptr, {&tls_dhparam} },
385 { "tls_eccurve", opt_stringptr, {&tls_eccurve} },
386 # ifndef DISABLE_OCSP
387 { "tls_ocsp_file", opt_stringptr, {&tls_ocsp_file} },
389 { "tls_on_connect_ports", opt_stringptr, {&tls_in.on_connect_ports} },
390 { "tls_privatekey", opt_stringptr, {&tls_privatekey} },
391 { "tls_remember_esmtp", opt_bool, {&tls_remember_esmtp} },
392 { "tls_require_ciphers", opt_stringptr, {&tls_require_ciphers} },
393 # ifndef DISABLE_TLS_RESUME
394 { "tls_resumption_hosts", opt_stringptr, {&tls_resumption_hosts} },
396 { "tls_try_verify_hosts", opt_stringptr, {&tls_try_verify_hosts} },
397 { "tls_verify_certificates", opt_stringptr, {&tls_verify_certificates} },
398 { "tls_verify_hosts", opt_stringptr, {&tls_verify_hosts} },
400 { "trusted_groups", opt_gidlist, {&trusted_groups} },
401 { "trusted_users", opt_uidlist, {&trusted_users} },
402 { "unknown_login", opt_stringptr, {&unknown_login} },
403 { "unknown_username", opt_stringptr, {&unknown_username} },
404 { "untrusted_set_sender", opt_stringptr, {&untrusted_set_sender} },
405 { "uucp_from_pattern", opt_stringptr, {&uucp_from_pattern} },
406 { "uucp_from_sender", opt_stringptr, {&uucp_from_sender} },
407 { "warn_message_file", opt_stringptr, {&warn_message_file} },
408 #ifndef DISABLE_WELLKNOWN
409 { "wellknown_advertise_hosts",opt_stringptr, {&wellknown_advertise_hosts} },
411 { "write_rejectlog", opt_bool, {&write_rejectlog} },
415 static int optionlist_config_size = nelem(optionlist_config);
422 fn_smtp_receive_timeout(const uschar * name, const uschar * str, unsigned flags) {/*Dummy*/}
427 options_from_list(optionlist_config, nelem(optionlist_config), US"MAIN", NULL);
433 uschar buf[EXIM_DRIVERNAME_MAX];
435 options_from_list(optionlist_auths, optionlist_auths_size,
436 US"AUTHENTICATORS", NULL);
438 for (struct auth_info * ai = auths_available; ai->drinfo.driver_name[0]; ai++)
440 driver_info * di = &ai->drinfo;
441 spf(buf, sizeof(buf), US"_DRIVER_AUTHENTICATOR_%T", di->driver_name);
442 builtin_macro_create(buf);
443 options_from_list(di->options, (unsigned)*di->options_count,
444 US"AUTHENTICATOR", di->driver_name);
446 if (ai->macros_create) (ai->macros_create)();
451 options_logging(void)
453 uschar buf[EXIM_DRIVERNAME_MAX];
455 for (bit_table * bp = log_options; bp < log_options + log_options_count; bp++)
457 spf(buf, sizeof(buf), US"_LOG_%T", bp->name);
458 builtin_macro_create(buf);
463 #else /*!MACRO_PREDEF*/
465 extern char **environ;
467 static void save_config_line(const uschar* line);
468 static void save_config_position(const uschar *file, int line);
469 static void print_config(BOOL admin, BOOL terse);
472 #define CSTATE_STACK_SIZE 10
474 const uschar *config_directory = NULL;
477 /* Structure for chain (stack) of .included files */
479 typedef struct config_file_item {
480 struct config_file_item *next;
481 const uschar *filename;
482 const uschar *directory;
487 /* Structure for chain of configuration lines (-bP config) */
489 typedef struct config_line_item {
490 struct config_line_item *next;
494 static config_line_item* config_lines;
496 /* Structure of table of conditional words and their state transitions */
498 typedef struct cond_item {
506 /* Structure of table of syslog facility names and values */
508 typedef struct syslog_fac_item {
514 static const uschar * const hidden = US"<value not displayable>";
516 /* Static variables */
518 static config_file_item *config_file_stack = NULL; /* For includes */
520 static uschar *syslog_facility_str = NULL;
521 static uschar next_section[24];
522 static uschar time_buffer[24];
524 /* State variables for conditional loading (.ifdef / .else / .endif) */
526 static int cstate = 0;
527 static int cstate_stack_ptr = -1;
528 static int cstate_stack[CSTATE_STACK_SIZE];
530 /* Table of state transitions for handling conditional inclusions. There are
531 four possible state transitions:
535 .elifdef true (or .else)
538 .endif just causes the previous cstate to be popped off the stack */
540 static int next_cstate[3][4] =
542 /* State 0: reading from file, or reading until next .else or .endif */
544 /* State 1: condition failed, skipping until next .else or .endif */
546 /* State 2: skipping until .endif */
550 /* Table of conditionals and the states to set. For each name, there are four
551 values: the length of the name (to save computing it each time), the state to
552 set if a macro was found in the line, the state to set if a macro was not found
553 in the line, and a stack manipulation setting which is:
555 -1 pull state value off the stack
556 0 don't alter the stack
557 +1 push value onto stack, before setting new state
560 static cond_item cond_list[] = {
561 { US"ifdef", 5, 0, 1, 1 },
562 { US"ifndef", 6, 1, 0, 1 },
563 { US"elifdef", 7, 2, 3, 0 },
564 { US"elifndef", 8, 3, 2, 0 },
565 { US"else", 4, 2, 2, 0 },
566 { US"endif", 5, 0, 0, -1 }
569 static int cond_list_size = sizeof(cond_list)/sizeof(cond_item);
571 /* Table of syslog facility names and their values */
573 static syslog_fac_item syslog_list[] = {
574 { US"mail", LOG_MAIL },
575 { US"user", LOG_USER },
576 { US"news", LOG_NEWS },
577 { US"uucp", LOG_UUCP },
578 { US"local0", LOG_LOCAL0 },
579 { US"local1", LOG_LOCAL1 },
580 { US"local2", LOG_LOCAL2 },
581 { US"local3", LOG_LOCAL3 },
582 { US"local4", LOG_LOCAL4 },
583 { US"local5", LOG_LOCAL5 },
584 { US"local6", LOG_LOCAL6 },
585 { US"local7", LOG_LOCAL7 },
586 { US"daemon", LOG_DAEMON }
589 static int syslog_list_size = sizeof(syslog_list)/sizeof(syslog_fac_item);
592 #define opt_fn_print BIT(0)
593 #define opt_fn_print_label BIT(1)
596 /*************************************************
597 * Find the name of an option *
598 *************************************************/
600 /* This function is to aid debugging. Various functions take arguments that are
601 pointer variables in the options table or in option tables for various drivers.
602 For debugging output, it is useful to be able to find the name of the option
603 which is currently being processed. This function finds it, if it exists, by
604 searching the table(s) for a value with the given content.
606 Arguments: a value that is presumed to be in the table above
607 Returns: the option name, or an empty string
611 readconf_find_option(void * listptr)
613 uschar * list = * USS listptr;
614 const uschar * name = NULL, * drname = NULL;
616 for (optionlist * o = optionlist_config; /* main-config options */
617 o < optionlist_config + optionlist_config_size; o++)
618 if (listptr == o->v.value)
622 for (const driver_instance * rd = (driver_instance *)routers;
623 rd; rd = rd->next) if (Ustrcmp(rd->name, router_name) == 0)
625 const router_instance * r = (router_instance *)rd;
626 const router_info * ri = (router_info *)rd->info;
628 /* Check for a listptr match first */
630 for (optionlist * o = optionlist_routers; /* generic options */
631 o < optionlist_routers + optionlist_routers_size; o++)
632 if ( (o->type & opt_mask) == opt_stringptr
633 && listptr == CS r + o->v.offset)
636 for (optionlist * o = ri->drinfo.options; /* private options */
637 o < ri->drinfo.options + *ri->drinfo.options_count; o++)
638 if ( (o->type & opt_mask) == opt_stringptr
639 && listptr == CS rd->options_block + o->v.offset)
642 /* Check for a list addr match, unless null */
646 for (optionlist * o = optionlist_routers; /* generic options */
647 o < optionlist_routers + optionlist_routers_size; o++)
648 if ( (o->type & opt_mask) == opt_stringptr
649 && list == * USS(CS r + o->v.offset))
651 return string_sprintf("DUP: %s %s vs. %s %s",
652 drname, name, rd->name, o->name);
654 { name = US o->name; drname = rd->name; }
656 for (optionlist * o = ri->drinfo.options; /* private options */
657 o < ri->drinfo.options + *ri->drinfo.options_count; o++)
658 if ( (o->type & opt_mask) == opt_stringptr
659 && list == * USS(CS rd->options_block + o->v.offset))
661 return string_sprintf("DUP: %s %s vs. %s %s",
662 drname, name, rd->name, o->name);
664 { name = US o->name; drname = rd->name; }
668 for (transport_instance * t = transports; t; t = t->drinst.next)
669 if (Ustrcmp(t->drinst.name, transport_name) == 0)
671 const transport_info * ti = t->drinst.info;
673 /* Check for a listptr match first */
675 for (optionlist * o = optionlist_transports; /* generic options */
676 o < optionlist_transports + optionlist_transports_size; o++)
677 if ( (o->type & opt_mask) == opt_stringptr
678 && listptr == CS t + o->v.offset)
681 for (optionlist * o = ti->drinfo.options; /* private options */
682 o < ti->drinfo.options + *ti->drinfo.options_count; o++)
683 if ( (o->type & opt_mask) == opt_stringptr
684 && listptr == CS t->drinst.options_block + o->v.offset)
687 /* Check for a list addr match, unless null */
691 for (optionlist * o = optionlist_transports; /* generic options */
692 o < optionlist_transports + optionlist_transports_size; o++)
693 if ( (o->type & opt_mask) == opt_stringptr
694 && list == * USS(CS t + o->v.offset))
696 return string_sprintf("DUP: %s %s vs. %s %s",
697 drname, name, t->drinst.name, o->name);
699 { name = US o->name; drname = t->drinst.name; }
701 for (optionlist * o = ti->drinfo.options; /* private options */
702 o < ti->drinfo.options + *ti->drinfo.options_count; o++)
703 if ( (o->type & opt_mask) == opt_stringptr
704 && list == * USS(CS t->drinst.options_block + o->v.offset))
706 return string_sprintf("DUP: %s %s vs. %s %s",
707 drname, name, t->drinst.name, o->name);
709 { name = US o->name; drname = t->drinst.name; }
712 return name ? name : US"";
718 /*************************************************
719 * Deal with an assignment to a macro *
720 *************************************************/
722 /* We have a new definition; append to the list.
725 name Name of the macro; will be copied
726 val Expansion result for the macro; will be copied
730 macro_create(const uschar * name, const uschar * val, BOOL command_line)
732 macro_item * m = store_get(sizeof(macro_item), GET_UNTAINTED);
734 READCONF_DEBUG fprintf(stderr, "%s: '%s' '%s'\n", __FUNCTION__, name, val);
736 m->command_line = command_line;
737 m->namelen = Ustrlen(name);
738 m->replen = Ustrlen(val);
739 m->name = string_copy(name);
740 m->replacement = string_copy(val);
752 /* This function is called when a line that starts with an upper case letter is
753 encountered. The argument "line" should contain a complete logical line, and
754 start with the first letter of the macro name. The macro name and the
755 replacement text are extracted and stored. Redefinition of existing,
756 non-command line, macros is permitted using '==' instead of '='.
759 s points to the start of the logical line
761 Returns: FALSE iff fatal error
765 macro_read_assignment(uschar *s)
767 uschar name[EXIM_DRIVERNAME_MAX];
772 while (isalnum(*s) || *s == '_')
774 if (namelen >= sizeof(name) - 1)
776 log_write(0, LOG_PANIC|LOG_CONFIG_IN,
777 "macro name too long (maximum is " SIZE_T_FMT " characters)", sizeof(name) - 1);
780 name[namelen++] = *s++;
784 Uskip_whitespace(&s);
787 log_write(0, LOG_PANIC|LOG_CONFIG_IN, "malformed macro definition");
796 Uskip_whitespace(&s);
798 /* If an existing macro of the same name was defined on the command line, we
799 just skip this definition. It's an error to attempt to redefine a macro without
800 redef set to TRUE, or to redefine a macro when it hasn't been defined earlier.
801 It is also an error to define a macro whose name begins with the name of a
802 previously defined macro. This is the requirement that make using a tree
803 for macros hard; we must check all macros for the substring. Perhaps a
804 sorted list, and a bsearch, would work?
805 Note: it is documented that the other way round works. */
807 for (m = macros; m; m = m->next)
809 if (Ustrcmp(m->name, name) == 0)
811 if (!m->command_line && !redef)
813 log_write(0, LOG_CONFIG|LOG_PANIC, "macro \"%s\" is already "
814 "defined (use \"==\" if you want to redefine it)", name);
820 if (m->namelen < namelen && Ustrstr(name, m->name) != NULL)
822 log_write(0, LOG_CONFIG|LOG_PANIC, "\"%s\" cannot be defined as "
823 "a macro because previously defined macro \"%s\" is a substring",
828 /* We cannot have this test, because it is documented that a substring
829 macro is permitted (there is even an example).
831 * if (m->namelen > namelen && Ustrstr(m->name, name) != NULL)
832 * log_write(0, LOG_CONFIG|LOG_PANIC_DIE, "\"%s\" cannot be defined as "
833 * "a macro because it is a substring of previously defined macro \"%s\"",
838 /* Check for an overriding command-line definition. */
840 if (m && m->command_line) return TRUE;
842 /* Redefinition must refer to an existing macro. */
847 m->replen = Ustrlen(s);
848 m->replacement = string_copy(s);
852 log_write(0, LOG_CONFIG|LOG_PANIC, "can't redefine an undefined macro "
857 /* We have a new definition. */
859 (void) macro_create(name, s, FALSE);
867 /* Process line for macros. The line is in big_buffer starting at offset len.
868 Expand big_buffer if needed. Handle definitions of new macros, and
869 macro expansions, rewriting the line in the buffer.
872 len Offset in buffer of start of line
873 newlen Pointer to offset of end of line, updated on return
874 macro_found Pointer to return that a macro was expanded
876 Return: pointer to first nonblank char in line
880 macros_expand(int len, int * newlen, BOOL * macro_found)
882 uschar * ss = big_buffer + len;
885 /* Find the true start of the physical line - leading spaces are always
888 Uskip_whitespace(&ss);
890 /* Process the physical line for macros. If this is the start of the logical
891 line, skip over initial text at the start of the line if it starts with an
892 upper case character followed by a sequence of name characters and an equals
893 sign, because that is the definition of a new macro, and we don't do
894 replacement therein. */
897 if (len == 0 && isupper(*s))
899 while (isalnum(*s) || *s == '_') s++;
900 if (Uskip_whitespace(&s) != '=') s = ss; /* Not a macro definition */
903 /* Skip leading chars which cannot start a macro name, to avoid multiple
904 pointless rescans in Ustrstr calls. */
906 while (*s && !isupper(*s) && !(*s == '_' && isupper(s[1]))) s++;
908 /* For each defined macro, scan the line (from after XXX= if present),
909 replacing all occurrences of the macro. */
911 *macro_found = FALSE;
912 if (*s) for (macro_item * m = *s == '_' ? macros : macros_user; m; m = m->next)
917 while (*s && !isupper(*s) && !(*s == '_' && isupper(s[1]))) s++;
921 while ((p = Ustrstr(t, m->name)) != NULL)
925 READCONF_DEBUG fprintf(stderr, "%s: matched '%s' in '%.*s'\n", __FUNCTION__,
926 m->name, (int) Ustrlen(ss)-1, ss);
927 /* Expand the buffer if necessary */
929 while (*newlen - m->namelen + m->replen + 1 > big_buffer_size)
931 int newsize = big_buffer_size + BIG_BUFFER_SIZE;
932 uschar *newbuffer = store_malloc(newsize);
933 memcpy(newbuffer, big_buffer, *newlen + 1);
934 p = newbuffer + (p - big_buffer);
935 s = newbuffer + (s - big_buffer);
936 ss = newbuffer + (ss - big_buffer);
937 t = newbuffer + (t - big_buffer);
938 big_buffer_size = newsize;
939 store_free(big_buffer);
940 big_buffer = newbuffer;
943 /* Shuffle the remaining characters up or down in the buffer before
944 copying in the replacement text. Don't rescan the replacement for this
948 if ((moveby = m->replen - m->namelen) != 0)
950 memmove(p + m->replen, pp, (big_buffer + *newlen) - pp + 1);
953 Ustrncpy(p, m->replacement, m->replen);
955 while (*t && !isupper(*t) && !(*t == '_' && isupper(t[1]))) t++;
960 /* An empty macro replacement at the start of a line could mean that ss no
961 longer points to the first non-blank character. */
963 Uskip_whitespace(&ss);
967 /*************************************************
968 * Read configuration line *
969 *************************************************/
971 /* A logical line of text is read from the configuration file into the big
972 buffer, taking account of macros, .includes, and continuations. The size of
973 big_buffer is increased if necessary. The count of configuration lines is
974 maintained. Physical input lines starting with # (ignoring leading white space,
975 and after macro replacement) and empty logical lines are always ignored.
976 Leading and trailing spaces are removed.
978 If we hit a line of the form "begin xxxx", the xxxx is placed in the
979 next_section vector, and the function returns NULL, indicating the end of a
980 configuration section. On end-of-file, NULL is returned with next_section
985 Returns: a pointer to the first non-blank in the line,
986 or NULL if eof or end of section is reached
990 get_config_line(void)
992 int startoffset = 0; /* To first non-blank char in logical line */
993 int len = 0; /* Of logical line so far */
998 /* Loop for handling continuation lines, skipping comments, and dealing with
1003 if (Ufgets(big_buffer+len, big_buffer_size-len, config_file) == NULL)
1005 if (config_file_stack != NULL) /* EOF inside .include */
1007 (void)fclose(config_file);
1008 config_file = config_file_stack->file;
1009 config_filename = config_file_stack->filename;
1010 config_directory = config_file_stack->directory;
1011 config_lineno = config_file_stack->lineno;
1012 config_file_stack = config_file_stack->next;
1014 save_config_position(config_filename, config_lineno);
1018 /* EOF at top level */
1020 if (cstate_stack_ptr >= 0)
1021 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1022 "Unexpected end of configuration file: .endif missing");
1024 if (len != 0) break; /* EOF after continuation */
1025 next_section[0] = 0; /* EOF at start of logical line */
1030 newlen = len + Ustrlen(big_buffer + len);
1032 if (config_lines && config_lineno == 1)
1033 save_config_position(config_filename, config_lineno);
1035 /* Handle pathologically long physical lines - yes, it did happen - by
1036 extending big_buffer at this point. The code also copes with very long
1039 while (newlen == big_buffer_size - 1 && big_buffer[newlen - 1] != '\n')
1042 big_buffer_size += BIG_BUFFER_SIZE;
1043 newbuffer = store_malloc(big_buffer_size);
1045 /* This use of strcpy is OK because we know that the string in the old
1046 buffer is shorter than the new buffer. */
1048 Ustrcpy(newbuffer, big_buffer);
1049 store_free(big_buffer);
1050 big_buffer = newbuffer;
1051 if (Ufgets(big_buffer+newlen, big_buffer_size-newlen, config_file) == NULL)
1053 newlen += Ustrlen(big_buffer + newlen);
1056 ss = macros_expand(len, &newlen, ¯o_found);
1058 /* Check for comment lines - these are physical lines. */
1060 if (*ss == '#') continue;
1062 /* Handle conditionals, which are also applied to physical lines. Conditions
1063 are of the form ".ifdef ANYTEXT" and are treated as true if any macro
1064 expansion occurred on the rest of the line. A preliminary test for the leading
1065 '.' saves effort on most lines. */
1071 /* Search the list of conditional directives */
1073 for (i = 0; i < cond_list_size; i++)
1076 cond_item *c = cond_list+i;
1077 if (Ustrncmp(ss+1, c->name, c->namelen) != 0) continue;
1079 /* The following character must be white space or end of string */
1081 n = ss[1 + c->namelen];
1082 if (n != ' ' && n != 't' && n != '\n' && n != 0) break;
1084 /* .ifdef and .ifndef push the current state onto the stack, then set
1085 a new one from the table. Stack overflow is an error */
1089 if (cstate_stack_ptr >= CSTATE_STACK_SIZE - 1)
1090 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1091 ".%s nested too deeply", c->name);
1092 cstate_stack[++cstate_stack_ptr] = cstate;
1093 cstate = next_cstate[cstate][macro_found? c->action1 : c->action2];
1096 /* For any of the others, stack underflow is an error. The next state
1097 comes either from the stack (.endif) or from the table. */
1101 if (cstate_stack_ptr < 0)
1102 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1103 ".%s without matching .ifdef", c->name);
1104 cstate = (c->pushpop < 0)? cstate_stack[cstate_stack_ptr--] :
1105 next_cstate[cstate][macro_found? c->action1 : c->action2];
1108 /* Having dealt with a directive, break the loop */
1113 /* If we have handled a conditional directive, continue with the next
1114 physical line. Otherwise, fall through. */
1116 if (i < cond_list_size) continue;
1119 /* If the conditional state is not 0 (actively using these lines), ignore
1122 if (cstate != 0) continue; /* Conditional skip */
1124 /* Handle .include lines - these are also physical lines. */
1126 if (Ustrncmp(ss, ".include", 8) == 0 &&
1128 (Ustrncmp(ss+8, "_if_exists", 10) == 0 && isspace(ss[18]))))
1131 int include_if_exists = isspace(ss[8]) ? 0 : 10;
1132 config_file_item *save;
1133 struct stat statbuf;
1135 ss += 9 + include_if_exists;
1136 Uskip_whitespace(&ss);
1137 t = ss + Ustrlen(ss);
1138 while (t > ss && isspace(t[-1])) t--;
1139 if (*ss == '\"' && t[-1] == '\"')
1146 /* We allow relative file names. For security reasons currently
1147 relative names not allowed with .include_if_exists. For .include_if_exists
1148 we need to check the permissions/ownership of the containing folder */
1150 if (include_if_exists) log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, ".include specifies a non-"
1151 "absolute path \"%s\"", ss);
1154 gstring * g = string_append(NULL, 3, config_directory, "/", ss);
1155 ss = string_from_gstring(g);
1158 if (include_if_exists != 0 && (Ustat(ss, &statbuf) != 0)) continue;
1161 save_config_position(config_filename, config_lineno);
1162 save = store_get(sizeof(config_file_item), GET_UNTAINTED);
1163 save->next = config_file_stack;
1164 config_file_stack = save;
1165 save->file = config_file;
1166 save->filename = config_filename;
1167 save->directory = config_directory;
1168 save->lineno = config_lineno;
1170 if (!(config_file = Ufopen(ss, "rb")))
1171 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "failed to open included "
1172 "configuration file %s", ss);
1174 config_filename = string_copy(ss);
1175 config_directory = string_copyn(ss, CUstrrchr(ss, '/') - ss);
1180 /* If this is the start of the logical line, remember where the non-blank
1181 data starts. Otherwise shuffle down continuation lines to remove leading
1185 startoffset = ss - big_buffer;
1188 s = big_buffer + len;
1191 memmove(s, ss, (newlen - len) - (ss - s) + 1);
1196 /* Accept the new addition to the line. Remove trailing white space. */
1199 while (len > 0 && isspace(big_buffer[len-1])) len--;
1200 big_buffer[len] = 0;
1202 /* We are done if the line does not end in backslash and contains some data.
1203 Empty logical lines are ignored. For continuations, remove the backslash and
1204 go round the loop to read the continuation line. */
1208 if (big_buffer[len-1] != '\\') break; /* End of logical line */
1209 big_buffer[--len] = 0; /* Remove backslash */
1211 } /* Loop for reading multiple physical lines */
1213 /* We now have a logical line. Test for the end of a configuration section (or,
1214 more accurately, for the start of the next section). Place the name of the next
1215 section in next_section, and return NULL. If the name given is longer than
1216 next_section, truncate it. It will be unrecognized later, because all the known
1217 section names do fit. Leave space for pluralizing. */
1219 s = big_buffer + startoffset; /* First non-space character */
1222 save_config_line(s);
1224 if (strncmpic(s, US"begin ", 6) == 0)
1227 Uskip_whitespace(&s);
1228 if (big_buffer + len - s > sizeof(next_section) - 2)
1229 s[sizeof(next_section) - 2] = 0;
1230 Ustrcpy(next_section, s);
1234 /* Return the first non-blank character. */
1241 /*************************************************
1243 *************************************************/
1245 /* The yield is the pointer to the next uschar. Names longer than the
1246 output space are silently truncated. This function is also used from acl.c when
1250 name where to put the name
1254 Returns: new input pointer
1258 readconf_readname(uschar * name, int len, const uschar * s)
1261 BOOL broken = FALSE;
1263 if (isalpha(Uskip_whitespace(&s)))
1264 while (isalnum(*s) || *s == '_')
1266 if (p < len-1) name[p++] = *s;
1276 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1277 "exim item name too long (>%d), unable to use \"%s\" (truncated)",
1280 Uskip_whitespace(&s);
1287 /*************************************************
1288 * Read a time value *
1289 *************************************************/
1291 /* This function is also called from outside, to read argument
1292 time values. The format of a time value is:
1294 [<n>w][<n>d][<n>h][<n>m][<n>s]
1296 as long as at least one is present. If a format error is encountered,
1297 return a negative value. The value must be terminated by the given
1302 terminator required terminating character
1303 return_msec if TRUE, allow fractional seconds and return milliseconds
1305 Returns: the time value, or -1 on syntax error
1306 value is seconds if return_msec is FALSE
1307 value is milliseconds if return_msec is TRUE
1311 readconf_readtime(const uschar *s, int terminator, BOOL return_msec)
1319 if (!isdigit(*s)) return -1;
1320 (void)sscanf(CCS s, "%d%n", &value, &count);
1325 case 'w': value *= 7;
1326 case 'd': value *= 24;
1327 case 'h': value *= 60;
1328 case 'm': value *= 60;
1333 if (!return_msec) return -1;
1334 (void)sscanf(CCS s, "%lf%n", &fraction, &count);
1336 if (*s++ != 's') return -1;
1337 yield += (int)(fraction * 1000.0);
1343 if (return_msec) value *= 1000;
1345 if (*s == terminator) return yield;
1347 /* Control never reaches here. */
1352 /*************************************************
1353 * Read a fixed point value *
1354 *************************************************/
1356 /* The value is returned *1000
1360 terminator required terminator
1362 Returns: the value, or -1 on error
1366 readconf_readfixed(const uschar *s, int terminator)
1370 if (!isdigit(*s)) return -1;
1371 (void)sscanf(CS s, "%d%n", &value, &count);
1373 yield = value * 1000;
1377 while (isdigit((*(++s))))
1379 yield += (*s - '0') * m;
1384 return (*s == terminator)? yield : (-1);
1389 /*************************************************
1390 * Find option in list *
1391 *************************************************/
1393 /* The lists are always in order, so binary chop can be used.
1396 name the option name to search for
1397 ol the first entry in the option list
1398 last one more than the offset of the last entry in the option list
1400 Returns: pointer to an option entry, or NULL if not found
1404 find_option(const uschar *name, optionlist *ol, int last)
1407 while (last > first)
1409 int middle = (first + last)/2;
1410 int c = Ustrcmp(name, ol[middle].name);
1412 if (c == 0) return ol + middle;
1413 else if (c > 0) first = middle + 1;
1421 /*************************************************
1422 * Find a set flag in option list *
1423 *************************************************/
1425 /* Because some versions of Unix make no restrictions on the values of uids and
1426 gids (even negative ones), we cannot represent "unset" by a special value.
1427 There is therefore a separate boolean variable for each one indicating whether
1428 a value is set or not. This function returns a pointer to the boolean, given
1429 the original option name. It is a major disaster if the flag cannot be found.
1432 name the name of the uid or gid option
1433 oltop points to the start of the relevant option list
1434 last one more than the offset of the last item in the option list
1435 data_block NULL when reading main options => data values in the option
1436 list are absolute addresses; otherwise they are byte offsets
1437 in data_block (used for driver options)
1439 Returns: a pointer to the boolean flag.
1443 get_set_flag(const uschar *name, optionlist *oltop, int last, void *data_block)
1446 uschar name2[EXIM_DRIVERNAME_MAX];
1447 sprintf(CS name2, "*set_%.50s", name);
1448 if (!(ol = find_option(name2, oltop, last)))
1449 log_write(0, LOG_MAIN|LOG_PANIC_DIE,
1450 "Exim internal error: missing set flag for %s", name);
1452 ? (BOOL *)(US data_block + ol->v.offset) : (BOOL *)ol->v.value;
1458 /*************************************************
1459 * Output extra characters message and die *
1460 *************************************************/
1462 /* Called when an option line has junk on the end. Sometimes this is because
1463 the sysadmin thinks comments are permitted.
1466 s points to the extra characters
1467 t1..t3 strings to insert in the log message
1469 Returns: doesn't return; dies
1473 extra_chars_error(const uschar *s, const uschar *t1, const uschar *t2, const uschar *t3)
1475 uschar *comment = US"";
1476 if (*s == '#') comment = US" (# is comment only at line start)";
1477 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1478 "extra characters follow %s%s%s%s", t1, t2, t3, comment);
1483 /*************************************************
1484 * Read rewrite information *
1485 *************************************************/
1487 /* Each line of rewrite information contains:
1489 . A complete address in the form user@domain, possibly with
1490 leading * for each part; or alternatively, a regex.
1492 . A replacement string (which will be expanded).
1494 . An optional sequence of one-letter flags, indicating which
1495 headers etc. to apply this rule to.
1497 All this is decoded and placed into a control block. The OR of the flags is
1498 maintained in a common word.
1501 p points to the string that makes up the rule
1502 existflags points to the overall flag word
1503 isglobal TRUE if reading global rewrite rules
1505 Returns: the control block for the parsed rule.
1508 static rewrite_rule *
1509 readconf_one_rewrite(const uschar *p, int *existflags, BOOL isglobal)
1511 rewrite_rule * next = store_get(sizeof(rewrite_rule), GET_UNTAINTED);
1514 next->key = string_dequote(&p);
1516 Uskip_whitespace(&p);
1518 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1519 "missing rewrite replacement string");
1522 next->replacement = string_dequote(&p);
1524 while (*p) switch (*p++)
1526 case ' ': case '\t': break;
1528 case 'q': next->flags |= rewrite_quit; break;
1529 case 'w': next->flags |= rewrite_whole; break;
1531 case 'h': next->flags |= rewrite_all_headers; break;
1532 case 's': next->flags |= rewrite_sender; break;
1533 case 'f': next->flags |= rewrite_from; break;
1534 case 't': next->flags |= rewrite_to; break;
1535 case 'c': next->flags |= rewrite_cc; break;
1536 case 'b': next->flags |= rewrite_bcc; break;
1537 case 'r': next->flags |= rewrite_replyto; break;
1539 case 'E': next->flags |= rewrite_all_envelope; break;
1540 case 'F': next->flags |= rewrite_envfrom; break;
1541 case 'T': next->flags |= rewrite_envto; break;
1543 case 'Q': next->flags |= rewrite_qualify; break;
1544 case 'R': next->flags |= rewrite_repeat; break;
1547 next->flags |= rewrite_smtp;
1548 if (next->key[0] != '^' && Ustrncmp(next->key, "\\N^", 3) != 0)
1549 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1550 "rewrite rule has the S flag but is not a regular expression");
1554 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1555 "unknown rewrite flag character '%c' "
1556 "(could be missing quotes round replacement item)", p[-1]);
1560 /* If no action flags are set, set all the "normal" rewrites. */
1562 if ((next->flags & (rewrite_all | rewrite_smtp)) == 0)
1563 next->flags |= isglobal? rewrite_all : rewrite_all_headers;
1565 /* Remember which exist, for optimization, and return the rule */
1567 *existflags |= next->flags;
1574 /*************************************************
1575 * Read global rewrite information *
1576 *************************************************/
1578 /* Each line is a single rewrite rule; it is parsed into a control block
1579 by readconf_one_rewrite(), and its flags are ORed into the global flag
1580 word rewrite_existflags. */
1583 readconf_rewrites(void)
1585 rewrite_rule **chain = &global_rewrite_rules;
1588 while ((p = get_config_line()) != NULL)
1590 rewrite_rule *next = readconf_one_rewrite(p, &rewrite_existflags, TRUE);
1592 chain = &(next->next);
1598 /*************************************************
1600 *************************************************/
1602 /* Strings are read into the normal store pool. As long we aren't too
1603 near the end of the current block, the string will just use what is necessary
1604 on the top of the stacking pool, because string_cat() uses the extension
1608 s the rest of the input line
1609 name the option name (for errors)
1611 Returns: pointer to the string
1615 read_string(const uschar *s, const uschar *name)
1620 if (*s != '\"') return string_copy(s);
1623 yield = string_dequote(&s);
1625 if (s == ss+1 || s[-1] != '\"')
1626 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1627 "missing quote at end of string value for %s", name);
1629 if (*s != 0) extra_chars_error(s, US"string value for ", name, US"");
1635 /*************************************************
1636 * Custom-handler options *
1637 *************************************************/
1639 fn_smtp_receive_timeout(const uschar * name, const uschar * str, unsigned flags)
1641 if (flags & opt_fn_print)
1643 if (flags & opt_fn_print_label) printf("%s = ", name);
1644 printf("%s\n", smtp_receive_timeout_s
1645 ? string_printing2(smtp_receive_timeout_s, SP_TAB)
1646 : readconf_printtime(smtp_receive_timeout));
1648 else if (*str == '$')
1649 smtp_receive_timeout_s = string_copy(str);
1652 /* "smtp_receive_timeout", opt_time, &smtp_receive_timeout */
1653 smtp_receive_timeout = readconf_readtime(str, 0, FALSE);
1654 if (smtp_receive_timeout < 0)
1655 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "invalid time value for %s",
1660 /*************************************************
1661 * Handle option line *
1662 *************************************************/
1664 /* This function is called from several places to process a line containing the
1665 setting of an option. The first argument is the line to be decoded; it has been
1666 checked not to be empty and not to start with '#'. Trailing newlines and white
1667 space have been removed. The second argument is a pointer to the list of
1668 variable names that are to be recognized, together with their types and
1669 locations, and the third argument gives the number of entries in the list.
1671 The fourth argument is a pointer to a data block. If it is NULL, then the data
1672 values in the options list are absolute addresses. Otherwise, they are byte
1673 offsets in the data block.
1675 String option data may continue onto several lines; this function reads further
1676 data from config_file if necessary.
1678 The yield of this function is normally zero. If a string continues onto
1679 multiple lines, then the data value is permitted to be followed by a comma
1680 or a semicolon (for use in drivers) and the yield is that character.
1683 buffer contains the configuration line to be handled
1684 oltop points to the start of the relevant option list
1685 last one more than the offset of the last item in the option list
1686 data_block NULL when reading main options => data values in the option
1687 list are absolute addresses; otherwise they are byte offsets
1688 in data_block when they have opt_public set; otherwise
1689 they are byte offsets in data_block->options_block.
1690 unknown_txt format string to use in panic message for unknown option;
1691 must contain %s for option name
1692 if given as NULL, don't panic on unknown option
1694 Returns: TRUE if an option was read successfully,
1695 FALSE false for an unknown option if unknown_txt == NULL,
1696 otherwise panic and die on an unknown option
1700 readconf_handle_option(uschar *buffer, optionlist *oltop, int last,
1701 void *data_block, uschar *unknown_txt)
1705 int count, type, value;
1709 BOOL boolvalue = TRUE;
1710 BOOL freesptr = TRUE;
1711 optionlist *ol, *ol2;
1715 uschar *inttype = US"";
1717 const uschar * s = buffer;
1718 uschar **str_target;
1719 uschar name[EXIM_DRIVERNAME_MAX];
1720 uschar name2[EXIM_DRIVERNAME_MAX];
1722 /* There may be leading spaces; thereafter, we expect an option name starting
1725 if (!isalpha( Uskip_whitespace(&s) ))
1726 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "option setting expected: %s", s);
1728 /* Read the name of the option, and skip any subsequent white space. If
1729 it turns out that what we read was "hide", set the flag indicating that
1730 this is a secure option, and loop to read the next word. */
1732 for (int n = 0; n < 2; n++)
1734 while (isalnum(*s) || *s == '_')
1736 if (ptr < sizeof(name)-1) name[ptr++] = *s;
1740 Uskip_whitespace(&s);
1741 if (Ustrcmp(name, "hide") != 0) break;
1742 issecure = opt_secure;
1746 /* Deal with "no_" or "not_" here for booleans */
1748 if (Ustrncmp(name, "no_", 3) == 0)
1754 if (Ustrncmp(name, "not_", 4) == 0)
1760 /* Search the list for the given name. A non-existent name, or an option that
1761 is set twice, is a disaster. */
1763 if (!(ol = find_option(name + offset, oltop, last)))
1765 if (!unknown_txt) return FALSE;
1766 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, CS unknown_txt, name);
1769 if ((ol->type & opt_set) && !(ol->type & (opt_rep_con | opt_rep_str)))
1770 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1771 "\"%s\" option set for the second time", name);
1773 ol->type |= opt_set | issecure;
1774 type = ol->type & opt_mask;
1776 /* Types with data values must be followed by '='; the "no[t]_" prefix
1777 applies only to boolean values. */
1779 if (type < opt_bool || type > opt_bool_last)
1782 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1783 "negation prefix applied to a non-boolean option");
1785 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1786 "unexpected end of line (data missing) after %s", name);
1788 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "missing \"=\" after %s", name);
1791 /* If a boolean wasn't preceded by "no[t]_" it can be followed by = and
1792 true/false/yes/no, or, in the case of opt_expand_bool, a general string that
1793 ultimately expands to one of those values. */
1795 else if (*s && (offset != 0 || *s != '='))
1796 extra_chars_error(s, US"boolean option ", name, US"");
1798 /* Skip white space after = */
1800 if (*s == '=') while (isspace(*++s));
1802 /* If there is a data block and the opt_public flag is not set, change
1803 the data block pointer to the private options block. */
1805 if (data_block && !(ol->type & opt_public))
1806 data_block = (void *)(((driver_instance *)data_block)->options_block);
1808 /* Now get the data according to the type. */
1812 /* If a string value is not enclosed in quotes, it consists of
1813 the rest of the current line, verbatim. Otherwise, string escapes
1816 A transport is specified as a string, which is then looked up in the
1817 list of transports. A search type is specified as one of a number of
1820 A set or rewrite rules for a driver is specified as a string, which is
1821 then parsed into a suitable chain of control blocks.
1823 Uids and gids are specified as strings which are then looked up in the
1824 passwd file. Lists of uids and gids are similarly specified as colon-
1825 separated strings. */
1830 case opt_expand_uid:
1831 case opt_expand_gid:
1836 reset_point = store_mark();
1837 sptr = read_string(s, name);
1839 /* Having read a string, we now have several different ways of using it,
1840 depending on the data type, so do another switch. If keeping the actual
1841 string is not required (because it is interpreted), freesptr is set TRUE,
1842 and at the end we reset the pool. */
1846 /* If this was a string, set the variable to point to the new string,
1847 and set the flag so its store isn't reclaimed. If it was a list of rewrite
1848 rules, we still keep the string (for printing), and parse the rules into a
1849 control block and flags word. */
1852 str_target = data_block ? USS (US data_block + ol->v.offset)
1854 if (ol->type & opt_rep_con)
1856 uschar * saved_condition;
1857 /* We already have a condition, we're conducting a crude hack to let
1858 multiple condition rules be chained together, despite storing them in
1860 *str_target = string_copy_perm( (saved_condition = *str_target)
1861 ? string_sprintf("${if and{{bool_lax{%s}}{bool_lax{%s}}}}",
1862 saved_condition, sptr)
1865 /* TODO(pdp): there is a memory leak here and just below
1866 when we set 3 or more conditions; I still don't
1867 understand the store mechanism enough to know
1868 what's the safe way to free content from an earlier store.
1869 AFAICT, stores stack, so freeing an early stored item also stores
1870 all data alloc'd after it. If we knew conditions were adjacent,
1871 we could survive that, but we don't. So I *think* we need to take
1872 another bit from opt_type to indicate "malloced"; this seems like
1873 quite a hack, especially for this one case. It also means that
1874 we can't ever reclaim the store from the *first* condition.
1876 Because we only do this once, near process start-up, I'm prepared to
1877 let this slide for the time being, even though it rankles. */
1879 else if (ol->type & opt_rep_str)
1882 Ustrncmp(name, "headers_add", 11) == 0 ? '\n'
1883 : Ustrncmp(name, "set", 3) == 0 ? ';'
1885 int sep_i = -(int)sep_o;
1886 const uschar * list = sptr;
1888 gstring * list_o = NULL;
1892 list_o = string_get(Ustrlen(*str_target) + Ustrlen(sptr));
1893 list_o = string_cat(list_o, *str_target);
1896 while ((s = string_nextinlist(&list, &sep_i, NULL, 0)))
1897 list_o = string_append_listele(list_o, sep_o, s);
1900 *str_target = string_copy_perm(string_from_gstring(list_o), FALSE);
1911 *USS (US data_block + ol->v.offset) = sptr;
1913 *USS ol->v.value = sptr;
1915 if (type == opt_rewrite)
1920 rewrite_rule **chain;
1923 sprintf(CS name2, "*%.50s_rules", name);
1924 ol2 = find_option(name2, oltop, last);
1925 sprintf(CS name2, "*%.50s_flags", name);
1926 ol3 = find_option(name2, oltop, last);
1929 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
1930 "rewrite rules not available for driver");
1934 chain = (rewrite_rule **)(US data_block + ol2->v.offset);
1935 flagptr = (int *)(US data_block + ol3->v.offset);
1939 chain = (rewrite_rule **)ol2->v.value;
1940 flagptr = (int *)ol3->v.value;
1943 /* This will trap if sptr is tainted. Not sure if that can happen */
1944 while ((p = string_nextinlist(CUSS &sptr, &sep, big_buffer, BIG_BUFFER_SIZE)))
1946 rewrite_rule *next = readconf_one_rewrite(p, flagptr, FALSE);
1948 chain = &(next->next);
1951 if ((*flagptr & (rewrite_all_envelope | rewrite_smtp)) != 0)
1952 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "rewrite rule specifies a "
1953 "non-header rewrite - not allowed at transport time -");
1957 /* If it was an expanded uid, see if there is any expansion to be
1958 done by checking for the presence of a $ character. If there is, save it
1959 in the corresponding *expand_user option field. Otherwise, fall through
1960 to treat it as a fixed uid. Ensure mutual exclusivity of the two kinds
1963 case opt_expand_uid:
1964 sprintf(CS name2, "*expand_%.50s", name);
1965 if ((ol2 = find_option(name2, oltop, last)))
1967 uschar *ss = (Ustrchr(sptr, '$') != NULL) ? sptr : NULL;
1970 *(USS(US data_block + ol2->v.offset)) = ss;
1972 *(USS ol2->v.value) = ss;
1976 *(get_set_flag(name, oltop, last, data_block)) = FALSE;
1982 /* Look up a fixed uid, and also make use of the corresponding gid
1983 if a passwd entry is returned and the gid has not been set. */
1986 if (!route_finduser(sptr, &pw, &uid))
1987 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "user %s was not found", sptr);
1989 *(uid_t *)(US data_block + ol->v.offset) = uid;
1991 *(uid_t *)ol->v.value = uid;
1993 /* Set the flag indicating a fixed value is set */
1995 *(get_set_flag(name, oltop, last, data_block)) = TRUE;
1997 /* Handle matching gid if we have a passwd entry: done by finding the
1998 same name with terminating "user" changed to "group"; if not found,
1999 ignore. Also ignore if the value is already set. */
2001 if (pw == NULL) break;
2002 Ustrcpy(name+Ustrlen(name)-4, US"group");
2003 ol2 = find_option(name, oltop, last);
2004 if (ol2 && ((ol2->type & opt_mask) == opt_gid ||
2005 (ol2->type & opt_mask) == opt_expand_gid))
2007 BOOL *set_flag = get_set_flag(name, oltop, last, data_block);
2011 *((gid_t *)(US data_block + ol2->v.offset)) = pw->pw_gid;
2013 *((gid_t *)ol2->v.value) = pw->pw_gid;
2019 /* If it was an expanded gid, see if there is any expansion to be
2020 done by checking for the presence of a $ character. If there is, save it
2021 in the corresponding *expand_user option field. Otherwise, fall through
2022 to treat it as a fixed gid. Ensure mutual exclusivity of the two kinds
2025 case opt_expand_gid:
2026 sprintf(CS name2, "*expand_%.50s", name);
2027 if ((ol2 = find_option(name2, oltop, last)))
2029 uschar *ss = (Ustrchr(sptr, '$') != NULL) ? sptr : NULL;
2032 *(USS(US data_block + ol2->v.offset)) = ss;
2034 *(USS ol2->v.value) = ss;
2038 *(get_set_flag(name, oltop, last, data_block)) = FALSE;
2044 /* Handle freestanding gid */
2047 if (!route_findgroup(sptr, &gid))
2048 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "group %s was not found", sptr);
2050 *((gid_t *)(US data_block + ol->v.offset)) = gid;
2052 *((gid_t *)ol->v.value) = gid;
2053 *(get_set_flag(name, oltop, last, data_block)) = TRUE;
2056 /* If it was a uid list, look up each individual entry, and build
2057 a vector of uids, with a count in the first element. Put the vector
2058 in malloc store so we can free the string. (We are reading into
2059 permanent store already.) */
2067 const uschar *op = expand_string (sptr);
2070 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "failed to expand %s: %s",
2071 name, expand_string_message);
2074 if (*p != 0) count++;
2075 while (*p != 0) if (*p++ == ':' && *p != 0) count++;
2076 list = store_malloc(count*sizeof(uid_t));
2077 list[ptr++] = (uid_t)(count - 1);
2080 *((uid_t **)(US data_block + ol->v.offset)) = list;
2082 *((uid_t **)ol->v.value) = list;
2088 /* If p is tainted we trap. Not sure that can happen */
2089 (void)string_nextinlist(&p, &sep, big_buffer, BIG_BUFFER_SIZE);
2090 if (!route_finduser(big_buffer, NULL, &uid))
2091 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "user %s was not found",
2098 /* If it was a gid list, look up each individual entry, and build
2099 a vector of gids, with a count in the first element. Put the vector
2100 in malloc store so we can free the string. (We are reading into permanent
2109 const uschar *op = expand_string (sptr);
2112 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "failed to expand %s: %s",
2113 name, expand_string_message);
2116 if (*p != 0) count++;
2117 while (*p != 0) if (*p++ == ':' && *p != 0) count++;
2118 list = store_malloc(count*sizeof(gid_t));
2119 list[ptr++] = (gid_t)(count - 1);
2122 *((gid_t **)(US data_block + ol->v.offset)) = list;
2124 *((gid_t **)ol->v.value) = list;
2130 /* If p is tainted we trap. Not sure that can happen */
2131 (void)string_nextinlist(&p, &sep, big_buffer, BIG_BUFFER_SIZE);
2132 if (!route_findgroup(big_buffer, &gid))
2133 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "group %s was not found",
2141 /* Release store if the value of the string doesn't need to be kept. */
2143 if (freesptr) reset_point = store_reset(reset_point);
2146 /* Expanded boolean: if no characters follow, or if there are no dollar
2147 characters, this is a fixed-valued boolean, and we fall through. Otherwise,
2148 save the string for later expansion in the alternate place. */
2150 case opt_expand_bool:
2151 if (*s && Ustrchr(s, '$') != 0)
2153 sprintf(CS name2, "*expand_%.50s", name);
2154 if ((ol2 = find_option(name2, oltop, last)))
2156 reset_point = store_mark();
2157 sptr = read_string(s, name);
2159 *(USS(US data_block + ol2->v.offset)) = sptr;
2161 *(USS ol2->v.value) = sptr;
2168 /* Boolean: if no characters follow, the value is boolvalue. Otherwise
2169 look for yes/not/true/false. Some booleans are stored in a single bit in
2170 a single int. There's a special fudge for verify settings; without a suffix
2171 they set both xx_sender and xx_recipient. The table points to the sender
2172 value; search subsequently for the recipient. There's another special case:
2173 opt_bool_set also notes when a boolean has been set. */
2177 case opt_bool_verify:
2181 s = readconf_readname(name2, EXIM_DRIVERNAME_MAX, s);
2182 if (strcmpic(name2, US"true") == 0 || strcmpic(name2, US"yes") == 0)
2184 else if (strcmpic(name2, US"false") == 0 || strcmpic(name2, US"no") == 0)
2186 else log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
2187 "\"%s\" is not a valid value for the \"%s\" option", name2, name);
2188 if (*s != 0) extra_chars_error(s, string_sprintf("\"%s\" ", name2),
2189 US"for boolean option ", name);
2192 /* Handle single-bit type. */
2194 if (type == opt_bit)
2196 int bit = 1 << ((ol->type >> 16) & 31);
2197 int * ptr = data_block
2198 ? (int *)(US data_block + ol->v.offset)
2199 : (int *)ol->v.value;
2200 if (boolvalue) *ptr |= bit; else *ptr &= ~bit;
2204 /* Handle full BOOL types */
2207 *((BOOL *)(US data_block + ol->v.offset)) = boolvalue;
2209 *((BOOL *)ol->v.value) = boolvalue;
2213 if (type == opt_bool_verify)
2215 sprintf(CS name2, "%.50s_recipient", name + offset);
2216 if ((ol2 = find_option(name2, oltop, last)))
2218 *((BOOL *)(US data_block + ol2->v.offset)) = boolvalue;
2220 *((BOOL *)ol2->v.value) = boolvalue;
2223 /* Note that opt_bool_set type is set, if there is somewhere to do so */
2225 else if (type == opt_bool_set)
2227 sprintf(CS name2, "*set_%.50s", name + offset);
2228 if ((ol2 = find_option(name2, oltop, last)))
2230 *((BOOL *)(US data_block + ol2->v.offset)) = TRUE;
2232 *((BOOL *)ol2->v.value) = TRUE;
2240 inttype = US"octal ";
2242 /* Integer: a simple(ish) case; allow octal and hex formats, and
2243 suffixes K, M, G, and T. The different types affect output, not input. */
2252 lvalue = strtol(CS s, CSS &endptr, intbase);
2255 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "%sinteger expected for %s",
2258 if (errno != ERANGE && *endptr)
2260 uschar * mp = US"TtGgMmKk\0"; /* YyZzEePpTtGgMmKk */
2262 if ((mp = Ustrchr(mp, *endptr)))
2267 if (lvalue > INT_MAX/1024 || lvalue < INT_MIN/1024)
2278 if (errno == ERANGE || lvalue > INT_MAX || lvalue < INT_MIN)
2279 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
2280 "absolute value of integer \"%s\" is too large (overflow)", s);
2282 if (Uskip_whitespace(&endptr))
2283 extra_chars_error(endptr, inttype, US"integer value for ", name);
2285 value = (int)lvalue;
2289 *(int *)(US data_block + ol->v.offset) = value;
2291 *(int *)ol->v.value = value;
2294 /* Integer held in K: again, allow formats and suffixes as above. */
2300 int_eximarith_t lvalue = strtol(CS s, CSS &endptr, intbase);
2303 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "%sinteger expected for %s",
2306 if (errno != ERANGE && *endptr)
2308 uschar * mp = US"ZzEePpTtGgMmKk\0"; /* YyZzEePpTtGgMmKk */
2310 if ((mp = Ustrchr(mp, *endptr)))
2315 if (lvalue > EXIM_ARITH_MAX/1024 || lvalue < EXIM_ARITH_MIN/1024)
2324 lvalue = (lvalue + 512)/1024;
2327 if (errno == ERANGE) log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
2328 "absolute value of integer \"%s\" is too large (overflow)", s);
2330 if (Uskip_whitespace(&endptr))
2331 extra_chars_error(endptr, inttype, US"integer value for ", name);
2334 *(int_eximarith_t *)(US data_block + ol->v.offset) = lvalue;
2336 *(int_eximarith_t *)ol->v.value = lvalue;
2340 /* Fixed-point number: held to 3 decimal places. */
2343 if (sscanf(CS s, "%d%n", &value, &count) != 1)
2344 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
2345 "fixed-point number expected for %s", name);
2347 if (value < 0) log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
2348 "integer \"%s\" is too large (overflow)", s);
2352 if (value < 0) log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
2353 "integer \"%s\" is too large (overflow)", s);
2355 /* We get a coverity error here for using count, as it derived
2356 from the tainted buffer pointed to by s, as parsed by sscanf().
2357 By the definition of sscanf we must be accessing between start
2358 and end of s (assuming it is nul-terminated...) so ignore the error. */
2359 /* coverity[tainted_data] */
2360 if (s[count] == '.')
2363 while (isdigit(s[++count]))
2365 value += (s[count] - '0') * d;
2370 while (isspace(s[count])) count++;
2373 extra_chars_error(s+count, US"fixed-point value for ", name, US"");
2376 *((int *)(US data_block + ol->v.offset)) = value;
2378 *((int *)ol->v.value) = value;
2381 /* There's a special routine to read time values. */
2384 value = readconf_readtime(s, 0, FALSE);
2386 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "invalid time value for %s",
2389 *((int *)(US data_block + ol->v.offset)) = value;
2391 *((int *)ol->v.value) = value;
2394 /* A time list is a list of colon-separated times, with the first
2395 element holding the size of the list and the second the number of
2401 int * list = data_block
2402 ? (int *)(US data_block + ol->v.offset)
2403 : (int *)ol->v.value;
2405 if (*s != 0) for (count = 1; count <= list[0] - 2; count++)
2408 uschar *snext = Ustrchr(s, ':');
2412 while (ss > s && isspace(ss[-1])) ss--;
2415 value = readconf_readtime(s, terminator, FALSE);
2417 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "invalid time value for %s",
2419 if (count > 1 && value <= list[count])
2420 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
2421 "time value out of order for %s", name);
2422 list[count+1] = value;
2423 if (snext == NULL) break;
2425 Uskip_whitespace(&s);
2428 if (count > list[0] - 2)
2429 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "too many time values for %s",
2431 if (count > 0 && list[2] == 0) count = 0;
2437 ol->v.fn(name, s, 0);
2446 /*************************************************
2447 * Print a time value *
2448 *************************************************/
2451 Argument: a time value in seconds
2452 Returns: pointer to a fixed buffer containing the time as a string,
2453 in readconf_readtime() format
2457 readconf_printtime(int t)
2460 uschar *p = time_buffer;
2462 if (t < 0) *p++ = '-', t = -t;
2473 if (w > 0) p += sprintf(CS p, "%dw", w);
2474 if (d > 0) p += sprintf(CS p, "%dd", d);
2475 if (h > 0) p += sprintf(CS p, "%dh", h);
2476 if (m > 0) p += sprintf(CS p, "%dm", m);
2477 if (s > 0 || p == time_buffer) sprintf(CS p, "%ds", s);
2484 /*************************************************
2485 * Print an individual option value *
2486 *************************************************/
2488 /* This is used by the -bP option, so prints to the standard output.
2489 The entire options list is passed in as an argument, because some options come
2490 in pairs - typically uid/gid settings, which can either be explicit numerical
2491 values, or strings to be expanded later. If the numerical value is unset,
2492 search for "*expand_<name>" to see if there is a string equivalent.
2495 ol option entry, or NULL for an unknown option
2497 options_block NULL for main configuration options; otherwise points to
2498 a driver block; if the option doesn't have opt_public
2499 set, then options_block->options_block is where the item
2501 oltop points to the option list in which ol exists
2502 last one more than the offset of the last entry in optop
2503 no_labels do not show "foo = " at the start.
2505 Returns: boolean success
2509 print_ol(optionlist *ol, const uschar *name, void *options_block,
2510 optionlist *oltop, int last, BOOL no_labels)
2519 uschar name2[EXIM_DRIVERNAME_MAX];
2523 printf("%s is not a known option\n", name);
2527 /* Non-admin callers cannot see options that have been flagged secure by the
2530 if (!f.admin_user && ol->type & opt_secure)
2533 printf("%s\n", CCS hidden);
2535 printf("%s = %s\n", name, CCS hidden);
2539 /* Else show the value of the option */
2541 value = ol->v.value;
2544 if (!(ol->type & opt_public))
2545 options_block = (void *)(((driver_instance *)options_block)->options_block);
2546 value = (void *)(US options_block + (long int)value);
2549 switch(ol->type & opt_mask)
2552 case opt_rewrite: /* Show the text value */
2554 if (!no_labels) printf("%s = ", name);
2555 printf("%s\n", s ? string_printing2(s, SP_TAB) : US"");
2559 if (!no_labels) printf("%s = ", name);
2560 printf("%d\n", *((int *)value));
2565 int x = *((int *)value);
2566 if (x != 0 && (x & 1023) == 0)
2570 if ((x & 1023) == 0)
2575 if (!no_labels) printf("%s = ", name);
2576 printf("%d%c\n", x, c);
2580 if (!no_labels) printf("%s = ", name);
2588 int_eximarith_t x = *((int_eximarith_t *)value);
2589 if (!no_labels) printf("%s = ", name);
2590 if (x == 0) printf("0\n");
2591 else if ((x & ((1<<30)-1)) == 0) printf(PR_EXIM_ARITH "T\n", x >> 30);
2592 else if ((x & ((1<<20)-1)) == 0) printf(PR_EXIM_ARITH "G\n", x >> 20);
2593 else if ((x & ((1<<10)-1)) == 0) printf(PR_EXIM_ARITH "M\n", x >> 10);
2594 else printf(PR_EXIM_ARITH "K\n", x);
2599 if (!no_labels) printf("%s = ", name);
2600 printf("%#o\n", *((int *)value));
2603 /* Can be negative only when "unset", in which case integer */
2607 int x = *((int *)value);
2610 if (x < 0) printf("%s =\n", name); else
2612 if (!no_labels) printf("%s = ", name);
2613 printf("%d.", x/1000);
2626 /* If the numerical value is unset, try for the string value */
2628 case opt_expand_uid:
2629 if (! *get_set_flag(name, oltop, last, options_block))
2631 sprintf(CS name2, "*expand_%.50s", name);
2632 if ((ol2 = find_option(name2, oltop, last)))
2635 s = *USS (US options_block + ol2->v.offset);
2637 s = *USS ol2->v.value;
2638 if (!no_labels) printf("%s = ", name);
2639 printf("%s\n", s ? string_printing(s) : US"");
2644 /* Else fall through */
2647 if (!no_labels) printf("%s = ", name);
2648 if (! *get_set_flag(name, oltop, last, options_block))
2651 if ((pw = getpwuid(*((uid_t *)value))))
2652 printf("%s\n", pw->pw_name);
2654 printf("%ld\n", (long int)(*((uid_t *)value)));
2657 /* If the numerical value is unset, try for the string value */
2659 case opt_expand_gid:
2660 if (! *get_set_flag(name, oltop, last, options_block))
2662 sprintf(CS name2, "*expand_%.50s", name);
2663 if ( (ol2 = find_option(name2, oltop, last))
2664 && (ol2->type & opt_mask) == opt_stringptr)
2667 s = *USS (US options_block + ol2->v.offset);
2669 s = *USS ol2->v.value;
2670 if (!no_labels) printf("%s = ", name);
2671 printf("%s\n", s ? string_printing(s) : US"");
2676 /* Else fall through */
2679 if (!no_labels) printf("%s = ", name);
2680 if (! *get_set_flag(name, oltop, last, options_block))
2683 if ((gr = getgrgid(*((int *)value))))
2684 printf("%s\n", gr->gr_name);
2686 printf("%ld\n", (long int)(*((int *)value)));
2690 uidlist = *((uid_t **)value);
2691 if (!no_labels) printf("%s =", name);
2694 uschar sep = no_labels ? '\0' : ' ';
2695 for (int i = 1; i <= (int)(uidlist[0]); i++)
2697 uschar *name = NULL;
2698 if ((pw = getpwuid(uidlist[i]))) name = US pw->pw_name;
2699 if (sep != '\0') printf("%c", sep);
2700 if (name) printf("%s", name);
2701 else printf("%ld", (long int)(uidlist[i]));
2709 gidlist = *((gid_t **)value);
2710 if (!no_labels) printf("%s =", name);
2713 uschar sep = no_labels ? '\0' : ' ';
2714 for (int i = 1; i <= (int)(gidlist[0]); i++)
2716 uschar *name = NULL;
2717 if ((gr = getgrgid(gidlist[i]))) name = US gr->gr_name;
2718 if (sep != '\0') printf("%c", sep);
2719 if (name) printf("%s", name);
2720 else printf("%ld", (long int)(gidlist[i]));
2728 if (!no_labels) printf("%s = ", name);
2729 printf("%s\n", readconf_printtime(*((int *)value)));
2734 int *list = (int *)value;
2735 if (!no_labels) printf("%s = ", name);
2736 for (int i = 0; i < list[1]; i++)
2737 printf("%s%s", i == 0 ? "" : ":", readconf_printtime(list[i+2]));
2743 printf("%s%s\n", (*((int *)value)) & (1 << ((ol->type >> 16) & 31))
2744 ? "" : "no_", name);
2747 case opt_expand_bool:
2748 sprintf(CS name2, "*expand_%.50s", name);
2749 if ((ol2 = find_option(name2, oltop, last)) && ol2->v.value)
2752 s = *USS (US options_block + ol2->v.offset);
2754 s = *USS ol2->v.value;
2757 if (!no_labels) printf("%s = ", name);
2758 printf("%s\n", string_printing(s));
2761 /* s == NULL => string not set; fall through */
2767 case opt_bool_verify:
2769 printf("%s%s\n", *((BOOL *)value) ? "" : "no_", name);
2773 ol->v.fn(name, NULL, no_labels ? opt_fn_print : opt_fn_print|opt_fn_print_label);
2781 /*************************************************
2782 * Print value from main configuration *
2783 *************************************************/
2785 /* This function, called as a result of encountering the -bP option,
2786 causes the value of any main configuration variable to be output if the
2787 second argument is NULL. There are some special values:
2789 all print all main configuration options
2790 config_file print the name of the configuration file
2791 (configure_file will still work, for backward
2793 routers print the routers' configurations
2794 transports print the transports' configuration
2795 authenticators print the authenticators' configuration
2796 macros print the macros' configuration
2797 router_list print a list of router names
2798 transport_list print a list of transport names
2799 authenticator_list print a list of authentication mechanism names
2800 macro_list print a list of macro names
2801 +name print a named list item
2802 local_scan print the local_scan options
2803 config print the configuration as it is parsed
2804 environment print the used execution environment
2806 If the second argument is not NULL, it must be one of "router", "transport",
2807 "authenticator" or "macro" in which case the first argument identifies the
2808 driver whose options are to be printed.
2811 name option name if type == NULL; else driver name
2812 type NULL or driver type name, as described above
2813 no_labels avoid the "foo = " at the start of an item
2815 Returns: Boolean success
2819 readconf_print(const uschar * name, const uschar * type, BOOL no_labels)
2821 BOOL names_only = FALSE;
2822 optionlist *ol2 = NULL;
2823 driver_instance *d = NULL;
2832 static uschar *types[] = { US"address", US"domain", US"host",
2834 static tree_node **anchors[] = { &addresslist_anchor, &domainlist_anchor,
2835 &hostlist_anchor, &localpartlist_anchor };
2837 for (int i = 0; i < 4; i++)
2838 if ((t = tree_search(*(anchors[i]), name+1)))
2840 namedlist_block * nb = t->data.ptr;
2841 const uschar * s = nb->hide ? hidden : nb->string;
2844 printf("%s\n", CCS s);
2846 printf("%slist %s = %s\n", types[i], name+1, CCS s);
2850 printf("no address, domain, host, or local part list called \"%s\" "
2851 "exists\n", name+1);
2856 if ( Ustrcmp(name, "configure_file") == 0
2857 || Ustrcmp(name, "config_file") == 0)
2859 printf("%s\n", CS config_main_filename);
2863 if (Ustrcmp(name, "all") == 0)
2865 for (optionlist * ol = optionlist_config;
2866 ol < optionlist_config + nelem(optionlist_config); ol++)
2867 if (!(ol->type & opt_hidden))
2868 (void) print_ol(ol, US ol->name, NULL,
2869 optionlist_config, nelem(optionlist_config),
2874 if (Ustrcmp(name, "local_scan") == 0)
2876 #ifndef LOCAL_SCAN_HAS_OPTIONS
2877 printf("local_scan() options are not supported\n");
2880 for (optionlist * ol = local_scan_options;
2881 ol < local_scan_options + local_scan_options_count; ol++)
2882 (void) print_ol(ol, US ol->name, NULL, local_scan_options,
2883 local_scan_options_count, no_labels);
2888 if (Ustrcmp(name, "config") == 0)
2890 print_config(f.admin_user, no_labels);
2894 if (Ustrcmp(name, "routers") == 0)
2899 else if (Ustrcmp(name, "transports") == 0)
2901 type = US"transport";
2904 else if (Ustrcmp(name, "authenticators") == 0)
2906 type = US"authenticator";
2909 else if (Ustrcmp(name, "macros") == 0)
2914 else if (Ustrcmp(name, "router_list") == 0)
2920 else if (Ustrcmp(name, "transport_list") == 0)
2922 type = US"transport";
2926 else if (Ustrcmp(name, "authenticator_list") == 0)
2928 type = US"authenticator";
2932 else if (Ustrcmp(name, "macro_list") == 0)
2938 else if (Ustrcmp(name, "environment") == 0)
2943 for (p = USS environ; *p; p++) ;
2944 qsort(environ, p - USS environ, sizeof(*p), string_compare_by_pointer);
2946 for (p = USS environ; *p; p++)
2949 if (no_labels && (q = Ustrchr(*p, '='))) *q = '\0';
2957 return print_ol(find_option(name,
2958 optionlist_config, nelem(optionlist_config)),
2959 name, NULL, optionlist_config, nelem(optionlist_config), no_labels);
2962 /* Handle the options for a router or transport. Skip options that are flagged
2963 as hidden. Some of these are options with names starting with '*', used for
2964 internal alternative representations of other options (which the printing
2965 function will sort out). Others are synonyms kept for backward compatibility.
2968 if (Ustrcmp(type, "router") == 0)
2970 d = (driver_instance *)routers;
2971 ol2 = optionlist_routers;
2972 size = optionlist_routers_size;
2974 else if (Ustrcmp(type, "transport") == 0)
2976 d = (driver_instance *)transports;
2977 ol2 = optionlist_transports;
2978 size = optionlist_transports_size;
2980 else if (Ustrcmp(type, "authenticator") == 0)
2982 d = (driver_instance *)auths;
2983 ol2 = optionlist_auths;
2984 size = optionlist_auths_size;
2987 else if (Ustrcmp(type, "macro") == 0)
2989 /* People store passwords in macros and they were previously not available
2990 for printing. So we have an admin_users restriction. */
2993 fprintf(stderr, "exim: permission denied; not admin\n");
2996 for (macro_item * m = macros; m; m = m->next)
2997 if (!name || Ustrcmp(name, m->name) == 0)
3000 printf("%s\n", CS m->name);
3002 printf("%s\n", CS m->replacement);
3004 printf("%s=%s\n", CS m->name, CS m->replacement);
3008 if (!name) return TRUE;
3010 printf("%s %s not found\n", type, name);
3016 for (; d; d = d->next) printf("%s\n", CS d->name);
3020 /* Either search for a given driver, or print all of them */
3022 for (; d; d = d->next)
3025 driver_info * di = d->info;
3028 printf("\n%s %s:\n", d->name, type);
3029 else if (Ustrcmp(d->name, name) != 0) continue;
3031 for (optionlist * ol = ol2; ol < ol2 + size; ol++)
3032 if (!(ol->type & opt_hidden))
3033 rc |= print_ol(ol, US ol->name, d, ol2, size, no_labels);
3035 for (optionlist * ol = di->options;
3036 ol < di->options + *di->options_count; ol++)
3037 if (!(ol->type & opt_hidden))
3038 rc |= print_ol(ol, US ol->name, d, di->options,
3039 *di->options_count, no_labels);
3041 if (name) return rc;
3043 if (!name) return TRUE;
3045 printf("%s %s not found\n", type, name);
3051 /*************************************************
3052 * Read a named list item *
3053 *************************************************/
3055 /* This function reads a name and a list (i.e. string). The name is used to
3056 save the list in a tree, sorted by its name. Each entry also has a number,
3057 which can be used for caching tests, but if the string contains any expansion
3058 items other than $key, the number is set negative to inhibit caching. This
3059 mechanism is used for domain, host, and address lists that are referenced by
3063 anchorp points to the tree anchor
3064 numberp points to the current number for this tree
3065 max the maximum number permitted
3066 s the text of the option line, starting immediately after the name
3068 tname the name of the list type, for messages
3069 hide do not output value on "-bP"
3075 read_named_list(tree_node **anchorp, int *numberp, int max, uschar *s,
3076 uschar *tname, BOOL hide)
3078 BOOL forcecache = FALSE;
3081 namedlist_block * nb = store_get_perm(sizeof(namedlist_block), GET_UNTAINTED);
3083 if (Ustrncmp(s, "_cache", 6) == 0)
3090 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "unrecognized configuration line");
3092 if (*numberp >= max)
3093 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "too many named %ss (max is %d)\n",
3096 Uskip_whitespace(&s);
3098 while (isalnum(*s) || *s == '_') s++;
3099 t = store_get(sizeof(tree_node) + s-ss, ss);
3100 Ustrncpy(t->name, ss, s-ss);
3102 Uskip_whitespace(&s);
3104 if (!tree_insertnode(anchorp, t))
3105 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
3106 "duplicate name \"%s\" for a named %s", t->name, tname);
3109 nb->number = *numberp;
3113 if (*s++ != '=') log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
3114 "missing '=' after \"%s\"", t->name);
3115 Uskip_whitespace(&s);
3116 nb->string = read_string(s, t->name);
3117 nb->cache_data = NULL;
3119 /* Check the string for any expansions; if any are found, mark this list
3120 uncacheable unless the user has explicited forced caching. */
3122 if (!forcecache && Ustrchr(nb->string, '$') != NULL) nb->number = -1;
3128 /*************************************************
3129 * Unpick data for a rate limit *
3130 *************************************************/
3132 /* This function is called to unpick smtp_ratelimit_{mail,rcpt} into four
3136 s string, in the form t,b,f,l
3137 where t is the threshold (integer)
3138 b is the initial delay (time)
3139 f is the multiplicative factor (fixed point)
3140 k is the maximum time (time)
3141 threshold where to store threshold
3142 base where to store base in milliseconds
3143 factor where to store factor in milliseconds
3144 limit where to store limit
3146 Returns: nothing (panics on error)
3150 unpick_ratelimit(uschar *s, int *threshold, int *base, double *factor,
3153 uschar bstring[16], lstring[16];
3155 if (sscanf(CS s, "%d, %15[0123456789smhdw.], %lf, %15s", threshold, bstring,
3156 factor, lstring) == 4)
3158 *base = readconf_readtime(bstring, 0, TRUE);
3159 *limit = readconf_readtime(lstring, 0, TRUE);
3160 if (*base >= 0 && *limit >= 0) return;
3162 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "malformed ratelimit data: %s", s);
3168 /*************************************************
3169 * Read main configuration options *
3170 *************************************************/
3172 /* This function is the first to be called for configuration reading. It
3173 opens the configuration file and reads general configuration settings until
3174 it reaches the end of the configuration section. The file is then left open so
3175 that the remaining configuration data can subsequently be read if needed for
3178 The configuration file must be owned either by root or exim, and be writeable
3179 only by root or uid/gid exim. The values for Exim's uid and gid can be changed
3180 in the config file, so the test is done on the compiled in values. A slight
3181 anomaly, to be carefully documented.
3183 The name of the configuration file is taken from a list that is included in the
3184 binary of Exim. It can be altered from the command line, but if that is done,
3185 root privilege is immediately withdrawn unless the caller is root or exim.
3186 The first file on the list that exists is used.
3188 For use on multiple systems that share file systems, first look for a
3189 configuration file whose name has the current node name on the end. If that is
3190 not found, try the generic name. For really contorted configurations, that run
3191 multiple Exims with different uid settings, first try adding the effective uid
3192 before the node name. These complications are going to waste resources on most
3193 systems. Therefore they are available only when requested by compile-time
3197 readconf_main(BOOL nowarn)
3200 struct stat statbuf;
3201 uschar * s, * filename;
3202 const uschar * list = config_main_filelist;
3204 /* Loop through the possible file names */
3206 /* Should never be a tainted list */
3207 while((filename = string_nextinlist(&list, &sep, big_buffer, big_buffer_size)))
3210 /* Cut out all the fancy processing unless specifically wanted */
3212 #if defined(CONFIGURE_FILE_USE_NODE) || defined(CONFIGURE_FILE_USE_EUID)
3213 uschar *suffix = filename + Ustrlen(filename);
3215 /* Try for the node-specific file if a node name exists */
3217 # ifdef CONFIGURE_FILE_USE_NODE
3219 if (uname(&uts) >= 0)
3221 # ifdef CONFIGURE_FILE_USE_EUID
3222 sprintf(CS suffix, ".%ld.%.256s", (long int)original_euid, uts.nodename);
3223 if (!(config_file = Ufopen(filename, "rb")))
3224 # endif /* CONFIGURE_FILE_USE_EUID */
3226 sprintf(CS suffix, ".%.256s", uts.nodename);
3227 config_file = Ufopen(filename, "rb");
3230 # endif /* CONFIGURE_FILE_USE_NODE */
3232 /* Otherwise, try the generic name, possibly with the euid added */
3234 # ifdef CONFIGURE_FILE_USE_EUID
3237 sprintf(CS suffix, ".%ld", (long int)original_euid);
3238 config_file = Ufopen(filename, "rb");
3240 # endif /* CONFIGURE_FILE_USE_EUID */
3242 /* Finally, try the unadorned name */
3247 config_file = Ufopen(filename, "rb");
3249 #else /* if neither defined */
3251 /* This is the common case when the fancy processing is not included. */
3253 config_file = Ufopen(filename, "rb");
3256 /* If the file does not exist, continue to try any others. For any other
3257 error, break out (and die). */
3259 if (config_file || errno != ENOENT) break;
3262 /* On success, save the name for verification; config_filename is used when
3263 logging configuration errors (it changes for .included files) whereas
3264 config_main_filename is the name shown by -bP. Failure to open a configuration
3265 file is a serious disaster. */
3269 uschar *last_slash = Ustrrchr(filename, '/');
3270 config_filename = config_main_filename = string_copy(filename);
3272 /* The config_main_directory we need for the $config_dir expansion.
3273 config_main_filename we need for $config_file expansion.
3274 And config_dir is the directory of the current configuration, used for
3275 relative .includes. We do need to know it's name, as we change our working
3278 if (filename[0] == '/')
3279 config_main_directory = last_slash == filename ? US"/" : string_copyn(filename, last_slash - filename);
3282 /* relative configuration file name: working dir + / + basename(filename) */
3284 uschar buf[PATH_MAX];
3287 if (os_getcwd(buf, PATH_MAX) == NULL)
3289 perror("exim: getcwd");
3290 exim_exit(EXIT_FAILURE);
3292 g = string_cat(NULL, buf);
3294 /* If the dir does not end with a "/", append one */
3295 if (gstring_last_char(g) != '/')
3296 g = string_catn(g, US"/", 1);
3298 /* If the config file contains a "/", extract the directory part */
3300 g = string_catn(g, filename, last_slash - filename);
3302 config_main_directory = string_from_gstring(g);
3304 config_directory = config_main_directory;
3308 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "non-existent configuration file(s): "
3309 "%s", config_main_filelist);
3311 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "%s",
3312 string_open_failed("configuration file %s", filename));
3314 /* Now, once we found and opened our configuration file, we change the directory
3315 to a safe place. Later we change to $spool_directory. */
3317 if (Uchdir("/") < 0)
3319 perror("exim: chdir `/': ");
3320 exim_exit(EXIT_FAILURE);
3323 /* Check the status of the file we have opened, if we have retained root
3324 privileges and the file isn't /dev/null (which *should* be 0666). */
3326 if (f.trusted_config && Ustrcmp(filename, US"/dev/null"))
3328 if (fstat(fileno(config_file), &statbuf) != 0)
3329 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "failed to stat configuration file %s",
3332 if ( statbuf.st_uid != root_uid /* owner not root */
3333 #ifdef CONFIGURE_OWNER
3334 && statbuf.st_uid != config_uid /* owner not the special one */
3337 statbuf.st_gid != root_gid /* group not root & */
3338 #ifdef CONFIGURE_GROUP
3339 && statbuf.st_gid != config_gid /* group not the special one */
3341 && (statbuf.st_mode & 020) != 0 /* group writeable */
3343 (statbuf.st_mode & 2) != 0 /* world writeable */
3345 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Exim configuration file %s has the "
3346 "wrong owner, group, or mode", big_buffer);
3348 /* Do a dummy store-allocation of a size related to the (toplevel) file size.
3349 This assumes we will need this much storage to handle all the allocations
3350 during startup; it won't help when .include is being used. When it does, it
3351 will cut down on the number of store blocks (and malloc calls, and sbrk
3352 syscalls). It also assume we're on the relevant pool. */
3354 if (statbuf.st_size > 8192)
3356 rmark r = store_mark();
3357 void * dummy = store_get((int)statbuf.st_size, GET_UNTAINTED);
3362 /* Process the main configuration settings. They all begin with a lower case
3363 letter. If we see something starting with an upper case letter, it is taken as
3364 a macro definition. */
3366 while ((s = get_config_line()))
3371 if (config_lineno == 1 && Ustrstr(s, "\xef\xbb\xbf") == s)
3372 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
3373 "found unexpected BOM (Byte Order Mark)");
3377 if (!macro_read_assignment(s)) exim_exit(EXIT_FAILURE);
3381 t = (hide = Ustrncmp(s, "hide", 4) == 0 && isspace(s[4])) ? s + 5 : s;
3383 if (Ustrncmp(t, "domainlist", 10) == 0)
3384 read_named_list(&domainlist_anchor, &domainlist_count,
3385 MAX_NAMED_LIST, t+10, US"domain list", hide);
3387 else if (Ustrncmp(t, "hostlist", 8) == 0)
3388 read_named_list(&hostlist_anchor, &hostlist_count,
3389 MAX_NAMED_LIST, t+8, US"host list", hide);
3391 else if (Ustrncmp(t, "addresslist", 11) == 0)
3392 read_named_list(&addresslist_anchor, &addresslist_count,
3393 MAX_NAMED_LIST, t+11, US"address list", hide);
3395 else if (Ustrncmp(t, "localpartlist", 13) == 0)
3396 read_named_list(&localpartlist_anchor, &localpartlist_count,
3397 MAX_NAMED_LIST, t+13, US"local part list", hide);
3400 (void) readconf_handle_option(s, optionlist_config, optionlist_config_size,
3401 NULL, US"main option \"%s\" unknown");
3405 /* If local_sender_retain is set, local_from_check must be unset. */
3407 if (local_sender_retain && local_from_check)
3408 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "both local_from_check and "
3409 "local_sender_retain are set; this combination is not allowed");
3411 /* If the timezone string is empty, set it to NULL, implying no TZ variable
3414 if (timezone_string && !*timezone_string) timezone_string = NULL;
3416 /* The max retry interval must not be greater than 24 hours. */
3418 if (retry_interval_max > 24*60*60) retry_interval_max = 24*60*60;
3420 /* remote_max_parallel must be > 0 */
3422 if (remote_max_parallel <= 0) remote_max_parallel = 1;
3424 /* Save the configured setting of freeze_tell, so we can re-instate it at the
3425 start of a new SMTP message. */
3427 freeze_tell_config = freeze_tell;
3429 /* The primary host name may be required for expansion of spool_directory
3430 and log_file_path, so make sure it is set asap. It is obtained from uname(),
3431 but if that yields an unqualified value, make a FQDN by using gethostbyname to
3432 canonize it. Some people like upper case letters in their host names, so we
3433 don't force the case. */
3435 if (!primary_hostname)
3437 const uschar * hostname;
3440 if (uname(&uts) < 0)
3441 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "uname() failed to yield host name");
3442 hostname = US uts.nodename;
3444 if (Ustrchr(hostname, '.') == NULL)
3447 struct hostent *hostdata;
3451 && ( !dns_ipv4_lookup
3452 || match_isinlist(hostname, CUSS &dns_ipv4_lookup, 0, NULL, NULL,
3453 MCL_DOMAIN, TRUE, NULL) != OK))
3460 # if HAVE_GETIPNODEBYNAME
3462 hostdata = getipnodebyname(CS hostname, af, 0, &error_num);
3464 hostdata = gethostbyname2(CS hostname, af);
3467 hostdata = gethostbyname(CS hostname);
3471 { hostname = US hostdata->h_name; break; }
3473 if (af == AF_INET) break;
3478 primary_hostname = string_copy(hostname);
3481 /* Set up default value for smtp_active_hostname */
3483 smtp_active_hostname = primary_hostname;
3485 /* If spool_directory wasn't set in the build-time configuration, it must have
3486 got set above. Of course, writing to the log may not work if log_file_path is
3487 not set, but it will at least get to syslog or somewhere, with any luck. */
3489 if (!*spool_directory)
3490 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "spool_directory undefined: cannot "
3493 /* Expand the spool directory name; it may, for example, contain the primary
3494 host name. Same comment about failure. */
3496 if (!(s = expand_string(spool_directory)))
3497 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "failed to expand spool_directory "
3498 "\"%s\": %s", spool_directory, expand_string_message);
3499 spool_directory = s;
3501 /* Expand log_file_path, which must contain "%s" in any component that isn't
3502 the null string or "syslog". It is also allowed to contain one instance of %D
3503 or %M. However, it must NOT contain % followed by anything else. */
3507 const uschar *ss, *sss;
3508 int sep = ':'; /* Fixed for log file path */
3509 if (!(s = expand_string(log_file_path)))
3510 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "failed to expand log_file_path "
3511 "\"%s\": %s", log_file_path, expand_string_message);
3514 /* should never be a tainted list */
3515 while ((sss = string_nextinlist(&ss, &sep, big_buffer, big_buffer_size)))
3518 if (sss[0] == 0 || Ustrcmp(sss, "syslog") == 0) continue;
3519 if (!(t = Ustrstr(sss, "%s")))
3520 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "log_file_path \"%s\" does not "
3521 "contain \"%%s\"", sss);
3523 if ((t = Ustrchr(sss, '%')))
3524 if ((t[1] != 'D' && t[1] != 'M') || Ustrchr(t+2, '%') != NULL)
3525 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "log_file_path \"%s\" contains "
3526 "unexpected \"%%\" character", s);
3532 /* Interpret syslog_facility into an integer argument for 'ident' param to
3533 openlog(). Default is LOG_MAIL set in globals.c. Allow the user to omit the
3536 if (syslog_facility_str)
3539 uschar * s = syslog_facility_str;
3541 if ((Ustrlen(syslog_facility_str) >= 4) &&
3542 (strncmpic(syslog_facility_str, US"log_", 4) == 0))
3545 for (i = 0; i < syslog_list_size; i++)
3546 if (strcmpic(s, syslog_list[i].name) == 0)
3548 syslog_facility = syslog_list[i].value;
3552 if (i >= syslog_list_size)
3553 log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3554 "failed to interpret syslog_facility \"%s\"", syslog_facility_str);
3557 /* Expand pid_file_path */
3561 const uschar * t = expand_cstring(pid_file_path);
3563 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "failed to expand pid_file_path "
3564 "\"%s\": %s", pid_file_path, expand_string_message);
3568 /* Set default value of process_log_path */
3570 if (!process_log_path || !*process_log_path)
3571 process_log_path = string_sprintf("%s/exim-process.info", spool_directory);
3573 /* Compile the regex for matching a UUCP-style "From_" line in an incoming
3576 regex_From = regex_must_compile(uucp_from_pattern, MCS_NOFLAGS, TRUE);
3578 /* Unpick the SMTP rate limiting options, if set */
3580 if (smtp_ratelimit_mail)
3581 unpick_ratelimit(smtp_ratelimit_mail, &smtp_rlm_threshold,
3582 &smtp_rlm_base, &smtp_rlm_factor, &smtp_rlm_limit);
3584 if (smtp_ratelimit_rcpt)
3585 unpick_ratelimit(smtp_ratelimit_rcpt, &smtp_rlr_threshold,
3586 &smtp_rlr_base, &smtp_rlr_factor, &smtp_rlr_limit);
3588 /* The qualify domains default to the primary host name */
3590 if (!qualify_domain_sender)
3591 qualify_domain_sender = primary_hostname;
3592 if (!qualify_domain_recipient)
3593 qualify_domain_recipient = qualify_domain_sender;
3595 /* Setting system_filter_user in the configuration sets the gid as well if a
3596 name is given, but a numerical value does not. */
3598 if (system_filter_uid_set && !system_filter_gid_set)
3600 struct passwd *pw = getpwuid(system_filter_uid);
3602 log_write(0, LOG_MAIN|LOG_PANIC_DIE, "Failed to look up uid %ld",
3603 (long int)system_filter_uid);
3604 system_filter_gid = pw->pw_gid;
3605 system_filter_gid_set = TRUE;
3608 /* If the errors_reply_to field is set, check that it is syntactically valid
3609 and ensure it contains a domain. */
3611 if (errors_reply_to)
3614 int start, end, domain;
3615 uschar *recipient = parse_extract_address(errors_reply_to, &errmess,
3616 &start, &end, &domain, FALSE);
3619 log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3620 "error in errors_reply_to (%s): %s", errors_reply_to, errmess);
3623 log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3624 "errors_reply_to (%s) does not contain a domain", errors_reply_to);
3627 /* If smtp_accept_queue or smtp_accept_max_per_host is set, then
3628 smtp_accept_max must also be set. */
3630 if (smtp_accept_max == 0 && (smtp_accept_queue > 0 || smtp_accept_max_per_host))
3631 log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3632 "smtp_accept_max must be set if smtp_accept_queue or "
3633 "smtp_accept_max_per_host is set");
3635 /* Set up the host number if anything is specified. It is an expanded string
3636 so that it can be computed from the host name, for example. We do this last
3637 so as to ensure that everything else is set up before the expansion. */
3639 if (host_number_string)
3643 uschar *s = expand_string(host_number_string);
3646 log_write(0, LOG_MAIN|LOG_PANIC_DIE,
3647 "failed to expand localhost_number \"%s\": %s",
3648 host_number_string, expand_string_message);
3649 n = Ustrtol(s, &end, 0);
3650 if (Uskip_whitespace(&end))
3651 log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3652 "localhost_number value is not a number: %s", s);
3653 if (n > LOCALHOST_MAX)
3654 log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3655 "localhost_number is greater than the maximum allowed value (%d)",
3661 /* If tls_verify_hosts is set, tls_verify_certificates must also be set */
3663 if ((tls_verify_hosts || tls_try_verify_hosts) && !tls_verify_certificates)
3664 log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3665 "tls_%sverify_hosts is set, but tls_verify_certificates is not set",
3666 tls_verify_hosts ? "" : "try_");
3668 /* Magic number: at time of writing, 1024 has been the long-standing value
3669 used by so many clients, and what Exim used to use always, that it makes
3670 sense to just min-clamp this max-clamp at that. */
3671 if (tls_dh_max_bits < 1024)
3672 log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3673 "tls_dh_max_bits is too small, must be at least 1024 for interop");
3675 /* If openssl_options is set, validate it */
3676 if (openssl_options)
3679 log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3680 "openssl_options is set but we're using GnuTLS");
3683 if (!tls_openssl_options_parse(openssl_options, &dummy))
3684 log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3685 "openssl_options parse error: %s", openssl_options);
3688 #endif /*DISABLE_TLS*/
3690 if (!nowarn && !keep_environment && environ && *environ)
3691 log_write(0, LOG_MAIN,
3692 "Warning: purging the environment.\n"
3693 " Suggested action: use keep_environment.");
3698 /*************************************************
3699 * Initialize one driver *
3700 *************************************************/
3702 /* This is called once the driver's generic options, if any, have been read.
3703 We can now find the driver, set up defaults for the private options, and
3704 unset any "set" bits in the private options table (which might have been
3705 set by another incarnation of the same driver).
3708 d pointer to driver instance block, with generic
3710 drivers_available vector of available drivers
3711 size_of_info size of each block in drivers_available
3712 class class of driver, for error message
3714 Returns: pointer to the driver info block
3717 static driver_info *
3718 init_driver(driver_instance * d, driver_info * drivers_available,
3719 int size_of_info, const uschar * class)
3721 /*XXX this is walking the old-array */
3722 for (driver_info * dd = drivers_available; *dd->driver_name;
3723 dd = (driver_info *)((US dd) + size_of_info))
3724 if (Ustrcmp(d->driver_name, dd->driver_name) == 0)
3726 int len = dd->options_len;
3728 d->options_block = store_get_perm(len, GET_UNTAINTED);
3729 memcpy(d->options_block, dd->options_block, len);
3730 for (int i = 0; i < *dd->options_count; i++)
3731 dd->options[i].type &= ~opt_set;
3735 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
3736 "%s %s: cannot find %s driver \"%s\"", class, d->name, class, d->driver_name);
3738 return NULL; /* never obeyed */
3745 driver_init_fini(driver_instance * d, const uschar * class)
3747 driver_info * di = d->info;
3749 if (!d->driver_name)
3750 log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3751 "no driver defined for %s \"%s\"", class, d->name);
3756 /*************************************************
3757 * Initialize driver list *
3758 *************************************************/
3760 /* This function is called for routers, transports, and authentication
3761 mechanisms. It reads the data from the current point in the configuration file
3762 up to the end of the section, and sets up a chain of instance blocks according
3763 to the file's contents. The file will already have been opened by a call to
3764 readconf_main, and must be left open for subsequent reading of further data.
3766 Any errors cause a panic crash. Note that the blocks with names driver_info and
3767 driver_instance must map the first portions of all the _info and _instance
3768 blocks for this shared code to work.
3771 anchor &routers, &transports, &auths
3772 drivers_available available drivers
3773 size_of_info size of each info block
3774 instance_default points to default data for an instance
3775 instance_size size of instance block
3776 driver_optionlist generic option list
3777 driver_optionlist_count count of generic option list
3778 class "router", "transport", or "authenticator"
3785 readconf_driver_init(
3786 driver_instance ** anchor,
3787 driver_info * drivers_available,
3789 void * instance_default,
3791 optionlist * driver_optionlist,
3792 int driver_optionlist_count,
3793 const uschar * class)
3795 driver_instance ** p = anchor;
3796 driver_instance * d = NULL;
3799 while ((buffer = get_config_line()))
3801 uschar name[EXIM_DRIVERNAME_MAX];
3804 /* Read the first name on the line and test for the start of a new driver. A
3805 macro definition indicates the end of the previous driver. If this isn't the
3806 start of a new driver, the line will be re-read. */
3808 s = readconf_readname(name, sizeof(name), buffer);
3810 /* Handle macro definition, first finishing off the initialization of the
3811 previous driver, if any. */
3813 if (isupper(*name) && *s == '=')
3817 /* s is using big_buffer, so this call had better not */
3818 driver_init_fini(d, class);
3821 if (!macro_read_assignment(buffer)) exim_exit(EXIT_FAILURE);
3825 /* If the line starts with a name terminated by a colon, we are at the
3826 start of the definition of a new driver. The rest of the line must be
3831 /* Finish off initializing the previous driver. */
3834 driver_init_fini(d, class);
3836 /* Check that we haven't already got a driver of this name */
3838 for (d = *anchor; d; d = d->next)
3839 if (Ustrcmp(name, d->name) == 0)
3840 log_write(0, LOG_PANIC_DIE|LOG_CONFIG,
3841 "there are two %ss called \"%s\"", class, name);
3843 /* Set up a new driver instance data block on the chain, with
3844 its default values installed. */
3846 d = store_get_perm(instance_size, GET_UNTAINTED);
3847 memcpy(d, instance_default, instance_size);
3849 p = (driver_instance **)&d->next;
3850 d->name = string_copy(name);
3851 d->srcfile = config_filename;
3852 d->srcline = config_lineno;
3854 /* Clear out the "set" bits in the generic options */
3856 for (int i = 0; i < driver_optionlist_count; i++)
3857 driver_optionlist[i].type &= ~opt_set;
3859 /* Check nothing more on this line, then do the next loop iteration. */
3861 Uskip_whitespace(&s);
3862 if (*s) extra_chars_error(s, US"driver name ", name, US"");
3866 /* Not the start of a new driver. Give an error if we have not set up a
3867 current driver yet. */
3870 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "%s name missing", class);
3872 /* First look to see if this is a generic option; if it is "driver",
3873 initialize the driver. If is it not a generic option, we can look for a
3874 private option provided that the driver has been previously set up. */
3876 if (readconf_handle_option(buffer, driver_optionlist,
3877 driver_optionlist_count, d, NULL))
3879 if (!d->info && d->driver_name)
3880 init_driver(d, drivers_available, size_of_info, class);
3883 /* Handle private options - pass the generic block because some may
3884 live therein. A flag with each option indicates if it is in the public
3889 driver_info * di = d->info;
3890 readconf_handle_option(buffer, di->options,
3891 *di->options_count, d, US"option \"%s\" unknown");
3894 /* The option is not generic and the driver name has not yet been given. */
3896 else log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "option \"%s\" unknown "
3897 "(\"driver\" must be specified before any private options)", name);
3900 /* Run the initialization function for the final driver. */
3903 driver_init_fini(d, class);
3908 /*************************************************
3909 * Check driver dependency *
3910 *************************************************/
3912 /* This function is passed a driver instance and a string. It checks whether
3913 any of the string options for the driver contains the given string as an
3917 d points to a driver instance block
3918 s the string to search for
3920 Returns: TRUE if a dependency is found
3924 readconf_depends(driver_instance * d, uschar * s)
3926 driver_info * di = d->info;
3927 int count = *di->options_count;
3930 for (optionlist * ol = di->options; ol < di->options + count; ol++)
3931 if ((ol->type & opt_mask) == opt_stringptr)
3933 void * options_block = ol->type & opt_public ? (void *)d : d->options_block;
3934 uschar * value = *USS(US options_block + ol->v.offset);
3936 if (value && (ss = Ustrstr(value, s)) != NULL)
3938 if (ss <= value || (ss[-1] != '$' && ss[-1] != '{') ||
3939 isalnum(ss[Ustrlen(s)])) continue;
3940 DEBUG(D_transport) debug_printf("driver %s: \"%s\" option depends on %s\n",
3941 d->name, ol->name, s);
3946 DEBUG(D_transport) debug_printf("driver %s does not depend on %s\n", d->name, s);
3953 /*************************************************
3954 * Decode an error type for retries *
3955 *************************************************/
3957 /* This function is global because it is also called from the main
3958 program when testing retry information. It decodes strings such as "quota_7d"
3959 into numerical error codes.
3962 pp points to start of text
3963 p points past end of text
3964 basic_errno points to an int to receive the main error number
3965 more_errno points to an int to receive the secondary error data
3967 Returns: NULL if decoded correctly; else points to error text
3971 readconf_retry_error(const uschar *pp, const uschar *p,
3972 int *basic_errno, int *more_errno)
3975 const uschar *q = pp;
3976 while (q < p && *q != '_') q++;
3979 if (len == 5 && strncmpic(pp, US"quota", len) == 0)
3981 *basic_errno = ERRNO_EXIMQUOTA;
3982 if (q != p && (*more_errno = readconf_readtime(q+1, *p, FALSE)) < 0)
3983 return US"bad time value";
3986 else if (len == 7 && strncmpic(pp, US"refused", len) == 0)
3988 *basic_errno = ECONNREFUSED;
3991 if (strncmpic(q+1, US"MX", p-q-1) == 0) *more_errno = 'M';
3992 else if (strncmpic(q+1, US"A", p-q-1) == 0) *more_errno = 'A';
3993 else return US"A or MX expected after \"refused\"";
3997 else if (len == 7 && strncmpic(pp, US"timeout", len) == 0)
3999 *basic_errno = ETIMEDOUT;
4003 int xlen = p - q - 1;
4004 const uschar *x = q + 1;
4006 static uschar *extras[] =
4007 { US"A", US"MX", US"connect", US"connect_A", US"connect_MX" };
4008 static int values[] =
4009 { 'A', 'M', RTEF_CTOUT, RTEF_CTOUT|'A', RTEF_CTOUT|'M' };
4011 for (i = 0; i < nelem(extras); i++)
4012 if (strncmpic(x, extras[i], xlen) == 0)
4014 *more_errno = values[i];
4018 if (i >= nelem(extras))
4019 if (strncmpic(x, US"DNS", xlen) == 0)
4020 log_write(0, LOG_MAIN|LOG_PANIC, "\"timeout_dns\" is no longer "
4021 "available in retry rules (it has never worked) - treated as "
4024 return US"\"A\", \"MX\", or \"connect\" expected after \"timeout\"";
4028 else if (strncmpic(pp, US"mail_4", 6) == 0 ||
4029 strncmpic(pp, US"rcpt_4", 6) == 0 ||
4030 strncmpic(pp, US"data_4", 6) == 0)
4033 int x = 255; /* means "any 4xx code" */
4034 if (p != pp + 8) bad = TRUE; else
4036 int a = pp[6], b = pp[7];
4040 if (isdigit(b)) x += b - '0';
4041 else if (b == 'x') x += 100;
4044 else if (a != 'x' || b != 'x') bad = TRUE;
4048 return string_sprintf("%.4s_4 must be followed by xx, dx, or dd, where "
4049 "x is literal and d is any digit", pp);
4051 *basic_errno = *pp == 'm' ? ERRNO_MAIL4XX :
4052 *pp == 'r' ? ERRNO_RCPT4XX : ERRNO_DATA4XX;
4053 *more_errno = x << 8;
4056 else if (len == 4 && strncmpic(pp, US"auth", len) == 0 &&
4057 strncmpic(q+1, US"failed", p-q-1) == 0)
4058 *basic_errno = ERRNO_AUTHFAIL;
4060 else if (strncmpic(pp, US"lost_connection", p - pp) == 0)
4061 *basic_errno = ERRNO_SMTPCLOSED;
4063 else if (strncmpic(pp, US"tls_required", p - pp) == 0)
4064 *basic_errno = ERRNO_TLSREQUIRED;
4066 else if (strncmpic(pp, US"lookup", p - pp) == 0)
4067 *basic_errno = ERRNO_UNKNOWNHOST;
4069 else if (len != 1 || Ustrncmp(pp, "*", 1) != 0)
4070 return string_sprintf("unknown or malformed retry error \"%.*s\"", (int) (p-pp), pp);
4078 /*************************************************
4079 * Read retry information *
4080 *************************************************/
4082 /* Each line of retry information contains:
4084 . A domain name pattern or an address pattern;
4086 . An error name, possibly with additional data, or *;
4088 . An optional sequence of retry items, each consisting of an identifying
4089 letter, a cutoff time, and optional parameters.
4091 All this is decoded and placed into a control block. */
4094 /* Subroutine to read an argument, preceded by a comma and terminated
4095 by comma, semicolon, whitespace, or newline. The types are: 0 = time value,
4096 1 = fixed point number (returned *1000).
4099 paddr pointer to pointer to current character; updated
4100 type 0 => read a time; 1 => read a fixed point number
4102 Returns: time in seconds or fixed point number * 1000
4106 retry_arg(const uschar ** paddr, int type)
4108 const uschar * p = *paddr, * pp;
4110 if (*p++ != ',') log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "comma expected");
4112 Uskip_whitespace(&p);
4114 while (isalnum(*p) || (type == 1 && *p == '.')) p++;
4116 if (*p && !isspace(*p) && *p != ',' && *p != ';')
4117 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "comma or semicolon expected");
4122 case 0: return readconf_readtime(pp, *p, FALSE);
4123 case 1: return readconf_readfixed(pp, *p);
4125 return 0; /* Keep picky compilers happy */
4128 /* The function proper */
4131 readconf_retries(void)
4133 retry_config **chain = &retries;
4137 while ((p = get_config_line()))
4139 retry_rule **rchain;
4143 next = store_get(sizeof(retry_config), GET_UNTAINTED);
4146 chain = &(next->next);
4147 next->basic_errno = next->more_errno = 0;
4148 next->senders = NULL;
4150 rchain = &(next->rules);
4152 next->pattern = string_dequote(&p);
4153 Uskip_whitespace(&p);
4155 while (mac_isgraph(*p)) p++;
4156 if (p - pp <= 0) log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
4157 "missing error type in retry rule");
4159 /* Test error names for things we understand. */
4161 if ((error = readconf_retry_error(pp, p, &next->basic_errno,
4162 &next->more_errno)))
4163 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "%s", error);
4165 /* There may be an optional address list of senders to be used as another
4166 constraint on the rule. This was added later, so the syntax is a bit of a
4167 fudge. Anything that is not a retry rule starting "F," or "G," is treated as
4170 Uskip_whitespace(&p);
4171 if (Ustrncmp(p, "senders", 7) == 0)
4174 Uskip_whitespace(&p);
4175 if (*p++ != '=') log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
4176 "\"=\" expected after \"senders\" in retry rule");
4177 Uskip_whitespace(&p);
4178 next->senders = string_dequote(&p);
4181 /* Now the retry rules. Keep the maximum timeout encountered. */
4183 Uskip_whitespace(&p);
4187 retry_rule * rule = store_get(sizeof(retry_rule), GET_UNTAINTED);
4189 rchain = &(rule->next);
4191 rule->rule = toupper(*p++);
4192 rule->timeout = retry_arg(&p, 0);
4193 if (rule->timeout > retry_maximum_timeout)
4194 retry_maximum_timeout = rule->timeout;
4198 case 'F': /* Fixed interval */
4199 rule->p1 = retry_arg(&p, 0);
4202 case 'G': /* Geometrically increasing intervals */
4203 case 'H': /* Ditto, but with randomness */
4204 rule->p1 = retry_arg(&p, 0);
4205 rule->p2 = retry_arg(&p, 1);
4209 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "unknown retry rule letter");
4213 if (rule->timeout <= 0 || rule->p1 <= 0 ||
4214 (rule->rule != 'F' && rule->p2 < 1000))
4215 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
4216 "bad parameters for retry rule");
4218 if (Uskip_whitespace(&p) == ';')
4221 Uskip_whitespace(&p);
4224 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "semicolon expected");
4231 /*************************************************
4232 * Initialize authenticators *
4233 *************************************************/
4235 /* Read the authenticators section of the configuration file.
4244 #ifndef DISABLE_PIPE_CONNECT
4248 readconf_driver_init((driver_instance **)&auths, /* chain anchor */
4249 (driver_info *)auths_available, /* available drivers */
4250 sizeof(auth_info), /* size of info block */
4251 &auth_defaults, /* default values for generic options */
4252 sizeof(auth_instance), /* size of instance block */
4253 optionlist_auths, /* generic options */
4254 optionlist_auths_size,
4257 for (auth_instance * au = auths; au; au = au->drinst.next)
4259 if (!au->public_name)
4260 log_write(0, LOG_PANIC_DIE|LOG_CONFIG, "no public name specified for "
4261 "the %s authenticator", au->drinst.name);
4263 for (auth_instance * bu = au->drinst.next; bu; bu = bu->drinst.next)
4264 if (strcmpic(au->public_name, bu->public_name) == 0)
4265 if ( au->client && bu->client
4266 || au->server && bu->server)
4267 log_write(0, LOG_PANIC_DIE|LOG_CONFIG, "two %s authenticators "
4268 "(%s and %s) have the same public name (%s)",
4269 au->client && bu->client ? US"client" : US"server",
4270 au->drinst.name, bu->drinst.name, au->public_name);
4271 #ifndef DISABLE_PIPE_CONNECT
4275 #ifndef DISABLE_PIPE_CONNECT
4276 f.smtp_in_early_pipe_no_auth = nauths > 16;
4281 /* For error messages, a string describing the config location associated
4282 with current processing. NULL if we are not in an authenticator. */
4285 authenticator_current_name(void)
4287 if (!authenticator_name) return NULL;
4288 return string_sprintf(" (authenticator %s, %s %d)", authenticator_name, driver_srcfile, driver_srcline);
4295 /*************************************************
4296 * Read ACL information *
4297 *************************************************/
4299 /* If this run of Exim is not doing something that involves receiving a
4300 message, we can just skip over the ACL information. No need to parse it.
4302 First, we have a function for acl_read() to call back to get the next line. We
4303 need to remember the line we passed, because at the end it will contain the
4304 name of the next ACL. */
4306 static uschar *acl_line;
4311 acl_line = get_config_line();
4316 /* Now the main function:
4325 /* Read each ACL and add it into the tree. Macro (re)definitions are allowed
4328 acl_line = get_config_line();
4332 uschar name[EXIM_DRIVERNAME_MAX];
4335 const uschar * p = readconf_readname(name, sizeof(name), acl_line);
4337 if (isupper(*name) && *p == '=')
4339 if (!macro_read_assignment(acl_line)) exim_exit(EXIT_FAILURE);
4340 acl_line = get_config_line();
4344 if (*p != ':' || name[0] == 0)
4345 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "missing or malformed ACL name");
4347 node = store_get_perm(sizeof(tree_node) + Ustrlen(name), name);
4348 Ustrcpy(node->name, name);
4349 if (!tree_insertnode(&acl_anchor, node))
4350 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
4351 "there are two ACLs called \"%s\"", name);
4353 node->data.ptr = acl_read(acl_callback, &error);
4355 if (node->data.ptr == NULL && error != NULL)
4356 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "error in ACL: %s", error);
4362 /*************************************************
4363 * Read configuration for local_scan() *
4364 *************************************************/
4366 /* This function is called after "begin local_scan" is encountered in the
4367 configuration file. If the local_scan() function allows for configuration
4368 options, we can process them. Otherwise, we expire in a panic.
4375 local_scan_init(void)
4377 #ifndef LOCAL_SCAN_HAS_OPTIONS
4378 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN, "local_scan() options not supported: "
4379 "(LOCAL_SCAN_HAS_OPTIONS not defined in Local/Makefile)");
4383 while ((p = get_config_line()))
4384 (void) readconf_handle_option(p, local_scan_options, local_scan_options_count,
4385 NULL, US"local_scan option \"%s\" unknown");
4391 /*************************************************
4392 * Read rest of configuration (after main) *
4393 *************************************************/
4395 /* This function reads the rest of the runtime configuration, after the main
4396 configuration. It is called only when actually needed. Each subsequent section
4397 of the configuration starts with a line of the form
4401 where the name is "routers", "transports", etc. A section is terminated by
4402 hitting the next "begin" line, and the next name is left in next_section.
4403 Because it may confuse people as to whether the names are singular or plural,
4404 we add "s" if it's missing. There is always enough room in next_section for
4405 this. This function is basically just a switch.
4411 static uschar *section_list[] = {
4425 while(next_section[0] != 0)
4429 int last = nelem(section_list);
4431 int n = Ustrlen(next_section);
4433 if (tolower(next_section[n-1]) != 's') Ustrcpy(next_section+n, US"s");
4437 int c = strcmpic(next_section, section_list[mid]);
4439 if (c > 0) first = mid + 1; else last = mid;
4441 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
4442 "\"%.*s\" is not a known configuration section name", n, next_section);
4443 mid = (last + first)/2;
4447 if (((had ^= bit) & bit) == 0)
4448 log_write(0, LOG_PANIC_DIE|LOG_CONFIG_IN,
4449 "\"%.*s\" section is repeated in the configuration file", n,
4454 case 0: readconf_acl(); break;
4455 case 1: auths_init(); break;
4456 case 2: local_scan_init(); break;
4457 case 3: readconf_retries(); break;
4458 case 4: readconf_rewrites(); break;
4459 case 5: route_init(); break;
4460 case 6: transport_init(); break;
4464 (void)fclose(config_file);
4467 /* Init the storage for the pre-parsed config lines */
4469 readconf_save_config(const uschar *s)
4471 save_config_line(string_sprintf("# Exim Configuration (%s)",
4472 f.running_in_test_harness ? US"X" : s));
4476 save_config_position(const uschar *file, int line)
4478 save_config_line(string_sprintf("# %d \"%s\"", line, file));
4481 /* Append a pre-parsed logical line to the config lines store,
4482 this operates on a global (static) list that holds all the pre-parsed
4483 config lines, we do no further processing here, output formatting and
4484 honouring of <hide> or macros will be done during output */
4487 save_config_line(const uschar* line)
4489 static config_line_item *current;
4490 config_line_item *next;
4492 next = (config_line_item*) store_get(sizeof(config_line_item), GET_UNTAINTED);
4493 next->line = string_copy(line);
4496 if (!config_lines) config_lines = next;
4497 else current->next = next;
4502 /* List the parsed config lines, care about nice formatting and
4503 hide the <hide> values unless we're the admin user */
4505 print_config(BOOL admin, BOOL terse)
4507 const int TS = terse ? 0 : 2;
4511 for (const config_line_item * i = config_lines; i; i = i->next)
4513 uschar * current, * p;
4515 if (r) store_reset(r);
4518 /* skip over to the first non-space */
4519 current = string_copy(i->line);
4520 if (!Uskip_whitespace(¤t))
4523 /* Collapse runs of spaces. We stop this if we encounter one of the
4524 following characters: "'$, as this may indicate careful formatting */
4526 for (p = current; *p; p++) if (isspace(*p))
4529 if (*p != ' ') *p = ' ';
4531 Uskip_whitespace(&p);
4534 memmove(p+1, next, Ustrlen(next)+1);
4536 if (*next == '"' || *next == '\'' || *next == '$')
4541 if (current[0] == '#')
4544 /* begin lines are left aligned */
4545 else if (Ustrncmp(current, "begin", 5) == 0 && isspace(current[5]))
4547 if (!terse) puts("");
4552 /* router/acl/transport block names */
4553 else if (current[Ustrlen(current)-1] == ':' && !Ustrchr(current, '='))
4555 if (!terse) puts("");
4556 printf("%*s%s\n", TS, "", current);
4560 /* hidden lines (all MACROS or lines prefixed with "hide") */
4562 && ( isupper(*current)
4563 || Ustrncmp(current, "hide", 4) == 0 && isspace(current[4])
4567 if ((p = Ustrchr(current, '=')))
4570 printf("%*s%s= %s\n", indent, "", current, CCS hidden);
4572 /* e.g.: hide split_spool_directory */
4574 printf("%*s\n", indent, CCS hidden);
4578 /* rest is public */
4579 printf("%*s%s\n", indent, "", current);
4581 if (r) store_reset(r);
4584 #endif /*!MACRO_PREDEF*/
4587 /* End of readconf.c */