Logging: fix duplicated transport target info under TFO
[users/jgh/exim.git] / src / src / transports / smtp.h
index c77c2c5d951445af3cefe34e3e881267ffa24252..5200fcb74db4e1f7c189ad4bc97d99fefeca91f0 100644 (file)
@@ -2,9 +2,16 @@
 *     Exim - an Internet mail transport agent    *
 *************************************************/
 
-/* Copyright (c) University of Cambridge 1995 - 2015 */
+/* Copyright (c) University of Cambridge 1995 - 2018 */
 /* See the file NOTICE for conditions of use and distribution. */
 
+#define DELIVER_BUFFER_SIZE 4096
+
+#define PENDING          256
+#define PENDING_DEFER   (PENDING + DEFER)
+#define PENDING_OK      (PENDING + OK)
+
+
 /* Private structure for the private options and other private data. */
 
 typedef struct {
@@ -21,10 +28,13 @@ typedef struct {
   uschar *serialize_hosts;
   uschar *hosts_try_auth;
   uschar *hosts_require_auth;
-#ifdef EXPERIMENTAL_DANE
+  uschar *hosts_try_chunking;
+#ifdef SUPPORT_DANE
   uschar *hosts_try_dane;
   uschar *hosts_require_dane;
+  uschar *dane_require_tls_ciphers;
 #endif
+  uschar *hosts_try_fastopen;
 #ifndef DISABLE_PRDR
   uschar *hosts_try_prdr;
 #endif
@@ -36,8 +46,14 @@ typedef struct {
   uschar *hosts_avoid_tls;
   uschar *hosts_verify_avoid_tls;
   uschar *hosts_avoid_pipelining;
+#ifdef EXPERIMENTAL_PIPE_CONNECT
+  uschar *hosts_pipe_connect;
+#endif
   uschar *hosts_avoid_esmtp;
+#ifndef DISABLE_TLS
   uschar *hosts_nopass_tls;
+  uschar *hosts_noproxy_tls;
+#endif
   int     command_timeout;
   int     connect_timeout;
   int     data_timeout;
@@ -59,17 +75,17 @@ typedef struct {
   BOOL    lmtp_ignore_quota;
   uschar *expand_retry_include_ip_address;
   BOOL    retry_include_ip_address;
-#ifndef DISABLE_SOCKS
+#ifdef SUPPORT_SOCKS
   uschar *socks_proxy;
 #endif
-#ifdef SUPPORT_TLS
+#ifndef DISABLE_TLS
   uschar *tls_certificate;
   uschar *tls_crl;
   uschar *tls_privatekey;
   uschar *tls_require_ciphers;
-  uschar *gnutls_require_kx;
-  uschar *gnutls_require_mac;
-  uschar *gnutls_require_proto;
+# ifdef EXPERIMENTAL_TLS_RESUME
+  uschar *tls_resumption_hosts;
+# endif
   uschar *tls_sni;
   uschar *tls_verify_certificates;
   int     tls_dh_min_bits;
@@ -78,16 +94,93 @@ typedef struct {
   uschar *tls_try_verify_hosts;
   uschar *tls_verify_cert_hostnames;
 #endif
+#ifdef SUPPORT_I18N
+  uschar *utf8_downconvert;
+#endif
 #ifndef DISABLE_DKIM
-  uschar *dkim_domain;
-  uschar *dkim_private_key;
-  uschar *dkim_selector;
-  uschar *dkim_canon;
-  uschar *dkim_sign_headers;
-  uschar *dkim_strict;
+  struct ob_dkim dkim;
+#endif
+#ifdef EXPERIMENTAL_ARC
+  uschar *arc_sign;
 #endif
 } smtp_transport_options_block;
 
+#define SOB (smtp_transport_options_block *)
+
+
+/* smtp connect context */
+typedef struct {
+  uschar *             from_addr;
+  address_item *       addrlist;
+
+  smtp_connect_args    conn_args;
+  int                  port;
+
+  BOOL verify:1;
+  BOOL lmtp:1;
+  BOOL smtps:1;
+  BOOL ok:1;
+  BOOL setting_up:1;
+#ifdef EXPERIMENTAL_PIPE_CONNECT
+  BOOL early_pipe_ok:1;
+  BOOL early_pipe_active:1;
+#endif
+  BOOL esmtp:1;
+  BOOL esmtp_sent:1;
+  BOOL pipelining_used:1;
+#ifndef DISABLE_PRDR
+  BOOL prdr_active:1;
+#endif
+#ifdef SUPPORT_I18N
+  BOOL utf8_needed:1;
+#endif
+  BOOL dsn_all_lasthop:1;
+#if !defined(DISABLE_TLS) && defined(SUPPORT_DANE)
+  BOOL dane_required:1;
+#endif
+#ifdef EXPERIMENTAL_PIPE_CONNECT
+  BOOL pending_BANNER:1;
+  BOOL pending_EHLO:1;
+#endif
+  BOOL pending_MAIL:1;
+  BOOL pending_BDAT:1;
+  BOOL good_RCPT:1;
+  BOOL completed_addr:1;
+  BOOL send_rset:1;
+  BOOL send_quit:1;
+
+  int          max_rcpt;
+  int          cmd_count;
+
+  unsigned     peer_offered;
+  unsigned     avoid_option;
+  uschar *     igquotstr;
+  uschar *     helo_data;
+#ifdef EXPERIMENTAL_DSN_INFO
+  uschar *     smtp_greeting;
+  uschar *     helo_response;
+#endif
+#ifdef EXPERIMENTAL_PIPE_CONNECT
+  ehlo_resp_precis     ehlo_resp;
+#endif
+
+  address_item *       first_addr;
+  address_item *       next_addr;
+  address_item *       sync_addr;
+
+  client_conn_ctx      cctx;
+  smtp_inblock         inblock;
+  smtp_outblock                outblock;
+  uschar       buffer[DELIVER_BUFFER_SIZE];
+  uschar       inbuffer[4096];
+  uschar       outbuffer[4096];
+} smtp_context;
+
+extern int smtp_setup_conn(smtp_context *, BOOL);
+extern int smtp_write_mail_and_rcpt_cmds(smtp_context *, int *);
+extern int smtp_reap_early_pipe(smtp_context *, int *);
+
+
 /* Data for reading the private options. */
 
 extern optionlist smtp_transport_options[];
@@ -105,13 +198,10 @@ extern void smtp_transport_closedown(transport_instance *);
 
 
 
-extern int     smtp_auth(uschar *, unsigned, address_item *, host_item *,
-                smtp_transport_options_block *, BOOL,
-                smtp_inblock *, smtp_outblock *);
 extern BOOL    smtp_mail_auth_str(uschar *, unsigned,
                 address_item *, smtp_transport_options_block *);
 
-#ifndef DISABLE_SOCKS
+#ifdef SUPPORT_SOCKS
 extern int     socks_sock_connect(host_item *, int, int, uschar *,
                 transport_instance *, int);
 #endif