Changed a few FINFO messages to FLOG.
[rsync/rsync.git] / io.c
diff --git a/io.c b/io.c
index 6028565..929609e 100644 (file)
--- a/io.c
+++ b/io.c
@@ -53,10 +53,12 @@ extern int io_timeout;
 extern int am_server;
 extern int am_daemon;
 extern int am_sender;
+extern int eol_nulls;
+extern char *remote_filesfrom_file;
 extern struct stats stats;
 
-
 const char phase_unknown[] = "unknown";
+int select_timeout = SELECT_TIMEOUT;
 
 /**
  * The connection might be dropped at some point; perhaps because the
@@ -267,7 +269,7 @@ int msg_list_push(int flush_it_all)
                                return 0;
                        FD_ZERO(&fds);
                        FD_SET(msg_fd_out, &fds);
-                       tv.tv_sec = io_timeout ? io_timeout : SELECT_TIMEOUT;
+                       tv.tv_sec = select_timeout;
                        tv.tv_usec = 0;
                        if (!select(msg_fd_out+1, NULL, &fds, NULL, &tv))
                                check_timeout();
@@ -384,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;
@@ -404,7 +410,7 @@ static int read_timeout(int fd, char *buf, size_t len)
                                fd_count = new_fd+1;
                }
 
-               tv.tv_sec = io_timeout?io_timeout:SELECT_TIMEOUT;
+               tv.tv_sec = select_timeout;
                tv.tv_usec = 0;
 
                errno = 0;
@@ -413,20 +419,17 @@ 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) {
-                       if (errno == EBADF) {
+                       check_timeout();
+                       if (errno == EBADF)
                                exit_cleanup(RERR_SOCKETIO);
-                       }
                        continue;
                }
 
                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) {
@@ -456,7 +459,6 @@ static int read_timeout(int fd, char *buf, size_t len)
                                                io_filesfrom_buflen = io_filesfrom_lastchar? 2 : 1;
                                                io_filesfrom_f_in = -1;
                                        } else {
-                                               extern int eol_nulls;
                                                if (!eol_nulls) {
                                                        char *s = io_filesfrom_buf + l;
                                                        /* Transform CR and/or LF into '\0' */
@@ -492,7 +494,8 @@ static int read_timeout(int fd, char *buf, size_t len)
                        }
                }
 
-               if (!FD_ISSET(fd, &r_fds)) continue;
+               if (!FD_ISSET(fd, &r_fds))
+                       continue;
 
                n = read(fd, buf, len);
 
@@ -525,9 +528,6 @@ int read_filesfrom_line(int fd, char *fname)
 {
        char ch, *s, *eob = fname + MAXPATHLEN - 1;
        int cnt;
-       extern int io_timeout;
-       extern int eol_nulls;
-       extern char *remote_filesfrom_file;
        int reading_remotely = remote_filesfrom_file != NULL;
        int nulls = eol_nulls || reading_remotely;
 
@@ -541,7 +541,7 @@ int read_filesfrom_line(int fd, char *fname)
                        fd_set fds;
                        FD_ZERO(&fds);
                        FD_SET(fd, &fds);
-                       tv.tv_sec = io_timeout? io_timeout : SELECT_TIMEOUT;
+                       tv.tv_sec = select_timeout;
                        tv.tv_usec = 0;
                        if (!select(fd+1, &fds, NULL, NULL, &tv))
                                check_timeout();
@@ -605,7 +605,8 @@ static int read_unbuffered(int fd, char *buf, size_t len)
                if (!buffer) {
                        bufferSz = 2 * IO_BUFFER_SIZE;
                        buffer   = new_array(char, bufferSz);
-                       if (!buffer) out_of_memory("read_unbuffered");
+                       if (!buffer)
+                               out_of_memory("read_unbuffered");
                }
                remaining = read_timeout(fd, buffer, bufferSz);
                bufferIdx = 0;
@@ -631,7 +632,8 @@ static int read_unbuffered(int fd, char *buf, size_t len)
                case MSG_DATA:
                        if (!buffer || remaining > bufferSz) {
                                buffer = realloc_array(buffer, char, remaining);
-                               if (!buffer) out_of_memory("read_unbuffered");
+                               if (!buffer)
+                                       out_of_memory("read_unbuffered");
                                bufferSz = remaining;
                        }
                        read_loop(fd, buffer, remaining);
@@ -688,7 +690,8 @@ int32 read_int(int f)
 
        readfd(f,b,4);
        ret = IVAL(b,0);
-       if (ret == (int32)0xffffffff) return -1;
+       if (ret == (int32)0xffffffff)
+               return -1;
        return ret;
 }
 
