MacOS: TCP Fast Open
[exim.git] / src / src / smtp_out.c
index c968f70e219312fff38eb95cc6adfe97ae7e0514..c5eafbc57499f003bdd66742925c73bea293db62 100644 (file)
@@ -45,7 +45,7 @@ if (!istring) return TRUE;
 
 if (!(expint = expand_string(istring)))
   {
-  if (expand_string_forcedfail) return TRUE;
+  if (f.expand_string_forcedfail) return TRUE;
   addr->transport_return = PANIC;
   addr->message = string_sprintf("failed to expand \"interface\" "
       "option for %s: %s", msg, expand_string_message);
@@ -149,7 +149,6 @@ struct tcp_info tinfo;
 socklen_t len = sizeof(tinfo);
 
 if (getsockopt(sock, IPPROTO_TCP, TCP_INFO, &tinfo, &len) == 0)
-  {
   switch (tcp_out_fastopen)
     {
       /* This is a somewhat dubious detection method; totally undocumented so likely
@@ -163,39 +162,40 @@ if (getsockopt(sock, IPPROTO_TCP, TCP_INFO, &tinfo, &len) == 0)
        '# echo -n "00000000-00000000-00000000-0000000" >/proc/sys/net/ipv4/tcp_fastopen_key'
       The kernel seems to be counting unack'd packets. */
 
-    case 1:
+    case TFO_ATTEMPTED:
       if (tinfo.tcpi_unacked > 1)
        {
        DEBUG(D_transport|D_v)
          debug_printf("TCP_FASTOPEN tcpi_unacked %d\n", tinfo.tcpi_unacked);
-       tcp_out_fastopen = 2;
+       tcp_out_fastopen = TFO_USED;
        }
       break;
 
-#ifdef notdef          /* This seems to always fire, meaning that we cannot tell
+#  ifdef notdef                /* This seems to always fire, meaning that we cannot tell
                        whether the server accepted data we sent.  For now assume
                        that it did. */
 
       /* If there was data-on-SYN but we had to retrasnmit it, declare no TFO */
 
-    case 2:
+    case TFO_USED:
       if (!(tinfo.tcpi_options & TCPI_OPT_SYN_DATA))
        {
        DEBUG(D_transport|D_v) debug_printf("TFO: had to retransmit\n");
-       tcp_out_fastopen = 0;
+       tcp_out_fastopen = TFO_NOT_USED;
        }
       break;
-#endif
-    }
 
-  }
+  default: break;      /* compiler quietening */
+#  endif
+    }
 # endif
 }
 #endif
 
 
 /* Arguments as for smtp_connect(), plus
-  early_data   if non-NULL, data to be sent - preferably in the TCP SYN segment
+  early_data   if non-NULL, idenmpotent data to be sent -
+               preferably in the TCP SYN segment
 
 Returns:      connected socket number, or -1 with errno set
 */
@@ -264,7 +264,7 @@ requested some early-data then include that in the TFO request. */
 else
   {
 #ifdef TCP_FASTOPEN
-  if (verify_check_given_host(&ob->hosts_try_fastopen, host) == OK)
+  if (verify_check_given_host(CUSS &ob->hosts_try_fastopen, host) == OK)
     fastopen_blob = early_data ? early_data : &tcp_fastopen_nodata;
 #endif
 
@@ -411,11 +411,11 @@ HDEBUG(D_transport|D_acl) debug_printf_indent("cmd buf flush %d bytes%s\n", n,
   more ? " (more expected)" : "");
 
 #ifdef SUPPORT_TLS
-if (tls_out.active == outblock->sock)
-  rc = tls_write(FALSE, outblock->buffer, n, more);
+if (outblock->cctx->tls_ctx)
+  rc = tls_write(outblock->cctx->tls_ctx, outblock->buffer, n, more);
 else
 #endif
-  rc = send(outblock->sock, outblock->buffer, n,
+  rc = send(outblock->cctx->sock, outblock->buffer, n,
 #ifdef MSG_MORE
            more ? MSG_MORE : 0
 #else
@@ -444,7 +444,7 @@ return TRUE;
 any error message.
 
 Arguments:
-  outblock   contains buffer for pipelining, and socket
+  sx        SMTP connection, contains buffer for pipelining, and socket
   mode       buffer, write-with-more-likely, write
   format     a format, starting with one of
              of HELO, MAIL FROM, RCPT TO, DATA, ".", or QUIT.
@@ -457,8 +457,9 @@ Returns:     0 if command added to pipelining buffer, with nothing transmitted
 */
 
 int
-smtp_write_command(smtp_outblock * outblock, int mode, const char *format, ...)
+smtp_write_command(void * sx, int mode, const char *format, ...)
 {
+smtp_outblock * outblock = &((smtp_context *)sx)->outblock;
 int count;
 int rc = 0;
 va_list ap;
@@ -546,7 +547,7 @@ read_response_line(smtp_inblock *inblock, uschar *buffer, int size, int timeout)
 uschar *p = buffer;
 uschar *ptr = inblock->ptr;
 uschar *ptrend = inblock->ptrend;
-int sock = inblock->sock;
+client_conn_ctx * cctx = inblock->cctx;
 
 /* Loop for reading multiple packets or reading another packet after emptying
 a previously-read one. */
@@ -584,7 +585,7 @@ for (;;)
 
   /* Need to read a new input packet. */
 
-  if((rc = ip_recv(sock, inblock->buffer, inblock->buffersize, timeout)) <= 0)
+  if((rc = ip_recv(cctx, inblock->buffer, inblock->buffersize, timeout)) <= 0)
     {
     DEBUG(D_deliver|D_transport|D_acl)
       debug_printf_indent(errno ? "  SMTP(%s)<<\n" : "  SMTP(closed)<<\n",
@@ -623,7 +624,8 @@ also returned after a reading error. In this case buffer[0] will be zero, and
 the error code will be in errno.
 
 Arguments:
-  inblock   the SMTP input block (contains holding buffer, socket, etc.)
+  sx        the SMTP connection (contains input block with holding buffer,
+               socket, etc.)
   buffer    where to put the response
   size      the size of the buffer
   okdigit   the expected first digit of the response
@@ -633,9 +635,10 @@ Returns:    TRUE if a valid, non-error response was received; else FALSE
 */
 
 BOOL
-smtp_read_response(smtp_inblock *inblock, uschar *buffer, int size, int okdigit,
+smtp_read_response(void * sx, uschar *buffer, int size, int okdigit,
    int timeout)
 {
+smtp_inblock * inblock = &((smtp_context *)sx)->inblock;
 uschar *ptr = buffer;
 int count;