X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsrc%2Freceive.c;h=6316ff9613ae87689e2fa20f6f6cc61a5d19b0aa;hb=58c30e4788427fe3ee1f2e058602c23f911b0d63;hp=b03ab71ed2353eede33dbc5c474e53362658d47e;hpb=d315eda12f25ca2f72ca56b777a427c9ee7188e1;p=user%2Fhenk%2Fcode%2Fexim.git diff --git a/src/src/receive.c b/src/src/receive.c index b03ab71ed..6316ff961 100644 --- a/src/src/receive.c +++ b/src/src/receive.c @@ -919,7 +919,7 @@ BOOL fix_nl = FALSE; for(;;) { - switch ((ch = (bdat_getc)(GETC_BUFFER_UNLIMITED))) + switch ((ch = bdat_getc(GETC_BUFFER_UNLIMITED))) { case EOF: return END_EOF; case ERR: return END_PROTOCOL; @@ -1026,32 +1026,34 @@ int ch; DEBUG(D_receive) debug_printf("CHUNKING: writing spoolfile in wire format\n"); spool_file_wireformat = TRUE; -/* Unfortunately cannot use sendfile() even if not TLS -as that requires (on linux) mmap-like operations on the input fd. - -XXX but worthwhile doing a block interface to the bdat_getc buffer -in the future */ - -for (;;) switch (ch = bdat_getc(GETC_BUFFER_UNLIMITED)) +for (;;) { - case EOF: return END_EOF; - case EOD: return END_DOT; - case ERR: return END_PROTOCOL; + if (chunking_data_left > 0) + { + unsigned len = MAX(chunking_data_left, thismessage_size_limit - message_size + 1); + uschar * buf = bdat_getbuf(&len); - default: - message_size++; -/*XXX not done: -linelength -max_received_linelength -body_linecount -body_zerocount -*/ - if (fout) - { - if (fputc(ch, fout) == EOF) return END_WERROR; - if (message_size > thismessage_size_limit) return END_SIZE; - } - break; + message_size += len; + if (fout && fwrite(buf, len, 1, fout) != 1) return END_WERROR; + } + else switch (ch = bdat_getc(GETC_BUFFER_UNLIMITED)) + { + case EOF: return END_EOF; + case EOD: return END_DOT; + case ERR: return END_PROTOCOL; + + default: + message_size++; + /*XXX not done: + linelength + max_received_linelength + body_linecount + body_zerocount + */ + if (fout && fputc(ch, fout) == EOF) return END_WERROR; + break; + } + if (message_size > thismessage_size_limit) return END_SIZE; } /*NOTREACHED*/ } @@ -3025,7 +3027,6 @@ if (chunking_state > CHUNKING_OFFERED) /* Cutthrough delivery: We have to create the Received header now rather than at the end of reception, so the timestamp behaviour is a change to the normal case. -XXX Ensure this gets documented XXX. Having created it, send the headers to the destination. */ if (cutthrough.fd >= 0 && cutthrough.delivery)