@@ -698,9 +701,8 @@ int64 read_longint(int f)
        char b[8];
        ret = read_int(f);
 
-       if ((int32)ret != (int32)0xffffffff) {
+       if ((int32)ret != (int32)0xffffffff)
                return ret;
-       }
 
 #ifdef NO_INT64
        rprintf(FERROR,"Integer overflow - attempted 64 bit offset\n");
@@ -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++;
 
@@ -817,22 +822,17 @@ static void writefd_unbuffered(int fd,char *buf,size_t len)
                                fd_count = msg_fd_in;
                }
 
-               tv.tv_sec = io_timeout?io_timeout:SELECT_TIMEOUT;
+               tv.tv_sec = select_timeout;
                tv.tv_usec = 0;
 
                errno = 0;
                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) {
-                       if (errno == EBADF) {
+                       check_timeout();
+                       if (errno == EBADF)
                                exit_cleanup(RERR_SOCKETIO);
-                       }
                        continue;
                }
 
@@ -861,7 +861,7 @@ static void writefd_unbuffered(int fd,char *buf,size_t len)
                                io_multiplexing_close();
                                rsyserr(FERROR, errno,
                                        "writefd_unbuffered failed to write %ld bytes: phase \"%s\"",
-                                       (long) len, io_write_phase);
+                                       (long)len, io_write_phase);
                                exit_cleanup(RERR_STREAMIO);
                        }
 
@@ -883,10 +883,12 @@ static int io_buffer_count;
 
 void io_start_buffering_out(int fd)
 {
-       if (io_buffer) return;
+       if (io_buffer)
+               return;
        multiplex_out_fd = fd;
        io_buffer = new_array(char, IO_BUFFER_SIZE);
-       if (!io_buffer) out_of_memory("writefd");
+       if (!io_buffer)
+               out_of_memory("writefd");
        io_buffer_count = 0;
 }
 
@@ -952,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);
@@ -960,7 +965,7 @@ static void writefd(int fd,char *buf,size_t len)
        }
 
        while (len) {
-               int n = MIN((int) len, IO_BUFFER_SIZE-io_buffer_count);
+               int n = MIN((int)len, IO_BUFFER_SIZE-io_buffer_count);
                if (n > 0) {
                        memcpy(io_buffer+io_buffer_count, buf, n);
                        buf += n;
@@ -1070,7 +1075,8 @@ void io_printf(int fd, const char *format, ...)
        len = vsnprintf(buf, sizeof buf, format, ap);
        va_end(ap);
 
-       if (len < 0) exit_cleanup(RERR_STREAMIO);
+       if (len < 0)
+               exit_cleanup(RERR_STREAMIO);
 
        write_sbuf(fd, buf);
 }
@@ -1096,7 +1102,8 @@ void io_start_multiplex_in(int fd)
 /** Write an message to the multiplexed data stream. */
 int io_multiplex_write(enum msgcode code, char *buf, size_t len)
 {
-       if (!io_multiplexing_out) return 0;
+       if (!io_multiplexing_out)
+               return 0;
 
        io_flush(NORMAL_FLUSH);
        stats.total_written += (len+4);