Add new errors mail_4xx, data_4xx, lost_connection, tls_required.
[exim.git] / src / src / macros.h
index bc685dac833804c9f769e63b1cb3ff08cc3f5475..7de0c4bfce46e623b08bc5148fa09d3b599a9789 100644 (file)
@@ -1,10 +1,10 @@
-/* $Cambridge: exim/src/src/macros.h,v 1.2 2004/11/04 10:42:11 ph10 Exp $ */
+/* $Cambridge: exim/src/src/macros.h,v 1.24 2006/03/09 15:10:16 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
 *************************************************/
 
-/* Copyright (c) University of Cambridge 1995 - 2004 */
+/* Copyright (c) University of Cambridge 1995 - 2006 */
 /* See the file NOTICE for conditions of use and distribution. */
 
 
@@ -72,7 +72,7 @@ as unsigned. */
 a no-op once an SSL session is in progress. */
 
 #ifdef SUPPORT_TLS
-#define mac_smtp_fflush() if (!tls_active) fflush(smtp_out);
+#define mac_smtp_fflush() if (tls_active < 0) fflush(smtp_out);
 #else
 #define mac_smtp_fflush() fflush(smtp_out);
 #endif
@@ -131,12 +131,12 @@ enough to hold all the headers from a normal kind of message. */
 into big_buffer_size and in some circumstances increased. It should be at least
 as long as the maximum path length. */
 
-#if defined PATH_MAX && PATH_MAX > 1024
+#if defined PATH_MAX && PATH_MAX > 16384
 #define BIG_BUFFER_SIZE PATH_MAX
-#elif defined MAXPATHLEN && MAXPATHLEN > 1024
+#elif defined MAXPATHLEN && MAXPATHLEN > 16384
 #define BIG_BUFFER_SIZE MAXPATHLEN
 #else
-#define BIG_BUFFER_SIZE 1024
+#define BIG_BUFFER_SIZE 16384
 #endif
 
 /* This limits the length of data returned by local_scan(). Because it is
@@ -160,11 +160,6 @@ record. */
 
 #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 */
@@ -178,7 +173,7 @@ record. */
 
 /* 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 */
 
@@ -227,31 +222,39 @@ enum {
   CEE_EXEC_PANIC            /* Panic-die if exec fails */
 };
 
+/* Bit values for filter_test */
+
+#define FTEST_NONE     0    /* Not filter testing */
+#define FTEST_USER     1    /* Testing user filter */
+#define FTEST_SYSTEM   2    /* Testing system filter */
+
 /* Returns from the routing, transport and authentication functions (not all
 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  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 */
 
@@ -310,6 +313,12 @@ for having to swallow the rest of an SMTP message is whether the value is
 #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 & \
@@ -317,7 +326,7 @@ for having to swallow the rest of an SMTP message is whether the value is
                                          D_pid         | \
                                          D_timestamp)  )
 
-#define D_default                    (D_all & \
+#define D_default                    (0xffffffff & \
                                        ~(D_expand      | \
                                          D_filter      | \
                                          D_interface   | \
@@ -334,6 +343,10 @@ values > 0x80000000 and are put into log_extra_selector (without the top bit).
 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
@@ -353,24 +366,28 @@ only in the name table to set all options in both bit maps. */
 #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_received_sender             0x80000100
-#define LX_received_recipients         0x80000200
-#define LX_rejected_header             0x80000400
-#define LX_return_path_on_delivery     0x80000800
-#define LX_sender_on_delivery          0x80001000
-#define LX_smtp_confirmation           0x80002000
-#define LX_subject                     0x80004000
-#define LX_tls_certificate_verified    0x80008000
-#define LX_tls_cipher                  0x80010000
-#define LX_tls_peerdn                  0x80020000
+#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_queue_time                  0x80000100
+#define LX_queue_time_overall          0x80000200
+#define LX_received_sender             0x80000400
+#define LX_received_recipients         0x80000800
+#define LX_rejected_header             0x80001000
+#define LX_return_path_on_delivery     0x80002000
+#define LX_sender_on_delivery          0x80004000
+#define LX_sender_verify_fail          0x80008000
+#define LX_smtp_confirmation           0x80010000
+#define LX_subject                     0x80020000
+#define LX_tls_certificate_verified    0x80040000
+#define LX_tls_cipher                  0x80080000
+#define LX_tls_peerdn                  0x80100000
+#define LX_unknown_in_list             0x80200000
 
 #define L_default     (L_connection_reject        | \
                        L_delay_delivery           | \
@@ -383,7 +400,9 @@ only in the name table to set all options in both bit maps. */
                        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_tls_cipher) & 0x7fffffff)
 
 /* Private error numbers for delivery failures, set negative so as not
@@ -433,6 +452,8 @@ to conflict with system errno values. */
 #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 */
 
@@ -482,15 +503,16 @@ router, which were chosen to represent the standard situation for users'
 #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 */
 
 /* 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
@@ -498,7 +520,7 @@ automated, but I haven't bothered. Keep this list in step with the above! */
 
 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_PERL, RDON_READFILE, RDON_READSOCK, RDON_RUN, RDON_DLFUNC, RDON_REALLOG,
   RDON_REWRITE, RDON_EXIM_FILTER, RDON_SIEVE_FILTER };
 
 /* Results of filter or forward file processing. Some are only from a filter;
@@ -545,6 +567,7 @@ to the header name, by calling header_checkname(). */
 #define htype_add_top       'a'
 #define htype_add_rec       'r'
 #define htype_add_bot       'z'
+#define htype_add_rfc       'f'
 
 /* Types of item in options lists. These are the bottom 8 bits of the "type"
 field, which is an int. The opt_void value is used for entries in tables that
@@ -591,11 +614,12 @@ enum { v_none, v_sender, v_recipient, v_expn };
 #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 */
 
@@ -607,6 +631,7 @@ enum { v_none, v_sender, v_recipient, v_expn };
 
 #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. */
@@ -731,13 +756,19 @@ enum { MCL_STRING, MCL_DOMAIN, MCL_HOST, MCL_ADDRESS, MCL_LOCALPART };
 /* 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", */
-       ACL_WHERE_DATA,       /* ) implemented by <= WHERE_NOTSMTP           */
+       ACL_WHERE_MIME,       /* ) implemented by <= WHERE_NOTSMTP           */
+       ACL_WHERE_DATA,       /* )                                           */
        ACL_WHERE_NOTSMTP,    /* )                                           */
 
        ACL_WHERE_AUTH,       /* These remaining ones are not currently    */