/* When built with TLS support, the act of flushing SMTP output becomes
a no-op once an SSL session is in progress. */
-#ifdef SUPPORT_TLS
+#ifndef DISABLE_TLS
#define mac_smtp_fflush() if (tls_in.active.sock < 0) fflush(smtp_out);
#else
#define mac_smtp_fflush() fflush(smtp_out);
#define DEBUG(x) if (debug_selector & (x))
#define HDEBUG(x) if (host_checking || (debug_selector & (x)))
-#define PTR_CHK(ptr) \
-do { \
-if ((void *)ptr > (void *)store_get(0)) \
- debug_printf("BUG: ptr '%s' beyond arena at %s:%d\n", \
- mac_expanded_string(ptr), __FUNCTION__, __LINE__); \
-} while(0)
-
/* The default From: text for DSNs */
#define DEFAULT_DSN_FROM "Mail Delivery System <Mailer-Daemon@$qualify_domain>"
ERRMESS_TOOMANYRECIP, /* Too many recipients */
ERRMESS_LOCAL_SCAN, /* Rejected by local scan */
ERRMESS_LOCAL_ACL /* Rejected by non-SMTP ACL */
-#ifdef EXPERIMENTAL_DMARC
+#ifdef SUPPORT_DMARC
,ERRMESS_DMARC_FORENSIC /* DMARC Forensic Report */
#endif
};
OK, FAIL, DEFER, ERROR, and FAIL_FORCED are also declared in local_scan.h for
use in the local_scan() function and in ${dlfunc loaded functions. Do not
-change them unilaterally. */
+change them unilaterally.
+
+Use rc_names[] for debug strings. */
#define OK 0 /* Successful match */
#define DEFER 1 /* Defer - some problem */
/* This macro is for single-word bit vectors: the debug selector,
and the first word of the log selector. */
-#define BIT(n) (1 << (n))
+#define BIT(n) (1UL << (n))
/* And these are for multi-word vectors. */
-#define BITWORD(n) ( (n) / BITWORDSIZE)
-#define BITMASK(n) (1 << (n) % BITWORDSIZE)
+#define BITWORD(n) ( (n) / BITWORDSIZE)
+#define BITMASK(n) (1U << (n) % BITWORDSIZE)
#define BIT_CLEAR(s,z,n) ((s)[BITWORD(n)] &= ~BITMASK(n))
#define BIT_SET(s,z,n) ((s)[BITWORD(n)] |= BITMASK(n))
word, and this is exposed in the local_scan ABI. The D_v and D_local_scan bit
masks are part of the local_scan API so are #defined in local_scan.h */
-#define DEBUG_BIT(name) Di_##name = IOTA(Di_iota), D_##name = BIT(Di_##name)
+#define DEBUG_BIT(name) Di_##name = IOTA(Di_iota), D_##name = (int)BIT(Di_##name)
enum {
Di_all = -1,
Di_local_scan = 1,
Di_iota = IOTA_INIT(2),
- DEBUG_BIT(acl),
+ DEBUG_BIT(acl), /* 2 */
DEBUG_BIT(auth),
DEBUG_BIT(deliver),
DEBUG_BIT(dns),
DEBUG_BIT(dnsbl),
- DEBUG_BIT(exec),
+ DEBUG_BIT(exec), /* 7 */
DEBUG_BIT(expand),
DEBUG_BIT(filter),
DEBUG_BIT(hints_lookup),
DEBUG_BIT(ident),
DEBUG_BIT(interface),
DEBUG_BIT(lists),
- DEBUG_BIT(load),
+ DEBUG_BIT(load), /* 15 */
DEBUG_BIT(lookup),
DEBUG_BIT(memory),
DEBUG_BIT(noutf8),
DEBUG_BIT(process_info),
DEBUG_BIT(queue_run),
DEBUG_BIT(receive),
- DEBUG_BIT(resolver),
+ DEBUG_BIT(resolver), /* 23 */
DEBUG_BIT(retry),
DEBUG_BIT(rewrite),
DEBUG_BIT(route),
DEBUG_BIT(tls),
DEBUG_BIT(transport),
DEBUG_BIT(uid),
- DEBUG_BIT(verify),
+ DEBUG_BIT(verify), /* 31 */
};
/* Multi-bit debug masks */
/* Options bits for logging. Those that have values < BITWORDSIZE can be used
in calls to log_write(). The others are put into later words in log_selector
and are only ever tested independently, so they do not need bit mask
-declarations. The Li_all value is recognized specially by decode_bits(). */
+declarations. The Li_all value is recognized specially by decode_bits().
+Add also to log_options[] when creating new ones. */
#define LOG_BIT(name) Li_##name = IOTA(Li_iota), L_##name = BIT(Li_##name)
-enum {
+enum logbit {
Li_all = -1,
Li_iota = IOTA_INIT(0),
Li_incoming_interface,
Li_incoming_port,
Li_millisec,
+ Li_msg_id,
+ Li_msg_id_created,
Li_outgoing_interface,
Li_outgoing_port,
Li_pid,
Li_tls_certificate_verified,
Li_tls_cipher,
Li_tls_peerdn,
+ Li_tls_resumption,
Li_tls_sni,
Li_unknown_in_list,
#ifdef SUPPORT_I18N
# define ERRNO_UTF8_FWD (-49) /* target not supporting SMTPUTF8 */
#endif
-#if defined(SUPPORT_TLS) && defined(EXPERIMENTAL_REQUIRETLS)
-# define ERRNO_REQUIRETLS (-50) /* REQUIRETLS session not started */
-#endif
+ /* -50 free for re-use */
/* These must be last, so all retry deferments can easily be identified */
enum { MSG_DELIVER, MSG_FREEZE, MSG_REMOVE, MSG_THAW, MSG_ADD_RECIPIENT,
MSG_MARK_ALL_DELIVERED, MSG_MARK_DELIVERED, MSG_EDIT_SENDER,
- MSG_SHOW_COPY, MSG_LOAD,
+ MSG_SHOW_COPY, MSG_LOAD, MSG_SETQUEUE,
/* These ones must be last: a test for >= MSG_SHOW_BODY is used
to test for actions that list individual spool files. */
MSG_SHOW_BODY, MSG_SHOW_HEADER, MSG_SHOW_LOG };
#define OPTION_PIPE BIT(5)
#define OPTION_SIZE BIT(6)
#define OPTION_CHUNKING BIT(7)
-#define OPTION_REQUIRETLS BIT(8)
-#define OPTION_EARLY_PIPE BIT(9)
-
-/* Codes for tls_requiretls requests (usually by sender) */
-
-#define REQUIRETLS_MSG BIT(0) /* REQUIRETLS onward use */
+#define OPTION_EARLY_PIPE BIT(8)
/* Argument for *_getc */
/* UTF-8 chars for line-drawing */
-#define UTF8_DOWN_RIGHT "\xE2\x94\x8c"
+#define UTF8_DOWN_RIGHT "\xE2\x95\xAD"
+#define UTF8_VERT "\xE2\x94\x82"
#define UTF8_HORIZ "\xE2\x94\x80"
#define UTF8_VERT_RIGHT "\xE2\x94\x9C"
-#define UTF8_UP_RIGHT "\xE2\x94\x94"
+#define UTF8_UP_RIGHT "\xE2\x95\xB0"
#define UTF8_VERT_2DASH "\xE2\x95\x8E"
#define AUTH_ITEM_IGN64 BIT(2)
+/* Flags for tls_{in,out}_resumption */
+#define RESUME_SUPPORTED BIT(0)
+#define RESUME_CLIENT_REQUESTED BIT(1)
+#define RESUME_CLIENT_SUGGESTED BIT(2)
+#define RESUME_SERVER_TICKET BIT(3)
+#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"
+
+/* Flags for string_vformat */
+#define SVFMT_EXTEND BIT(0)
+#define SVFMT_REBUFFER BIT(1)
+#define SVFMT_TAINT_NOCHK BIT(2)
+
/* End of macros.h */