* 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 */
+#ifndef MACROS_H
+#define MACROS_H
/* These two macros make it possible to obtain the result of macro-expanding
a string as a text string. This is sometimes useful for debugging output. */
/* A macro to simplify testing bits in lookup types */
-#define mac_islookup(a,b) ((lookup_list[a]->type & (b)) != 0)
+#define mac_islookup(li,b) ((li)->type & (b))
/* Debugging control */
#define LOG_NAME_SIZE 256
-#define DEBUG(x) if (debug_selector & (x))
-#define HDEBUG(x) if (host_checking || debug_selector & (x))
+#define IS_DEBUG(x) (debug_selector & (x))
+#define DEBUG(x) if (IS_DEBUG(x))
+#define HDEBUG(x) if (host_checking || IS_DEBUG(x))
/* The default From: text for DSNs */
/* The length of the base names of spool files, which consist of an internal
message id with a trailing "-H" or "-D" added. */
-#define SPOOL_NAME_LENGTH (MESSAGE_ID_LENGTH+2)
+#define SPOOL_NAME_LENGTH_OLD (MESSAGE_ID_LENGTH_OLD + 2)
+#define SPOOL_NAME_LENGTH (MESSAGE_ID_LENGTH + 2)
/* The maximum number of message ids to store in a waiting database
record, and the max number of continuation records allowed. */
/* Macros for trivial functions */
+#define xstr(x) #x
+#define str(x) xstr(x) /* stringize, expanding macros in arg first */
#define mac_ismsgid(s) (regex_match(regex_ismsgid, (s), -1, NULL))
Li_8bitmime = BITWORDSIZE,
Li_acl_warn_skipped,
Li_arguments,
+ Li_connection_id,
Li_deliver_time,
Li_delivery_size,
Li_dkim,
enum { opt_bit = 32, opt_bool_verify, opt_bool_set, opt_expand_bool,
opt_bool_last,
opt_rewrite, opt_timelist, opt_uid, opt_gid, opt_uidlist, opt_gidlist,
- opt_expand_uid, opt_expand_gid, opt_func, opt_void };
+ opt_expand_uid, opt_expand_gid, opt_func, opt_void, opt_module };
/* There's a high-ish bit which is used to flag duplicate options, kept
for compatibility, which shouldn't be output. Also used for hidden options
most recent SMTP commands. SCH_NONE is "empty". */
enum { SCH_NONE, SCH_AUTH, SCH_DATA, SCH_BDAT,
- SCH_EHLO, SCH_ETRN, SCH_EXPN, SCH_HELO,
+ SCH_EHLO, SCH_ATRN, SCH_ETRN, SCH_EXPN, SCH_HELO,
SCH_HELP, SCH_MAIL, SCH_NOOP, SCH_QUIT, SCH_RCPT, SCH_RSET, SCH_STARTTLS,
- SCH_VRFY };
+ SCH_VRFY,
+#ifndef DISABLE_WELLKNOWN
+ SCH_WELLKNOWN,
+#endif
+#ifdef EXPERIMENTAL_XCLIENT
+ SCH_XCLIENT,
+#endif
+ };
/* Returns from host_find_by{name,dns}() */
**** IMPORTANT ****
*/
-enum { ACL_WHERE_RCPT, /* Some controls are for RCPT only */
- ACL_WHERE_MAIL, /* ) */
- ACL_WHERE_PREDATA, /* ) There are several tests for "in message", */
- ACL_WHERE_MIME, /* ) implemented by <= WHERE_NOTSMTP */
- ACL_WHERE_DKIM, /* ) */
- ACL_WHERE_DATA, /* ) */
+enum { ACL_WHERE_RCPT, /* Some controls are for RCPT only */
+ ACL_WHERE_MAIL, /* ) */
+ ACL_WHERE_PREDATA, /* ) There are several tests for "in message", */
+ ACL_WHERE_MIME, /* ) implemented by <= WHERE_NOTSMTP */
+ ACL_WHERE_DKIM, /* ) */
+ ACL_WHERE_DATA, /* ) */
#ifndef DISABLE_PRDR
- ACL_WHERE_PRDR, /* ) */
+ ACL_WHERE_PRDR, /* ) */
#endif
- ACL_WHERE_NOTSMTP, /* ) */
+ ACL_WHERE_NOTSMTP, /* ) */
- ACL_WHERE_AUTH, /* These remaining ones are not currently */
- ACL_WHERE_CONNECT, /* required to be in a special order so they */
- ACL_WHERE_ETRN, /* are just alphabetical. */
+ ACL_WHERE_AUTH, /* These remaining ones are not currently */
+ ACL_WHERE_ATRN, /* */
+ ACL_WHERE_CONNECT, /* required to be in a special order so they */
+ ACL_WHERE_ETRN, /* are just alphabetical. */
ACL_WHERE_EXPN,
ACL_WHERE_HELO,
ACL_WHERE_MAILAUTH,
ACL_WHERE_NOTQUIT,
ACL_WHERE_QUIT,
ACL_WHERE_STARTTLS,
+#ifndef DISABLE_WELLKNOWN
+ ACL_WHERE_WELLKNOWN,
+#endif
ACL_WHERE_VRFY,
ACL_WHERE_DELIVERY,
#define ACL_BIT_NOTSMTP BIT(ACL_WHERE_NOTSMTP)
#define ACL_BIT_AUTH BIT(ACL_WHERE_AUTH)
#define ACL_BIT_CONNECT BIT(ACL_WHERE_CONNECT)
+#define ACL_BIT_ATRN BIT(ACL_WHERE_ATRN)
#define ACL_BIT_ETRN BIT(ACL_WHERE_ETRN)
#define ACL_BIT_EXPN BIT(ACL_WHERE_EXPN)
#define ACL_BIT_HELO BIT(ACL_WHERE_HELO)
#define ACL_BIT_QUIT BIT(ACL_WHERE_QUIT)
#define ACL_BIT_STARTTLS BIT(ACL_WHERE_STARTTLS)
#define ACL_BIT_VRFY BIT(ACL_WHERE_VRFY)
+#ifndef DISABLE_WELLKNOWN
+# define ACL_BIT_WELLKNOWN BIT(ACL_WHERE_WELLKNOWN)
+#endif
#define ACL_BIT_DELIVERY BIT(ACL_WHERE_DELIVERY)
#define ACL_BIT_UNKNOWN BIT(ACL_WHERE_UNKNOWN)
#define UTF8_VERT_RIGHT "\xE2\x94\x9C"
#define UTF8_UP_RIGHT "\xE2\x95\xB0"
#define UTF8_VERT_2DASH "\xE2\x95\x8E"
+#define UTF8_LEFT_TRIANGLE "\xE2\x97\x80"
+#define UTF8_RIGHT_TRIANGLE "\xE2\x96\xB6"
+#define UTF8_LIGHT_SHADE "\xE2\x96\x91"
+#define UTF8_L_ARROW_HOOK "\xE2\x86\xA9"
/* Options on tls_close */
#define RESUME_USED BIT(4)
#define RESUME_DECODE_STRING \
- US"not requested or offered : 0x02 :client requested, no server ticket" \
- ": 0x04 : 0x05 : 0x06 :client offered session, no server action" \
- ": 0x08 :no client request: 0x0A :client requested new ticket, server provided" \
- ": 0x0C :client offered session, not used: 0x0E :client offered session, server only provided new ticket" \
- ": 0x10 :session resumed unasked: 0x12 :session resumed unasked" \
- ": 0x14 : 0x15 : 0x16 :session resumed" \
- ": 0x18 :session resumed unasked: 0x1A :session resumed unasked" \
- ": 0x1C :session resumed: 0x1E :session resumed, also new ticket"
+ US"not requested or offered" \
+ ": 0x02 :client requested, no server ticket" \
+ ": 0x04 : 0x05 " \
+ ": 0x06 :client offered session, no server action" \
+ ": 0x08 :no client request" \
+ ": 0x0A :client requested new ticket, server provided" \
+ ": 0x0C :client offered session, not used" \
+ ": 0x0E :client offered session, server only provided new ticket" \
+ ": 0x10 :session resumed unasked" \
+ ": 0x12 :session resumed unasked" \
+ ": 0x14 : 0x15" \
+ ": 0x16 :session resumed" \
+ ": 0x18 :session resumed unasked" \
+ ": 0x1A :session resumed unasked" \
+ ": 0x1C :session resumed" \
+ ": 0x1E :session resumed, also new ticket"
/* Flags for string_vformat */
#define SVFMT_EXTEND BIT(0)
#define QL_MSGID_ONLY 3
#define QL_UNSORTED 8
+/* Flags for transport_set_up_command() */
+#define TSUC_EXPAND_ARGS BIT(0)
+#define TSUC_ALLOW_TAINTED_ARGS BIT(1)
+#define TSUC_ALLOW_RECIPIENTS BIT(2)
+
+/* Flags for smtp_printf */
+#define SP_MORE TRUE
+#define SP_NO_MORE FALSE
+
+/* Flags for smtp_respond */
+#define SR_FINAL TRUE
+#define SR_NOT_FINAL FALSE
+
+/* Flags for continued-TLS-connection */
+#define CTF_CV BIT(0)
+#define CTF_DV BIT(1)
+#define CTF_TR BIT(2)
+
+/* Return codes for smtp_write_mail_and_rcpt_cmds() */
+typedef enum {
+ sw_mrc_ok, /* good, rcpt results in addr->transport_return (PENDING_OK, DEFER, FAIL) */
+ sw_mrc_bad_mail, /* MAIL response error */
+ sw_mrc_bad_read, /* any non-MAIL read i/o error */
+ sw_mrc_nonmail_read_timeo, /* non-MAIL response timeout */
+ sw_mrc_bad_internal, /* internal error; channel still usable */
+ sw_mrc_tx_fail, /* transmit failed */
+} sw_mrc_t;
+
+/* Recent versions of PCRE2 are allocating 20kB per match, rather than the previous 112 B.
+When doing en extended loop of matching, release store periodically. */
+
+#define REGEX_LOOPCOUNT_STORE_RESET 1000
+
+/* Debug an option access. Use for non-list ones about to be expanded
+(lists have their own debugging, under D_list). */
+#define GET_OPTION(name) \
+ DEBUG(D_expand) debug_printf("try option " name "\n");
+
+#endif /* whole file */
/* End of macros.h */
+/* vi: aw ai sw=2
+*/