Installed Lars Mainka's patch for OpenSSL support of CRL collections.
[exim.git] / src / src / globals.c
CommitLineData
1a46a8c5 1/* $Cambridge: exim/src/src/globals.c,v 1.20 2005/03/22 14:11:54 ph10 Exp $ */
059ec3d9
PH
2
3/*************************************************
4* Exim - an Internet mail transport agent *
5*************************************************/
6
c988f1f4 7/* Copyright (c) University of Cambridge 1995 - 2005 */
059ec3d9
PH
8/* See the file NOTICE for conditions of use and distribution. */
9
10/* All the global variables are defined together in this one module, so
11that they are easy to find. */
12
13#include "exim.h"
14
15
16/* The OSF1 linker puts out a worrying warning if any sections contain no
17executable code. It says
18
19Warning: Linking some objects which contain exception information sections
20 and some which do not. This may cause fatal runtime exception handling
21 problems.
22
23As this may cause people to worry needlessly, include a dummy function here
24to stop the message from appearing. Make it reference itself to stop picky
25compilers complaining that it is unused, and put in a dummy argument to stop
26even pickier compilers complaining about infinite loops. */
27
28static void dummy(int x) { dummy(x-1); }
29
30
31/* Generic options for auths, all of which live inside auth_instance
32data blocks and hence have the opt_public flag set. */
33
34optionlist optionlist_auths[] = {
35 { "driver", opt_stringptr | opt_public,
36 (void *)(offsetof(auth_instance, driver_name)) },
37 { "public_name", opt_stringptr | opt_public,
38 (void *)(offsetof(auth_instance, public_name)) },
39 { "server_advertise_condition", opt_stringptr | opt_public,
40 (void *)(offsetof(auth_instance, advertise_condition))},
41 { "server_debug_print", opt_stringptr | opt_public,
42 (void *)(offsetof(auth_instance, server_debug_string)) },
43 { "server_mail_auth_condition", opt_stringptr | opt_public,
44 (void *)(offsetof(auth_instance, mail_auth_condition)) },
45 { "server_set_id", opt_stringptr | opt_public,
46 (void *)(offsetof(auth_instance, set_id)) }
47};
48
49int optionlist_auths_size = sizeof(optionlist_auths)/sizeof(optionlist);
50
51/* An empty host aliases list. */
52
53uschar *no_aliases = NULL;
54
55
56/* For comments on these variables, see globals.h. I'm too idle to
57duplicate them here... */
58
59#ifdef EXIM_PERL
60uschar *opt_perl_startup = NULL;
61BOOL opt_perl_at_start = FALSE;
62BOOL opt_perl_started = FALSE;
63#endif
64
1a46a8c5
PH
65#ifdef EXPAND_DLFUNC
66tree_node *dlobj_anchor = NULL;
67#endif
68
059ec3d9
PH
69#ifdef LOOKUP_IBASE
70uschar *ibase_servers = NULL;
71#endif
72
73#ifdef LOOKUP_LDAP
74uschar *eldap_default_servers = NULL;
75int eldap_version = -1;
76#endif
77
78#ifdef LOOKUP_MYSQL
79uschar *mysql_servers = NULL;
80#endif
81
82#ifdef LOOKUP_ORACLE
83uschar *oracle_servers = NULL;
84#endif
85
86#ifdef LOOKUP_PGSQL
87uschar *pgsql_servers = NULL;
88#endif
89
90#ifdef SUPPORT_MOVE_FROZEN_MESSAGES
91BOOL move_frozen_messages = FALSE;
92#endif
93
94/* These variables are outside the #ifdef because it keeps the code less
95cluttered in several places (e.g. during logging) if we can always refer to
96them. Also, the tls_ variables are now always visible. */
97
98BOOL tls_active = -1;
99BOOL tls_certificate_verified = FALSE;
100uschar *tls_cipher = NULL;
101BOOL tls_on_connect = FALSE;
102uschar *tls_on_connect_ports = NULL;
103uschar *tls_peerdn = NULL;
104
105#ifdef SUPPORT_TLS
106const pcre *regex_STARTTLS = NULL;
107uschar *tls_advertise_hosts = NULL; /* This is deliberate */
108uschar *tls_certificate = NULL;
109uschar *tls_crl = NULL;
110uschar *tls_dhparam = NULL;
111BOOL tls_offered = FALSE;
112uschar *tls_privatekey = NULL;
113BOOL tls_remember_esmtp = FALSE;
114uschar *tls_require_ciphers = NULL;
115uschar *tls_try_verify_hosts = NULL;
116uschar *tls_verify_certificates= NULL;
117uschar *tls_verify_hosts = NULL;
118#endif
119
120
121/* Input-reading functions for messages, so we can use special ones for
122incoming TCP/IP. The defaults use stdin. We never need these for any
123stand-alone tests. */
124
125#ifndef STAND_ALONE
126int (*receive_getc)(void) = stdin_getc;
127int (*receive_ungetc)(int) = stdin_ungetc;
128int (*receive_feof)(void) = stdin_feof;
129int (*receive_ferror)(void) = stdin_ferror;
130#endif
131
132
133/* List of per-address expansion variables for clearing and saving/restoring
134when verifying one address while routing/verifying another. We have to have
135the size explicit, because it is referenced from more than one module. */
136
137uschar **address_expansions[ADDRESS_EXPANSIONS_COUNT] = {
138 &deliver_address_data,
139 &deliver_domain,
140 &deliver_domain_data,
141 &deliver_domain_orig,
142 &deliver_domain_parent,
143 &deliver_localpart,
144 &deliver_localpart_data,
145 &deliver_localpart_orig,
146 &deliver_localpart_parent,
147 &deliver_localpart_prefix,
148 &deliver_localpart_suffix,
149 (uschar **)(&deliver_recipients),
150 &deliver_host,
151 &deliver_home,
152 &address_file,
153 &address_pipe,
154 &self_hostname,
155 NULL };
156
157int address_expansions_count = sizeof(address_expansions)/sizeof(uschar **);
158
159/* General global variables */
160
161tree_node *acl_anchor = NULL;
162uschar *acl_not_smtp = NULL;
163uschar *acl_smtp_auth = NULL;
164uschar *acl_smtp_connect = NULL;
165uschar *acl_smtp_data = NULL;
166uschar *acl_smtp_etrn = NULL;
167uschar *acl_smtp_expn = NULL;
168uschar *acl_smtp_helo = NULL;
169uschar *acl_smtp_mail = NULL;
170uschar *acl_smtp_mailauth = NULL;
8523533c
TK
171#ifdef WITH_CONTENT_SCAN
172uschar *acl_smtp_mime = NULL;
173#endif
059ec3d9
PH
174uschar *acl_smtp_predata = NULL;
175uschar *acl_smtp_quit = NULL;
176uschar *acl_smtp_rcpt = NULL;
177uschar *acl_smtp_starttls = NULL;
178uschar *acl_smtp_vrfy = NULL;
179BOOL acl_temp_details = FALSE;
180uschar *acl_var[ACL_C_MAX+ACL_M_MAX];
181uschar *acl_verify_message = NULL;
182header_line *acl_warn_headers = NULL;
183string_item *acl_warn_logged = NULL;
184
185/* Names of SMTP places for use in ACL error messages, and corresponding SMTP
186error codes - keep in step with definitions of ACL_WHERE_xxxx in macros.h. */
187
188uschar *acl_wherenames[] = { US"RCPT",
189 US"MAIL",
190 US"PREDATA",
8523533c
TK
191#ifdef WITH_CONTENT_SCAN
192 US"MIME",
193#endif
059ec3d9
PH
194 US"DATA",
195 US"non-SMTP",
196 US"AUTH",
197 US"connection",
198 US"ETRN",
199 US"EXPN",
200 US"EHLO or HELO",
201 US"MAILAUTH",
202 US"QUIT",
203 US"STARTTLS",
204 US"VRFY"
205 };
206
207int acl_wherecodes[] = { 550, /* RCPT */
208 550, /* MAIL */
209 550, /* PREDATA */
8523533c
TK
210#ifdef WITH_CONTENT_SCAN
211 550, /* MIME */
8e669ac1 212#endif
059ec3d9
PH
213 550, /* DATA */
214 0, /* not SMTP; not relevant */
215 503, /* AUTH */
216 550, /* connect */
217 458, /* ETRN */
218 550, /* EXPN */
219 550, /* HELO/EHLO */
220 0, /* MAILAUTH; not relevant */
221 0, /* QUIT; not relevant */
222 550, /* STARTTLS */
223 252 /* VRFY */
224 };
8e669ac1 225
69358f02
PH
226BOOL active_local_from_check = FALSE;
227BOOL active_local_sender_retain = FALSE;
059ec3d9
PH
228BOOL accept_8bitmime = FALSE;
229address_item *addr_duplicate = NULL;
230
231address_item address_defaults = {
232 NULL, /* next */
233 NULL, /* parent */
234 NULL, /* first */
235 NULL, /* dupof */
236 NULL, /* start_router */
237 NULL, /* router */
238 NULL, /* transport */
239 NULL, /* host_list */
240 NULL, /* host_used */
241 NULL, /* fallback_hosts */
242 NULL, /* reply */
243 NULL, /* retries */
244 NULL, /* address */
245 NULL, /* unique */
246 NULL, /* cc_local_part */
247 NULL, /* lc_local_part */
248 NULL, /* local_part */
249 NULL, /* prefix */
250 NULL, /* suffix */
251 NULL, /* domain */
252 NULL, /* address_retry_key */
253 NULL, /* domain_retry_key */
254 NULL, /* current_dir */
255 NULL, /* home_dir */
256 NULL, /* message */
257 NULL, /* user_message */
258 NULL, /* onetime_parent */
259 NULL, /* pipe_expandn */
260 NULL, /* return_filename */
261 NULL, /* self_hostname */
262 NULL, /* shadow_message */
263 #ifdef SUPPORT_TLS
264 NULL, /* cipher */
265 NULL, /* peerdn */
266 #endif
267 (uid_t)(-1), /* uid */
268 (gid_t)(-1), /* gid */
269 0, /* flags */
270 { 0 }, /* domain_cache - any larger array should be zeroed */
271 { 0 }, /* localpart_cache - ditto */
272 -1, /* mode */
273 0, /* more_errno */
274 ERRNO_UNKNOWNERROR, /* basic_errno */
275 0, /* child_count */
276 -1, /* return_file */
277 SPECIAL_NONE, /* special_action */
278 DEFER, /* transport_return */
279 { /* fields that are propagated to children */
280 NULL, /* address_data */
281 NULL, /* domain_data */
282 NULL, /* localpart_data */
283 NULL, /* errors_address */
284 NULL, /* extra_headers */
285 NULL, /* remove_headers */
286 }
287};
288
289uschar *address_file = NULL;
290uschar *address_pipe = NULL;
291BOOL address_test_mode = FALSE;
292tree_node *addresslist_anchor = NULL;
293int addresslist_count = 0;
294gid_t *admin_groups = NULL;
295BOOL admin_user = FALSE;
296BOOL allow_domain_literals = FALSE;
297BOOL allow_mx_to_ip = FALSE;
298BOOL allow_unqualified_recipient = TRUE; /* For local messages */
299BOOL allow_unqualified_sender = TRUE; /* Reset for SMTP */
300BOOL allow_utf8_domains = FALSE;
301uschar *authenticated_id = NULL;
302uschar *authenticated_sender = NULL;
303BOOL authentication_failed = FALSE;
304auth_instance *auths = NULL;
305uschar *auth_advertise_hosts = US"*";
306auth_instance auth_defaults = {
307 NULL, /* chain pointer */
308 NULL, /* name */
309 NULL, /* info */
310 NULL, /* private options block pointer */
311 NULL, /* driver_name */
312 NULL, /* advertise_condition */
313 NULL, /* public_name */
314 NULL, /* set_id */
315 NULL, /* server_mail_auth_condition */
316 NULL, /* server_debug_string */
317 FALSE, /* client */
318 FALSE, /* server */
319 FALSE /* advertised */
320};
321
322uschar *auth_defer_msg = US"reason not recorded";
323uschar *auth_defer_user_msg = US"";
324int auto_thaw = 0;
8523533c
TK
325#ifdef WITH_CONTENT_SCAN
326uschar *av_scanner = US"sophie:/var/run/sophie"; /* AV scanner */
327#endif
059ec3d9
PH
328
329BOOL background_daemon = TRUE;
330uschar *base62_chars=
331 US"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
332uschar *bi_command = NULL;
333uschar *big_buffer = NULL;
334int big_buffer_size = BIG_BUFFER_SIZE;
8523533c
TK
335#ifdef EXPERIMENTAL_BRIGHTMAIL
336uschar *bmi_alt_location = NULL;
337uschar *bmi_base64_tracker_verdict = NULL;
338uschar *bmi_base64_verdict = NULL;
339uschar *bmi_config_file = US"/opt/brightmail/etc/brightmail.cfg";
340int bmi_deliver = 1;
341int bmi_run = 0;
342uschar *bmi_verdicts = NULL;
343#endif
059ec3d9
PH
344int body_linecount = 0;
345int body_zerocount = 0;
346uschar *bounce_message_file = NULL;
347uschar *bounce_message_text = NULL;
348uschar *bounce_recipient = NULL;
349BOOL bounce_return_body = TRUE;
350BOOL bounce_return_message = TRUE;
351int bounce_return_size_limit = 100*1024;
352uschar *bounce_sender_authentication = NULL;
353int bsmtp_transaction_linecount = 0;
354
355int callout_cache_domain_positive_expire = 7*24*60*60;
356int callout_cache_domain_negative_expire = 3*60*60;
357int callout_cache_positive_expire = 24*60*60;
358int callout_cache_negative_expire = 2*60*60;
359uschar *callout_random_local_part = US"$primary_hostname-$tod_epoch-testing";
360uschar *check_dns_names_pattern= US"(?i)^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$";
361int check_log_inodes = 0;
362int check_log_space = 0;
363int check_spool_inodes = 0;
364int check_spool_space = 0;
365int clmacro_count = 0;
366uschar *clmacros[MAX_CLMACROS];
367BOOL config_changed = FALSE;
368FILE *config_file = NULL;
369uschar *config_filename = NULL;
370int config_lineno = 0;
35edf2ff
PH
371#ifdef CONFIGURE_GROUP
372gid_t config_gid = CONFIGURE_GROUP;
373#endif
059ec3d9
PH
374uschar *config_main_filelist = US CONFIGURE_FILE
375 "\0<-----------Space to patch configure_filename->";
376uschar *config_main_filename = NULL;
377
378#ifdef CONFIGURE_OWNER
379uid_t config_uid = CONFIGURE_OWNER;
380#endif
381
382int connection_max_messages= -1;
383uschar *continue_hostname = NULL;
384uschar *continue_host_address = NULL;
385BOOL continue_more = FALSE;
386int continue_sequence = 1;
387uschar *continue_transport = NULL;
388
389BOOL daemon_listen = FALSE;
390uschar *daemon_smtp_port = US"smtp";
3d235903 391BOOL debug_daemon = FALSE;
059ec3d9
PH
392int debug_fd = -1;
393FILE *debug_file = NULL;
394bit_table debug_options[] = {
395 { US"acl", D_acl },
396 { US"all", D_all },
397 { US"auth", D_auth },
398 { US"deliver", D_deliver },
399 { US"dns", D_dns },
400 { US"dnsbl", D_dnsbl },
401 { US"exec", D_exec },
402 { US"expand", D_expand },
403 { US"filter", D_filter },
404 { US"hints_lookup", D_hints_lookup },
405 { US"host_lookup", D_host_lookup },
406 { US"ident", D_ident },
407 { US"interface", D_interface },
408 { US"lists", D_lists },
409 { US"load", D_load },
410 { US"local_scan", D_local_scan },
411 { US"lookup", D_lookup },
412 { US"memory", D_memory },
413 { US"pid", D_pid },
414 { US"process_info", D_process_info },
415 { US"queue_run", D_queue_run },
416 { US"receive", D_receive },
417 { US"resolver", D_resolver },
418 { US"retry", D_retry },
419 { US"rewrite", D_rewrite },
420 { US"route", D_route },
421 { US"timestamp", D_timestamp },
422 { US"tls", D_tls },
423 { US"transport", D_transport },
424 { US"uid", D_uid },
425 { US"verify", D_verify }
426};
427int debug_options_count = sizeof(debug_options)/sizeof(bit_table);
428unsigned int debug_selector = 0;
429int delay_warning[DELAY_WARNING_SIZE] = { DELAY_WARNING_SIZE, 1, 24*60*60 };
430uschar *delay_warning_condition= US"${if match{$h_precedence:}{(?i)bulk|list|junk}{no}{yes}}";
431BOOL delivery_date_remove = TRUE;
432uschar *deliver_address_data = NULL;
433int deliver_datafile = -1;
434uschar *deliver_domain = NULL;
435uschar *deliver_domain_data = NULL;
436uschar *deliver_domain_orig = NULL;
437uschar *deliver_domain_parent = NULL;
438BOOL deliver_drop_privilege = FALSE;
439BOOL deliver_firsttime = FALSE;
440BOOL deliver_force = FALSE;
441BOOL deliver_freeze = FALSE;
442int deliver_frozen_at = 0;
443uschar *deliver_home = NULL;
444uschar *deliver_host = NULL;
445uschar *deliver_host_address = NULL;
446uschar *deliver_in_buffer = NULL;
447ino_t deliver_inode = 0;
448uschar *deliver_localpart = NULL;
449uschar *deliver_localpart_data = NULL;
450uschar *deliver_localpart_orig = NULL;
451uschar *deliver_localpart_parent = NULL;
452uschar *deliver_localpart_prefix = NULL;
453uschar *deliver_localpart_suffix = NULL;
454BOOL deliver_force_thaw = FALSE;
455BOOL deliver_manual_thaw = FALSE;
456uschar *deliver_out_buffer = NULL;
457int deliver_queue_load_max = -1;
458address_item *deliver_recipients = NULL;
459uschar *deliver_selectstring = NULL;
460BOOL deliver_selectstring_regex = FALSE;
461uschar *deliver_selectstring_sender = NULL;
462BOOL deliver_selectstring_sender_regex = FALSE;
8523533c
TK
463#ifdef WITH_OLD_DEMIME
464int demime_errorlevel = 0;
465int demime_ok = 0;
466uschar *demime_reason = NULL;
467#endif
059ec3d9
PH
468BOOL disable_logging = FALSE;
469
fb2274d4
TK
470#ifdef EXPERIMENTAL_DOMAINKEYS
471uschar *dk_signing_domain = NULL;
472uschar *dk_signing_selector = NULL;
473int dk_do_verify = 0;
474#endif
475
059ec3d9
PH
476uschar *dns_again_means_nonexist = NULL;
477uschar *dns_ipv4_lookup = NULL;
478int dns_retrans = 0;
479int dns_retry = 0;
480uschar *dnslist_domain = NULL;
481uschar *dnslist_text = NULL;
482uschar *dnslist_value = NULL;
483tree_node *domainlist_anchor = NULL;
484int domainlist_count = 0;
485BOOL dont_deliver = FALSE;
486BOOL dot_ends = TRUE;
487BOOL drop_cr = FALSE; /* No longer used */
488
489BOOL enable_dollar_recipients = FALSE;
490BOOL envelope_to_remove = TRUE;
491int errno_quota = ERRNO_QUOTA;
492uschar *errors_copy = NULL;
493int error_handling = ERRORS_SENDER;
494uschar *errors_reply_to = NULL;
495int errors_sender_rc = EXIT_FAILURE;
496
497gid_t exim_gid = EXIM_GID;
498BOOL exim_gid_set = TRUE; /* This gid is always set */
499uschar *exim_path = US BIN_DIRECTORY "/exim"
500 "\0<---------------Space to patch exim_path->";
501uid_t exim_uid = EXIM_UID;
502BOOL exim_uid_set = TRUE; /* This uid is always set */
503int expand_forbid = 0;
504int expand_nlength[EXPAND_MAXN+1];
505int expand_nmax = -1;
506uschar *expand_nstring[EXPAND_MAXN+1];
507BOOL expand_string_forcedfail = FALSE;
508uschar *expand_string_message;
509BOOL extract_addresses_remove_arguments = TRUE;
510uschar *extra_local_interfaces = NULL;
511
8523533c 512BOOL fake_reject = FALSE;
dc082449 513uschar *fake_reject_text = US"Your message has been rejected but is being kept for evaluation.\nIf it was a legitimate message, it may still be delivered to the target recipient(s).";
059ec3d9
PH
514int filter_n[FILTER_VARIABLE_COUNT];
515BOOL filter_running = FALSE;
516int filter_sn[FILTER_VARIABLE_COUNT];
f05da2e8
PH
517int filter_test = FTEST_NONE;
518uschar *filter_test_sfile = NULL;
519uschar *filter_test_ufile = NULL;
059ec3d9
PH
520uschar *filter_thisaddress = NULL;
521int finduser_retries = 0;
8523533c
TK
522#ifdef WITH_OLD_DEMIME
523uschar *found_extension = NULL;
524#endif
059ec3d9
PH
525uid_t fixed_never_users[] = { FIXED_NEVER_USERS };
526uschar *freeze_tell = NULL;
527uschar *fudged_queue_times = US"";
528
529uschar *gecos_name = NULL;
530uschar *gecos_pattern = NULL;
531rewrite_rule *global_rewrite_rules = NULL;
532
533uschar *headers_charset = US HEADERS_CHARSET;
534int header_insert_maxlen = 64 * 1024;
535header_line *header_last = NULL;
536header_line *header_list = NULL;
537int header_maxsize = HEADER_MAXSIZE;
538int header_line_maxsize = 0;
539
540header_name header_names[] = {
541 { US"bcc", 3, TRUE, htype_bcc },
542 { US"cc", 2, TRUE, htype_cc },
543 { US"date", 4, TRUE, htype_date },
544 { US"delivery-date", 13, FALSE, htype_delivery_date },
545 { US"envelope-to", 11, FALSE, htype_envelope_to },
546 { US"from", 4, TRUE, htype_from },
547 { US"message-id", 10, TRUE, htype_id },
548 { US"received", 8, FALSE, htype_received },
549 { US"reply-to", 8, FALSE, htype_reply_to },
550 { US"return-path", 11, FALSE, htype_return_path },
551 { US"sender", 6, TRUE, htype_sender },
552 { US"subject", 7, FALSE, htype_subject },
553 { US"to", 2, TRUE, htype_to }
554};
555
556int header_names_size = sizeof(header_names)/sizeof(header_name);
557
558BOOL header_rewritten = FALSE;
559uschar *helo_accept_junk_hosts = NULL;
560uschar *helo_allow_chars = US"";
561uschar *helo_lookup_domains = US"@ : @[]";
562uschar *helo_try_verify_hosts = NULL;
563BOOL helo_verified = FALSE;
564uschar *helo_verify_hosts = NULL;
565uschar *hex_digits = US"0123456789abcdef";
566uschar *hold_domains = NULL;
567BOOL host_checking = FALSE;
568BOOL host_checking_callout = FALSE;
569uschar *host_data = NULL;
570BOOL host_find_failed_syntax= FALSE;
571uschar *host_lookup = NULL;
b08b24c8 572BOOL host_lookup_deferred = FALSE;
059ec3d9
PH
573BOOL host_lookup_failed = FALSE;
574uschar *host_lookup_order = US"bydns:byaddr";
575uschar *host_lookup_msg = US"";
576int host_number = 0;
577uschar *host_number_string = NULL;
578uschar *host_reject_connection = NULL;
579tree_node *hostlist_anchor = NULL;
580int hostlist_count = 0;
581uschar *hosts_treat_as_local = NULL;
582uschar *hosts_connection_nolog = NULL;
583
584int ignore_bounce_errors_after = 10*7*24*60*60; /* 10 weeks */
585BOOL ignore_fromline_local = FALSE;
586uschar *ignore_fromline_hosts = NULL;
587uschar *interface_address = NULL;
588int interface_port = -1;
589BOOL is_inetd = FALSE;
590
591int journal_fd = -1;
592
593int keep_malformed = 4*24*60*60; /* 4 days */
594
595uschar *eldap_dn = NULL;
596int load_average = -2;
597BOOL local_error_message = FALSE;
598BOOL local_from_check = TRUE;
599uschar *local_from_prefix = NULL;
600uschar *local_from_suffix = NULL;
601
602#if HAVE_IPV6
603uschar *local_interfaces = US"<; ::0 ; 0.0.0.0";
604#else
605uschar *local_interfaces = US"0.0.0.0";
606#endif
607
608uschar *local_scan_data = NULL;
609int local_scan_timeout = 5*60;
610BOOL local_sender_retain = FALSE;
611gid_t local_user_gid = (gid_t)(-1);
612uid_t local_user_uid = (uid_t)(-1);
613
614tree_node *localpartlist_anchor= NULL;
615int localpartlist_count = 0;
616uschar *log_buffer = NULL;
617unsigned int log_extra_selector = LX_default;
618uschar *log_file_path = US LOG_FILE_PATH
619 "\0<--------------Space to patch log_file_path->";
620
621/* Those log options with L_xxx identifiers have values less than 0x800000 and
622are the ones that get put into log_write_selector. They can be used in calls to
623log_write() to test for the bit. The options with LX_xxx identifiers have
624values greater than 0x80000000 and are put int log_extra_selector (without the
625top bit). They are never used in calls to log_write(), but are tested
626independently. This separation became necessary when the number of log
627selectors was getting close to filling a 32-bit word. */
628
629bit_table log_options[] = {
630 { US"address_rewrite", L_address_rewrite },
631 { US"all", L_all },
632 { US"all_parents", L_all_parents },
633 { US"arguments", LX_arguments },
634 { US"connection_reject", L_connection_reject },
635 { US"delay_delivery", L_delay_delivery },
636 { US"deliver_time", LX_deliver_time },
637 { US"delivery_size", LX_delivery_size },
638 { US"dnslist_defer", L_dnslist_defer },
639 { US"etrn", L_etrn },
640 { US"host_lookup_failed", L_host_lookup_failed },
641 { US"ident_timeout", LX_ident_timeout },
642 { US"incoming_interface", LX_incoming_interface },
643 { US"incoming_port", LX_incoming_port },
644 { US"lost_incoming_connection", L_lost_incoming_connection },
645 { US"outgoing_port", LX_outgoing_port },
646 { US"queue_run", L_queue_run },
647 { US"queue_time", LX_queue_time },
2ac0e484 648 { US"queue_time_overall", LX_queue_time_overall },
059ec3d9
PH
649 { US"received_recipients", LX_received_recipients },
650 { US"received_sender", LX_received_sender },
651 { US"rejected_header", LX_rejected_header },
652 { US"rejected_headers", LX_rejected_header },
653 { US"retry_defer", L_retry_defer },
654 { US"return_path_on_delivery", LX_return_path_on_delivery },
655 { US"sender_on_delivery", LX_sender_on_delivery },
656 { US"size_reject", L_size_reject },
657 { US"skip_delivery", L_skip_delivery },
658 { US"smtp_confirmation", LX_smtp_confirmation },
659 { US"smtp_connection", L_smtp_connection },
660 { US"smtp_incomplete_transaction", L_smtp_incomplete_transaction },
661 { US"smtp_protocol_error", L_smtp_protocol_error },
662 { US"smtp_syntax_error", L_smtp_syntax_error },
663 { US"subject", LX_subject },
664 { US"tls_certificate_verified", LX_tls_certificate_verified },
665 { US"tls_cipher", LX_tls_cipher },
666 { US"tls_peerdn", LX_tls_peerdn }
667};
668
669int log_options_count = sizeof(log_options)/sizeof(bit_table);
670unsigned int log_write_selector= L_default;
671uschar *log_selector_string = NULL;
672FILE *log_stderr = NULL;
673BOOL log_testing_mode = FALSE;
674BOOL log_timezone = FALSE;
675uschar *login_sender_address = NULL;
676int lookup_open_max = 25;
677uschar *lookup_value = NULL;
678
679macro_item *macros = NULL;
680uschar *mailstore_basename = NULL;
8523533c
TK
681#ifdef WITH_CONTENT_SCAN
682uschar *malware_name = NULL; /* Virus Name */
683#endif
059ec3d9
PH
684int max_username_length = 0;
685int message_age = 0;
686uschar *message_body = NULL;
687uschar *message_body_end = NULL;
688int message_body_size = 0;
689int message_body_visible = 500;
690int message_ended = END_NOTSTARTED;
691uschar *message_headers = NULL;
692uschar *message_id;
693uschar *message_id_domain = NULL;
694uschar *message_id_text = NULL;
695struct timeval message_id_tv = { 0, 0 };
696uschar message_id_option[MESSAGE_ID_LENGTH + 3];
697uschar *message_id_external;
698int message_linecount = 0;
699BOOL message_logs = TRUE;
700int message_size = 0;
701uschar *message_size_limit = US"50M";
702uschar message_subdir[2] = { 0, 0 };
703uschar *message_reference = NULL;
8523533c
TK
704
705/* MIME ACL expandables */
706#ifdef WITH_CONTENT_SCAN
f7b63901 707int mime_anomaly_level = 0;
8523533c
TK
708uschar *mime_anomaly_text = NULL;
709uschar *mime_boundary = NULL;
710uschar *mime_charset = NULL;
711uschar *mime_content_description = NULL;
712uschar *mime_content_disposition = NULL;
713uschar *mime_content_id = NULL;
714unsigned int mime_content_size = 0;
715uschar *mime_content_transfer_encoding = NULL;
716uschar *mime_content_type = NULL;
717uschar *mime_decoded_filename = NULL;
718uschar *mime_filename = NULL;
719int mime_is_multipart = 0;
720int mime_is_coverletter = 0;
721int mime_is_rfc822 = 0;
722int mime_part_count = -1;
723#endif
724
059ec3d9
PH
725BOOL mua_wrapper = FALSE;
726
727uid_t *never_users = NULL;
8523533c
TK
728#ifdef WITH_CONTENT_SCAN
729BOOL no_mbox_unspool = FALSE;
730#endif
059ec3d9
PH
731BOOL no_multiline_responses = FALSE;
732
733uid_t original_euid;
734gid_t originator_gid;
735uschar *originator_login = NULL;
736uschar *originator_name = NULL;
737uid_t originator_uid;
738uschar *override_local_interfaces = NULL;
739uschar *override_pid_file_path = NULL;
740
741BOOL parse_allow_group = FALSE;
742BOOL parse_found_group = FALSE;
743uschar *percent_hack_domains = NULL;
744uschar *pid_file_path = US PID_FILE_PATH
745 "\0<--------------Space to patch pid_file_path->";
746uschar *pipelining_advertise_hosts = US"*";
747BOOL preserve_message_logs = FALSE;
748uschar *primary_hostname = NULL;
749BOOL print_topbitchars = FALSE;
750uschar process_info[PROCESS_INFO_SIZE];
751uschar *process_log_path = NULL;
752BOOL prod_requires_admin = TRUE;
753
754uschar *qualify_domain_recipient = NULL;
755uschar *qualify_domain_sender = NULL;
756BOOL queue_2stage = FALSE;
757uschar *queue_domains = NULL;
758int queue_interval = -1;
759BOOL queue_list_requires_admin = TRUE;
760BOOL queue_only = FALSE;
761uschar *queue_only_file = NULL;
762int queue_only_load = -1;
763BOOL queue_only_override = TRUE;
764BOOL queue_only_policy = FALSE;
765BOOL queue_run_first_delivery = FALSE;
766BOOL queue_run_force = FALSE;
767BOOL queue_run_in_order = FALSE;
768BOOL queue_run_local = FALSE;
769int queue_run_max = 5;
770pid_t queue_run_pid = (pid_t)0;
771int queue_run_pipe = -1;
772BOOL queue_running = FALSE;
773BOOL queue_smtp = FALSE;
774uschar *queue_smtp_domains = NULL;
775
776unsigned int random_seed = 0;
777uschar *raw_active_hostname = NULL;
778uschar *raw_sender = NULL;
779uschar **raw_recipients = NULL;
780int raw_recipients_count = 0;
781
782int rcpt_count = 0;
783int rcpt_fail_count = 0;
784int rcpt_defer_count = 0;
785gid_t real_gid;
786uid_t real_uid;
787BOOL really_exim = TRUE;
788BOOL receive_call_bombout = FALSE;
789int receive_linecount = 0;
790int receive_messagecount = 0;
791int receive_timeout = 0;
792int received_count = 0;
793uschar *received_for = NULL;
794
795/* This is the default text for Received headers generated by Exim. The
796date will be automatically added on the end. */
797
798uschar *received_header_text = US
799 "Received: "
800 "${if def:sender_rcvhost {from $sender_rcvhost\n\t}"
1e70f85b 801 "{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}"
059ec3d9
PH
802 "${if def:sender_helo_name {(helo=$sender_helo_name)\n\t}}}}"
803 "by $primary_hostname "
804 "${if def:received_protocol {with $received_protocol}} "
805 #ifdef SUPPORT_TLS
806 "${if def:tls_cipher {($tls_cipher)\n\t}}"
807 #endif
808 "(Exim $version_number)\n\t"
809 "id $message_id"
810 "${if def:received_for {\n\tfor $received_for}}"
811 "\0<---------------Space to patch received_header_text->";
812
813int received_headers_max = 30;
814uschar *received_protocol = NULL;
815int received_time = 0;
816uschar *recipient_data = NULL;
817uschar *recipient_unqualified_hosts = NULL;
2c7db3f5 818uschar *recipient_verify_failure = NULL;
059ec3d9
PH
819int recipients_count = 0;
820BOOL recipients_discarded = FALSE;
821recipient_item *recipients_list = NULL;
822int recipients_list_max = 0;
823int recipients_max = 0;
824BOOL recipients_max_reject = FALSE;
825const pcre *regex_AUTH = NULL;
826const pcre *regex_check_dns_names = NULL;
827const pcre *regex_From = NULL;
828const pcre *regex_PIPELINING = NULL;
829const pcre *regex_SIZE = NULL;
830const pcre *regex_ismsgid = NULL;
8523533c
TK
831#ifdef WITH_CONTENT_SCAN
832uschar *regex_match_string = NULL;
833#endif
059ec3d9
PH
834int remote_delivery_count = 0;
835int remote_max_parallel = 2;
836uschar *remote_sort_domains = NULL;
837int retry_data_expire = 7*24*60*60;
838int retry_interval_max = 24*60*60;
839int retry_maximum_timeout = 0; /* set from retry config */
840retry_config *retries = NULL;
841uschar *return_path = NULL;
842BOOL return_path_remove = TRUE;
843int rewrite_existflags = 0;
844uschar *rfc1413_hosts = US"*";
845int rfc1413_query_timeout = 30;
846/* BOOL rfc821_domains = FALSE; <<< on the way out */
847uid_t root_uid = ROOT_UID;
848
849router_instance *routers = NULL;
850router_instance router_defaults = {
851 NULL, /* chain pointer */
852 NULL, /* name */
853 NULL, /* info */
854 NULL, /* private options block pointer */
855 NULL, /* driver name */
856
857 NULL, /* address_data */
8523533c
TK
858#ifdef EXPERIMENTAL_BRIGHTMAIL
859 NULL, /* bmi_rule */
8e669ac1 860#endif
059ec3d9
PH
861 NULL, /* cannot_route_message */
862 NULL, /* condition */
863 NULL, /* current_directory */
864 NULL, /* debug_string */
865 NULL, /* domains */
866 NULL, /* errors_to */
867 NULL, /* expand_gid */
868 NULL, /* expand_uid */
869 NULL, /* expand_more */
870 NULL, /* expand_unseen */
871 NULL, /* extra_headers */
872 NULL, /* fallback_hosts */
873 NULL, /* home_directory */
874 NULL, /* ignore_target_hosts */
875 NULL, /* local_parts */
876 NULL, /* pass_router_name */
877 NULL, /* prefix */
878 NULL, /* redirect_router_name */
879 NULL, /* remove_headers */
880 NULL, /* require_files */
881 NULL, /* router_home_directory */
882 US"freeze", /* self */
883 NULL, /* senders */
884 NULL, /* suffix */
885 NULL, /* translate_ip_address */
886 NULL, /* transport_name */
887
888 TRUE, /* address_test */
8523533c
TK
889#ifdef EXPERIMENTAL_BRIGHTMAIL
890 FALSE, /* bmi_deliver_alternate */
891 FALSE, /* bmi_deliver_default */
892 FALSE, /* bmi_dont_deliver */
893#endif
059ec3d9
PH
894 TRUE, /* expn */
895 FALSE, /* caseful_local_part */
896 FALSE, /* check_local_user */
897 FALSE, /* disable_logging */
898 FALSE, /* fail_verify_recipient */
899 FALSE, /* fail_verify_sender */
900 FALSE, /* gid_set */
901 FALSE, /* initgroups */
902 TRUE_UNSET, /* log_as_local */
903 TRUE, /* more */
904 FALSE, /* pass_on_timeout */
905 FALSE, /* prefix_optional */
906 TRUE, /* repeat_use */
907 TRUE_UNSET, /* retry_use_local_part - fudge "unset" */
908 FALSE, /* same_domain_copy_routing */
909 FALSE, /* self_rewrite */
910 FALSE, /* suffix_optional */
911 FALSE, /* verify_only */
912 TRUE, /* verify_recipient */
913 TRUE, /* verify_sender */
914 FALSE, /* uid_set */
915 FALSE, /* unseen */
916
917 self_freeze, /* self_code */
918 (uid_t)(-1), /* uid */
919 (gid_t)(-1), /* gid */
920
921 NULL, /* fallback_hostlist */
922 NULL, /* transport instance */
923 NULL, /* pass_router */
924 NULL /* redirect_router */
925};
926
927ip_address_item *running_interfaces = NULL;
928BOOL running_in_test_harness = FALSE;
929
930/* This is a weird one. The following string gets patched in the binary by the
931script that sets up a copy of Exim for running in the test harness. It seems
932that compilers are now clever, and share constant strings if they can.
933Elsewhere in Exim the string "<" is used. The compiler optimization seems to
934make use of the end of this string in order to save space. So the patching then
935wrecks this. We default this optimization by adding some additional characters
936onto the end of the string. */
937
938uschar *running_status = US">>>running<<<" "\0EXTRA";
939
940int runrc = 0;
941
942uschar *search_error_message = NULL;
943BOOL search_find_defer = FALSE;
944uschar *self_hostname = NULL;
945uschar *sender_address = NULL;
946unsigned int sender_address_cache[(MAX_NAMED_LIST * 2)/32];
2a3eea10 947uschar *sender_address_data = NULL;
059ec3d9
PH
948BOOL sender_address_forced = FALSE;
949uschar *sender_address_unrewritten = NULL;
950uschar *sender_data = NULL;
951unsigned int sender_domain_cache[(MAX_NAMED_LIST * 2)/32];
952uschar *sender_fullhost = NULL;
953uschar *sender_helo_name = NULL;
954uschar **sender_host_aliases = &no_aliases;
955uschar *sender_host_address = NULL;
956uschar *sender_host_authenticated = NULL;
957unsigned int sender_host_cache[(MAX_NAMED_LIST * 2)/32];
958uschar *sender_host_name = NULL;
959int sender_host_port = 0;
960BOOL sender_host_notsocket = FALSE;
961BOOL sender_host_unknown = FALSE;
962uschar *sender_ident = NULL;
963BOOL sender_local = FALSE;
964uschar *sender_rcvhost = NULL;
965BOOL sender_set_untrusted = FALSE;
966uschar *sender_unqualified_hosts = NULL;
2c7db3f5 967uschar *sender_verify_failure = NULL;
059ec3d9
PH
968address_item *sender_verified_list = NULL;
969address_item *sender_verified_failed = NULL;
970int sender_verified_rc = -1;
971BOOL sender_verified_responded = FALSE;
972volatile BOOL sigalrm_seen = FALSE;
973uschar **sighup_argv = NULL;
974int smtp_accept_count = 0;
975BOOL smtp_accept_keepalive = TRUE;
976int smtp_accept_max = 20;
977int smtp_accept_max_nonmail= 10;
978uschar *smtp_accept_max_nonmail_hosts = US"*";
979int smtp_accept_max_per_connection = 1000;
980uschar *smtp_accept_max_per_host = NULL;
981int smtp_accept_queue = 0;
982int smtp_accept_queue_per_connection = 10;
983int smtp_accept_reserve = 0;
984uschar *smtp_active_hostname = NULL;
985BOOL smtp_authenticated = FALSE;
1f5b4c3d 986uschar *smtp_banner = US"$smtp_active_hostname ESMTP "
059ec3d9
PH
987 "Exim $version_number $tod_full"
988 "\0<---------------Space to patch smtp_banner->";
989BOOL smtp_batched_input = FALSE;
990BOOL smtp_check_spool_space = TRUE;
991uschar *smtp_command_argument = NULL;
992int smtp_connect_backlog = 20;
993double smtp_delay_mail = 0.0;
994double smtp_delay_rcpt = 0.0;
995BOOL smtp_enforce_sync = TRUE;
996FILE *smtp_in = NULL;
997BOOL smtp_input = FALSE;
998int smtp_load_reserve = -1;
999int smtp_mailcmd_count = 0;
1000FILE *smtp_out = NULL;
1001uschar *smtp_etrn_command = NULL;
1002BOOL smtp_etrn_serialize = TRUE;
1003int smtp_max_synprot_errors= 3;
1004int smtp_max_unknown_commands = 3;
1005uschar *smtp_ratelimit_hosts = NULL;
1006uschar *smtp_ratelimit_mail = NULL;
1007uschar *smtp_ratelimit_rcpt = NULL;
1008uschar *smtp_read_error = US"";
1009int smtp_receive_timeout = 5*60;
1010uschar *smtp_reserve_hosts = NULL;
1011BOOL smtp_return_error_details = FALSE;
1012int smtp_rlm_base = 0;
1013double smtp_rlm_factor = 0.0;
1014int smtp_rlm_limit = 0;
1015int smtp_rlm_threshold = INT_MAX;
1016int smtp_rlr_base = 0;
1017double smtp_rlr_factor = 0.0;
1018int smtp_rlr_limit = 0;
1019int smtp_rlr_threshold = INT_MAX;
1020BOOL smtp_use_pipelining = FALSE;
1021BOOL smtp_use_size = FALSE;
8523533c
TK
1022
1023#ifdef WITH_CONTENT_SCAN
1024uschar *spamd_address = US"127.0.0.1 783";
1025uschar *spam_bar = NULL;
1026uschar *spam_report = NULL;
1027uschar *spam_score = NULL;
1028uschar *spam_score_int = NULL;
1029#endif
1030#ifdef EXPERIMENTAL_SPF
1031uschar *spf_header_comment = NULL;
1032uschar *spf_received = NULL;
1033uschar *spf_result = NULL;
1034uschar *spf_smtp_comment = NULL;
1035#endif
1036
059ec3d9
PH
1037BOOL split_spool_directory = FALSE;
1038uschar *spool_directory = US SPOOL_DIRECTORY
1039 "\0<--------------Space to patch spool_directory->";
8523533c
TK
1040#ifdef EXPERIMENTAL_SRS
1041uschar *srs_config = NULL;
1042uschar *srs_db_address = NULL;
1043uschar *srs_db_key = NULL;
1044uschar *srs_orig_recipient = NULL;
1045uschar *srs_orig_sender = NULL;
1046uschar *srs_recipient = NULL;
1047uschar *srs_status = NULL;
8e669ac1 1048#endif
059ec3d9
PH
1049int string_datestamp_offset= -1;
1050BOOL strip_excess_angle_brackets = FALSE;
1051BOOL strip_trailing_dot = FALSE;
1052uschar *submission_domain = NULL;
1053BOOL submission_mode = FALSE;
1054BOOL synchronous_delivery = FALSE;
1055BOOL syslog_duplication = TRUE;
1056int syslog_facility = LOG_MAIL;
1057uschar *syslog_processname = US"exim";
1058BOOL syslog_timestamp = TRUE;
1059uschar *system_filter = NULL;
1060
1061uschar *system_filter_directory_transport = NULL;
1062uschar *system_filter_file_transport = NULL;
1063uschar *system_filter_pipe_transport = NULL;
1064uschar *system_filter_reply_transport = NULL;
1065
1066gid_t system_filter_gid = 0;
1067BOOL system_filter_gid_set = FALSE;
1068uid_t system_filter_uid = 0;
1069BOOL system_filter_uid_set = FALSE;
1070BOOL system_filtering = FALSE;
1071
1072BOOL tcp_nodelay = TRUE;
1073int thismessage_size_limit = 0;
1074int timeout_frozen_after = 0;
1075BOOL timestamps_utc = FALSE;
1076
1077transport_instance *transports = NULL;
1078
1079transport_instance transport_defaults = {
1080 NULL, /* chain pointer */
1081 NULL, /* name */
1082 NULL, /* info */
1083 NULL, /* private options block pointer */
1084 NULL, /* driver name */
1085 NULL, /* setup entry point */
1086 1, /* batch_max */
1087 NULL, /* batch_id */
1088 NULL, /* home_dir */
1089 NULL, /* current_dir */
1090 TRUE, /* multi-domain */
1091 FALSE, /* overrides_hosts */
1092 100, /* max_addresses */
1093 500, /* connection_max_messages */
1094 FALSE, /* deliver_as_creator */
1095 FALSE, /* disable_logging */
1096 FALSE, /* initgroups */
1097 FALSE, /* uid_set */
1098 FALSE, /* gid_set */
1099 (uid_t)(-1), /* uid */
1100 (gid_t)(-1), /* gid */
1101 NULL, /* expand_uid */
1102 NULL, /* expand_gid */
1103 NULL, /* warn_message */
1104 NULL, /* shadow */
1105 NULL, /* shadow_condition */
1106 NULL, /* filter_command */
1107 NULL, /* add_headers */
1108 NULL, /* remove_headers */
1109 NULL, /* return_path */
1110 NULL, /* debug_string */
1111 NULL, /* message_size_limit */
1112 NULL, /* headers_rewrite */
1113 NULL, /* rewrite_rules */
1114 0, /* rewrite_existflags */
1115 300, /* filter_timeout */
1116 FALSE, /* body_only */
1117 FALSE, /* delivery_date_add */
1118 FALSE, /* envelope_to_add */
1119 FALSE, /* headers_only */
1120 FALSE, /* rcpt_include_affixes */
1121 FALSE, /* return_path_add */
1122 FALSE, /* return_output */
1123 FALSE, /* return_fail_output */
1124 FALSE, /* log_output */
1125 FALSE, /* log_fail_output */
1126 FALSE, /* log_defer_output */
1127 TRUE_UNSET /* retry_use_local_part: BOOL, but set neither
1128 1 nor 0 so can detect unset */
1129};
1130
1131int transport_count;
1132uschar **transport_filter_argv = NULL;
1133int transport_filter_timeout;
1134int transport_write_timeout= 0;
1135
1136tree_node *tree_dns_fails = NULL;
1137tree_node *tree_duplicates = NULL;
1138tree_node *tree_nonrecipients = NULL;
1139tree_node *tree_unusable = NULL;
1140
1141BOOL trusted_caller = FALSE;
1142gid_t *trusted_groups = NULL;
1143uid_t *trusted_users = NULL;
1144uschar *timezone_string = US TIMEZONE_DEFAULT;
1145
1146uschar *unknown_login = NULL;
1147uschar *unknown_username = NULL;
1148uschar *untrusted_set_sender = NULL;
1149
1150/* A regex for matching a "From_" line in an incoming message, in the form
1151
1152 From ph10 Fri Jan 5 12:35 GMT 1996
1153
1154which the "mail" commands send to the MTA (undocumented, of course), or in
1155the form
1156
1157 From ph10 Fri, 7 Jan 97 14:00:00 GMT
1158
1159which is apparently used by some UUCPs, despite it not being in RFC 976.
1160Because of variations in time formats, just match up to the minutes. That
1161should be sufficient. Examples have been seen of time fields like 12:1:03,
1162so just require one digit for hours and minutes. The weekday is also absent
1163in some forms. */
1164
1165uschar *uucp_from_pattern = US
1166 "^From\\s+(\\S+)\\s+(?:[a-zA-Z]{3},?\\s+)?" /* Common start */
1167 "(?:" /* Non-extracting bracket */
1168 "[a-zA-Z]{3}\\s+\\d?\\d|" /* First form */
1169 "\\d?\\d\\s+[a-zA-Z]{3}\\s+\\d\\d(?:\\d\\d)?" /* Second form */
1170 ")" /* End alternation */
1171 "\\s+\\d\\d?:\\d\\d?"; /* Start of time */
1172
1173uschar *uucp_from_sender = US"$1";
1174
1175uschar *warn_message_file = NULL;
1176uschar *warnmsg_delay = NULL;
1177uschar *warnmsg_recipients = NULL;
1178BOOL write_rejectlog = TRUE;
1179
4929acf0 1180uschar *version_copyright = US"Copyright (c) University of Cambridge 2005";
059ec3d9
PH
1181uschar *version_date = US"?";
1182uschar *version_cnumber = US"????";
1183uschar *version_string = US"?";
1184
1185int warning_count = 0;
1186
1187/* End of globals.c */