Macros: convert to tree for speed of lookup
[exim.git] / src / src / structs.h
index a17b50332276084ada95fa582c920f3a1086e0ce..a32a5f9c6332fe1ec15e8368e1210fd3ba4d3c5b 100644 (file)
@@ -2,7 +2,7 @@
 *     Exim - an Internet mail transport agent    *
 *************************************************/
 
-/* Copyright (c) University of Cambridge 1995 - 2015 */
+/* Copyright (c) University of Cambridge 1995 - 2017 */
 /* See the file NOTICE for conditions of use and distribution. */
 
 
@@ -25,16 +25,12 @@ struct smtp_outblock;
 struct transport_info;
 struct router_info;
 
-/* Structure for remembering macros for the configuration file */
-
-typedef struct macro_item {
-  struct  macro_item * next;
-  BOOL         command_line;
-  unsigned     namelen;
-  unsigned     replen;
-  const uschar * name;
-  const uschar * replacement;
-} macro_item;
+/* Growable-string */
+typedef struct gstring {
+  int  size;           /* Current capacity of string memory */
+  int  ptr;            /* Offset at which to append further chars */
+  uschar * s;          /* The string memory */
+} gstring;
 
 /* Structure for bit tables for debugging and logging */
 
@@ -238,7 +234,7 @@ typedef int (*tpt_chunk_cmd_cb)(struct transport_context *, unsigned, unsigned);
 typedef struct transport_context {
   union {                      /* discriminated by option topt_output_string */
     int                          fd;   /* file descriptor to write message to */
-    uschar *             msg;  /* allocated string with written message */
+    gstring *            msg;  /* allocated string with written message */
   } u;
   transport_instance   * tblock;               /* transport */
   struct address_item  * addr;
@@ -249,10 +245,6 @@ typedef struct transport_context {
   /* items below only used with option topt_use_bdat */
   tpt_chunk_cmd_cb       chunk_cb;             /* per-datachunk callback */
   void                 * smtp_context;
-
-  /* items below only used with option topt_output_string */
-  int                    msg_size;
-  int                    msg_ptr;
 } transport_ctx;
 
 
@@ -610,6 +602,8 @@ typedef struct address_item {
     BOOL af_cert_verified:1;           /* delivered with verified TLS cert */
     BOOL af_pass_message:1;            /* pass message in bounces */
     BOOL af_bad_reply:1;               /* filter could not generate autoreply */
+    BOOL af_tcp_fastopen_conn:1;       /* delivery connection used TCP Fast Open */
+    BOOL af_tcp_fastopen:1;            /* delivery usefuly used TCP Fast Open */
 #ifndef DISABLE_PRDR
     BOOL af_prdr_used:1;               /* delivery used SMTP PRDR */
 #endif
@@ -700,6 +694,38 @@ typedef struct tree_node {
   uschar  name[1];                /* node name - variable length */
 } tree_node;
 
+typedef struct tree_node_64 {
+  struct tree_node_64 *left;      /* pointer to left child */
+  struct tree_node_64 *right;     /* pointer to right child */
+  union
+    {
+    void  *ptr;                   /* pointer to data */
+    int val;                      /* or integer data */
+    } data;
+  uschar  balance;                /* balancing factor */
+  uschar  name[64];               /* node name - bounded length */
+} tree_node_64;
+
+/* Structure for remembering macros for the configuration file */
+
+typedef struct macro_item {
+  BOOL         command_line;
+  unsigned     namelen;
+  unsigned     replen;
+  unsigned     m_number;
+  tree_node    tnode;          /* contains name; ptr indicates val */
+} macro_item;
+
+typedef struct macro_item_64 {
+  BOOL         command_line;
+  unsigned     namelen;
+  unsigned     replen;
+  unsigned     m_number;
+  tree_node_64 tnode;          /* contains name; ptr indicates val */
+} macro_item_64;
+
+#define tnode_to_mitem(tp) (tp ? (macro_item *) (CS(tp) - offsetof(macro_item, tnode)) : NULL)
+
 /* Structure for holding time-limited data such as DNS returns.
 We use this rather than extending tree_node to avoid wasting
 space for most tree use (variables...) at the cost of complexity
@@ -866,11 +892,13 @@ typedef BOOL (*oicf) (uschar *message_id, void *data);
 /* DKIM information for transport */
 struct ob_dkim {
   uschar *dkim_domain;
+  uschar *dkim_identity;
   uschar *dkim_private_key;
   uschar *dkim_selector;
   uschar *dkim_canon;
   uschar *dkim_sign_headers;
   uschar *dkim_strict;
+  uschar *dkim_hash;
   BOOL    dot_stuffed;
 };