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