aboutsummaryrefslogtreecommitdiffstats
path: root/io.c
diff options
context:
space:
mode:
authorWayne Davison <wayned@samba.org>2004-06-06 19:15:58 +0000
committerWayne Davison <wayned@samba.org>2004-06-06 19:15:58 +0000
commit4033b80b51c05ad86eb1d4584c247932d4f77f0f (patch)
tree0c221b395872ef8f4648dadd995405c7b1a08c38 /io.c
parent99218d821bd814dbb10646bd0298274c947ae471 (diff)
downloadandroid_external_rsync-4033b80b51c05ad86eb1d4584c247932d4f77f0f.tar.gz
android_external_rsync-4033b80b51c05ad86eb1d4584c247932d4f77f0f.tar.bz2
android_external_rsync-4033b80b51c05ad86eb1d4584c247932d4f77f0f.zip
- Got rid of some useless calls to msg_list_push().
- Added a couple checks to ensure that the receiver doesn't mix two clashing kinds of writes on the msg_fd_out pipe. - Made sure that the read code in the receiver flushes the msg_fd_out pipe, if needed.
Diffstat (limited to 'io.c')
-rw-r--r--io.c28
1 files changed, 16 insertions, 12 deletions
diff --git a/io.c b/io.c
index c14f7ad8..929609ef 100644
--- a/io.c
+++ b/io.c
@@ -386,6 +386,10 @@ static int read_timeout(int fd, char *buf, size_t len)
FD_SET(msg_fd_in, &r_fds);
if (msg_fd_in >= fd_count)
fd_count = msg_fd_in+1;
+ } else if (msg_list_head) {
+ FD_SET(msg_fd_out, &w_fds);
+ if (msg_fd_out >= fd_count)
+ fd_count = msg_fd_out+1;
}
if (io_filesfrom_f_out >= 0) {
int new_fd;
@@ -415,12 +419,8 @@ static int read_timeout(int fd, char *buf, size_t len)
io_filesfrom_buflen? &w_fds : NULL,
NULL, &tv);
- if (count == 0) {
- msg_list_push(NORMAL_FLUSH);
- check_timeout();
- }
-
if (count <= 0) {
+ check_timeout();
if (errno == EBADF)
exit_cleanup(RERR_SOCKETIO);
continue;
@@ -428,6 +428,8 @@ static int read_timeout(int fd, char *buf, size_t len)
if (msg_fd_in >= 0 && FD_ISSET(msg_fd_in, &r_fds))
read_msg_fd();
+ else if (msg_list_head && FD_ISSET(msg_fd_out, &w_fds))
+ msg_list_push(NORMAL_FLUSH);
if (io_filesfrom_f_out >= 0) {
if (io_filesfrom_buflen) {
@@ -801,7 +803,10 @@ static void writefd_unbuffered(int fd,char *buf,size_t len)
int fd_count, count;
struct timeval tv;
- msg_list_push(NORMAL_FLUSH);
+ if (fd == msg_fd_out) {
+ rprintf(FERROR, "Internal error: wrong write used in receiver.\n");
+ exit_cleanup(RERR_PROTOCOL);
+ }
no_flush++;
@@ -824,12 +829,8 @@ static void writefd_unbuffered(int fd,char *buf,size_t len)
count = select(fd_count+1, msg_fd_in >= 0 ? &r_fds : NULL,
&w_fds, NULL, &tv);
- if (count == 0) {
- msg_list_push(NORMAL_FLUSH);
- check_timeout();
- }
-
if (count <= 0) {
+ check_timeout();
if (errno == EBADF)
exit_cleanup(RERR_SOCKETIO);
continue;
@@ -953,7 +954,10 @@ static void writefd(int fd,char *buf,size_t len)
{
stats.total_written += len;
- msg_list_push(NORMAL_FLUSH);
+ if (fd == msg_fd_out) {
+ rprintf(FERROR, "Internal error: wrong write used in receiver.\n");
+ exit_cleanup(RERR_PROTOCOL);
+ }
if (!io_buffer || fd != multiplex_out_fd) {
writefd_unbuffered(fd, buf, len);