* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) The Exim Maintainers 2020 - 2022 */
+/* Copyright (c) The Exim Maintainers 2020 - 2024 */
/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
/* SPDX-License-Identifier: GPL-2.0-or-later */
extern uschar *acl_smtp_data; /* ACL run after DATA received */
#ifndef DISABLE_PRDR
extern uschar *acl_smtp_data_prdr; /* ACL run after DATA received if in PRDR mode*/
-const extern pcre2_code *regex_PRDR; /* For recognizing PRDR settings */
+extern const pcre2_code *regex_PRDR; /* For recognizing PRDR settings */
#endif
#ifndef DISABLE_DKIM
extern uschar *acl_smtp_dkim; /* ACL run for DKIM signatures / domains */
extern uschar *acl_smtp_rcpt; /* ACL run for RCPT */
extern uschar *acl_smtp_starttls; /* ACL run for STARTTLS */
extern uschar *acl_smtp_vrfy; /* ACL run for VRFY */
+#ifndef DISABLE_WELLKNOWN
+extern uschar *acl_smtp_wellknown; /* ACL run for WELLKNOWN */
+#endif
extern tree_node *acl_var_c; /* ACL connection variables */
extern tree_node *acl_var_m; /* ACL message variables */
extern uschar *acl_verify_message; /* User message for verify failure */
extern uschar *acl_wherenames[]; /* Names for messages */
extern address_item *addr_duplicate; /* Duplicate address list */
extern address_item address_defaults; /* Default data for address item */
-extern uschar *address_file; /* Name of file when delivering to one */
-extern uschar *address_pipe; /* Pipe command when delivering to one */
+extern const uschar *address_file; /* Name of file when delivering to one */
+extern const uschar *address_pipe; /* Pipe command when delivering to one */
extern tree_node *addresslist_anchor; /* Tree of defined address lists */
extern int addresslist_count; /* Number defined */
extern gid_t *admin_groups; /* List of admin groups */
extern int body_8bitmime; /* sender declared BODY= ; 7=7BIT, 8=8BITMIME */
extern uschar *bounce_message_file; /* Template file */
extern uschar *bounce_message_text; /* One-liner */
-extern uschar *bounce_recipient; /* When writing an errmsg */
+extern const uschar *bounce_recipient; /* When writing an errmsg */
extern BOOL bounce_return_body; /* Include body in returned message */
extern int bounce_return_linesize_limit; /* Max line length in return */
extern BOOL bounce_return_message; /* Include message in bounce */
extern const uschar *config_filename; /* Configuration file name */
extern gid_t config_gid; /* Additional group owner */
extern int config_lineno; /* Line number */
-extern uschar *config_main_filelist; /* List of possible config files */
+extern const uschar *config_main_filelist; /* List of possible config files */
extern uschar *config_main_filename; /* File name actually used */
extern uschar *config_main_directory; /* Directory where the main config file was found */
extern uid_t config_uid; /* Additional owner */
extern uschar *continue_proxy_sni; /* proxied conn SNI */
extern uschar *continue_hostname; /* Host for continued delivery */
extern uschar *continue_host_address; /* IP address for ditto */
+extern uschar continue_next_id[]; /* Next message_id from hintsdb */
extern int continue_sequence; /* Sequence num for continued delivery */
extern uschar *continue_transport; /* Transport for continued delivery */
-#ifdef EXPERIMENTAL_ESMTP_LIMITS
+#ifndef COMPILE_UTILITY
+extern open_db *continue_wait_db; /* Hintsdb for wait-transport */
+extern open_db *continue_retry_db; /* Hintsdb for retries */
+#endif
+#ifndef DISABLE_ESMTP_LIMITS
extern unsigned continue_limit_mail; /* Peer advertised limit */
extern unsigned continue_limit_rcpt;
extern unsigned continue_limit_rcptdom;
extern int deliver_host_port; /* Address for remote delivery filter */
extern uschar *deliver_in_buffer; /* Buffer for copying file */
extern ino_t deliver_inode; /* Inode for appendfile */
-extern uschar *deliver_localpart; /* The local part for delivery */
+extern const uschar *deliver_localpart;/* The local part for delivery */
extern uschar *deliver_localpart_data; /* From local part lookup (de-tainted) */
-extern uschar *deliver_localpart_orig; /* The original local part for delivery */
-extern uschar *deliver_localpart_parent; /* The parent local part for delivery */
-extern uschar *deliver_localpart_prefix; /* The stripped prefix, if any */
-extern uschar *deliver_localpart_prefix_v; /* The stripped-prefix variable portion, if any */
-extern uschar *deliver_localpart_suffix; /* The stripped suffix, if any */
-extern uschar *deliver_localpart_suffix_v; /* The stripped-suffix variable portion, if any */
+extern const uschar *deliver_localpart_orig; /* The original local part for delivery */
+extern const uschar *deliver_localpart_parent; /* The parent local part for delivery */
+extern const uschar *deliver_localpart_prefix; /* The stripped prefix, if any */
+extern const uschar *deliver_localpart_prefix_v; /* The stripped-prefix variable portion, if any */
+extern const uschar *deliver_localpart_suffix; /* The stripped suffix, if any */
+extern const uschar *deliver_localpart_suffix_v; /* The stripped-suffix variable portion, if any */
extern uschar *deliver_out_buffer; /* Buffer for copying file */
extern int deliver_queue_load_max; /* Different value for queue running */
extern address_item *deliver_recipients; /* Current set of addresses */
extern int dkim_key_length; /* Expansion variable, length of signing key in bits */
extern void *dkim_signatures; /* Actually a (pdkim_signature *) but most files do not need to know */
extern uschar *dkim_signers; /* Expansion variable, holds colon-separated list of domains and identities that have signed a message */
+extern gstring *dkim_signing_record; /* domains+selectors used */
extern uschar *dkim_signing_domain; /* Expansion variable, domain used for signing a message. */
extern uschar *dkim_signing_selector; /* Expansion variable, selector used for signing a message. */
extern uschar *dkim_verify_hashes; /* Preference order for signatures */
#ifndef DISABLE_EVENT
extern uschar *event_action; /* expansion for delivery events */
-extern uschar *event_data; /* event data */
+extern const uschar *event_data; /* event data */
extern int event_defer_errno; /* error number set when a remote delivery is deferred with a host error */
extern const uschar *event_name; /* event classification */
#endif
extern int filter_n[FILTER_VARIABLE_COUNT]; /* filter variables */
extern int filter_sn[FILTER_VARIABLE_COUNT]; /* variables set by system filter */
extern int filter_test; /* Filter test type */
-extern uschar *filter_test_sfile; /* System filter test file */
-extern uschar *filter_test_ufile; /* User filter test file */
+extern const uschar *filter_test_sfile;/* System filter test file */
+extern const uschar *filter_test_ufile;/* User filter test file */
extern uschar *filter_thisaddress; /* For address looping */
extern int finduser_retries; /* Retry count for getpwnam() */
extern uid_t fixed_never_users[]; /* Can't be overridden */
extern uschar *eldap_dn; /* Where LDAP DNs are left */
extern const uschar *letter_digit_hyphen_dot; /* Legitimate DNS host name chars */
-#ifdef EXPERIMENTAL_ESMTP_LIMITS
+#ifndef DISABLE_ESMTP_LIMITS
extern uschar *limits_advertise_hosts; /* for banner/EHLO pipelining */
#endif
extern int load_average; /* Most recently read load average */
#ifdef SUPPORT_I18N
extern BOOL message_smtputf8; /* Internationalized mail handling */
extern int message_utf8_downconvert; /* convert from utf8 */
-const extern pcre2_code *regex_UTF8; /* For recognizing SMTPUTF8 settings */
+extern const pcre2_code *regex_UTF8; /* For recognizing SMTPUTF8 settings */
#endif
extern uschar message_subdir[]; /* Subdirectory for messages */
-extern uschar *message_reference; /* Reference for error messages */
+extern const uschar *message_reference;/* Reference for error messages */
/* MIME ACL expandables */
#ifdef WITH_CONTENT_SCAN
extern uschar *originator_name; /* Full name of same */
extern uid_t originator_uid; /* Uid of ditto */
extern uschar *override_local_interfaces; /* Value of -oX argument */
-extern uschar *override_pid_file_path; /* Value of -oP argument */
+extern const uschar *override_pid_file_path; /* Value of -oP argument */
extern BOOL panic_coredump; /* SEGV rather than exit, on LOG_PANIC_DIE */
extern pcre2_general_context * pcre_gen_ctx; /* pcre memory management */
extern pcre2_compile_context * pcre_mlc_cmp_ctx;
extern uschar *percent_hack_domains; /* Local domains for which '% operates */
-extern uschar *pid_file_path; /* For writing daemon pids */
+extern const uschar *pid_file_path; /* For writing daemon pids */
#ifndef DISABLE_PIPE_CONNECT
extern uschar *pipe_connect_advertise_hosts; /* for banner/EHLO pipelining */
#endif
extern tree_node *ratelimiters_conn; /* Results of connection ratelimit checks */
extern tree_node *ratelimiters_mail; /* Results of per-mail ratelimit checks */
extern uschar *raw_active_hostname; /* Pre-expansion */
-extern uschar *raw_sender; /* Before rewriting */
-extern uschar **raw_recipients; /* Before rewriting */
+extern const uschar *raw_sender; /* Before rewriting */
+extern const uschar **raw_recipients; /* Before rewriting */
extern int raw_recipients_count;
extern const uschar * rc_names[]; /* Mostly for debug output */
extern int rcpt_count; /* Count of RCPT commands in a message */
extern int receive_messagecount; /* Mainly for BSMTP errors */
extern int receive_timeout; /* For non-SMTP acceptance */
extern int received_count; /* Count of Received: headers */
-extern uschar *received_for; /* For "for" field */
+extern const uschar *received_for; /* For "for" field */
extern uschar *received_header_text; /* Definition of Received: header */
extern int received_headers_max; /* Max count of Received: headers */
extern struct timeval received_time; /* Time the message started to be received */
extern uschar *recipient_unqualified_hosts; /* Permitted unqualified recipients */
extern uschar *recipient_verify_failure; /* What went wrong */
extern int recipients_list_max; /* Maximum number fitting in list */
-extern int recipients_max; /* Max permitted */
+extern uschar *recipients_max; /* Max permitted */
+extern int recipients_max_expanded;
extern BOOL recipients_max_reject; /* If TRUE, reject whole message */
extern const pcre2_code *regex_AUTH; /* For recognizing AUTH settings */
extern const pcre2_code *regex_check_dns_names; /* For DNS name checking */
extern const pcre2_code *regex_From; /* For recognizing "From_" lines */
extern const pcre2_code *regex_CHUNKING; /* For recognizing CHUNKING (RFC 3030) */
extern const pcre2_code *regex_IGNOREQUOTA; /* For recognizing IGNOREQUOTA (LMTP) */
-#ifdef EXPERIMENTAL_ESMTP_LIMITS
+#ifndef DISABLE_ESMTP_LIMITS
extern const pcre2_code *regex_LIMITS; /* For recognizing LIMITS */
#endif
extern const pcre2_code *regex_PIPELINING; /* For recognizing PIPELINING */
extern int retry_data_expire; /* When to expire retry data */
extern int retry_interval_max; /* Absolute maximum */
extern int retry_maximum_timeout; /* The maximum timeout */
-extern uschar *return_path; /* Return path for a message */
+extern const uschar *return_path; /* Return path for a message */
extern BOOL return_path_remove; /* Remove return-path headers */
extern int rewrite_existflags; /* Indicate which headers have rewrites */
extern uschar *rfc1413_hosts; /* RFC hosts */
extern uschar *self_hostname; /* Self host after routing->directors */
extern unsigned int sender_address_cache[(MAX_NAMED_LIST * 2)/32]; /* Cache bits for sender */
extern uschar *sender_address_data; /* address_data from sender verify */
-extern uschar *sender_address_unrewritten; /* Set if rewritten by verify */
+extern const uschar *sender_address_unrewritten; /* Set if rewritten by verify */
extern uschar *sender_data; /* lookup result for senders */
extern unsigned int sender_domain_cache[(MAX_NAMED_LIST * 2)/32]; /* Cache bits for sender domain */
extern uschar *sender_fullhost; /* Sender host name + address */
extern int sending_port; /* Port of outgoing interface */
extern SIGNAL_BOOL sigalrm_seen; /* Flag for sigalrm_handler */
extern const uschar *sigalarm_setter; /* For debug, set to callpoint of alarm() */
-extern uschar **sighup_argv; /* Args for re-execing after SIGHUP */
+extern const uschar **sighup_argv; /* Args for re-execing after SIGHUP */
extern int slow_lookup_log; /* Log DNS lookups taking longer than N millisecs */
extern int smtp_accept_count; /* Count of connections */
extern BOOL smtp_accept_keepalive; /* Set keepalive on incoming */
extern BOOL syslog_duplication; /* FALSE => no duplicate logging */
extern int syslog_facility; /* As defined by Syslog.h */
extern BOOL syslog_pid; /* TRUE if PID on syslogs */
-extern uschar *syslog_processname; /* 'ident' param to openlog() */
+extern const uschar *syslog_processname; /* 'ident' param to openlog() */
extern BOOL syslog_timestamp; /* TRUE if time on syslogs */
extern uschar *system_filter; /* Name of system filter file */
extern int warning_count; /* Delay warnings sent for this msg */
+#ifndef DISABLE_WELLKNOWN
+extern uschar *wellknown_advertise_hosts;/* Allow WELLKNOWN command for specified hosts */
+extern uschar *wellknown_response; /* SMTP response for WELLKNOWN verb */
+#endif
+
/* End of globals.h */