1. Added Tony F's ${dlfunc expansion, slightly modified (see NewStuff).
[exim.git] / src / src / globals.c
1 /* $Cambridge: exim/src/src/globals.c,v 1.20 2005/03/22 14:11:54 ph10 Exp $ */
2
3 /*************************************************
4 *     Exim - an Internet mail transport agent    *
5 *************************************************/
6
7 /* Copyright (c) University of Cambridge 1995 - 2005 */
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
11 that 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
17 executable code. It says
18
19 Warning: Linking some objects which contain exception information sections
20         and some which do not. This may cause fatal runtime exception handling
21         problems.
22
23 As this may cause people to worry needlessly, include a dummy function here
24 to stop the message from appearing. Make it reference itself to stop picky
25 compilers complaining that it is unused, and put in a dummy argument to stop
26 even pickier compilers complaining about infinite loops. */
27
28 static void dummy(int x) { dummy(x-1); }
29
30
31 /* Generic options for auths, all of which live inside auth_instance
32 data blocks and hence have the opt_public flag set. */
33
34 optionlist 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
49 int     optionlist_auths_size = sizeof(optionlist_auths)/sizeof(optionlist);
50
51 /* An empty host aliases list. */
52
53 uschar *no_aliases             = NULL;
54
55
56 /* For comments on these variables, see globals.h. I'm too idle to
57 duplicate them here... */
58
59 #ifdef EXIM_PERL
60 uschar *opt_perl_startup       = NULL;
61 BOOL    opt_perl_at_start      = FALSE;
62 BOOL    opt_perl_started       = FALSE;
63 #endif
64
65 #ifdef EXPAND_DLFUNC
66 tree_node *dlobj_anchor        = NULL;
67 #endif
68
69 #ifdef LOOKUP_IBASE
70 uschar *ibase_servers          = NULL;
71 #endif
72
73 #ifdef LOOKUP_LDAP
74 uschar *eldap_default_servers  = NULL;
75 int     eldap_version          = -1;
76 #endif
77
78 #ifdef LOOKUP_MYSQL
79 uschar *mysql_servers          = NULL;
80 #endif
81
82 #ifdef LOOKUP_ORACLE
83 uschar *oracle_servers         = NULL;
84 #endif
85
86 #ifdef LOOKUP_PGSQL
87 uschar *pgsql_servers          = NULL;
88 #endif
89
90 #ifdef SUPPORT_MOVE_FROZEN_MESSAGES
91 BOOL    move_frozen_messages   = FALSE;
92 #endif
93
94 /* These variables are outside the #ifdef because it keeps the code less
95 cluttered in several places (e.g. during logging) if we can always refer to
96 them. Also, the tls_ variables are now always visible. */
97
98 BOOL    tls_active             = -1;
99 BOOL    tls_certificate_verified = FALSE;
100 uschar *tls_cipher             = NULL;
101 BOOL    tls_on_connect         = FALSE;
102 uschar *tls_on_connect_ports   = NULL;
103 uschar *tls_peerdn             = NULL;
104
105 #ifdef SUPPORT_TLS
106 const pcre *regex_STARTTLS     = NULL;
107 uschar *tls_advertise_hosts    = NULL;    /* This is deliberate */
108 uschar *tls_certificate        = NULL;
109 uschar *tls_crl                = NULL;
110 uschar *tls_dhparam            = NULL;
111 BOOL    tls_offered            = FALSE;
112 uschar *tls_privatekey         = NULL;
113 BOOL    tls_remember_esmtp     = FALSE;
114 uschar *tls_require_ciphers    = NULL;
115 uschar *tls_try_verify_hosts   = NULL;
116 uschar *tls_verify_certificates= NULL;
117 uschar *tls_verify_hosts       = NULL;
118 #endif
119
120
121 /* Input-reading functions for messages, so we can use special ones for
122 incoming TCP/IP. The defaults use stdin. We never need these for any
123 stand-alone tests. */
124
125 #ifndef STAND_ALONE
126 int (*receive_getc)(void)      = stdin_getc;
127 int (*receive_ungetc)(int)     = stdin_ungetc;
128 int (*receive_feof)(void)      = stdin_feof;
129 int (*receive_ferror)(void)    = stdin_ferror;
130 #endif
131
132
133 /* List of per-address expansion variables for clearing and saving/restoring
134 when verifying one address while routing/verifying another. We have to have
135 the size explicit, because it is referenced from more than one module. */
136
137 uschar **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
157 int address_expansions_count = sizeof(address_expansions)/sizeof(uschar **);
158
159 /* General global variables */
160
161 tree_node *acl_anchor          = NULL;
162 uschar *acl_not_smtp           = NULL;
163 uschar *acl_smtp_auth          = NULL;
164 uschar *acl_smtp_connect       = NULL;
165 uschar *acl_smtp_data          = NULL;
166 uschar *acl_smtp_etrn          = NULL;
167 uschar *acl_smtp_expn          = NULL;
168 uschar *acl_smtp_helo          = NULL;
169 uschar *acl_smtp_mail          = NULL;
170 uschar *acl_smtp_mailauth      = NULL;
171 #ifdef WITH_CONTENT_SCAN
172 uschar *acl_smtp_mime          = NULL;
173 #endif
174 uschar *acl_smtp_predata       = NULL;
175 uschar *acl_smtp_quit          = NULL;
176 uschar *acl_smtp_rcpt          = NULL;
177 uschar *acl_smtp_starttls      = NULL;
178 uschar *acl_smtp_vrfy          = NULL;
179 BOOL    acl_temp_details       = FALSE;
180 uschar *acl_var[ACL_C_MAX+ACL_M_MAX];
181 uschar *acl_verify_message     = NULL;
182 header_line *acl_warn_headers  = NULL;
183 string_item *acl_warn_logged   = NULL;
184
185 /* Names of SMTP places for use in ACL error messages, and corresponding SMTP
186 error codes - keep in step with definitions of ACL_WHERE_xxxx in macros.h. */
187
188 uschar *acl_wherenames[]       = { US"RCPT",
189                                    US"MAIL",
190                                    US"PREDATA",
191 #ifdef WITH_CONTENT_SCAN
192                                    US"MIME",
193 #endif
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
207 int     acl_wherecodes[]       = { 550,     /* RCPT */
208                                    550,     /* MAIL */
209                                    550,     /* PREDATA */
210 #ifdef WITH_CONTENT_SCAN
211                                    550,     /* MIME */
212 #endif
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                                  };
225
226 BOOL    active_local_from_check = FALSE;
227 BOOL    active_local_sender_retain = FALSE;
228 BOOL    accept_8bitmime        = FALSE;
229 address_item  *addr_duplicate  = NULL;
230
231 address_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
289 uschar *address_file           = NULL;
290 uschar *address_pipe           = NULL;
291 BOOL    address_test_mode      = FALSE;
292 tree_node *addresslist_anchor  = NULL;
293 int     addresslist_count      = 0;
294 gid_t  *admin_groups           = NULL;
295 BOOL    admin_user             = FALSE;
296 BOOL    allow_domain_literals  = FALSE;
297 BOOL    allow_mx_to_ip         = FALSE;
298 BOOL    allow_unqualified_recipient = TRUE;    /* For local messages */
299 BOOL    allow_unqualified_sender = TRUE;       /* Reset for SMTP */
300 BOOL    allow_utf8_domains     = FALSE;
301 uschar *authenticated_id       = NULL;
302 uschar *authenticated_sender   = NULL;
303 BOOL    authentication_failed  = FALSE;
304 auth_instance  *auths          = NULL;
305 uschar *auth_advertise_hosts   = US"*";
306 auth_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
322 uschar *auth_defer_msg         = US"reason not recorded";
323 uschar *auth_defer_user_msg    = US"";
324 int     auto_thaw              = 0;
325 #ifdef WITH_CONTENT_SCAN
326 uschar *av_scanner             = US"sophie:/var/run/sophie";  /* AV scanner */
327 #endif
328
329 BOOL    background_daemon      = TRUE;
330 uschar *base62_chars=
331     US"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
332 uschar *bi_command             = NULL;
333 uschar *big_buffer             = NULL;
334 int     big_buffer_size        = BIG_BUFFER_SIZE;
335 #ifdef EXPERIMENTAL_BRIGHTMAIL
336 uschar *bmi_alt_location       = NULL;
337 uschar *bmi_base64_tracker_verdict = NULL;
338 uschar *bmi_base64_verdict     = NULL;
339 uschar *bmi_config_file        = US"/opt/brightmail/etc/brightmail.cfg";
340 int     bmi_deliver            = 1;
341 int     bmi_run                = 0;
342 uschar *bmi_verdicts           = NULL;
343 #endif
344 int     body_linecount         = 0;
345 int     body_zerocount         = 0;
346 uschar *bounce_message_file    = NULL;
347 uschar *bounce_message_text    = NULL;
348 uschar *bounce_recipient       = NULL;
349 BOOL    bounce_return_body     = TRUE;
350 BOOL    bounce_return_message  = TRUE;
351 int     bounce_return_size_limit = 100*1024;
352 uschar *bounce_sender_authentication = NULL;
353 int     bsmtp_transaction_linecount = 0;
354
355 int     callout_cache_domain_positive_expire = 7*24*60*60;
356 int     callout_cache_domain_negative_expire = 3*60*60;
357 int     callout_cache_positive_expire = 24*60*60;
358 int     callout_cache_negative_expire = 2*60*60;
359 uschar *callout_random_local_part = US"$primary_hostname-$tod_epoch-testing";
360 uschar *check_dns_names_pattern= US"(?i)^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$";
361 int     check_log_inodes       = 0;
362 int     check_log_space        = 0;
363 int     check_spool_inodes     = 0;
364 int     check_spool_space      = 0;
365 int     clmacro_count          = 0;
366 uschar *clmacros[MAX_CLMACROS];
367 BOOL    config_changed         = FALSE;
368 FILE   *config_file            = NULL;
369 uschar *config_filename        = NULL;
370 int     config_lineno          = 0;
371 #ifdef CONFIGURE_GROUP
372 gid_t   config_gid             = CONFIGURE_GROUP;
373 #endif
374 uschar *config_main_filelist   = US CONFIGURE_FILE
375                          "\0<-----------Space to patch configure_filename->";
376 uschar *config_main_filename   = NULL;
377
378 #ifdef CONFIGURE_OWNER
379 uid_t   config_uid             = CONFIGURE_OWNER;
380 #endif
381
382 int     connection_max_messages= -1;
383 uschar *continue_hostname      = NULL;
384 uschar *continue_host_address  = NULL;
385 BOOL    continue_more          = FALSE;
386 int     continue_sequence      = 1;
387 uschar *continue_transport     = NULL;
388
389 BOOL    daemon_listen          = FALSE;
390 uschar *daemon_smtp_port       = US"smtp";
391 BOOL    debug_daemon           = FALSE;
392 int     debug_fd               = -1;
393 FILE   *debug_file             = NULL;
394 bit_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 };
427 int     debug_options_count    = sizeof(debug_options)/sizeof(bit_table);
428 unsigned int debug_selector    = 0;
429 int     delay_warning[DELAY_WARNING_SIZE] = { DELAY_WARNING_SIZE, 1, 24*60*60 };
430 uschar *delay_warning_condition= US"${if match{$h_precedence:}{(?i)bulk|list|junk}{no}{yes}}";
431 BOOL    delivery_date_remove   = TRUE;
432 uschar *deliver_address_data   = NULL;
433 int     deliver_datafile       = -1;
434 uschar *deliver_domain         = NULL;
435 uschar *deliver_domain_data    = NULL;
436 uschar *deliver_domain_orig    = NULL;
437 uschar *deliver_domain_parent  = NULL;
438 BOOL    deliver_drop_privilege = FALSE;
439 BOOL    deliver_firsttime      = FALSE;
440 BOOL    deliver_force          = FALSE;
441 BOOL    deliver_freeze         = FALSE;
442 int     deliver_frozen_at      = 0;
443 uschar *deliver_home           = NULL;
444 uschar *deliver_host           = NULL;
445 uschar *deliver_host_address   = NULL;
446 uschar *deliver_in_buffer      = NULL;
447 ino_t   deliver_inode          = 0;
448 uschar *deliver_localpart      = NULL;
449 uschar *deliver_localpart_data = NULL;
450 uschar *deliver_localpart_orig = NULL;
451 uschar *deliver_localpart_parent = NULL;
452 uschar *deliver_localpart_prefix = NULL;
453 uschar *deliver_localpart_suffix = NULL;
454 BOOL    deliver_force_thaw     = FALSE;
455 BOOL    deliver_manual_thaw    = FALSE;
456 uschar *deliver_out_buffer     = NULL;
457 int     deliver_queue_load_max = -1;
458 address_item  *deliver_recipients = NULL;
459 uschar *deliver_selectstring   = NULL;
460 BOOL    deliver_selectstring_regex = FALSE;
461 uschar *deliver_selectstring_sender = NULL;
462 BOOL    deliver_selectstring_sender_regex = FALSE;
463 #ifdef WITH_OLD_DEMIME
464 int     demime_errorlevel      = 0;
465 int     demime_ok              = 0;
466 uschar *demime_reason          = NULL;
467 #endif
468 BOOL    disable_logging        = FALSE;
469
470 #ifdef EXPERIMENTAL_DOMAINKEYS
471 uschar *dk_signing_domain      = NULL;
472 uschar *dk_signing_selector    = NULL;
473 int     dk_do_verify           = 0;
474 #endif
475
476 uschar *dns_again_means_nonexist = NULL;
477 uschar *dns_ipv4_lookup        = NULL;
478 int     dns_retrans            = 0;
479 int     dns_retry              = 0;
480 uschar *dnslist_domain         = NULL;
481 uschar *dnslist_text           = NULL;
482 uschar *dnslist_value          = NULL;
483 tree_node *domainlist_anchor   = NULL;
484 int     domainlist_count       = 0;
485 BOOL    dont_deliver           = FALSE;
486 BOOL    dot_ends               = TRUE;
487 BOOL    drop_cr                = FALSE;         /* No longer used */
488
489 BOOL    enable_dollar_recipients = FALSE;
490 BOOL    envelope_to_remove     = TRUE;
491 int     errno_quota            = ERRNO_QUOTA;
492 uschar *errors_copy            = NULL;
493 int     error_handling         = ERRORS_SENDER;
494 uschar *errors_reply_to        = NULL;
495 int     errors_sender_rc       = EXIT_FAILURE;
496
497 gid_t   exim_gid               = EXIM_GID;
498 BOOL    exim_gid_set           = TRUE;          /* This gid is always set */
499 uschar *exim_path              = US BIN_DIRECTORY "/exim"
500                         "\0<---------------Space to patch exim_path->";
501 uid_t   exim_uid               = EXIM_UID;
502 BOOL    exim_uid_set           = TRUE;          /* This uid is always set */
503 int     expand_forbid          = 0;
504 int     expand_nlength[EXPAND_MAXN+1];
505 int     expand_nmax            = -1;
506 uschar *expand_nstring[EXPAND_MAXN+1];
507 BOOL    expand_string_forcedfail = FALSE;
508 uschar *expand_string_message;
509 BOOL    extract_addresses_remove_arguments = TRUE;
510 uschar *extra_local_interfaces = NULL;
511
512 BOOL    fake_reject            = FALSE;
513 uschar *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).";
514 int     filter_n[FILTER_VARIABLE_COUNT];
515 BOOL    filter_running         = FALSE;
516 int     filter_sn[FILTER_VARIABLE_COUNT];
517 int     filter_test            = FTEST_NONE;
518 uschar *filter_test_sfile      = NULL;
519 uschar *filter_test_ufile      = NULL;
520 uschar *filter_thisaddress     = NULL;
521 int     finduser_retries       = 0;
522 #ifdef WITH_OLD_DEMIME
523 uschar *found_extension        = NULL;
524 #endif
525 uid_t   fixed_never_users[]    = { FIXED_NEVER_USERS };
526 uschar *freeze_tell            = NULL;
527 uschar *fudged_queue_times     = US"";
528
529 uschar *gecos_name             = NULL;
530 uschar *gecos_pattern          = NULL;
531 rewrite_rule  *global_rewrite_rules = NULL;
532
533 uschar *headers_charset        = US HEADERS_CHARSET;
534 int     header_insert_maxlen   = 64 * 1024;
535 header_line  *header_last      = NULL;
536 header_line  *header_list      = NULL;
537 int     header_maxsize         = HEADER_MAXSIZE;
538 int     header_line_maxsize    = 0;
539
540 header_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
556 int header_names_size          = sizeof(header_names)/sizeof(header_name);
557
558 BOOL    header_rewritten       = FALSE;
559 uschar *helo_accept_junk_hosts = NULL;
560 uschar *helo_allow_chars       = US"";
561 uschar *helo_lookup_domains    = US"@ : @[]";
562 uschar *helo_try_verify_hosts  = NULL;
563 BOOL    helo_verified          = FALSE;
564 uschar *helo_verify_hosts      = NULL;
565 uschar *hex_digits             = US"0123456789abcdef";
566 uschar *hold_domains           = NULL;
567 BOOL    host_checking          = FALSE;
568 BOOL    host_checking_callout  = FALSE;
569 uschar *host_data              = NULL;
570 BOOL    host_find_failed_syntax= FALSE;
571 uschar *host_lookup            = NULL;
572 BOOL    host_lookup_deferred   = FALSE;
573 BOOL    host_lookup_failed     = FALSE;
574 uschar *host_lookup_order      = US"bydns:byaddr";
575 uschar *host_lookup_msg        = US"";
576 int     host_number            = 0;
577 uschar *host_number_string     = NULL;
578 uschar *host_reject_connection = NULL;
579 tree_node *hostlist_anchor     = NULL;
580 int     hostlist_count         = 0;
581 uschar *hosts_treat_as_local   = NULL;
582 uschar *hosts_connection_nolog = NULL;
583
584 int     ignore_bounce_errors_after = 10*7*24*60*60;  /* 10 weeks */
585 BOOL    ignore_fromline_local  = FALSE;
586 uschar *ignore_fromline_hosts  = NULL;
587 uschar *interface_address      = NULL;
588 int     interface_port         = -1;
589 BOOL    is_inetd               = FALSE;
590
591 int     journal_fd             = -1;
592
593 int     keep_malformed         = 4*24*60*60;    /* 4 days */
594
595 uschar *eldap_dn               = NULL;
596 int     load_average           = -2;
597 BOOL    local_error_message    = FALSE;
598 BOOL    local_from_check       = TRUE;
599 uschar *local_from_prefix      = NULL;
600 uschar *local_from_suffix      = NULL;
601
602 #if HAVE_IPV6
603 uschar *local_interfaces       = US"<; ::0 ; 0.0.0.0";
604 #else
605 uschar *local_interfaces       = US"0.0.0.0";
606 #endif
607
608 uschar *local_scan_data        = NULL;
609 int     local_scan_timeout     = 5*60;
610 BOOL    local_sender_retain    = FALSE;
611 gid_t   local_user_gid         = (gid_t)(-1);
612 uid_t   local_user_uid         = (uid_t)(-1);
613
614 tree_node *localpartlist_anchor= NULL;
615 int     localpartlist_count    = 0;
616 uschar *log_buffer             = NULL;
617 unsigned int log_extra_selector = LX_default;
618 uschar *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
622 are the ones that get put into log_write_selector. They can be used in calls to
623 log_write() to test for the bit. The options with LX_xxx identifiers have
624 values greater than 0x80000000 and are put int log_extra_selector (without the
625 top bit). They are never used in calls to log_write(), but are tested
626 independently. This separation became necessary when the number of log
627 selectors was getting close to filling a 32-bit word. */
628
629 bit_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 },
648   { US"queue_time_overall",           LX_queue_time_overall },
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
669 int     log_options_count      = sizeof(log_options)/sizeof(bit_table);
670 unsigned int log_write_selector= L_default;
671 uschar *log_selector_string    = NULL;
672 FILE   *log_stderr             = NULL;
673 BOOL    log_testing_mode       = FALSE;
674 BOOL    log_timezone           = FALSE;
675 uschar *login_sender_address   = NULL;
676 int     lookup_open_max        = 25;
677 uschar *lookup_value           = NULL;
678
679 macro_item  *macros            = NULL;
680 uschar *mailstore_basename     = NULL;
681 #ifdef WITH_CONTENT_SCAN
682 uschar *malware_name           = NULL;  /* Virus Name */
683 #endif
684 int     max_username_length    = 0;
685 int     message_age            = 0;
686 uschar *message_body           = NULL;
687 uschar *message_body_end       = NULL;
688 int     message_body_size      = 0;
689 int     message_body_visible   = 500;
690 int     message_ended          = END_NOTSTARTED;
691 uschar *message_headers        = NULL;
692 uschar *message_id;
693 uschar *message_id_domain      = NULL;
694 uschar *message_id_text        = NULL;
695 struct timeval message_id_tv   = { 0, 0 };
696 uschar  message_id_option[MESSAGE_ID_LENGTH + 3];
697 uschar *message_id_external;
698 int     message_linecount      = 0;
699 BOOL    message_logs           = TRUE;
700 int     message_size           = 0;
701 uschar *message_size_limit     = US"50M";
702 uschar  message_subdir[2]      = { 0, 0 };
703 uschar *message_reference      = NULL;
704
705 /* MIME ACL expandables */
706 #ifdef WITH_CONTENT_SCAN
707 int     mime_anomaly_level     = 0;
708 uschar *mime_anomaly_text      = NULL;
709 uschar *mime_boundary          = NULL;
710 uschar *mime_charset           = NULL;
711 uschar *mime_content_description = NULL;
712 uschar *mime_content_disposition = NULL;
713 uschar *mime_content_id        = NULL;
714 unsigned int mime_content_size = 0;
715 uschar *mime_content_transfer_encoding = NULL;
716 uschar *mime_content_type      = NULL;
717 uschar *mime_decoded_filename  = NULL;
718 uschar *mime_filename          = NULL;
719 int     mime_is_multipart      = 0;
720 int     mime_is_coverletter    = 0;
721 int     mime_is_rfc822         = 0;
722 int     mime_part_count        = -1;
723 #endif
724
725 BOOL    mua_wrapper            = FALSE;
726
727 uid_t  *never_users            = NULL;
728 #ifdef WITH_CONTENT_SCAN
729 BOOL    no_mbox_unspool        = FALSE;
730 #endif
731 BOOL    no_multiline_responses = FALSE;
732
733 uid_t   original_euid;
734 gid_t   originator_gid;
735 uschar *originator_login       = NULL;
736 uschar *originator_name        = NULL;
737 uid_t   originator_uid;
738 uschar *override_local_interfaces = NULL;
739 uschar *override_pid_file_path = NULL;
740
741 BOOL    parse_allow_group      = FALSE;
742 BOOL    parse_found_group      = FALSE;
743 uschar *percent_hack_domains   = NULL;
744 uschar *pid_file_path          = US PID_FILE_PATH
745                            "\0<--------------Space to patch pid_file_path->";
746 uschar *pipelining_advertise_hosts = US"*";
747 BOOL    preserve_message_logs  = FALSE;
748 uschar *primary_hostname       = NULL;
749 BOOL    print_topbitchars      = FALSE;
750 uschar  process_info[PROCESS_INFO_SIZE];
751 uschar *process_log_path       = NULL;
752 BOOL    prod_requires_admin    = TRUE;
753
754 uschar *qualify_domain_recipient = NULL;
755 uschar *qualify_domain_sender  = NULL;
756 BOOL    queue_2stage           = FALSE;
757 uschar *queue_domains          = NULL;
758 int     queue_interval         = -1;
759 BOOL    queue_list_requires_admin = TRUE;
760 BOOL    queue_only             = FALSE;
761 uschar *queue_only_file        = NULL;
762 int     queue_only_load        = -1;
763 BOOL    queue_only_override    = TRUE;
764 BOOL    queue_only_policy      = FALSE;
765 BOOL    queue_run_first_delivery = FALSE;
766 BOOL    queue_run_force        = FALSE;
767 BOOL    queue_run_in_order     = FALSE;
768 BOOL    queue_run_local        = FALSE;
769 int     queue_run_max          = 5;
770 pid_t   queue_run_pid          = (pid_t)0;
771 int     queue_run_pipe         = -1;
772 BOOL    queue_running          = FALSE;
773 BOOL    queue_smtp             = FALSE;
774 uschar *queue_smtp_domains     = NULL;
775
776 unsigned int random_seed       = 0;
777 uschar *raw_active_hostname    = NULL;
778 uschar *raw_sender             = NULL;
779 uschar **raw_recipients        = NULL;
780 int     raw_recipients_count   = 0;
781
782 int     rcpt_count             = 0;
783 int     rcpt_fail_count        = 0;
784 int     rcpt_defer_count       = 0;
785 gid_t   real_gid;
786 uid_t   real_uid;
787 BOOL    really_exim            = TRUE;
788 BOOL    receive_call_bombout   = FALSE;
789 int     receive_linecount      = 0;
790 int     receive_messagecount   = 0;
791 int     receive_timeout        = 0;
792 int     received_count         = 0;
793 uschar *received_for           = NULL;
794
795 /*  This is the default text for Received headers generated by Exim. The
796 date  will be automatically added on the end. */
797
798 uschar *received_header_text   = US
799      "Received: "
800      "${if def:sender_rcvhost {from $sender_rcvhost\n\t}"
801      "{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}"
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
813 int     received_headers_max   = 30;
814 uschar *received_protocol      = NULL;
815 int     received_time          = 0;
816 uschar *recipient_data         = NULL;
817 uschar *recipient_unqualified_hosts = NULL;
818 uschar *recipient_verify_failure = NULL;
819 int     recipients_count       = 0;
820 BOOL    recipients_discarded   = FALSE;
821 recipient_item  *recipients_list = NULL;
822 int     recipients_list_max    = 0;
823 int     recipients_max         = 0;
824 BOOL    recipients_max_reject  = FALSE;
825 const pcre *regex_AUTH         = NULL;
826 const pcre *regex_check_dns_names = NULL;
827 const pcre *regex_From         = NULL;
828 const pcre *regex_PIPELINING   = NULL;
829 const pcre *regex_SIZE         = NULL;
830 const pcre *regex_ismsgid      = NULL;
831 #ifdef WITH_CONTENT_SCAN
832 uschar *regex_match_string     = NULL;
833 #endif
834 int     remote_delivery_count  = 0;
835 int     remote_max_parallel    = 2;
836 uschar *remote_sort_domains    = NULL;
837 int     retry_data_expire      = 7*24*60*60;
838 int     retry_interval_max     = 24*60*60;
839 int     retry_maximum_timeout  = 0;        /* set from retry config */
840 retry_config  *retries         = NULL;
841 uschar *return_path            = NULL;
842 BOOL    return_path_remove     = TRUE;
843 int     rewrite_existflags     = 0;
844 uschar *rfc1413_hosts          = US"*";
845 int     rfc1413_query_timeout  = 30;
846 /* BOOL    rfc821_domains         = FALSE;  <<< on the way out */
847 uid_t   root_uid               = ROOT_UID;
848
849 router_instance  *routers  = NULL;
850 router_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 */
858 #ifdef EXPERIMENTAL_BRIGHTMAIL
859     NULL,                      /* bmi_rule */
860 #endif
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 */
889 #ifdef EXPERIMENTAL_BRIGHTMAIL
890     FALSE,                     /* bmi_deliver_alternate */
891     FALSE,                     /* bmi_deliver_default */
892     FALSE,                     /* bmi_dont_deliver */
893 #endif
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
927 ip_address_item *running_interfaces = NULL;
928 BOOL    running_in_test_harness = FALSE;
929
930 /* This is a weird one. The following string gets patched in the binary by the
931 script that sets up a copy of Exim for running in the test harness. It seems
932 that compilers are now clever, and share constant strings if they can.
933 Elsewhere in Exim the string "<" is used. The compiler optimization seems to
934 make use of the end of this string in order to save space. So the patching then
935 wrecks this. We default this optimization by adding some additional characters
936 onto the end of the string. */
937
938 uschar *running_status         = US">>>running<<<" "\0EXTRA";
939
940 int     runrc                  = 0;
941
942 uschar *search_error_message   = NULL;
943 BOOL    search_find_defer      = FALSE;
944 uschar *self_hostname          = NULL;
945 uschar *sender_address         = NULL;
946 unsigned int sender_address_cache[(MAX_NAMED_LIST * 2)/32];
947 uschar *sender_address_data    = NULL;
948 BOOL    sender_address_forced  = FALSE;
949 uschar *sender_address_unrewritten = NULL;
950 uschar *sender_data            = NULL;
951 unsigned int sender_domain_cache[(MAX_NAMED_LIST * 2)/32];
952 uschar *sender_fullhost        = NULL;
953 uschar *sender_helo_name       = NULL;
954 uschar **sender_host_aliases   = &no_aliases;
955 uschar *sender_host_address    = NULL;
956 uschar *sender_host_authenticated = NULL;
957 unsigned int sender_host_cache[(MAX_NAMED_LIST * 2)/32];
958 uschar *sender_host_name       = NULL;
959 int     sender_host_port       = 0;
960 BOOL    sender_host_notsocket  = FALSE;
961 BOOL    sender_host_unknown    = FALSE;
962 uschar *sender_ident           = NULL;
963 BOOL    sender_local           = FALSE;
964 uschar *sender_rcvhost         = NULL;
965 BOOL    sender_set_untrusted   = FALSE;
966 uschar *sender_unqualified_hosts = NULL;
967 uschar *sender_verify_failure = NULL;
968 address_item *sender_verified_list  = NULL;
969 address_item *sender_verified_failed = NULL;
970 int     sender_verified_rc     = -1;
971 BOOL    sender_verified_responded = FALSE;
972 volatile  BOOL sigalrm_seen    = FALSE;
973 uschar **sighup_argv           = NULL;
974 int     smtp_accept_count      = 0;
975 BOOL    smtp_accept_keepalive  = TRUE;
976 int     smtp_accept_max        = 20;
977 int     smtp_accept_max_nonmail= 10;
978 uschar *smtp_accept_max_nonmail_hosts = US"*";
979 int     smtp_accept_max_per_connection = 1000;
980 uschar *smtp_accept_max_per_host = NULL;
981 int     smtp_accept_queue      = 0;
982 int     smtp_accept_queue_per_connection = 10;
983 int     smtp_accept_reserve    = 0;
984 uschar *smtp_active_hostname   = NULL;
985 BOOL    smtp_authenticated     = FALSE;
986 uschar *smtp_banner            = US"$smtp_active_hostname ESMTP "
987                              "Exim $version_number $tod_full"
988                              "\0<---------------Space to patch smtp_banner->";
989 BOOL    smtp_batched_input     = FALSE;
990 BOOL    smtp_check_spool_space = TRUE;
991 uschar *smtp_command_argument  = NULL;
992 int     smtp_connect_backlog   = 20;
993 double  smtp_delay_mail        = 0.0;
994 double  smtp_delay_rcpt        = 0.0;
995 BOOL    smtp_enforce_sync      = TRUE;
996 FILE   *smtp_in                = NULL;
997 BOOL    smtp_input             = FALSE;
998 int     smtp_load_reserve      = -1;
999 int     smtp_mailcmd_count     = 0;
1000 FILE   *smtp_out               = NULL;
1001 uschar *smtp_etrn_command      = NULL;
1002 BOOL    smtp_etrn_serialize    = TRUE;
1003 int     smtp_max_synprot_errors= 3;
1004 int     smtp_max_unknown_commands = 3;
1005 uschar *smtp_ratelimit_hosts   = NULL;
1006 uschar *smtp_ratelimit_mail    = NULL;
1007 uschar *smtp_ratelimit_rcpt    = NULL;
1008 uschar *smtp_read_error        = US"";
1009 int     smtp_receive_timeout   = 5*60;
1010 uschar *smtp_reserve_hosts     = NULL;
1011 BOOL    smtp_return_error_details = FALSE;
1012 int     smtp_rlm_base          = 0;
1013 double  smtp_rlm_factor        = 0.0;
1014 int     smtp_rlm_limit         = 0;
1015 int     smtp_rlm_threshold     = INT_MAX;
1016 int     smtp_rlr_base          = 0;
1017 double  smtp_rlr_factor        = 0.0;
1018 int     smtp_rlr_limit         = 0;
1019 int     smtp_rlr_threshold     = INT_MAX;
1020 BOOL    smtp_use_pipelining    = FALSE;
1021 BOOL    smtp_use_size          = FALSE;
1022
1023 #ifdef WITH_CONTENT_SCAN
1024 uschar *spamd_address          = US"127.0.0.1 783";
1025 uschar *spam_bar               = NULL;
1026 uschar *spam_report            = NULL;
1027 uschar *spam_score             = NULL;
1028 uschar *spam_score_int         = NULL;
1029 #endif
1030 #ifdef EXPERIMENTAL_SPF
1031 uschar *spf_header_comment     = NULL;
1032 uschar *spf_received           = NULL;
1033 uschar *spf_result             = NULL;
1034 uschar *spf_smtp_comment       = NULL;
1035 #endif
1036
1037 BOOL    split_spool_directory  = FALSE;
1038 uschar *spool_directory        = US SPOOL_DIRECTORY
1039                            "\0<--------------Space to patch spool_directory->";
1040 #ifdef EXPERIMENTAL_SRS
1041 uschar *srs_config             = NULL;
1042 uschar *srs_db_address         = NULL;
1043 uschar *srs_db_key             = NULL;
1044 uschar *srs_orig_recipient     = NULL;
1045 uschar *srs_orig_sender        = NULL;
1046 uschar *srs_recipient          = NULL;
1047 uschar *srs_status             = NULL;
1048 #endif
1049 int     string_datestamp_offset= -1;
1050 BOOL    strip_excess_angle_brackets = FALSE;
1051 BOOL    strip_trailing_dot     = FALSE;
1052 uschar *submission_domain      = NULL;
1053 BOOL    submission_mode        = FALSE;
1054 BOOL    synchronous_delivery   = FALSE;
1055 BOOL    syslog_duplication     = TRUE;
1056 int     syslog_facility        = LOG_MAIL;
1057 uschar *syslog_processname     = US"exim";
1058 BOOL    syslog_timestamp       = TRUE;
1059 uschar *system_filter          = NULL;
1060
1061 uschar *system_filter_directory_transport = NULL;
1062 uschar *system_filter_file_transport = NULL;
1063 uschar *system_filter_pipe_transport = NULL;
1064 uschar *system_filter_reply_transport = NULL;
1065
1066 gid_t   system_filter_gid      = 0;
1067 BOOL    system_filter_gid_set  = FALSE;
1068 uid_t   system_filter_uid      = 0;
1069 BOOL    system_filter_uid_set  = FALSE;
1070 BOOL    system_filtering       = FALSE;
1071
1072 BOOL    tcp_nodelay            = TRUE;
1073 int     thismessage_size_limit = 0;
1074 int     timeout_frozen_after   = 0;
1075 BOOL    timestamps_utc         = FALSE;
1076
1077 transport_instance  *transports = NULL;
1078
1079 transport_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
1131 int     transport_count;
1132 uschar **transport_filter_argv  = NULL;
1133 int     transport_filter_timeout;
1134 int     transport_write_timeout= 0;
1135
1136 tree_node  *tree_dns_fails     = NULL;
1137 tree_node  *tree_duplicates    = NULL;
1138 tree_node  *tree_nonrecipients = NULL;
1139 tree_node  *tree_unusable      = NULL;
1140
1141 BOOL    trusted_caller         = FALSE;
1142 gid_t  *trusted_groups         = NULL;
1143 uid_t  *trusted_users          = NULL;
1144 uschar *timezone_string        = US TIMEZONE_DEFAULT;
1145
1146 uschar *unknown_login          = NULL;
1147 uschar *unknown_username       = NULL;
1148 uschar *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
1154 which  the "mail" commands send to the MTA (undocumented, of course), or in
1155 the  form
1156
1157     From ph10 Fri, 7 Jan 97 14:00:00 GMT
1158
1159 which  is apparently used by some UUCPs, despite it not being in RFC 976.
1160 Because  of variations in time formats, just match up to the minutes. That
1161 should  be sufficient. Examples have been seen of time fields like 12:1:03,
1162 so  just require one digit for hours and minutes. The weekday is also absent
1163 in  some forms. */
1164
1165 uschar *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
1173 uschar *uucp_from_sender       = US"$1";
1174
1175 uschar *warn_message_file      = NULL;
1176 uschar *warnmsg_delay          = NULL;
1177 uschar *warnmsg_recipients     = NULL;
1178 BOOL    write_rejectlog        = TRUE;
1179
1180 uschar *version_copyright      = US"Copyright (c) University of Cambridge 2005";
1181 uschar *version_date           = US"?";
1182 uschar *version_cnumber        = US"????";
1183 uschar *version_string         = US"?";
1184
1185 int     warning_count          = 0;
1186
1187 /*  End of globals.c */