TLS resumption: support Outlook hosts-behind-loadbalancer
[exim.git] / src / src / structs.h
1 /*************************************************
2 *     Exim - an Internet mail transport agent    *
3 *************************************************/
4
5 /* Copyright (c) University of Cambridge 1995 - 2018 */
6 /* Copyright (c) The Exim Maintainers 2020 - 2021 */
7 /* See the file NOTICE for conditions of use and distribution. */
8
9
10 /* Definitions of various structures. In addition, those that are visible for
11 the compilation of local_scan() are defined in local_scan.h. These are
12
13   header_line
14   optionlist
15   recipient_item
16
17 For those declared here, we have to pre-declare some because of mutually
18 recursive definitions in the auths, routers, and transports blocks. */
19
20 struct address_item;
21 struct auth_info;
22 struct driver_info;
23 struct director_info;
24 struct smtp_inblock;
25 struct smtp_outblock;
26 struct transport_info;
27 struct router_info;
28
29 /* Growable-string */
30 typedef struct gstring {
31   int   size;           /* Current capacity of string memory */
32   int   ptr;            /* Offset at which to append further chars */
33   uschar * s;           /* The string memory */
34 } gstring;
35
36 /* Structure for remembering macros for the configuration file */
37
38 typedef struct macro_item {
39   struct  macro_item * next;
40   BOOL          command_line;
41   unsigned      namelen;
42   unsigned      replen;
43   const uschar * name;
44   const uschar * replacement;
45 } macro_item;
46
47 /* Structure for bit tables for debugging and logging */
48
49 typedef struct bit_table {
50   uschar *name;
51   int bit;
52 } bit_table;
53
54 /* Block for holding a uid and gid, possibly unset, and an initgroups flag. */
55
56 typedef struct ugid_block {
57   uid_t   uid;
58   gid_t   gid;
59   BOOL    uid_set;
60   BOOL    gid_set;
61   BOOL    initgroups;
62 } ugid_block;
63
64 typedef enum {  CHUNKING_NOT_OFFERED = -1,
65                 CHUNKING_OFFERED,
66                 CHUNKING_ACTIVE,
67                 CHUNKING_LAST} chunking_state_t;
68
69 typedef enum {  TFO_NOT_USED = 0,
70                 TFO_ATTEMPTED_NODATA,
71                 TFO_ATTEMPTED_DATA,
72                 TFO_USED_NODATA,
73                 TFO_USED_DATA } tfo_state_t;
74
75 /* Structure for holding information about a host for use mainly by routers,
76 but also used when checking lists of hosts and when transporting. Looking up
77 host addresses is done using this structure. */
78
79 typedef enum {DS_UNK=-1, DS_NO, DS_YES} dnssec_status_t;
80
81 typedef struct host_item {
82   struct host_item *next;
83   const uschar *name;           /* Host name */
84 #ifndef DISABLE_TLS
85   const uschar *certname;       /* Name used for certificate checks */
86 #endif
87   const uschar *address;        /* IP address in text form */
88   int     port;                 /* port value in host order (if SRV lookup) */
89   int     mx;                   /* MX value if found via MX records */
90   int     sort_key;             /* MX*1000 plus random "fraction" */
91   int     status;               /* Usable, unusable, or unknown */
92   int     why;                  /* Why host is unusable */
93   int     last_try;             /* Time of last try if known */
94   dnssec_status_t dnssec;
95 } host_item;
96
97 /* Chain of rewrite rules, read from the rewrite config, or parsed from the
98 rewrite_headers field of a transport. */
99
100 typedef struct rewrite_rule {
101   struct rewrite_rule *next;
102   int     flags;
103   uschar *key;
104   uschar *replacement;
105 } rewrite_rule;
106
107 /* This structure is used to pass back configuration data from the smtp
108 transport to the outside world. It is used during callback processing. If ever
109 another remote transport were implemented, it could use the same structure. */
110
111 typedef struct transport_feedback {
112   uschar *interface;
113   uschar *port;
114   uschar *protocol;
115   uschar *hosts;
116   uschar *helo_data;
117   BOOL   hosts_override;
118   BOOL   hosts_randomize;
119   BOOL   gethostbyname;
120   BOOL   qualify_single;
121   BOOL   search_parents;
122 } transport_feedback;
123
124 /* Routers, transports, and authenticators have similar data blocks. Each
125 driver that is compiled into the code is represented by a xxx_info block; the
126 active drivers are represented by a chain of xxx_instance blocks. To make it
127 possible to use the same code for reading the configuration files for all
128 three, the layout of the start of the blocks is kept the same, and represented
129 by the generic structures driver_info and driver_instance. */
130
131 typedef struct driver_instance {
132   struct driver_instance *next;
133   uschar *name;                   /* Instance name */
134   struct driver_info *info;       /* Points to info for this driver */
135   void   *options_block;          /* Pointer to private options */
136
137   uschar *driver_name;            /* All start with this generic option */
138   const uschar *srcfile;          /* and config source info for errors */
139   int     srcline;
140 } driver_instance;
141
142 typedef struct driver_info {
143   uschar *driver_name;            /* Name of driver */
144
145   optionlist *options;            /* Table of private options names */
146   int    *options_count;          /* -> Number of entries in table */
147   void   *options_block;          /* Points to default private block */
148   int     options_len;            /* Length of same in bytes */
149   void  (*init)(                  /* Initialization entry point */
150     struct driver_instance *);
151 } driver_info;
152
153
154 /* Structure for holding information about the configured transports. Some
155 of the generally accessible options are set from the configuration file; others
156 are set by transport initialization, since they can only be set for certain
157 transports. They need to be generally accessible, however, as they are used by
158 the main transport code. */
159
160 typedef struct transport_instance {
161   struct transport_instance *next;
162   uschar *name;                   /* Instance name */
163   struct transport_info *info;    /* Info for this driver */
164   void *options_block;            /* Pointer to private options */
165   uschar *driver_name;            /* Must be first */
166   const uschar *srcfile;
167   int     srcline;
168
169   int   (*setup)(                 /* Setup entry point */
170     struct transport_instance *,
171     struct address_item *,
172     struct transport_feedback *,  /* For passing back config data */
173     uid_t,                        /* The uid that will be used */
174     gid_t,                        /* The gid that will be used */
175     uschar **);                   /* For an error message */
176                                   /**************************************/
177   int     batch_max;              /* )                                  */
178   uschar *batch_id;               /* )                                  */
179   uschar *home_dir;               /* ) Used only for local transports   */
180   uschar *current_dir;            /* )                                  */
181                                   /**************************************/
182   uschar *expand_multi_domain;    /* )                                  */
183   BOOL    multi_domain;           /* )                                  */
184   BOOL    overrides_hosts;        /* ) Used only for remote transports  */
185   int     max_addresses;          /* )                                  */
186   int     connection_max_messages;/* )                                  */
187                                   /**************************************/
188   BOOL    deliver_as_creator;     /* Used only by pipe at present */
189   BOOL    disable_logging;        /* For very weird requirements */
190   BOOL    initgroups;             /* Initialize groups when setting uid */
191   BOOL    uid_set;                /* uid is set */
192   BOOL    gid_set;                /* gid is set */
193   uid_t   uid;
194   gid_t   gid;
195   uschar *expand_uid;             /* Variable uid */
196   uschar *expand_gid;             /* Variable gid */
197   uschar *warn_message;           /* Used only by appendfile at present */
198   uschar *shadow;                 /* Name of shadow transport */
199   uschar *shadow_condition;       /* Condition for running it */
200   uschar *filter_command;         /* For on-the-fly-filtering */
201   uschar *add_headers;            /* Add these headers */
202   uschar *remove_headers;         /* Remove these headers */
203   uschar *return_path;            /* Overriding (rewriting) return path */
204   uschar *debug_string;           /* Debugging output */
205   uschar *max_parallel;           /* Number of concurrent instances */
206   uschar *message_size_limit;     /* Biggest message this transport handles */
207   uschar *headers_rewrite;        /* Rules for rewriting headers */
208   rewrite_rule *rewrite_rules;    /* Parsed rewriting rules */
209   int     rewrite_existflags;     /* Bits showing which headers are rewritten */
210   int     filter_timeout;         /* For transport filter timing */
211   BOOL    body_only;              /* Deliver only the body */
212   BOOL    delivery_date_add;      /* Add Delivery-Date header */
213   BOOL    envelope_to_add;        /* Add Envelope-To header */
214   BOOL    headers_only;           /* Deliver only the headers */
215   BOOL    rcpt_include_affixes;   /* TRUE to retain affixes in RCPT commands */
216   BOOL    return_path_add;        /* Add Return-Path header */
217   BOOL    return_output;          /* TRUE if output should always be returned */
218   BOOL    return_fail_output;     /* ditto, but only on failure */
219   BOOL    log_output;             /* Similarly for logging */
220   BOOL    log_fail_output;
221   BOOL    log_defer_output;
222   BOOL    retry_use_local_part;   /* Defaults true for local, false for remote */
223 #ifndef DISABLE_EVENT
224   uschar  *event_action;          /* String to expand on notable events */
225 #endif
226 } transport_instance;
227
228
229 /* Structure for holding information about a type of transport. The first six
230 fields must match driver_info above. */
231
232 typedef struct transport_info {
233   uschar *driver_name;            /* Driver name */
234   optionlist *options;            /* Table of private options names */
235   int    *options_count;          /* -> Number of entries in table */
236   void   *options_block;          /* Points to default private block */
237   int     options_len;            /* Length of same in bytes */
238   void (*init)(                   /* Initialization function */
239     struct transport_instance *);
240 /****/
241   BOOL (*code)(                   /* Main entry point */
242     transport_instance *,
243     struct address_item *);
244   void (*tidyup)(                 /* Tidyup function */
245     struct transport_instance *);
246   void  (*closedown)(             /* For closing down a passed channel */
247     struct transport_instance *);
248   BOOL    local;                  /* TRUE for local transports */
249 } transport_info;
250
251
252 /* smtp transport datachunk callback */
253
254 #define tc_reap_prev    BIT(0)  /* Flags: reap previous SMTP cmd responses */
255 #define tc_chunk_last   BIT(1)  /* annotate chunk SMTP cmd as LAST */
256
257 struct transport_context;
258 typedef int (*tpt_chunk_cmd_cb)(struct transport_context *, unsigned, unsigned);
259
260 /* Structure for information about a delivery-in-progress */
261
262 typedef struct transport_context {
263   union {                       /* discriminated by option topt_output_string */
264     int                   fd;   /* file descriptor to write message to */
265     gstring *             msg;  /* allocated string with written message */
266   } u;
267   transport_instance    * tblock;               /* transport */
268   struct address_item   * addr;
269   uschar                * check_string;         /* string replacement */
270   uschar                * escape_string;
271   int                     options;              /* output processing topt_* */
272
273   /* items below only used with option topt_use_bdat */
274   tpt_chunk_cmd_cb        chunk_cb;             /* per-datachunk callback */
275   void                  * smtp_context;
276 } transport_ctx;
277
278
279
280 typedef struct {
281   uschar *request;
282   uschar *require;
283 } dnssec_domains;
284
285 /* Structure for holding information about the configured routers. */
286
287 typedef struct router_instance {
288   struct router_instance *next;
289   uschar *name;
290   struct router_info *info;
291   void   *options_block;          /* Pointer to private options */
292   uschar *driver_name;            /* Must be first */
293   const uschar *srcfile;
294   int     srcline;
295
296   uschar *address_data;           /* Arbitrary data */
297 #ifdef EXPERIMENTAL_BRIGHTMAIL
298   uschar *bmi_rule;               /* Brightmail AntiSpam rule checking */
299 #endif
300   uschar *cannot_route_message;   /* Used when routing fails */
301   uschar *condition;              /* General condition */
302   uschar *current_directory;      /* For use during delivery */
303   uschar *debug_string;           /* Debugging output */
304   uschar *domains;                /* Specific domains */
305   uschar *errors_to;              /* Errors address */
306   uschar *expand_gid;             /* Expanded gid string */
307   uschar *expand_uid;             /* Expanded uid string */
308   uschar *expand_more;            /* Expanded more string */
309   uschar *expand_unseen;          /* Expanded unseen string */
310   uschar *extra_headers;          /* Additional headers */
311   uschar *fallback_hosts;         /* For remote transports (text list) */
312   uschar *home_directory;         /* For use during delivery */
313   uschar *ignore_target_hosts;    /* Target hosts to ignore */
314   uschar *local_parts;            /* Specific local parts */
315   uschar *pass_router_name;       /* Router for passed address */
316   uschar *prefix;                 /* Address prefix */
317   uschar *redirect_router_name;   /* Router for generated address */
318   uschar *remove_headers;         /* Removed headers */
319   uschar *require_files;          /* File checks before router is run */
320   uschar *router_home_directory;  /* For use while routing */
321   uschar *self;                   /* Text option for handling self reference */
322   uschar *senders;                /* Specific senders */
323   uschar *suffix;                 /* Address suffix */
324   uschar *translate_ip_address;   /* IP address translation fudgery */
325   uschar *transport_name;         /* Transport name */
326
327   BOOL    address_test;           /* Use this router when testing addresses */
328 #ifdef EXPERIMENTAL_BRIGHTMAIL
329   BOOL    bmi_deliver_alternate;  /* TRUE => BMI said that message should be delivered to alternate location */
330   BOOL    bmi_deliver_default;    /* TRUE => BMI said that message should be delivered to default location */
331   BOOL    bmi_dont_deliver;       /* TRUE => BMI said that message should not be delivered at all */
332 #endif
333   BOOL    expn;                   /* Use this router when processing EXPN */
334   BOOL    caseful_local_part;     /* TRUE => don't lowercase */
335   BOOL    check_local_user;       /* TRUE => check local user */
336   BOOL    disable_logging;        /* For very weird requirements */
337   BOOL    fail_verify_recipient;  /* Fail verify if recipient match this router */
338   BOOL    fail_verify_sender;     /* Fail verify if sender match this router */
339   BOOL    gid_set;                /* Flag to indicate gid is set */
340   BOOL    initgroups;             /* TRUE if initgroups is required */
341   BOOL    log_as_local;           /* TRUE logs as a local delivery */
342   BOOL    more;                   /* If FALSE, do no more if this one fails */
343   BOOL    pass_on_timeout;        /* Treat timeout DEFERs as fails */
344   BOOL    prefix_optional;        /* Just what it says */
345   BOOL    repeat_use;             /* If FALSE, skip if ancestor used it */
346   BOOL    retry_use_local_part;   /* Just what it says */
347   BOOL    same_domain_copy_routing; /* TRUE => copy routing for same domain */
348   BOOL    self_rewrite;           /* TRUE to rewrite headers if making local */
349   uschar *set;                    /* Variable = value to set; list */
350   BOOL    suffix_optional;        /* As it says */
351   BOOL    verify_only;            /* Skip this router if not verifying */
352   BOOL    verify_recipient;       /* Use this router when verifying a recipient*/
353   BOOL    verify_sender;          /* Use this router when verifying a sender */
354   BOOL    uid_set;                /* Flag to indicate uid is set */
355   BOOL    unseen;                 /* If TRUE carry on, even after success */
356   BOOL    dsn_lasthop;            /* If TRUE, this router is a DSN endpoint */
357
358   int     self_code;              /* Encoded version of "self" */
359   uid_t   uid;                    /* Fixed uid value */
360   gid_t   gid;                    /* Fixed gid value */
361
362   host_item *fallback_hostlist;   /* For remote transport (block chain) */
363   transport_instance *transport;  /* Transport block (when found) */
364   struct router_instance *pass_router; /* Actual router for passed address */
365   struct router_instance *redirect_router; /* Actual router for generated address */
366
367   dnssec_domains dnssec;
368 } router_instance;
369
370
371 /* Structure for holding information about a type of router. The first six
372 fields must match driver_info above. */
373
374 typedef struct router_info {
375   uschar *driver_name;
376   optionlist *options;            /* Table of private options names */
377   int    *options_count;          /* -> Number of entries in table */
378   void   *options_block;          /* Points to default private block */
379   int     options_len;            /* Length of same in bytes */
380   void (*init)(                   /* Initialization function */
381     struct router_instance *);
382 /****/
383   int (*code)(                    /* Main entry point */
384     router_instance *,
385     struct address_item *,
386     struct passwd *,
387     int,
388     struct address_item **,
389     struct address_item **,
390     struct address_item **,
391     struct address_item **);
392   void (*tidyup)(                 /* Tidyup function */
393     struct router_instance *);
394   int     ri_flags;               /* Descriptive flags */
395 } router_info;
396
397
398 /* Structure for holding information about a lookup type. */
399
400 #include "lookupapi.h"
401
402
403 /* Structure for holding information about the configured authentication
404 mechanisms */
405
406 typedef struct auth_instance {
407   struct auth_instance *next;
408   uschar *name;                   /* Exim instance name */
409   struct auth_info *info;         /* Pointer to driver info block */
410   void   *options_block;          /* Pointer to private options */
411   uschar *driver_name;            /* Must be first */
412   const uschar *srcfile;
413   int     srcline;
414
415   uschar *advertise_condition;    /* Are we going to advertise this?*/
416   uschar *client_condition;       /* Should the client try this? */
417   uschar *public_name;            /* Advertised name */
418   uschar *set_id;                 /* String to set when server as authenticated id */
419   uschar *set_client_id;          /* String to set when client as client_authenticated id */
420   uschar *mail_auth_condition;    /* Condition for AUTH on MAIL command */
421   uschar *server_debug_string;    /* Debugging output */
422   uschar *server_condition;       /* Authorization condition */
423   BOOL    client;                 /* TRUE if client option(s) set */
424   BOOL    server;                 /* TRUE if server options(s) set */
425   BOOL    advertised;             /* Set TRUE when advertised */
426 } auth_instance;
427
428
429 /* Structure for holding information about an authentication mechanism. The
430 first six fields must match driver_info above. */
431
432 typedef struct auth_info {
433   uschar *driver_name;            /* e.g. "condition" */
434   optionlist *options;            /* Table of private options names */
435   int    *options_count;          /* -> Number of entries in table */
436   void   *options_block;          /* Points to default private block */
437   int     options_len;            /* Length of same in bytes */
438   void (*init)(                   /* initialization function */
439     struct auth_instance *);
440 /****/
441   int (*servercode)(              /* server function */
442     auth_instance *,              /* the instance data */
443     uschar *);                    /* rest of AUTH command */
444   int (*clientcode)(              /* client function */
445     struct auth_instance *,
446     void *,                       /* smtp conn, with socket, output and input buffers */
447     int,                          /* command timeout */
448     uschar *,                     /* buffer for reading response */
449     int);                         /* sizeof buffer */
450   gstring * (*version_report)(    /* diagnostic version reporting */
451     gstring *);                   /* string to append to */
452   void (*macros_create)(void);    /* feature-macro creation */
453 } auth_info;
454
455
456 /* Structure for holding a single IP address and port; used for the chain of
457 addresses and ports for the local host. Make the char string large enough to
458 hold an IPv6 address. */
459
460 typedef struct ip_address_item {
461   struct ip_address_item *next;
462   int    port;
463   BOOL   v6_include_v4;            /* Used in the daemon */
464   uschar address[46];
465   uschar * log;                    /* portion of "listening on" log line */
466 } ip_address_item;
467
468 /* Structure for chaining together arbitrary strings. */
469
470 typedef struct string_item {
471   struct string_item *next;
472   uschar *text;
473 } string_item;
474
475 /* Information about a soft delivery failure, for use when calculating
476 retry information. It's separate from the address block, because there
477 can be a chain of them for SMTP deliveries where multiple IP addresses
478 can be tried. */
479
480 typedef struct retry_item {
481   struct retry_item *next;        /* for chaining */
482   uschar *key;                    /* string identifying host/address/message */
483   int     basic_errno;            /* error code for this destination */
484   int     more_errno;             /* additional error information */
485   uschar *message;                /* local error message */
486   int     flags;                  /* see below */
487 } retry_item;
488
489 /* Retry data flags */
490
491 #define rf_delete   0x0001        /* retry info is to be deleted */
492 #define rf_host     0x0002        /* retry info is for a remote host */
493 #define rf_message  0x0004        /* retry info is for a host+message */
494
495 /* Information about a constructed message that is to be sent using the
496 autoreply transport. This is pointed to from the address block. */
497
498 typedef struct reply_item {
499   uschar *from;                   /* ) */
500   uschar *reply_to;               /* ) */
501   uschar *to;                     /* ) */
502   uschar *cc;                     /* ) specific header fields */
503   uschar *bcc;                    /* ) */
504   uschar *subject;                /* ) */
505   uschar *headers;                /* misc other headers, concatenated */
506   uschar *text;                   /* text string body */
507   uschar *file;                   /* file body */
508   BOOL    file_expand;            /* expand the body */
509   int     expand_forbid;          /* expansion lockout flags */
510   uschar *logfile;                /* file to keep a log in */
511   uschar *oncelog;                /* file to keep records in for once only */
512   time_t  once_repeat;            /* time to repeat "once only" */
513   BOOL    return_message;         /* send back the original message */
514 } reply_item;
515
516
517 /* The address_item structure contains many fields which are used at various
518 times while delivering a message. Some are used only for remote deliveries;
519 some only for local. A particular set of fields is copied whenever a child
520 address is created. For convenience, we keep those fields in a separate
521 sub-structure so they can be copied in one go. This also means I won't forget
522 to edit the various copying places when new to-be-copied fields are added. */
523
524 typedef struct address_item_propagated {
525   uschar *address_data;           /* arbitrary data to keep with the address */
526   uschar *domain_data;            /* from "domains" lookup */
527   uschar *localpart_data;         /* from "local_parts" lookup */
528   uschar *errors_address;         /* where to send errors (NULL => sender) */
529   header_line *extra_headers;     /* additional headers */
530   uschar *remove_headers;         /* list of those to remove */
531   void   *variables;              /* router-vasriables */
532
533   BOOL    ignore_error:1;         /* ignore delivery error */
534 #ifdef SUPPORT_I18N
535   BOOL    utf8_msg:1;             /* requires SMTPUTF8 processing */
536   BOOL    utf8_downcvt:1;         /* mandatory downconvert on delivery */
537   BOOL    utf8_downcvt_maybe:1;   /* optional downconvert on delivery */
538 #endif
539 } address_item_propagated;
540
541
542 /* The main address structure. Note that fields that are to be copied to
543 generated addresses should be put in the address_item_propagated structure (see
544 above) rather than directly into the address_item structure. */
545
546 typedef struct address_item {
547   struct address_item *next;      /* for chaining addresses */
548   struct address_item *parent;    /* parent address */
549   struct address_item *first;     /* points to first after group delivery */
550   struct address_item *dupof;     /* points to address this is a duplicate of */
551
552   router_instance *start_router;  /* generated address starts here */
553   router_instance *router;        /* the router that routed */
554   transport_instance *transport;  /* the transport to use */
555
556   host_item *host_list;           /* host data for the transport */
557   host_item *host_used;           /* host that took delivery or failed hard */
558   host_item *fallback_hosts;      /* to try if delivery defers */
559
560   reply_item *reply;              /* data for autoreply */
561   retry_item *retries;            /* chain of retry information */
562
563   uschar *address;                /* address being delivered or routed */
564   uschar *unique;                 /* used for disambiguating */
565   uschar *cc_local_part;          /* caseful local part */
566   uschar *lc_local_part;          /* lowercased local part */
567   uschar *local_part;             /* points to cc or lc version */
568   uschar *prefix;                 /* stripped prefix of local part */
569   uschar *prefix_v;               /*  variable part of above */
570   uschar *suffix;                 /* stripped suffix of local part */
571   uschar *suffix_v;               /*  variable part of above */
572   const uschar *domain;           /* working domain (lower cased) */
573
574   uschar *address_retry_key;      /* retry key including full address */
575   uschar *domain_retry_key;       /* retry key for domain only */
576
577   uschar *current_dir;            /* current directory for transporting */
578   uschar *home_dir;               /* home directory for transporting */
579   uschar *message;                /* error message */
580   uschar *user_message;           /* error message that can be sent over SMTP
581                                      or quoted in bounce message */
582   uschar *onetime_parent;         /* saved original parent for onetime */
583   uschar **pipe_expandn;          /* numeric expansions for pipe from filter */
584   uschar *return_filename;        /* name of return file */
585   uschar *self_hostname;          /* after self=pass */
586   uschar *shadow_message;         /* info about shadow transporting */
587
588 #ifndef DISABLE_TLS
589   const uschar *tlsver;           /* version used for transport */
590   uschar *cipher;                 /* Cipher used for transport */
591   void   *ourcert;                /* Certificate offered to peer, binary */
592   void   *peercert;               /* Certificate from peer, binary */
593   uschar *peerdn;                 /* DN of server's certificate */
594   int    ocsp;                    /* OCSP status of peer cert */
595 #endif
596
597 #ifdef EXPERIMENTAL_DSN_INFO
598   const uschar *smtp_greeting;    /* peer self-identification */
599   const uschar *helo_response;    /* peer message */
600 #endif
601
602   uschar *authenticator;          /* auth driver name used by transport */
603   uschar *auth_id;                /* auth "login" name used by transport */
604   uschar *auth_sndr;              /* AUTH arg to SMTP MAIL, used by transport */
605
606   uschar *dsn_orcpt;              /* DSN orcpt value */
607   int     dsn_flags;              /* DSN flags */
608   int     dsn_aware;              /* DSN aware flag */
609
610   uid_t   uid;                    /* uid for transporting */
611   gid_t   gid;                    /* gid for transporting */
612
613                                   /* flags */
614   struct {
615     BOOL af_allow_file:1;               /* allow file in generated address */
616     BOOL af_allow_pipe:1;               /* allow pipe in generated address */
617     BOOL af_allow_reply:1;              /* allow autoreply in generated address */
618     BOOL af_dr_retry_exists:1;          /* router retry record exists */
619     BOOL af_expand_pipe:1;              /* expand pipe arguments */
620     BOOL af_file:1;                     /* file delivery; always with pfr */
621     BOOL af_gid_set:1;                  /* gid field is set */
622     BOOL af_home_expanded:1;            /* home_dir is already expanded */
623     BOOL af_initgroups:1;               /* use initgroups() for local transporting */
624     BOOL af_local_host_removed:1;       /* local host was backup */
625     BOOL af_lt_retry_exists:1;          /* local transport retry exists */
626     BOOL af_pfr:1;                      /* pipe or file or reply delivery */
627     BOOL af_retry_skipped:1;            /* true if retry caused some skipping */
628     BOOL af_retry_timedout:1;           /* true if retry timed out */
629     BOOL af_uid_set:1;                  /* uid field is set */
630     BOOL af_hide_child:1;               /* hide child in bounce/defer msgs */
631     BOOL af_sverify_told:1;             /* sender verify failure notified */
632     BOOL af_verify_pmfail:1;            /* verify failure was postmaster callout */
633     BOOL af_verify_nsfail:1;            /* verify failure was null sender callout */
634     BOOL af_homonym:1;                  /* an ancestor has same address */
635     BOOL af_verify_routed:1;            /* for cached sender verify: routed OK */
636     BOOL af_verify_callout:1;           /* for cached sender verify: callout was specified */
637     BOOL af_include_affixes:1;          /* delivered with affixes in RCPT */
638     BOOL af_new_conn:1;                 /* delivered on an fresh TCP conn */
639     BOOL af_cont_conn:1;                /* delivered (with new MAIL cmd) on an existing TCP conn */
640     BOOL af_cert_verified:1;            /* delivered with verified TLS cert */
641     BOOL af_pass_message:1;             /* pass message in bounces */
642     BOOL af_bad_reply:1;                /* filter could not generate autoreply */
643     BOOL af_tcp_fastopen_conn:1;        /* delivery connection used TCP Fast Open */
644     BOOL af_tcp_fastopen:1;             /* delivery usefully used TCP Fast Open */
645     BOOL af_tcp_fastopen_data:1;        /* delivery sent SMTP commands on TCP Fast Open */
646     BOOL af_pipelining:1;               /* delivery used (traditional) pipelining */
647 #ifndef DISABLE_PIPE_CONNECT
648     BOOL af_early_pipe:1;               /* delivery used connect-time pipelining */
649 #endif
650 #ifndef DISABLE_PRDR
651     BOOL af_prdr_used:1;                /* delivery used SMTP PRDR */
652 #endif
653     BOOL af_chunking_used:1;            /* delivery used SMTP CHUNKING */
654     BOOL af_force_command:1;            /* force_command in pipe transport */
655 #ifdef SUPPORT_DANE
656     BOOL af_dane_verified:1;            /* TLS cert verify done with DANE */
657 #endif
658 #ifdef SUPPORT_I18N
659     BOOL af_utf8_downcvt:1;             /* downconvert was done for delivery */
660 #endif
661 #ifndef DISABLE_TLS_RESUME
662     BOOL af_tls_resume:1;               /* TLS used a resumed session */
663 #endif
664   } flags;
665
666   unsigned int domain_cache[(MAX_NAMED_LIST * 2)/32];
667   unsigned int localpart_cache[(MAX_NAMED_LIST * 2)/32];
668   int     mode;                   /* mode for local transporting to a file */
669   int     basic_errno;            /* status after failure */
670   int     more_errno;             /* additional error information */
671   struct timeval delivery_time;   /* time taken to do delivery/attempt */
672
673   unsigned short child_count;     /* number of child addresses */
674   short int return_file;          /* fileno of return data file */
675   short int special_action;       /* ( used when when deferred or failed */
676                                   /* (  also  */
677                                   /* ( contains = or - when successful SMTP delivered */
678                                   /* (  also  */
679                                   /* ( contains verify rc in sender verify cache */
680   short int transport_return;     /* result of delivery attempt */
681   address_item_propagated prop;   /* fields that are propagated to children */
682 } address_item;
683
684 /* The table of header names consists of items of this type */
685
686 typedef struct {
687   uschar *name;
688   int     len;
689   BOOL    allow_resent;
690   int     htype;
691 } header_name;
692
693 /* Chain of information about errors (e.g. bad addresses) */
694
695 typedef struct error_block {
696   struct error_block *next;
697   const uschar *text1;
698   uschar *text2;
699 } error_block;
700
701 /* Chain of file names when processing the queue */
702
703 typedef struct queue_filename {
704   struct queue_filename *next;
705   uschar dir_uschar;
706   uschar text[1];
707 } queue_filename;
708
709 /* Chain of items of retry information, read from the retry config. */
710
711 typedef struct retry_rule {
712   struct retry_rule *next;
713   int    rule;
714   int    timeout;
715   int    p1;
716   int    p2;
717 } retry_rule;
718
719 typedef struct retry_config {
720   struct retry_config *next;
721   uschar *pattern;
722   int     basic_errno;
723   int     more_errno;
724   uschar *senders;
725   retry_rule *rules;
726 } retry_config;
727
728 /* Structure for each node in a tree, of which there are various kinds */
729
730 typedef struct tree_node {
731   struct tree_node *left;         /* pointer to left child */
732   struct tree_node *right;        /* pointer to right child */
733   union
734     {
735     void  *ptr;                   /* pointer to data */
736     int val;                      /* or integer data */
737     } data;
738   uschar  balance;                /* balancing factor */
739   uschar  name[1];                /* node name - variable length */
740 } tree_node;
741
742 /* Structure for holding time-limited data such as DNS returns.
743 We use this rather than extending tree_node to avoid wasting
744 space for most tree use (variables...) at the cost of complexity
745 for the lookups cache.
746 We also store any options used for the lookup. */
747
748 typedef struct expiring_data {
749   time_t        expiry;         /* if nonzero, data invalid after this time */
750   const uschar * opts;          /* options, or NULL */
751   union
752     {
753     void  *     ptr;            /* pointer to data */
754     int         val;            /* or integer data */
755     } data;
756 } expiring_data;
757
758 /* Structure for holding the handle and the cached last lookup for searches.
759 This block is pointed to by the tree entry for the file. The file can get
760 closed if too many are opened at once. There is a LRU chain for deciding which
761 to close. */
762
763 typedef struct search_cache {
764   void   *handle;                 /* lookup handle, or NULL if closed */
765   int search_type;                /* search type */
766   tree_node *up;                  /* LRU up pointer */
767   tree_node *down;                /* LRU down pointer */
768   tree_node *item_cache;          /* tree of cached results */
769 } search_cache;
770
771 /* Structure for holding a partially decoded DNS record; the name has been
772 uncompressed, but the data pointer is into the raw data. */
773
774 typedef struct {
775   uschar        name[DNS_MAXNAME];      /* domain name */
776   int           type;                   /* record type */
777   unsigned short ttl;                   /* time-to-live, seconds */
778   int           size;                   /* size of data */
779   const uschar *data;                   /* pointer to data */
780 } dns_record;
781
782 /* Structure for holding the result of a DNS query.  A touch over
783 64k big, so take care to release as soon as possible. */
784
785 typedef struct {
786   int     answerlen;              /* length of the answer */
787   uschar  answer[NS_MAXMSG];      /* the answer itself */
788 } dns_answer;
789
790 /* Structure for holding the intermediate data while scanning a DNS answer
791 block. */
792
793 typedef struct {
794   int            rrcount;         /* count of RRs in the answer */
795   const uschar *aptr;             /* pointer in the answer while scanning */
796   dns_record     srr;             /* data from current record in scan */
797 } dns_scan;
798
799 /* Structure for holding a chain of IP addresses that are extracted from
800 an A, AAAA, or A6 record. For the first two, there is only ever one address,
801 but the chaining feature of A6 allows for several addresses to be realized from
802 a single initial A6 record. The structure defines the address field of length
803 1. In use, a suitable sized block is obtained to hold the complete textual
804 address. */
805
806 typedef struct dns_address {
807   struct dns_address *next;
808   uschar  address[1];
809 } dns_address;
810
811 /* Structure used for holding intermediate data during MD5 computations. */
812
813 typedef struct md5 {
814   unsigned int length;
815   unsigned int abcd[4];
816   }
817 md5;
818
819 /* Structure used for holding intermediate data during SHA-1 computations. */
820
821 typedef struct sha1 {
822   unsigned int H[5];
823   unsigned int length;
824 } sha1;
825
826 /* Information for making an smtp connection */
827 typedef struct {
828   transport_instance *  tblock;
829   void *                ob;     /* smtp_transport_options_block * */
830   host_item *           host;
831   int                   host_af;
832   uschar *              interface;
833
834   int                   sock;   /* used for a bound but not connected socket */
835   uschar *              sending_ip_address;     /* used for TLS resumption */
836   const uschar *        host_lbserver;          /* ditto, for server-behind LB */
837
838 #ifdef SUPPORT_DANE
839   BOOL dane:1;                  /* connection must do dane */
840   dns_answer            tlsa_dnsa;      /* strictly, this should use tainted mem */
841 #endif
842 } smtp_connect_args;
843
844 /* A client-initiated connection. If TLS, the second element is non-NULL */
845 typedef struct {
846   int   sock;
847   void * tls_ctx;
848 } client_conn_ctx;
849
850
851 /* Structure used to hold incoming packets of SMTP responses for a specific
852 socket. The packets which may contain multiple lines (and in some cases,
853 multiple responses). */
854
855 typedef struct smtp_inblock {
856   client_conn_ctx * cctx;         /* the connection */
857   int     buffersize;             /* the size of the buffer */
858   uschar *ptr;                    /* current position in the buffer */
859   uschar *ptrend;                 /* end of data in the buffer */
860   uschar *buffer;                 /* the buffer itself */
861 } smtp_inblock;
862
863 /* Structure used to hold buffered outgoing packets of SMTP commands for a
864 specific socket. The packets which may contain multiple lines when pipelining
865 is in use. */
866
867 typedef struct smtp_outblock {
868   client_conn_ctx * cctx;         /* the connection */
869   int     cmd_count;              /* count of buffered commands */
870   int     buffersize;             /* the size of the buffer */
871   BOOL    authenticating;         /* TRUE when authenticating */
872   uschar *ptr;                    /* current position in the buffer */
873   uschar *buffer;                 /* the buffer itself */
874
875   smtp_connect_args * conn_args;  /* to make connection, if not yet made */
876 } smtp_outblock;
877
878 /* Structure to hold information about the source of redirection information */
879
880 typedef struct redirect_block {
881   uschar *string;                 /* file name or string */
882   uid_t  *owners;                 /* allowed file owners */
883   gid_t  *owngroups;              /* allowed file groups */
884   struct passwd *pw;              /* possible owner if not NULL */
885   int     modemask;               /* forbidden bits */
886   BOOL    isfile;                 /* TRUE if string is a file name */
887   BOOL    check_owner;            /* TRUE, FALSE, or TRUE_UNSET */
888   BOOL    check_group;            /* TRUE, FALSE, or TRUE_UNSET */
889 } redirect_block;
890
891 /* Structure for passing arguments to check_host() */
892
893 typedef struct check_host_block {
894   const uschar *host_name;
895   const uschar *host_address;
896   const uschar *host_ipv4;
897   BOOL   negative;
898 } check_host_block;
899
900 /* Structure for remembering lookup data when caching the result of
901 a lookup in a named list. */
902
903 typedef struct namedlist_cacheblock {
904   struct namedlist_cacheblock *next;
905   uschar *key;
906   uschar *data;
907 } namedlist_cacheblock;
908
909 /* Structure for holding data for an entry in a named list */
910
911 typedef struct namedlist_block {
912   const uschar *string;                 /* the list string */
913   namedlist_cacheblock *cache_data;     /* cached domain_data or localpart_data */
914   short         number;                 /* the number of the list for caching */
915   BOOL          hide;                   /* -bP does not display value */
916 } namedlist_block;
917
918 /* Structures for Access Control Lists */
919
920 typedef struct acl_condition_block {
921   struct acl_condition_block *  next;
922   uschar *                      arg;
923   int                           type;
924   union {
925     BOOL        negated;
926     uschar *    varname;
927   } u;
928 } acl_condition_block;
929
930 typedef struct acl_block {
931   struct acl_block *    next;
932   acl_condition_block * condition;
933   int                   verb;
934   int                   srcline;
935   const uschar *        srcfile;
936 } acl_block;
937
938 /* smtp transport calc outbound_ip */
939 typedef BOOL (*oicf) (uschar *message_id, void *data);
940
941 /* DKIM information for transport */
942 struct ob_dkim {
943   uschar *dkim_domain;
944   uschar *dkim_identity;
945   uschar *dkim_private_key;
946   uschar *dkim_selector;
947   uschar *dkim_canon;
948   uschar *dkim_sign_headers;
949   uschar *dkim_strict;
950   uschar *dkim_hash;
951   uschar *dkim_timestamps;
952   BOOL    dot_stuffed;
953   BOOL    force_bodyhash;
954 #ifdef EXPERIMENTAL_ARC
955   uschar *arc_signspec;
956 #endif
957 };
958
959 /* End of structs.h */