{ "hosts_try_dane", opt_stringptr,
(void *)offsetof(smtp_transport_options_block, hosts_try_dane) },
#endif
+ { "hosts_try_fastopen", opt_stringptr,
+ (void *)offsetof(smtp_transport_options_block, hosts_try_fastopen) },
#ifndef DISABLE_PRDR
{ "hosts_try_prdr", opt_stringptr,
(void *)offsetof(smtp_transport_options_block, hosts_try_prdr) },
NULL, /* hosts_try_dane */
NULL, /* hosts_require_dane */
#endif
+ NULL, /* hosts_try_fastopen */
#ifndef DISABLE_PRDR
US"*", /* hosts_try_prdr */
#endif
/* Local statics */
-static uschar *smtp_command; /* Points to last cmd for error messages */
-static uschar *mail_command; /* Points to MAIL cmd for error messages */
-static BOOL update_waiting; /* TRUE to update the "wait" database */
-static BOOL pipelining_active; /* current transaction is in pipe mode */
-static int off = 0; /* for use by setsockopt */
+static uschar *smtp_command; /* Points to last cmd for error messages */
+static uschar *mail_command; /* Points to MAIL cmd for error messages */
+static uschar *data_command = US""; /* Points to DATA cmd for error messages */
+static BOOL update_waiting; /* TRUE to update the "wait" database */
+static BOOL pipelining_active; /* current transaction is in pipe mode */
/*************************************************
/* Write SMTP chunk header command */
if (chunk_size > 0)
+ {
if((cmd_count = smtp_write_command(tctx->outblock, FALSE, "BDAT %u%s\r\n",
chunk_size,
flags & tc_chunk_last ? " LAST" : "")
) < 0) return ERROR;
+ if (flags & tc_chunk_last)
+ data_command = string_copy(big_buffer); /* Save for later error message */
+ }
prev_cmd_count = cmd_count += tctx->cmd_count;
default: goto RESPONSE_FAILED; /* I/O error, or any MAIL/DATA error */
}
pipelining_active = FALSE;
+ data_command = string_copy(big_buffer); /* Save for later error message */
}
/* If there were no good recipients (but otherwise there have been no
#else
"LMTP error after %s: %s",
#endif
- big_buffer, string_printing(buffer));
+ data_command, string_printing(buffer));
setflag(addr, af_pass_message); /* Allow message to go to user */
if (buffer[0] == '5')
addr->transport_return = FAIL;
if (lflags.send_quit)
{
shutdown(outblock.sock, SHUT_WR);
- for (rc = 16; read(inblock.sock, inbuffer, sizeof(inbuffer)) > 0 && rc > 0;)
- rc--; /* drain socket */
+ if (fcntl(inblock.sock, F_SETFL, O_NONBLOCK) == 0)
+ for (rc = 16; read(inblock.sock, inbuffer, sizeof(inbuffer)) > 0 && rc > 0;)
+ rc--; /* drain socket */
}
(void)close(inblock.sock);