X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/328c5688dbe0f4c14418f22350ccd99b3fe8ac71..a5ffa9b475a426bc73366db01f7cc92a3811bc3a:/src/src/transport.c diff --git a/src/src/transport.c b/src/src/transport.c index 7806e3957..20d0b8a52 100644 --- a/src/src/transport.c +++ b/src/src/transport.c @@ -11,10 +11,6 @@ transports. */ #include "exim.h" -#ifdef HAVE_LINUX_SENDFILE -# include -#endif - /* Structure for keeping list of addresses that have been added to Envelope-To:, in order to avoid duplication. */ @@ -207,6 +203,7 @@ Arguments: tctx transport context: file descriptor or string to write to block block of bytes to write len number of bytes to write + more further data expected soon Returns: TRUE on success, FALSE on failure (with errno preserved); transport_count is incremented by the number of bytes written @@ -237,7 +234,7 @@ for (i = 0; i < 100; i++) { rc = #ifdef SUPPORT_TLS - (tls_out.active == fd) ? tls_write(FALSE, block, len) : + tls_out.active == fd ? tls_write(FALSE, block, len, more) : #endif #ifdef MSG_MORE more ? send(fd, block, len, MSG_MORE) : @@ -254,7 +251,7 @@ for (i = 0; i < 100; i++) rc = #ifdef SUPPORT_TLS - (tls_out.active == fd) ? tls_write(FALSE, block, len) : + tls_out.active == fd ? tls_write(FALSE, block, len, more) : #endif #ifdef MSG_MORE more ? send(fd, block, len, MSG_MORE) : @@ -473,7 +470,7 @@ for (ptr = start; ptr < end; ptr++) /* If CHUNKING, prefix with BDAT (size) NON-LAST. Also, reap responses from previous SMTP commands. */ - if (tctx && tctx->options & topt_use_bdat && tctx->chunk_cb) + if (tctx->options & topt_use_bdat && tctx->chunk_cb) { if ( tctx->chunk_cb(tctx, (unsigned)len, 0) != OK || !transport_write_block(tctx, deliver_out_buffer, len, FALSE) @@ -490,7 +487,7 @@ for (ptr = start; ptr < end; ptr++) /* Remove CR before NL if required */ if ( *ptr == '\r' && ptr[1] == '\n' - && (!tctx || !(tctx->options & topt_use_crlf)) + && !(tctx->options & topt_use_crlf) && spool_file_wireformat ) ptr++; @@ -501,7 +498,7 @@ for (ptr = start; ptr < end; ptr++) /* Insert CR before NL if required */ - if (tctx && tctx->options & topt_use_crlf && !spool_file_wireformat) + if (tctx->options & topt_use_crlf && !spool_file_wireformat) *chunk_ptr++ = '\r'; *chunk_ptr++ = '\n'; transport_newlines++; @@ -898,7 +895,7 @@ Returns: TRUE on success; FALSE (with errno) on failure. is incremented by the number of bytes written. */ -BOOL +static BOOL internal_transport_write_message(transport_ctx * tctx, int size_limit) { int len, size = 0; @@ -972,9 +969,11 @@ if (!(tctx->options & topt_no_headers)) if (tctx->options & topt_add_delivery_date) { - uschar buffer[100]; - int n = sprintf(CS buffer, "Delivery-date: %s\n", tod_stamp(tod_full)); - if (!write_chunk(tctx, buffer, n)) goto bad; + uschar * s = tod_stamp(tod_full); + + if ( !write_chunk(tctx, US"Delivery-date: ", 15) + || !write_chunk(tctx, s, Ustrlen(s)) + || !write_chunk(tctx, US"\n", 1)) goto bad; } /* Then the message's headers. Don't write any that are flagged as "old"; @@ -1065,7 +1064,7 @@ then we can just dump it using sendfile. This should get used for CHUNKING output and also for writing the -K file for dkim signing, when we had CHUNKING input. */ -#ifdef HAVE_LINUX_SENDFILE +#ifdef OS_SENDFILE if ( spool_file_wireformat && !(tctx->options & (topt_no_body | topt_end_dot)) && !nl_check_length @@ -1088,7 +1087,7 @@ if ( spool_file_wireformat while(size > 0) { - if ((copied = sendfile(tctx->u.fd, deliver_datafile, &offset, size)) <= 0) break; + if ((copied = os_sendfile(tctx->u.fd, deliver_datafile, &offset, size)) <= 0) break; size -= copied; } return copied >= 0; @@ -1940,7 +1939,11 @@ if ((pid = fork()) == 0) write the log, etc., so that the output is always in the same order for automatic comparison. */ - if ((pid = fork()) != 0) _exit(EXIT_SUCCESS); + if ((pid = fork()) != 0) + { + DEBUG(D_transport) debug_printf("transport_pass_socket succeeded (final-pid %d)\n", pid); + _exit(EXIT_SUCCESS); + } if (running_in_test_harness) sleep(1); transport_do_pass_socket(transport_name, hostname, hostaddress, @@ -1955,7 +1958,7 @@ if (pid > 0) { int rc; while ((rc = wait(&status)) != pid && (rc >= 0 || errno != ECHILD)); - DEBUG(D_transport) debug_printf("transport_pass_socket succeeded\n"); + DEBUG(D_transport) debug_printf("transport_pass_socket succeeded (inter-pid %d)\n", pid); return TRUE; } else