-/* $Cambridge: exim/src/src/macros.h,v 1.10 2005/03/10 08:56:03 tom Exp $ */
-
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) University of Cambridge 1995 - 2005 */
+/* Copyright (c) University of Cambridge 1995 - 2012 */
/* See the file NOTICE for conditions of use and distribution. */
#define mac_expanded_string(s) mac_string(s)
+/* When running in the test harness, the load average is fudged. */
+
+#define OS_GETLOADAVG() \
+ (running_in_test_harness? (test_harness_load_avg += 10) : os_getloadavg())
+
+
/* The address_item structure has a word full of 1-bit flags. These macros
manipulate them. */
((uschar)(c) > 127 && print_topbitchars))
+/* Convenience for testing strings */
+
+#define streqic(Foo, Bar) (strcmpic(Foo, Bar) == 0)
+
+
/* 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
-#define mac_smtp_fflush() if (tls_active < 0) fflush(smtp_out);
+#define mac_smtp_fflush() if (tls_in.active < 0) fflush(smtp_out);
#else
#define mac_smtp_fflush() fflush(smtp_out);
#endif
/* A macro to simplify testing bits in lookup types */
-#define mac_islookup(a,b) ((lookup_list[a].type & (b)) != 0)
+#define mac_islookup(a,b) ((lookup_list[a]->type & (b)) != 0)
/* Debugging control */
#define DEBUG(x) if ((debug_selector & (x)) != 0)
#define HDEBUG(x) if (host_checking || (debug_selector & (x)) != 0)
+/* The default From: text for DSNs */
+
+#define DEFAULT_DSN_FROM "Mail Delivery System <Mailer-Daemon@$qualify_domain>"
+
/* The size of the vector for saving/restoring address expansion pointers while
verifying. This has to be explicit because it is referenced in more than one
source module. */
#define LOG_BUFFER_SIZE 8192
+/* The size of the circular buffer that remembers recent SMTP commands */
+
+#define SMTP_HBUFF_SIZE 20
+
/* The initial size of a big buffer for use in various places. It gets put
into big_buffer_size and in some circumstances increased. It should be at least
as long as the maximum path length. */
#define WAIT_NAME_MAX 50
-/* The numbers of connection and message variables for ACLs */
-
-#define ACL_C_MAX 10
-#define ACL_M_MAX 10
-
/* Fixed option values for all PCRE functions */
#define PCRE_COPT 0 /* compile */
/* Options for dns_next_rr */
-enum { RESET_NEXT, RESET_ANSWERS, RESET_ADDITIONAL };
+enum { RESET_NEXT, RESET_ANSWERS, RESET_AUTHORITY, RESET_ADDITIONAL };
/* Argument values for the time-of-day function */
-enum { tod_log, tod_log_bare, tod_log_zone, tod_log_datestamp,
- tod_zone, tod_full, tod_bsdin, tod_mbx, tod_epoch, tod_zulu };
+enum { tod_log, tod_log_bare, tod_log_zone, tod_log_datestamp_daily,
+ tod_log_datestamp_monthly, tod_zone, tod_full, tod_bsdin,
+ tod_mbx, tod_epoch, tod_epoch_l, tod_zulu };
/* For identifying types of driver */
ERRMESS_TOOMANYRECIP, /* Too many recipients */
ERRMESS_LOCAL_SCAN, /* Rejected by local scan */
ERRMESS_LOCAL_ACL /* Rejected by non-SMTP ACL */
+#ifdef EXPERIMENTAL_DMARC
+ ,ERRMESS_DMARC_FORENSIC /* DMARC Forensic Report */
+#endif
};
/* Error handling styles - set by option, and apply only when receiving
apply to all of them). Some other functions also use these convenient values,
and some additional values are used only by non-driver functions.
-OK, FAIL, DEFER, and ERROR are also declared in local_scan.h for use in the
-local_scan() function. Do not change them unilaterally. */
+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. */
#define OK 0 /* Successful match */
#define DEFER 1 /* Defer - some problem */
#define FAIL 2 /* Matching failed */
#define ERROR 3 /* Internal or config error */
+#define FAIL_FORCED 4 /* "Forced" failure */
/***********/
-#define DECLINE 4 /* Declined to handle the address, pass to next
+#define DECLINE 5 /* Declined to handle the address, pass to next
router unless no_more is set */
-#define PASS 5 /* Pass to next driver, or to pass_router,
+#define PASS 6 /* Pass to next driver, or to pass_router,
even if no_more is set */
-#define DISCARD 6 /* Address routed to :blackhole: or "seen finish" */
-#define SKIP 7 /* Skip this router (used in route_address only) */
-#define REROUTED 8 /* Address was changed and child created*/
-#define PANIC 9 /* Hard failed with internal error */
-#define BAD64 10 /* Bad base64 data (auth) */
-#define UNEXPECTED 11 /* Unexpected initial auth data */
-#define CANCELLED 12 /* Authentication cancelled */
-#define FAIL_SEND 13 /* send() failed in authenticator */
-#define FAIL_DROP 14 /* Fail and drop connection (used in ACL) */
+#define DISCARD 7 /* Address routed to :blackhole: or "seen finish" */
+#define SKIP 8 /* Skip this router (used in route_address only) */
+#define REROUTED 9 /* Address was changed and child created*/
+#define PANIC 10 /* Hard failed with internal error */
+#define BAD64 11 /* Bad base64 data (auth) */
+#define UNEXPECTED 12 /* Unexpected initial auth data */
+#define CANCELLED 13 /* Authentication cancelled */
+#define FAIL_SEND 14 /* send() failed in authenticator */
+#define FAIL_DROP 15 /* Fail and drop connection (used in ACL) */
/* Returns from the deliver_message() function */
#define D_uid 0x20000000
#define D_verify 0x40000000
+/* The D_all value must always have all bits set, as it is recognized specially
+by the function that decodes debug and log selectors. This is to enable it to
+set all the bits in a multi-word selector. Debug doesn't use this yet, but we
+are getting close. In fact, we want to omit "memory" for -d+all, but can't
+handle this here. It is fudged externally. */
+
#define D_all 0xffffffff
#define D_any (D_all & \
D_pid | \
D_timestamp) )
-#define D_default (D_all & \
+#define D_default (0xffffffff & \
~(D_expand | \
D_filter | \
D_interface | \
These are only ever tested independently. "All" is a magic value that is used
only in the name table to set all options in both bit maps. */
+/* The L_all value must always have all bits set, as it is recognized specially
+by the function that decodes debug and log selectors. This is to enable it to
+set all the bits in a multi-word selector. */
+
#define L_all 0xffffffff
#define L_address_rewrite 0x00000001
#define L_smtp_protocol_error 0x00004000
#define L_smtp_syntax_error 0x00008000
-#define LX_arguments 0x80000001
-#define LX_deliver_time 0x80000002
-#define LX_delivery_size 0x80000004
-#define LX_ident_timeout 0x80000008
-#define LX_incoming_interface 0x80000010
-#define LX_incoming_port 0x80000020
-#define LX_outgoing_port 0x80000040
-#define LX_queue_time 0x80000080
-#define LX_queue_time_overall 0x80000100
-#define LX_received_sender 0x80000200
-#define LX_received_recipients 0x80000400
-#define LX_rejected_header 0x80000800
-#define LX_return_path_on_delivery 0x80001000
-#define LX_sender_on_delivery 0x80002000
-#define LX_smtp_confirmation 0x80004000
-#define LX_subject 0x80008000
-#define LX_tls_certificate_verified 0x80010000
-#define LX_tls_cipher 0x80020000
-#define LX_tls_peerdn 0x80040000
+#define LX_acl_warn_skipped 0x80000001
+#define LX_arguments 0x80000002
+#define LX_deliver_time 0x80000004
+#define LX_delivery_size 0x80000008
+#define LX_ident_timeout 0x80000010
+#define LX_incoming_interface 0x80000020
+#define LX_incoming_port 0x80000040
+#define LX_outgoing_port 0x80000080
+#define LX_pid 0x80000100
+#define LX_queue_time 0x80000200
+#define LX_queue_time_overall 0x80000400
+#define LX_received_sender 0x80000800
+#define LX_received_recipients 0x80001000
+#define LX_rejected_header 0x80002000
+#define LX_return_path_on_delivery 0x80004000
+#define LX_sender_on_delivery 0x80008000
+#define LX_sender_verify_fail 0x80010000
+#define LX_smtp_confirmation 0x80020000
+#define LX_smtp_no_mail 0x80040000
+#define LX_subject 0x80080000
+#define LX_tls_certificate_verified 0x80100000
+#define LX_tls_cipher 0x80200000
+#define LX_tls_peerdn 0x80400000
+#define LX_tls_sni 0x80800000
+#define LX_unknown_in_list 0x81000000
+#define LX_8bitmime 0x82000000
+#define LX_smtp_mailauth 0x84000000
#define L_default (L_connection_reject | \
L_delay_delivery | \
L_size_reject | \
L_skip_delivery)
-#define LX_default ((LX_rejected_header | \
+#define LX_default ((LX_acl_warn_skipped | \
+ LX_rejected_header | \
+ LX_sender_verify_fail | \
+ LX_smtp_confirmation | \
LX_tls_cipher) & 0x7fffffff)
/* Private error numbers for delivery failures, set negative so as not
#define ERRNO_AUTHFAIL (-42) /* When required by client */
#define ERRNO_CONNECTTIMEOUT (-43) /* Used internally in smtp transport */
#define ERRNO_RCPT4XX (-44) /* RCPT gave 4xx error */
+#define ERRNO_MAIL4XX (-45) /* MAIL gave 4xx error */
+#define ERRNO_DATA4XX (-46) /* DATA gave 4xx error */
/* These must be last, so all retry deferments can easily be identified */
#define RDO_READFILE 0x00001000 /* Forbid "readfile" in exp in filter */
#define RDO_READSOCK 0x00002000 /* Forbid "readsocket" in exp in filter */
#define RDO_RUN 0x00004000 /* Forbid "run" in expansion in filter */
-#define RDO_REALLOG 0x00008000 /* Really do log (not testing/verifying) */
-#define RDO_REWRITE 0x00010000 /* Rewrite generated addresses */
-#define RDO_EXIM_FILTER 0x00020000 /* Forbid Exim filters */
-#define RDO_SIEVE_FILTER 0x00040000 /* Forbid Sieve filters */
+#define RDO_DLFUNC 0x00008000 /* Forbid "dlfunc" in expansion in filter */
+#define RDO_REALLOG 0x00010000 /* Really do log (not testing/verifying) */
+#define RDO_REWRITE 0x00020000 /* Rewrite generated addresses */
+#define RDO_EXIM_FILTER 0x00040000 /* Forbid Exim filters */
+#define RDO_SIEVE_FILTER 0x00080000 /* Forbid Sieve filters */
+#define RDO_PREPEND_HOME 0x00100000 /* Prepend $home to relative paths in Exim filter save commands */
/* This is the set that apply to expansions in filters */
#define RDO_FILTER_EXPANSIONS \
- (RDO_EXISTS|RDO_LOOKUP|RDO_PERL|RDO_READFILE|RDO_READSOCK|RDO_RUN)
+ (RDO_EXISTS|RDO_LOOKUP|RDO_PERL|RDO_READFILE|RDO_READSOCK|RDO_RUN|RDO_DLFUNC)
/* As well as the RDO bits themselves, we need the bit numbers in order to
access (most of) the individual bits as separate options. This could be
enum { RDON_BLACKHOLE, RDON_DEFER, RDON_EACCES, RDON_ENOTDIR, RDON_EXISTS,
RDON_FAIL, RDON_FILTER, RDON_FREEZE, RDON_INCLUDE, RDON_LOG, RDON_LOOKUP,
- RDON_PERL, RDON_READFILE, RDON_READSOCK, RDON_RUN, RDON_REALLOG,
- RDON_REWRITE, RDON_EXIM_FILTER, RDON_SIEVE_FILTER };
+ RDON_PERL, RDON_READFILE, RDON_READSOCK, RDON_RUN, RDON_DLFUNC, RDON_REALLOG,
+ RDON_REWRITE, RDON_EXIM_FILTER, RDON_SIEVE_FILTER, RDON_PREPEND_HOME };
/* Results of filter or forward file processing. Some are only from a filter;
some are only from a forward file. */
#define opt_public 0x200 /* Stored in the main instance block */
#define opt_set 0x400 /* Option is set */
#define opt_secure 0x800 /* "hide" prefix used */
-#define opt_mask 0x0ff
+#define opt_rep_con 0x1000 /* Can be appended to by a repeated line (condition) */
+#define opt_rep_str 0x2000 /* Can be appended to by a repeated line (string) */
+#define opt_mask 0x00ff
/* Verify types when directing and routing */
#define vopt_is_recipient 0x0002
#define vopt_qualify 0x0004
#define vopt_expn 0x0008
-#define vopt_callout_postmaster 0x0010 /* during callout */
+#define vopt_callout_fullpm 0x0010 /* full postmaster during callout */
#define vopt_callout_random 0x0020 /* during callout */
#define vopt_callout_no_cache 0x0040 /* disable callout cache */
#define vopt_callout_recipsender 0x0080 /* use real sender to verify recip */
#define vopt_callout_recippmaster 0x0100 /* use postmaster to verify recip */
+#define vopt_success_on_redirect 0x0200
/* Values for fields in callout cache records */
#define ccache_unknown 0 /* test hasn't been done */
#define ccache_accept 1
-#define ccache_reject 2
+#define ccache_reject 2 /* All rejections except */
+#define ccache_reject_mfnull 3 /* MAIL FROM:<> was rejected */
/* Options for lookup functions */
#define lookup_querystyle 1 /* query-style lookup */
#define lookup_absfile 2 /* requires absolute file name */
+#define lookup_absfilequery 4 /* query-style starts with file name */
/* Status values for host_item blocks. Require hstatus_unusable and
hstatus_unusable_expired to be last. */
#define LOG_MAIN 1 /* Write to the main log */
#define LOG_PANIC 2 /* Write to the panic log */
#define LOG_PANIC_DIE 6 /* Write to the panic log and then die */
-#define LOG_PROCESS 8 /* Write to the process log */
#define LOG_REJECT 16 /* Write to the reject log, with headers */
#define LOG_SENDER 32 /* Add raw sender to the message */
#define LOG_RECIPIENTS 64 /* Add raw recipients to the message */
#define LOG_CONFIG_FOR (256+128) /* Add " for" instead of ":\n" */
#define LOG_CONFIG_IN (512+128) /* Add " in line x[ of file y]" */
+/* and for debug_bits() logging action control: */
+#define DEBUG_FROM_CONFIG 0x0001
+
+/* SMTP command identifiers for the smtp_connection_had field that records the
+most recent SMTP commands. Must be kept in step with the list of names in
+smtp_in.c that is used for creating the smtp_no_mail logging action. SCH_NONE
+is "empty". */
+
+enum { SCH_NONE, SCH_AUTH, SCH_DATA, SCH_EHLO, SCH_ETRN, SCH_EXPN, SCH_HELO,
+ SCH_HELP, SCH_MAIL, SCH_NOOP, SCH_QUIT, SCH_RCPT, SCH_RSET, SCH_STARTTLS,
+ SCH_VRFY };
+
/* Returns from host_find_by{name,dns}() */
enum {
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,
+ /* 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 };
/* Returns from the spool_read_header() function */
#define topt_no_body 0x040 /* Omit body */
#define topt_escape_headers 0x080 /* Apply escape check to headers */
-/* Codes for the host_find_failed option. */
+/* Codes for the host_find_failed and host_all_ignored options. */
#define hff_freeze 0
#define hff_defer 1
#define hff_pass 2
#define hff_decline 3
#define hff_fail 4
+#define hff_ignore 5
/* Router information flags */
/* Codes for the places from which ACLs can be called. These are cunningly
ordered to make it easy to implement tests for certain ACLs when processing
"control" modifiers, by means of a maximum "where" value. Do not modify this
-order without checking carefully! Furthermore, remember to keep these in step
-with the tables of names and response codes in globals.c. */
+order without checking carefully!
+
+**** IMPORTANT***
+**** Furthermore, remember to keep these in step with the tables
+**** of names and response codes in globals.c.
+**** IMPORTANT ****
+*/
enum { ACL_WHERE_RCPT, /* Some controls are for RCPT only */
ACL_WHERE_MAIL, /* ) */
ACL_WHERE_PREDATA, /* ) There are several tests for "in message", */
- /* ) implemented by <= WHERE_NOTSMTP */
-
-/* Remove next line in case of removeing WITH_CONTENT_SCAN.
- ACL_WHERE_MIME is defined unconditionally to avoid clutter in acl.c */
- ACL_WHERE_MIME, /* ) */
-
+ ACL_WHERE_MIME, /* ) implemented by <= WHERE_NOTSMTP */
+ ACL_WHERE_DKIM, /* ) */
ACL_WHERE_DATA, /* ) */
+#ifdef EXPERIMENTAL_PRDR
+ ACL_WHERE_PRDR, /* ) */
+#endif
ACL_WHERE_NOTSMTP, /* ) */
ACL_WHERE_AUTH, /* These remaining ones are not currently */
ACL_WHERE_EXPN,
ACL_WHERE_HELO,
ACL_WHERE_MAILAUTH,
+ ACL_WHERE_NOTSMTP_START,
+ ACL_WHERE_NOTQUIT,
ACL_WHERE_QUIT,
ACL_WHERE_STARTTLS,
- ACL_WHERE_VRFY
+ ACL_WHERE_VRFY,
+
+ ACL_WHERE_DELIVERY,
+ ACL_WHERE_UNKNOWN /* Currently used by a ${acl:name} expansion */
};
/* Situations for spool_write_header() */