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