X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/ed25806effa22b42397238dd88511ee8b62e0a61..94481d9113220ded7ee6a76a96fa468c79680478:/util.c diff --git a/util.c b/util.c index 4da0931a..1c733940 100644 --- a/util.c +++ b/util.c @@ -59,19 +59,73 @@ void write_buf(int f,char *buf,int len) total_written += len; } +static int num_waiting(int fd) +{ + int len=0; +#ifdef FIONREAD + ioctl(fd,FIONREAD,&len); +#endif + return(len); +} + +static char *read_buffer = NULL; +static char *read_buffer_p = NULL; +static int read_buffer_len = 0; +static int read_buffer_size = 0; + + void write_flush(int f) { } +void read_check(int f) +{ + int n; + + if (read_buffer_len == 0) { + read_buffer_p = read_buffer; + } + + if ((n=num_waiting(f)) <= 0) + return; + + if (read_buffer_p != read_buffer) { + memmove(read_buffer,read_buffer_p,read_buffer_len); + read_buffer_p = read_buffer; + } + + 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); + if (!read_buffer) out_of_memory("read check"); + read_buffer_p = read_buffer; + } + + n = read(f,read_buffer+read_buffer_len,n); + if (n > 0) { + read_buffer_len += n; + } +} + -int readfd(int fd,char *buffer,int N) +static int readfd(int fd,char *buffer,int N) { int ret; int total=0; while (total < N) { - ret = read(fd,buffer + total,N - total); + if (read_buffer_len > 0) { + ret = MIN(read_buffer_len,N-total); + memcpy(buffer+total,read_buffer_p,ret); + read_buffer_p += ret; + read_buffer_len -= ret; + } else { + ret = read(fd,buffer + total,N - total); + } if (ret <= 0) return total; @@ -227,3 +281,4 @@ int set_modtime(char *fname,time_t modtime) return utimes(fname,t); #endif } +