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