Matt McCutchen's Web Site
/
rsync
/
rsync.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
damn, I had implicitly assumed signed characters when writing the
[rsync/rsync.git]
/
io.c
diff --git
a/io.c
b/io.c
index
3c55dbe
..
51fc0cb
100644
(file)
--- a/
io.c
+++ b/
io.c
@@
-62,6
+62,8
@@
static void read_check(int f)
{
int n;
{
int n;
+ if (f == -1) return;
+
if (read_buffer_len == 0) {
read_buffer_p = read_buffer;
}
if (read_buffer_len == 0) {
read_buffer_p = read_buffer;
}
@@
-69,6
+71,9
@@
static void read_check(int f)
if ((n=num_waiting(f)) <= 0)
return;
if ((n=num_waiting(f)) <= 0)
return;
+ /* things could deteriorate if we read in really small chunks */
+ if (n < 10) n = 1024;
+
if (read_buffer_p != read_buffer) {
memmove(read_buffer,read_buffer_p,read_buffer_len);
read_buffer_p = read_buffer;
if (read_buffer_p != read_buffer) {
memmove(read_buffer,read_buffer_p,read_buffer_len);
read_buffer_p = read_buffer;
@@
-95,10
+100,13
@@
static int readfd(int fd,char *buffer,int N)
{
int ret;
int total=0;
{
int ret;
int total=0;
+
+ if (read_buffer_len < N)
+ read_check(buffer_f_in);
while (total < N)
{
while (total < N)
{
- if (read_buffer_len > 0) {
+ if (read_buffer_len > 0
&& buffer_f_in == fd
) {
ret = MIN(read_buffer_len,N-total);
memcpy(buffer+total,read_buffer_p,ret);
read_buffer_p += ret;
ret = MIN(read_buffer_len,N-total);
memcpy(buffer+total,read_buffer_p,ret);
read_buffer_p += ret;
@@
-129,8
+137,8
@@
int read_int(int f)
char b[4];
if ((ret=readfd(f,b,4)) != 4) {
if (verbose > 1)
char b[4];
if ((ret=readfd(f,b,4)) != 4) {
if (verbose > 1)
- fprintf(FERROR,"Error reading %d bytes : %s\n",
- 4,ret==-1?strerror(errno):"EOF");
+ fprintf(FERROR,"
(%d)
Error reading %d bytes : %s\n",
+
getpid(),
4,ret==-1?strerror(errno):"EOF");
exit_cleanup(1);
}
total_read += 4;
exit_cleanup(1);
}
total_read += 4;
@@
-142,8
+150,8
@@
void read_buf(int f,char *buf,int len)
int ret;
if ((ret=readfd(f,buf,len)) != len) {
if (verbose > 1)
int ret;
if ((ret=readfd(f,buf,len)) != len) {
if (verbose > 1)
- fprintf(FERROR,"Error reading %d bytes : %s\n",
- len,ret==-1?strerror(errno):"EOF");
+ fprintf(FERROR,"
(%d)
Error reading %d bytes : %s\n",
+
getpid(),
len,ret==-1?strerror(errno):"EOF");
exit_cleanup(1);
}
total_read += len;
exit_cleanup(1);
}
total_read += len;
@@
-151,9
+159,9
@@
void read_buf(int f,char *buf,int len)
unsigned char read_byte(int f)
{
unsigned char read_byte(int f)
{
- char c;
- read_buf(f,&c,1);
- return
(unsigned char)
c;
+
unsigned
char c;
+ read_buf(f,
(char *)
&c,1);
+ return c;
}
}
@@
-228,7
+236,8
@@
int read_write(int fd_in,int fd_out,int size)
static int writefd(int fd,char *buf,int len)
{
int total = 0;
static int writefd(int fd,char *buf,int len)
{
int total = 0;
- fd_set fds;
+ fd_set w_fds, r_fds;
+ int fd_count;
struct timeval tv;
if (buffer_f_in == -1)
struct timeval tv;
if (buffer_f_in == -1)
@@
-245,11
+254,18
@@
static int writefd(int fd,char *buf,int len)
if (ret == -1) {
read_check(buffer_f_in);
if (ret == -1) {
read_check(buffer_f_in);
- FD_ZERO(&fds);
- FD_SET(fd,&fds);
+ fd_count = fd+1;
+ FD_ZERO(&w_fds);
+ FD_ZERO(&r_fds);
+ FD_SET(fd,&w_fds);
+ if (buffer_f_in != -1) {
+ FD_SET(buffer_f_in,&r_fds);
+ if (buffer_f_in > fd)
+ fd_count = buffer_f_in+1;
+ }
tv.tv_sec = BLOCKING_TIMEOUT;
tv.tv_usec = 0;
tv.tv_sec = BLOCKING_TIMEOUT;
tv.tv_usec = 0;
- select(fd
+1,NULL,&
fds,NULL,&tv);
+ select(fd
_count,buffer_f_in == -1? NULL: &r_fds,&w_
fds,NULL,&tv);
} else {
total += ret;
}
} else {
total += ret;
}