X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/254f38d1c5ada5e4df0bccb385dc466549620c71..158dff9936e36a2d31d037d3988b9353458d6471:/src/src/structs.h diff --git a/src/src/structs.h b/src/src/structs.h index 7fb32777c..06cd06084 100644 --- a/src/src/structs.h +++ b/src/src/structs.h @@ -2,6 +2,7 @@ * Exim - an Internet mail transport agent * *************************************************/ +/* Copyright (c) The Exim Maintainers 2020 - 2022 */ /* Copyright (c) University of Cambridge 1995 - 2018 */ /* See the file NOTICE for conditions of use and distribution. */ @@ -79,14 +80,17 @@ typedef enum {DS_UNK=-1, DS_NO, DS_YES} dnssec_status_t; typedef struct host_item { struct host_item *next; - const uschar *name; /* Host name */ - const uschar *address; /* IP address in text form */ - int port; /* port value in host order (if SRV lookup) */ - int mx; /* MX value if found via MX records */ - int sort_key; /* MX*1000 plus random "fraction" */ - int status; /* Usable, unusable, or unknown */ - int why; /* Why host is unusable */ - int last_try; /* Time of last try if known */ + const uschar *name; /* Host name */ +#ifndef DISABLE_TLS + const uschar *certname; /* Name used for certificate checks */ +#endif + const uschar *address; /* IP address in text form */ + int port; /* port value in host order (if SRV lookup) */ + int mx; /* MX value if found via MX records */ + int sort_key; /* MX*1000 plus random "fraction" */ + int status; /* Usable, unusable, or unknown */ + int why; /* Why host is unusable */ + int last_try; /* Time of last try if known */ dnssec_status_t dnssec; } host_item; @@ -129,11 +133,15 @@ typedef struct driver_instance { uschar *name; /* Instance name */ struct driver_info *info; /* Points to info for this driver */ void *options_block; /* Pointer to private options */ + uschar *driver_name; /* All start with this generic option */ + const uschar *srcfile; /* and config source info for errors */ + int srcline; } driver_instance; typedef struct driver_info { uschar *driver_name; /* Name of driver */ + optionlist *options; /* Table of private options names */ int *options_count; /* -> Number of entries in table */ void *options_block; /* Points to default private block */ @@ -155,6 +163,9 @@ typedef struct transport_instance { struct transport_info *info; /* Info for this driver */ void *options_block; /* Pointer to private options */ uschar *driver_name; /* Must be first */ + const uschar *srcfile; + int srcline; + int (*setup)( /* Setup entry point */ struct transport_instance *, struct address_item *, @@ -279,6 +290,8 @@ typedef struct router_instance { struct router_info *info; void *options_block; /* Pointer to private options */ uschar *driver_name; /* Must be first */ + const uschar *srcfile; + int srcline; uschar *address_data; /* Arbitrary data */ #ifdef EXPERIMENTAL_BRIGHTMAIL @@ -333,6 +346,7 @@ typedef struct router_instance { BOOL retry_use_local_part; /* Just what it says */ BOOL same_domain_copy_routing; /* TRUE => copy routing for same domain */ BOOL self_rewrite; /* TRUE to rewrite headers if making local */ + uschar *set; /* Variable = value to set; list */ BOOL suffix_optional; /* As it says */ BOOL verify_only; /* Skip this router if not verifying */ BOOL verify_recipient; /* Use this router when verifying a recipient*/ @@ -395,6 +409,9 @@ typedef struct auth_instance { struct auth_info *info; /* Pointer to driver info block */ void *options_block; /* Pointer to private options */ uschar *driver_name; /* Must be first */ + const uschar *srcfile; + int srcline; + uschar *advertise_condition; /* Are we going to advertise this?*/ uschar *client_condition; /* Should the client try this? */ uschar *public_name; /* Advertised name */ @@ -430,8 +447,9 @@ typedef struct auth_info { int, /* command timeout */ uschar *, /* buffer for reading response */ int); /* sizeof buffer */ - void (*version_report)( /* diagnostic version reporting */ - FILE *); /* I/O stream to print to */ + gstring * (*version_report)( /* diagnostic version reporting */ + gstring *); /* string to append to */ + void (*macros_create)(void); /* feature-macro creation */ } auth_info; @@ -510,16 +528,14 @@ typedef struct address_item_propagated { uschar *errors_address; /* where to send errors (NULL => sender) */ header_line *extra_headers; /* additional headers */ uschar *remove_headers; /* list of those to remove */ + void *variables; /* router-vasriables */ - #ifdef EXPERIMENTAL_SRS - uschar *srs_sender; /* Change return path when delivering */ - #endif BOOL ignore_error:1; /* ignore delivery error */ - #ifdef SUPPORT_I18N +#ifdef SUPPORT_I18N BOOL utf8_msg:1; /* requires SMTPUTF8 processing */ BOOL utf8_downcvt:1; /* mandatory downconvert on delivery */ BOOL utf8_downcvt_maybe:1; /* optional downconvert on delivery */ - #endif +#endif } address_item_propagated; @@ -550,7 +566,9 @@ typedef struct address_item { uschar *lc_local_part; /* lowercased local part */ uschar *local_part; /* points to cc or lc version */ uschar *prefix; /* stripped prefix of local part */ + uschar *prefix_v; /* variable part of above */ uschar *suffix; /* stripped suffix of local part */ + uschar *suffix_v; /* variable part of above */ const uschar *domain; /* working domain (lower cased) */ uschar *address_retry_key; /* retry key including full address */ @@ -567,7 +585,8 @@ typedef struct address_item { uschar *self_hostname; /* after self=pass */ uschar *shadow_message; /* info about shadow transporting */ -#ifdef SUPPORT_TLS +#ifndef DISABLE_TLS + const uschar *tlsver; /* version used for transport */ uschar *cipher; /* Cipher used for transport */ void *ourcert; /* Certificate offered to peer, binary */ void *peercert; /* Certificate from peer, binary */ @@ -616,6 +635,8 @@ typedef struct address_item { BOOL af_verify_routed:1; /* for cached sender verify: routed OK */ BOOL af_verify_callout:1; /* for cached sender verify: callout was specified */ BOOL af_include_affixes:1; /* delivered with affixes in RCPT */ + BOOL af_new_conn:1; /* delivered on an fresh TCP conn */ + BOOL af_cont_conn:1; /* delivered (with new MAIL cmd) on an existing TCP conn */ 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 */ @@ -623,7 +644,7 @@ typedef struct address_item { BOOL af_tcp_fastopen:1; /* delivery usefully used TCP Fast Open */ BOOL af_tcp_fastopen_data:1; /* delivery sent SMTP commands on TCP Fast Open */ BOOL af_pipelining:1; /* delivery used (traditional) pipelining */ -#ifdef EXPERIMENTAL_PIPE_CONNECT +#ifndef DISABLE_PIPE_CONNECT BOOL af_early_pipe:1; /* delivery used connect-time pipelining */ #endif #ifndef DISABLE_PRDR @@ -636,17 +657,19 @@ typedef struct address_item { #endif #ifdef SUPPORT_I18N BOOL af_utf8_downcvt:1; /* downconvert was done for delivery */ +#endif +#ifndef DISABLE_TLS_RESUME + BOOL af_tls_resume:1; /* TLS used a resumed session */ #endif } flags; unsigned int domain_cache[(MAX_NAMED_LIST * 2)/32]; unsigned int localpart_cache[(MAX_NAMED_LIST * 2)/32]; int mode; /* mode for local transporting to a file */ + int basic_errno; /* status after failure */ int more_errno; /* additional error information */ - /* (may need to hold a timestamp) */ - unsigned int delivery_usec; /* subsecond part of delivery time */ + struct timeval delivery_time; /* time taken to do delivery/attempt */ - short int basic_errno; /* status after failure */ unsigned short child_count; /* number of child addresses */ short int return_file; /* fileno of return data file */ short int special_action; /* ( used when when deferred or failed */ @@ -719,11 +742,17 @@ typedef struct tree_node { /* 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 -for the lookups cache */ +for the lookups cache. +We also store any options used for the lookup. */ typedef struct expiring_data { - time_t expiry; /* if nonzero, data invalid after this time */ - void *ptr; /* pointer to data */ + time_t expiry; /* if nonzero, data invalid after this time */ + const uschar * opts; /* options, or NULL */ + union + { + void * ptr; /* pointer to data */ + int val; /* or integer data */ + } data; } expiring_data; /* Structure for holding the handle and the cached last lookup for searches. @@ -802,9 +831,14 @@ typedef struct { int host_af; uschar * interface; -#if defined(SUPPORT_TLS) && defined(SUPPORT_DANE) + int sock; /* used for a bound but not connected socket */ + uschar * sending_ip_address; /* used for TLS resumption */ + const uschar * host_lbserver; /* ditto, for server-behind LB */ + BOOL have_lbserver:1; /* host_lbserver is valid */ + +#ifdef SUPPORT_DANE BOOL dane:1; /* connection must do dane */ - dns_answer tlsa_dnsa; + dns_answer tlsa_dnsa; /* strictly, this should use tainted mem */ #endif } smtp_connect_args; @@ -861,7 +895,7 @@ typedef struct check_host_block { const uschar *host_name; const uschar *host_address; const uschar *host_ipv4; - BOOL negative; + mcs_flags flags; } check_host_block; /* Structure for remembering lookup data when caching the result of @@ -876,9 +910,10 @@ typedef struct namedlist_cacheblock { /* Structure for holding data for an entry in a named list */ typedef struct namedlist_block { - const uschar *string; /* the list string */ - namedlist_cacheblock *cache_data; /* cached domain_data or localpart_data */ - int number; /* the number of the list for caching */ + const uschar *string; /* the list string */ + namedlist_cacheblock *cache_data; /* cached domain_data or localpart_data */ + short number; /* the number of the list for caching */ + BOOL hide; /* -bP does not display value */ } namedlist_block; /* Structures for Access Control Lists */