From: Jeremy Harris Date: Tue, 26 Jul 2016 18:44:08 +0000 (+0100) Subject: tidying X-Git-Tag: exim-4_88_RC1~65 X-Git-Url: https://git.exim.org/exim.git/commitdiff_plain/6b46ecc6a8f5e3ab97c62451646a6d6045205bb1 tidying --- diff --git a/src/src/deliver.c b/src/src/deliver.c index f99aa1819..202f7a400 100644 --- a/src/src/deliver.c +++ b/src/src/deliver.c @@ -6906,8 +6906,8 @@ if (addr_senddsn) { FILE *f = fdopen(fd, "wb"); /* header only as required by RFC. only failure DSN needs to honor RET=FULL */ - int topt = topt_add_return_path | topt_no_body; uschar * bound; + transport_ctx tctx; DEBUG(D_deliver) debug_printf("sending error message to: %s\n", sender_address); @@ -6986,7 +6986,10 @@ if (addr_senddsn) return_path = sender_address; /* In case not previously set */ /* Write the original email out */ - transport_write_message(NULL, fileno(f), topt, 0, NULL, NULL, NULL, NULL, NULL, 0); + + bzero(&tctx, sizeof(tctx)); + tctx.options = topt_add_return_path | topt_no_body; + transport_write_message(fileno(f), &tctx, 0); fflush(f); fprintf(f,"\n--%s--\n", bound); @@ -7441,8 +7444,18 @@ wording. */ fflush(f); transport_filter_argv = NULL; /* Just in case */ return_path = sender_address; /* In case not previously set */ - transport_write_message(NULL, fileno(f), topt, - 0, dsnnotifyhdr, NULL, NULL, NULL, NULL, 0); + { /* Dummy transport for headers add */ + transport_ctx * tctx = + store_get(sizeof(*tctx) + sizeof(transport_instance)); + transport_instance * tb = (transport_instance *)(tctx+1); + + bzero(tctx, sizeof(*tctx)+sizeof(*tb)); + tctx->tblock = tb; + tctx->options = topt; + tb->add_headers = dsnnotifyhdr; + + transport_write_message(fileno(f), tctx, 0); + } fflush(f); /* we never add the final text. close the file */ @@ -7758,7 +7771,9 @@ else if (addr_defer != (address_item *)(+1)) FILE *wmf = NULL; FILE *f = fdopen(fd, "wb"); uschar * bound; - int topt; + transport_ctx tctx; + + bzero(&tctx, sizeof(tctx)); if (warn_message_file) if (!(wmf = Ufopen(warn_message_file, "rb"))) @@ -7905,11 +7920,12 @@ else if (addr_defer != (address_item *)(+1)) fflush(f); /* header only as required by RFC. only failure DSN needs to honor RET=FULL */ - topt = topt_add_return_path | topt_no_body; + tctx.options = topt_add_return_path | topt_no_body; transport_filter_argv = NULL; /* Just in case */ return_path = sender_address; /* In case not previously set */ + /* Write the original email out */ - transport_write_message(NULL, fileno(f), topt, 0, NULL, NULL, NULL, NULL, NULL, 0); + transport_write_message(fileno(f), &tctx, 0); fflush(f); fprintf(f,"\n--%s--\n", bound); diff --git a/src/src/functions.h b/src/src/functions.h index b5e3098dc..4909d9f61 100644 --- a/src/src/functions.h +++ b/src/src/functions.h @@ -144,9 +144,8 @@ extern uschar *deliver_get_sender_address (uschar *id); extern BOOL directory_make(const uschar *, const uschar *, int, BOOL); #ifndef DISABLE_DKIM -extern BOOL dkim_transport_write_message(address_item *, int, int, - uschar *, uschar *, uschar *, uschar *, rewrite_rule *, - int, struct ob_dkim *); +extern BOOL dkim_transport_write_message(int, transport_ctx *, + struct ob_dkim *); #endif extern dns_address *dns_address_from_rr(dns_answer *, dns_record *); extern int dns_basic_lookup(dns_answer *, const uschar *, int); @@ -468,10 +467,10 @@ extern BOOL transport_set_up_command(const uschar ***, uschar *, extern void transport_update_waiting(host_item *, uschar *); extern BOOL transport_write_block(int, uschar *, int); extern BOOL transport_write_string(int, const char *, ...); -extern BOOL transport_headers_send(address_item *, int, uschar *, uschar *, - BOOL (*)(int, uschar *, int, BOOL), BOOL, rewrite_rule *, int); -extern BOOL transport_write_message(address_item *, int, int, int, uschar *, - uschar *, uschar *, uschar *, rewrite_rule *, int); +extern BOOL transport_headers_send(address_item *, int, transport_instance *, + BOOL (*)(int, uschar *, int, BOOL), + BOOL); +extern BOOL transport_write_message(int, transport_ctx *, int); extern void tree_add_duplicate(uschar *, address_item *); extern void tree_add_nonrecipient(uschar *); extern void tree_add_unusable(host_item *); diff --git a/src/src/queue.c b/src/src/queue.c index 1b7b9f74c..7648f47ca 100644 --- a/src/src/queue.c +++ b/src/src/queue.c @@ -1145,7 +1145,7 @@ switch(action) case MSG_SHOW_COPY: deliver_in_buffer = store_malloc(DELIVER_IN_BUFFER_SIZE); deliver_out_buffer = store_malloc(DELIVER_OUT_BUFFER_SIZE); - transport_write_message(NULL, 1, 0, 0, NULL, NULL, NULL, NULL, NULL, 0); + transport_write_message(1, NULL, 0); break; diff --git a/src/src/structs.h b/src/src/structs.h index 1dd363a5c..6666c52ca 100644 --- a/src/src/structs.h +++ b/src/src/structs.h @@ -218,6 +218,17 @@ typedef struct transport_info { } transport_info; +/* Structure for information about a delivery-in-progress */ + +typedef struct transport_context { + transport_instance * tblock; + struct address_item * addr; + uschar * check_string; + uschar * escape_string; + int options; /* topt_* */ +} transport_ctx; + + typedef struct { uschar *request; diff --git a/src/src/transport.c b/src/src/transport.c index daf334c9b..4f7538d24 100644 --- a/src/src/transport.c +++ b/src/src/transport.c @@ -616,11 +616,12 @@ Arguments: Returns: TRUE on success; FALSE on failure. */ BOOL -transport_headers_send(address_item *addr, int fd, uschar *add_headers, uschar *remove_headers, +transport_headers_send(address_item *addr, int fd, transport_instance * tblock, BOOL (*sendfn)(int fd, uschar * s, int len, BOOL use_crlf), - BOOL use_crlf, rewrite_rule *rewrite_rules, int rewrite_existflags) + BOOL use_crlf) { header_line *h; +const uschar *list; /* Then the message's headers. Don't write any that are flagged as "old"; that means they were rewritten, or are a record of envelope rewriting, or @@ -632,10 +633,9 @@ Then check addr->prop.remove_headers too, provided that addr is not NULL. */ for (h = header_list; h; h = h->next) if (h->type != htype_old) { int i; - const uschar *list = remove_headers; - BOOL include_header = TRUE; + list = tblock->remove_headers; for (i = 0; i < 2; i++) /* For remove_headers && addr->prop.remove_headers */ { if (list) @@ -658,9 +658,9 @@ for (h = header_list; h; h = h->next) if (h->type != htype_old) while (*ss == ' ' || *ss == '\t') ss++; if (*ss == ':') break; } - if (s != NULL) { include_header = FALSE; break; } + if (s) { include_header = FALSE; break; } } - if (addr != NULL) list = addr->prop.remove_headers; + if (addr) list = addr->prop.remove_headers; } /* If this header is to be output, try to rewrite it if there are rewriting @@ -668,12 +668,13 @@ for (h = header_list; h; h = h->next) if (h->type != htype_old) if (include_header) { - if (rewrite_rules) + if (tblock->rewrite_rules) { void *reset_point = store_get(0); header_line *hh; - if ((hh = rewrite_header(h, NULL, NULL, rewrite_rules, rewrite_existflags, FALSE))) + if ((hh = rewrite_header(h, NULL, NULL, tblock->rewrite_rules, + tblock->rewrite_existflags, FALSE))) { if (!sendfn(fd, hh->text, hh->slen, use_crlf)) return FALSE; store_reset(reset_point); @@ -732,12 +733,12 @@ up any other headers. An empty string or a forced expansion failure are noops. An added header string from a transport may not end with a newline; add one if it does not. */ -if (add_headers) +if ((list = CUS tblock->add_headers)) { int sep = '\n'; uschar * s; - while ((s = string_nextinlist(CUSS &add_headers, &sep, NULL, 0))) + while ((s = string_nextinlist(&list, &sep, NULL, 0))) if ((s = expand_string(s))) { int len = Ustrlen(s); @@ -793,30 +794,32 @@ can include timeouts for certain transports, which are requested by setting transport_write_timeout non-zero. Arguments: - addr (chain of) addresses (for extra headers), or NULL; - only the first address is used fd file descriptor to write the message to - options bit-wise options: - add_return_path if TRUE, add a "return-path" header - add_envelope_to if TRUE, add a "envelope-to" header - add_delivery_date if TRUE, add a "delivery-date" header - use_crlf if TRUE, turn NL into CR LF - end_dot if TRUE, send a terminating "." line at the end - no_headers if TRUE, omit the headers - no_body if TRUE, omit the body - size_limit if > 0, this is a limit to the size of message written; - it is used when returning messages to their senders, - and is approximate rather than exact, owing to chunk - buffering - add_headers a string containing one or more headers to add; it is - expanded, and must be in correct RFC 822 format as - it is transmitted verbatim; NULL => no additions, - and so does empty string or forced expansion fail - remove_headers a colon-separated list of headers to remove, or NULL - check_string a string to check for at the start of lines, or NULL - escape_string a string to insert in front of any check string - rewrite_rules chain of header rewriting rules - rewrite_existflags flags for the rewriting rules + tctx + addr (chain of) addresses (for extra headers), or NULL; + only the first address is used + tblock optional transport instance block (NULL signifies NULL/0): + add_headers a string containing one or more headers to add; it is + expanded, and must be in correct RFC 822 format as + it is transmitted verbatim; NULL => no additions, + and so does empty string or forced expansion fail + remove_headers a colon-separated list of headers to remove, or NULL + rewrite_rules chain of header rewriting rules + rewrite_existflags flags for the rewriting rules + options bit-wise options: + add_return_path if TRUE, add a "return-path" header + add_envelope_to if TRUE, add a "envelope-to" header + add_delivery_date if TRUE, add a "delivery-date" header + use_crlf if TRUE, turn NL into CR LF + end_dot if TRUE, send a terminating "." line at the end + no_headers if TRUE, omit the headers + no_body if TRUE, omit the body + size_limit if > 0, this is a limit to the size of message written; + it is used when returning messages to their senders, + and is approximate rather than exact, owing to chunk + buffering + check_string a string to check for at the start of lines, or NULL + escape_string a string to insert in front of any check string Returns: TRUE on success; FALSE (with errno) on failure. In addition, the global variable transport_count @@ -824,13 +827,11 @@ Returns: TRUE on success; FALSE (with errno) on failure. */ static BOOL -internal_transport_write_message(address_item *addr, int fd, int options, - int size_limit, uschar *add_headers, uschar *remove_headers, uschar *check_string, - uschar *escape_string, rewrite_rule *rewrite_rules, int rewrite_existflags) +internal_transport_write_message(int fd, transport_ctx * tctx, int size_limit) { int written = 0; int len; -BOOL use_crlf = (options & topt_use_crlf) != 0; +BOOL use_crlf = (tctx->options & topt_use_crlf) != 0; /* Initialize pointer in output buffer. */ @@ -839,11 +840,11 @@ chunk_ptr = deliver_out_buffer; /* Set up the data for start-of-line data checking and escaping */ nl_partial_match = -1; -if (check_string && escape_string) +if (tctx->check_string && tctx->escape_string) { - nl_check = check_string; + nl_check = tctx->check_string; nl_check_length = Ustrlen(nl_check); - nl_escape = escape_string; + nl_escape = tctx->escape_string; nl_escape_length = Ustrlen(nl_escape); } else @@ -853,17 +854,17 @@ else an option (set for SMTP, not otherwise). Negate the length if not wanted till after the headers. */ -if (!(options & topt_escape_headers)) +if (!(tctx->options & topt_escape_headers)) nl_check_length = -nl_check_length; /* Write the headers if required, including any that have to be added. If there are header rewriting rules, apply them. */ -if (!(options & topt_no_headers)) +if (!(tctx->options & topt_no_headers)) { /* Add return-path: if requested. */ - if (options & topt_add_return_path) + if (tctx->options & topt_add_return_path) { uschar buffer[ADDRESS_MAXLENGTH + 20]; int n = sprintf(CS buffer, "Return-path: <%.*s>\n", ADDRESS_MAXLENGTH, @@ -873,7 +874,7 @@ if (!(options & topt_no_headers)) /* Add envelope-to: if requested */ - if (options & topt_add_envelope_to) + if (tctx->options & topt_add_envelope_to) { BOOL first = TRUE; address_item *p; @@ -887,7 +888,7 @@ if (!(options & topt_no_headers)) anchors for lists of addresses already handled; they have to be defined at this level becuase write_env_to() calls itself recursively. */ - for (p = addr; p; p = p->next) + for (p = tctx->addr; p; p = p->next) if (!write_env_to(p, &plist, &dlist, &first, fd, use_crlf)) return FALSE; @@ -899,7 +900,7 @@ if (!(options & topt_no_headers)) /* Add delivery-date: if requested. */ - if ((options & topt_add_delivery_date) != 0) + if (tctx->options & topt_add_delivery_date) { uschar buffer[100]; int n = sprintf(CS buffer, "Delivery-date: %s\n", tod_stamp(tod_full)); @@ -911,8 +912,8 @@ if (!(options & topt_no_headers)) were removed (e.g. Bcc). If remove_headers is not null, skip any headers that match any entries therein. Then check addr->prop.remove_headers too, provided that addr is not NULL. */ - if (!transport_headers_send(addr, fd, add_headers, remove_headers, &write_chunk, - use_crlf, rewrite_rules, rewrite_existflags)) + + if (!transport_headers_send(tctx->addr, fd, tctx->tblock, &write_chunk, use_crlf)) return FALSE; } @@ -922,7 +923,7 @@ negative in cases where it isn't to apply to the headers). Then ensure the body is positioned at the start of its file (following the message id), then write it, applying the size limit if required. */ -if (!(options & topt_no_body)) +if (!(tctx->options & topt_no_body)) { nl_check_length = abs(nl_check_length); nl_partial_match = 0; @@ -954,7 +955,7 @@ nl_check_length = nl_escape_length = 0; /* If requested, add a terminating "." line (SMTP output). */ -if (options & topt_end_dot && !write_chunk(fd, US".\n", 2, use_crlf)) +if (tctx->options & topt_end_dot && !write_chunk(fd, US".\n", 2, use_crlf)) return FALSE; /* Write out any remaining data in the buffer before returning. */ @@ -986,10 +987,8 @@ Returns: TRUE on success; FALSE (with errno) for any failure */ BOOL -dkim_transport_write_message(address_item *addr, int out_fd, int options, - uschar *add_headers, uschar *remove_headers, - uschar *check_string, uschar *escape_string, rewrite_rule *rewrite_rules, - int rewrite_existflags, struct ob_dkim * dkim) +dkim_transport_write_message(int out_fd, transport_ctx * tctx, + struct ob_dkim * dkim) { int dkim_fd; int save_errno = 0; @@ -1003,10 +1002,7 @@ off_t k_file_size; /* If we can't sign, just call the original function. */ if (!(dkim->dkim_private_key && dkim->dkim_domain && dkim->dkim_selector)) - return transport_write_message(addr, out_fd, options, - 0, add_headers, remove_headers, - check_string, escape_string, rewrite_rules, - rewrite_existflags); + return transport_write_message(out_fd, tctx, 0); dkim_spool_name = spool_fname(US"input", message_subdir, message_id, string_sprintf("-%d-K", (int)getpid())); @@ -1021,10 +1017,7 @@ if ((dkim_fd = Uopen(dkim_spool_name, O_RDWR|O_CREAT|O_TRUNC, SPOOL_MODE)) < 0) /* Call original function to write the -K file; does the CRLF expansion */ -rc = transport_write_message(addr, dkim_fd, options, - 0, add_headers, remove_headers, - check_string, escape_string, rewrite_rules, - rewrite_existflags); +rc = transport_write_message(dkim_fd, tctx, 0); /* Save error state. We must clean up before returning. */ if (!rc) @@ -1067,13 +1060,13 @@ if (dkim->dkim_private_key && dkim->dkim_domain && dkim->dkim_selector) int siglen = Ustrlen(dkim_signature); while(siglen > 0) { - #ifdef SUPPORT_TLS +#ifdef SUPPORT_TLS wwritten = tls_out.active == out_fd ? tls_write(FALSE, dkim_signature, siglen) : write(out_fd, dkim_signature, siglen); - #else +#else wwritten = write(out_fd, dkim_signature, siglen); - #endif +#endif if (wwritten == -1) { /* error, bail out */ @@ -1174,6 +1167,7 @@ set up a filtering process, fork another process to call the internal function to write to the filter, and in this process just suck from the filter and write down the given fd. At the end, tidy up the pipes and the processes. +XXX Arguments: as for internal_transport_write_message() above Returns: TRUE on success; FALSE (with errno) for any failure @@ -1181,16 +1175,16 @@ Returns: TRUE on success; FALSE (with errno) for any failure */ BOOL -transport_write_message(address_item *addr, int fd, int options, - int size_limit, uschar *add_headers, uschar *remove_headers, - uschar *check_string, uschar *escape_string, rewrite_rule *rewrite_rules, - int rewrite_existflags) +transport_write_message(int fd, transport_ctx * tctx, int size_limit) { BOOL use_crlf; BOOL last_filter_was_NL = TRUE; int rc, len, yield, fd_read, fd_write, save_errno; int pfd[2] = {-1, -1}; pid_t filter_pid, write_pid; +static transport_ctx dummy_tctx = { NULL, NULL, NULL, NULL, 0 }; + +if (!tctx) tctx = &dummy_tctx; transport_filter_timed_out = FALSE; @@ -1201,22 +1195,20 @@ if ( !transport_filter_argv || !*transport_filter_argv || !**transport_filter_argv ) - return internal_transport_write_message(addr, fd, options, size_limit, - add_headers, remove_headers, check_string, escape_string, - rewrite_rules, rewrite_existflags); + return internal_transport_write_message(fd, tctx, size_limit); /* Otherwise the message must be written to a filter process and read back before being written to the incoming fd. First set up the special processing to be done during the copying. */ -use_crlf = (options & topt_use_crlf) != 0; +use_crlf = (tctx->options & topt_use_crlf) != 0; nl_partial_match = -1; -if (check_string != NULL && escape_string != NULL) +if (tctx->check_string && tctx->escape_string) { - nl_check = check_string; + nl_check = tctx->check_string; nl_check_length = Ustrlen(nl_check); - nl_escape = escape_string; + nl_escape = tctx->escape_string; nl_escape_length = Ustrlen(nl_escape); } else nl_check_length = nl_escape_length = 0; @@ -1254,16 +1246,17 @@ if ((write_pid = fork()) == 0) (void)close(fd_read); (void)close(pfd[pipe_read]); nl_check_length = nl_escape_length = 0; - rc = internal_transport_write_message(addr, fd_write, - (options & ~(topt_use_crlf | topt_end_dot)), - size_limit, add_headers, remove_headers, NULL, NULL, - rewrite_rules, rewrite_existflags); + + tctx->options &= ~(topt_use_crlf | topt_end_dot); + + rc = internal_transport_write_message(fd_write, tctx, size_limit); + save_errno = errno; if ( write(pfd[pipe_write], (void *)&rc, sizeof(BOOL)) != sizeof(BOOL) || write(pfd[pipe_write], (void *)&save_errno, sizeof(int)) != sizeof(int) - || write(pfd[pipe_write], (void *)&(addr->more_errno), sizeof(int)) + || write(pfd[pipe_write], (void *)&tctx->addr->more_errno, sizeof(int)) != sizeof(int) ) rc = FALSE; /* compiler quietening */ @@ -1360,7 +1353,7 @@ if (filter_pid > 0 && (rc = child_close(filter_pid, 30)) != 0 && yield) { yield = FALSE; save_errno = ERRNO_FILTER_FAIL; - addr->more_errno = rc; + tctx->addr->more_errno = rc; DEBUG(D_transport) debug_printf("filter process returned %d\n", rc); } @@ -1381,7 +1374,7 @@ if (write_pid > 0) if (!ok) { dummy = read(pfd[pipe_read], (void *)&save_errno, sizeof(int)); - dummy = read(pfd[pipe_read], (void *)&(addr->more_errno), sizeof(int)); + dummy = read(pfd[pipe_read], (void *)&(tctx->addr->more_errno), sizeof(int)); yield = FALSE; } } @@ -1389,7 +1382,7 @@ if (write_pid > 0) { yield = FALSE; save_errno = ERRNO_FILTER_FAIL; - addr->more_errno = rc; + tctx->addr->more_errno = rc; DEBUG(D_transport) debug_printf("writing process returned %d\n", rc); } } @@ -1403,10 +1396,10 @@ filter was not NL, insert a NL to make the SMTP protocol work. */ if (yield) { nl_check_length = nl_escape_length = 0; - if ( options & topt_end_dot + if ( tctx->options & topt_end_dot && ( last_filter_was_NL - ? !write_chunk(fd, US".\n", 2, options) - : !write_chunk(fd, US"\n.\n", 3, options) + ? !write_chunk(fd, US".\n", 2, tctx->options) + : !write_chunk(fd, US"\n.\n", 3, tctx->options) ) ) yield = FALSE; @@ -1423,7 +1416,7 @@ DEBUG(D_transport) { debug_printf("end of filtering transport writing: yield=%d\n", yield); if (!yield) - debug_printf("errno=%d more_errno=%d\n", errno, addr->more_errno); + debug_printf("errno=%d more_errno=%d\n", errno, tctx->addr->more_errno); } return yield; diff --git a/src/src/transports/appendfile.c b/src/src/transports/appendfile.c index 5dc4ee9b5..c9d150525 100644 --- a/src/src/transports/appendfile.c +++ b/src/src/transports/appendfile.c @@ -2874,9 +2874,14 @@ at initialization time. */ if (yield == OK) { - if (!transport_write_message(addr, fd, ob->options, 0, tblock->add_headers, - tblock->remove_headers, ob->check_string, ob->escape_string, - tblock->rewrite_rules, tblock->rewrite_existflags)) + transport_ctx tctx = { + tblock, + addr, + ob->check_string, + ob->escape_string, + ob->options + }; + if (!transport_write_message(fd, &tctx, 0)) yield = DEFER; } diff --git a/src/src/transports/autoreply.c b/src/src/transports/autoreply.c index 54f9ef4de..36a68b92c 100644 --- a/src/src/transports/autoreply.c +++ b/src/src/transports/autoreply.c @@ -691,6 +691,17 @@ if (return_message) US"------ This is a copy of the body of the message, without the headers.\n" : US"------ This is a copy of the message, including all the headers.\n"; + transport_ctx tctx = { + tblock, + addr, + NULL, + NULL, + (tblock->body_only ? topt_no_headers : 0) | + (tblock->headers_only ? topt_no_body : 0) | + (tblock->return_path_add ? topt_add_return_path : 0) | + (tblock->delivery_date_add ? topt_add_delivery_date : 0) | + (tblock->envelope_to_add ? topt_add_envelope_to : 0) + }; if (bounce_return_size_limit > 0 && !tblock->headers_only) { @@ -710,14 +721,7 @@ if (return_message) fflush(f); transport_count = 0; - transport_write_message(addr, fileno(f), - (tblock->body_only? topt_no_headers : 0) | - (tblock->headers_only? topt_no_body : 0) | - (tblock->return_path_add? topt_add_return_path : 0) | - (tblock->delivery_date_add? topt_add_delivery_date : 0) | - (tblock->envelope_to_add? topt_add_envelope_to : 0), - bounce_return_size_limit, tblock->add_headers, tblock->remove_headers, - NULL, NULL, tblock->rewrite_rules, tblock->rewrite_existflags); + transport_write_message(fileno(f), &tctx, bounce_return_size_limit); } /* End the message and wait for the child process to end; no timeout. */ diff --git a/src/src/transports/lmtp.c b/src/src/transports/lmtp.c index bca597893..9624ece6a 100644 --- a/src/src/transports/lmtp.c +++ b/src/src/transports/lmtp.c @@ -609,6 +609,13 @@ for (addr = addrlist; addr != NULL; addr = addr->next) if (send_data) { BOOL ok; + transport_ctx tctx = { + tblock, + addrlist, + US".", + US"..", + ob->options + }; if (!lmtp_write_command(fd_in, "DATA\r\n")) goto WRITE_FAILED; if (!lmtp_read_response(out, buffer, sizeof(buffer), '3', timeout)) @@ -628,9 +635,7 @@ if (send_data) debug_printf(" LMTP>> writing message and terminating \".\"\n"); transport_count = 0; - ok = transport_write_message(addrlist, fd_in, ob->options, 0, - tblock->add_headers, tblock->remove_headers, US".", US"..", - tblock->rewrite_rules, tblock->rewrite_existflags); + ok = transport_write_message(fd_in, &tctx, 0); /* Failure can either be some kind of I/O disaster (including timeout), or the failure of a transport filter or the expansion of added headers. */ diff --git a/src/src/transports/pipe.c b/src/src/transports/pipe.c index db522e54b..e3d01974a 100644 --- a/src/src/transports/pipe.c +++ b/src/src/transports/pipe.c @@ -555,6 +555,13 @@ uschar *envp[50]; const uschar *envlist = ob->environment; uschar *cmd, *ss; uschar *eol = (ob->use_crlf)? US"\r\n" : US"\n"; +transport_ctx tctx = { + tblock, + addr, + ob->check_string, + ob->escape_string, + ob->options /* set at initialization time */ +}; DEBUG(D_transport) debug_printf("%s transport entered\n", tblock->name); @@ -842,23 +849,19 @@ if (ob->use_bsmtp) if (!transport_write_string(fd_in, "MAIL FROM:<%s>%s", return_path, eol)) goto END_WRITE; - for (a = addr; a != NULL; a = a->next) - { + for (a = addr; a; a = a->next) if (!transport_write_string(fd_in, "RCPT TO:<%s>%s", transport_rcpt_address(a, tblock->rcpt_include_affixes), eol)) goto END_WRITE; - } if (!transport_write_string(fd_in, "DATA%s", eol)) goto END_WRITE; } -/* Now the actual message - the options were set at initialization time */ +/* Now the actual message */ -if (!transport_write_message(addr, fd_in, ob->options, 0, tblock->add_headers, - tblock->remove_headers, ob->check_string, ob->escape_string, - tblock->rewrite_rules, tblock->rewrite_existflags)) +if (!transport_write_message(fd_in, &tctx, 0)) goto END_WRITE; /* Now any configured suffix */ diff --git a/src/src/transports/smtp.c b/src/src/transports/smtp.c index 757a837db..4884ea937 100644 --- a/src/src/transports/smtp.c +++ b/src/src/transports/smtp.c @@ -2343,6 +2343,18 @@ if (!ok) ok = TRUE; else { + transport_ctx tctx = { + tblock, + addrlist, + US".", US"..", /* Escaping strings */ + topt_use_crlf | topt_end_dot | topt_escape_headers + | (tblock->body_only ? topt_no_headers : 0) + | (tblock->headers_only ? topt_no_body : 0) + | (tblock->return_path_add ? topt_add_return_path : 0) + | (tblock->delivery_date_add ? topt_add_delivery_date : 0) + | (tblock->envelope_to_add ? topt_add_envelope_to : 0) + }; + sigalrm_seen = FALSE; transport_write_timeout = ob->data_timeout; smtp_command = US"sending data block"; /* For error messages */ @@ -2351,30 +2363,9 @@ else transport_count = 0; #ifndef DISABLE_DKIM - ok = dkim_transport_write_message(addrlist, inblock.sock, - topt_use_crlf | topt_end_dot | topt_escape_headers | - (tblock->body_only? topt_no_headers : 0) | - (tblock->headers_only? topt_no_body : 0) | - (tblock->return_path_add? topt_add_return_path : 0) | - (tblock->delivery_date_add? topt_add_delivery_date : 0) | - (tblock->envelope_to_add? topt_add_envelope_to : 0), - tblock->add_headers, tblock->remove_headers, - US".", US"..", /* Escaping strings */ - tblock->rewrite_rules, tblock->rewrite_existflags, - &ob->dkim - ); + ok = dkim_transport_write_message(inblock.sock, &tctx, &ob->dkim); #else - ok = transport_write_message(addrlist, inblock.sock, - topt_use_crlf | topt_end_dot | topt_escape_headers | - (tblock->body_only? topt_no_headers : 0) | - (tblock->headers_only? topt_no_body : 0) | - (tblock->return_path_add? topt_add_return_path : 0) | - (tblock->delivery_date_add? topt_add_delivery_date : 0) | - (tblock->envelope_to_add? topt_add_envelope_to : 0), - 0, /* No size limit */ - tblock->add_headers, tblock->remove_headers, - US".", US"..", /* Escaping strings */ - tblock->rewrite_rules, tblock->rewrite_existflags); + ok = transport_write_message(inblock.sock, &tctx, 0); #endif /* transport_write_message() uses write() because it is called from other diff --git a/src/src/verify.c b/src/src/verify.c index cfbe0fe60..c04b288dc 100644 --- a/src/src/verify.c +++ b/src/src/verify.c @@ -1589,11 +1589,8 @@ if(cutthrough.fd < 0) HDEBUG(D_acl) debug_printf("----------- start cutthrough headers send -----------\n"); if (!transport_headers_send(&cutthrough.addr, cutthrough.fd, - cutthrough.addr.transport->add_headers, - cutthrough.addr.transport->remove_headers, - &cutthrough_write_chunk, TRUE, - cutthrough.addr.transport->rewrite_rules, - cutthrough.addr.transport->rewrite_existflags)) + cutthrough.addr.transport, + &cutthrough_write_chunk, TRUE)) return FALSE; HDEBUG(D_acl) debug_printf("----------- done cutthrough headers send ------------\n");