X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/ea2111d10a10a164334eff3b621ed7e630404345..e44f9a12c4c6d560f00d6e3521dca27e1d1e422a:/io.c diff --git a/io.c b/io.c index 03da79ce..a88d76af 100644 --- a/io.c +++ b/io.c @@ -32,10 +32,11 @@ static int io_multiplexing_in; static int multiplex_in_fd; static int multiplex_out_fd; static time_t last_io; - +static int eof_error=1; extern int verbose; extern int io_timeout; + int64 write_total(void) { return total_written; @@ -78,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 @@ -119,7 +121,9 @@ static int read_timeout(int fd, char *buf, int len) } if (n == 0) { - rprintf(FERROR,"EOF in read_timeout\n"); + if (eof_error) { + rprintf(FERROR,"EOF in read_timeout\n"); + } exit_cleanup(1); } @@ -142,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) @@ -220,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; } @@ -325,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) { @@ -374,6 +377,8 @@ static void writefd_unbuffered(int fd,char *buf,int len) read_check(buffer_f_in); } } + + no_flush--; } @@ -395,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); @@ -482,8 +487,12 @@ void write_byte(int f,unsigned char c) int read_line(int f, char *buf, int maxlen) { + eof_error = 0; + while (maxlen) { + buf[0] = 0; read_buf(f, buf, 1); + if (buf[0] == 0) return 0; if (buf[0] == '\n') { buf[0] = 0; break; @@ -497,6 +506,9 @@ int read_line(int f, char *buf, int maxlen) *buf = 0; return 0; } + + eof_error = 1; + return 1; }