X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/528bfcd79a0ebcf9a2a0071981525213f25b1fc6..e44f9a12c4c6d560f00d6e3521dca27e1d1e422a:/io.c diff --git a/io.c b/io.c index e9a66a48..a88d76af 100644 --- a/io.c +++ b/io.c @@ -79,6 +79,7 @@ static char *read_buffer; static char *read_buffer_p; static int read_buffer_len; static int read_buffer_size; +static int no_flush; /* read from a socket with IO timeout. return the number of bytes read. If no bytes can be read then exit, never return @@ -145,7 +146,7 @@ static void read_loop(int fd, char *buf, int len) } } -/* read from the file descriptor handing multiplexing - +/* read from the file descriptor handling multiplexing - return number of bytes read never return <= 0 */ static int read_unbuffered(int fd, char *buf, int len) @@ -223,10 +224,7 @@ static void read_check(int f) if (n > (read_buffer_size - read_buffer_len)) { read_buffer_size += n; - if (!read_buffer) - read_buffer = (char *)malloc(read_buffer_size); - else - read_buffer = (char *)realloc(read_buffer,read_buffer_size); + read_buffer = (char *)Realloc(read_buffer,read_buffer_size); if (!read_buffer) out_of_memory("read check"); read_buffer_p = read_buffer; } @@ -328,6 +326,8 @@ static void writefd_unbuffered(int fd,char *buf,int len) struct timeval tv; int reading; + no_flush++; + reading = (buffer_f_in != -1 && read_buffer_len < MAX_READ_BUFFER); while (total < len) { @@ -377,6 +377,8 @@ static void writefd_unbuffered(int fd,char *buf,int len) read_check(buffer_f_in); } } + + no_flush--; } @@ -398,7 +400,7 @@ void io_start_buffering(int fd) void io_flush(void) { int fd = multiplex_out_fd; - if (!io_buffer_count) return; + if (!io_buffer_count || no_flush) return; if (io_multiplexing_out) { SIVAL(io_buffer-4, 0, (MPLEX_BASE<<24) + io_buffer_count);