Split up the ifuncs.h file into 3 .h files.
[rsync/rsync.git] / io.c
diff --git a/io.c b/io.c
index 018dd28..ed556b1 100644 (file)
--- a/io.c
+++ b/io.c
@@ -29,6 +29,7 @@
 
 #include "rsync.h"
 #include "ifuncs.h"
+#include "inums.h"
 
 /** If no timeout is specified then use a 60 second select timeout */
 #define SELECT_TIMEOUT 60
@@ -36,7 +37,6 @@
 extern int bwlimit;
 extern size_t bwlimit_writemax;
 extern int io_timeout;
-extern int allowed_lull;
 extern int am_server;
 extern int am_daemon;
 extern int am_sender;
@@ -47,7 +47,6 @@ extern int eol_nulls;
 extern int flist_eof;
 extern int list_only;
 extern int read_batch;
-extern int csum_length;
 extern int protect_args;
 extern int checksum_seed;
 extern int protocol_version;
@@ -60,7 +59,8 @@ extern int filesfrom_convert;
 extern iconv_t ic_send, ic_recv;
 #endif
 
-const char phase_unknown[] = "unknown";
+int csum_length = SHORT_SUM_LENGTH; /* initial value */
+int allowed_lull = 0;
 int ignore_timeout = 0;
 int batch_fd = -1;
 int msgdone_cnt = 0;
@@ -101,7 +101,7 @@ static char ff_lastchar;
 #ifdef ICONV_OPTION
 static xbuf iconv_buf = EMPTY_XBUF;
 #endif
-static int defer_forwarding_messages = 0, defer_forwarding_keep = 0;
+static int defer_forwarding_messages = 0, keep_defer_forwarding = 0;
 static int select_timeout = SELECT_TIMEOUT;
 static int active_filecnt = 0;
 static OFF_T active_bytecnt = 0;
@@ -183,9 +183,7 @@ static int flist_ndx_pop(struct flist_ndx_list *lp)
 static void got_flist_entry_status(enum festatus status, const char *buf)
 {
        int ndx = IVAL(buf, 0);
-       struct file_list *flist = flist_for_ndx(ndx);
-
-       assert(flist != NULL);
+       struct file_list *flist = flist_for_ndx(ndx, "got_flist_entry_status");
 
        if (remove_source_files) {
                active_filecnt--;
@@ -296,33 +294,32 @@ static void msg_list_add(struct msg_list *lst, int code, const char *buf, int le
        lst->tail = m;
 }
 
+static inline int flush_a_msg(int fd)
+{
+       struct msg_list_item *m = msg_queue.head;
+       int len = IVAL(m->buf, 0) & 0xFFFFFF;
+       int tag = *((uchar*)m->buf+3) - MPLEX_BASE;
+
+       if (!(msg_queue.head = m->next))
+               msg_queue.tail = NULL;
+
+       defer_forwarding_messages++;
+       mplex_write(fd, tag, m->buf + 4, len, m->convert);
+       defer_forwarding_messages--;
+
+       free(m);
+
+       return len;
+}
+
 static void msg_flush(void)
 {
        if (am_generator) {
-               while (msg_queue.head && io_multiplexing_out) {
-                       struct msg_list_item *m = msg_queue.head;
-                       int len = IVAL(m->buf, 0) & 0xFFFFFF;
-                       int tag = *((uchar*)m->buf+3) - MPLEX_BASE;
-                       if (!(msg_queue.head = m->next))
-                               msg_queue.tail = NULL;
-                       stats.total_written += len + 4;
-                       defer_forwarding_messages++;
-                       mplex_write(sock_f_out, tag, m->buf + 4, len, m->convert);
-                       defer_forwarding_messages--;
-                       free(m);
-               }
+               while (msg_queue.head && io_multiplexing_out)
+                       stats.total_written += flush_a_msg(sock_f_out) + 4;
        } else {
-               while (msg_queue.head) {
-                       struct msg_list_item *m = msg_queue.head;
-                       int len = IVAL(m->buf, 0) & 0xFFFFFF;
-                       int tag = *((uchar*)m->buf+3) - MPLEX_BASE;
-                       if (!(msg_queue.head = m->next))
-                               msg_queue.tail = NULL;
-                       defer_forwarding_messages++;
-                       mplex_write(msg_fd_out, tag, m->buf + 4, len, m->convert);
-                       defer_forwarding_messages--;
-                       free(m);
-               }
+               while (msg_queue.head)
+                       (void)flush_a_msg(msg_fd_out);
        }
 }
 
@@ -352,8 +349,7 @@ static void check_for_d_option_error(const char *msg)
 
        if (saw_d) {
                rprintf(FWARNING,
-                       "*** Try adding \"-r --exclude='/*/*'\" "
-                       "if remote rsync is <= 2.6.3 ***\n");
+                   "*** Try using \"--old-d\" if remote rsync is <= 2.6.3 ***\n");
        }
 }
 
@@ -409,7 +405,7 @@ static void read_msg_fd(void)
                /* Read extra file list from receiver. */
                assert(iobuf_in != NULL);
                assert(iobuf_f_in == fd);
-               if (verbose > 3) {
+               if (DEBUG_GTE(FLIST, 2)) {
                        rprintf(FINFO, "[%s] receiving flist for dir %d\n",
                                who_am_i(), IVAL(buf,0));
                }
@@ -450,6 +446,7 @@ static void read_msg_fd(void)
                got_flist_entry_status(FES_NO_SEND, buf);
                break;
        case MSG_ERROR_SOCKET:
+       case MSG_ERROR_UTF8:
        case MSG_CLIENT:
                if (!am_generator)
                        goto invalid_msg;
@@ -513,7 +510,7 @@ static void mplex_write(int fd, enum msgcode code, const char *buf, size_t len,
                xbuf outbuf, inbuf;
 
                INIT_XBUF(outbuf, buffer + 4, 0, sizeof buffer - 4);
-               INIT_XBUF(inbuf, (char*)buf, len, -1);
+               INIT_XBUF(inbuf, (char*)buf, len, (size_t)-1);
 
                iconvbufs(ic_send, &inbuf, &outbuf,
                          ICB_INCLUDE_BAD | ICB_INCLUDE_INCOMPLETE);
@@ -532,9 +529,9 @@ static void mplex_write(int fd, enum msgcode code, const char *buf, size_t len,
 
        SIVAL(buffer, 0, ((MPLEX_BASE + (int)code)<<24) + len);
 
-       defer_forwarding_keep = 1; /* defer_forwarding_messages++ on return */
+       keep_defer_forwarding++; /* defer_forwarding_messages++ on return */
        writefd_unbuffered(fd, buffer, n+4);
-       defer_forwarding_keep = 0;
+       keep_defer_forwarding--;
 
        if (len > n)
                writefd_unbuffered(fd, buf+n, len-n);
@@ -569,10 +566,9 @@ void send_msg_int(enum msgcode code, int num)
 
 void wait_for_receiver(void)
 {
-       if (iobuf_out_cnt)
-               io_flush(NORMAL_FLUSH);
-       else
-               read_msg_fd();
+       if (io_flush(FULL_FLUSH))
+               return;
+       read_msg_fd();
 }
 
 int get_redo_num(void)
@@ -630,8 +626,8 @@ static void whine_about_eof(int fd)
        }
 
        rprintf(FERROR, RSYNC_NAME ": connection unexpectedly closed "
-               "(%.0f bytes received so far) [%s]\n",
-               (double)stats.total_read, who_am_i());
+               "(%s bytes received so far) [%s]\n",
+               big_num(stats.total_read), who_am_i());
 
        exit_cleanup(RERR_STREAMIO);
 }
@@ -921,6 +917,8 @@ void read_args(int f_in, char *mod_name, char *buf, size_t bufsiz, int rl_nulls,
        }
        argv[argc] = NULL;
 
+       glob_expand(NULL, NULL, NULL, NULL);
+
        *argc_p = argc;
        *argv_p = argv;
 }
@@ -1091,10 +1089,9 @@ static int readfd_unbuffered(int fd, char *buf, size_t len)
                                xbuf outbuf, inbuf;
                                char ibuf[512];
                                int add_null = 0;
-                               int pos = 0;
 
                                INIT_CONST_XBUF(outbuf, line);
-                               INIT_XBUF(inbuf, ibuf, 0, -1);
+                               INIT_XBUF(inbuf, ibuf, 0, (size_t)-1);
 
                                while (msg_bytes) {
                                        inbuf.len = msg_bytes > sizeof ibuf
@@ -1106,7 +1103,6 @@ static int readfd_unbuffered(int fd, char *buf, size_t len)
                                        if (iconvbufs(ic_send, &inbuf, &outbuf,
                                            ICB_INCLUDE_BAD | ICB_INCLUDE_INCOMPLETE) < 0)
                                                goto overflow;
-                                       pos = -1;
                                }
                                if (add_null) {
                                        if (outbuf.len == outbuf.size)
@@ -1353,6 +1349,7 @@ int read_vstring(int f, char *buf, int bufsize)
  * called by both the sender and the receiver. */
 void read_sum_head(int f, struct sum_struct *sum)
 {
+       int32 max_blength = protocol_version < 30 ? OLD_MAX_BLOCK_SIZE : MAX_BLOCK_SIZE;
        sum->count = read_int(f);
        if (sum->count < 0) {
                rprintf(FERROR, "Invalid checksum count %ld [%s]\n",
@@ -1360,7 +1357,7 @@ void read_sum_head(int f, struct sum_struct *sum)
                exit_cleanup(RERR_PROTOCOL);
        }
        sum->blength = read_int(f);
-       if (sum->blength < 0 || sum->blength > MAX_BLOCK_SIZE) {
+       if (sum->blength < 0 || sum->blength > max_blength) {
                rprintf(FERROR, "Invalid block length %ld [%s]\n",
                        (long)sum->blength, who_am_i());
                exit_cleanup(RERR_PROTOCOL);
@@ -1553,24 +1550,34 @@ static void writefd_unbuffered(int fd, const char *buf, size_t len)
        }
 
        no_flush--;
-       defer_inc -= defer_forwarding_keep;
+       if (keep_defer_forwarding)
+               defer_inc--;
        if (!(defer_forwarding_messages -= defer_inc) && !no_flush)
                msg_flush();
 }
 
-void io_flush(int flush_it_all)
+int io_flush(int flush_it_all)
 {
-       if (!iobuf_out_cnt || no_flush)
-               return;
+       int flushed_something = 0;
 
-       if (io_multiplexing_out)
-               mplex_write(sock_f_out, MSG_DATA, iobuf_out, iobuf_out_cnt, 0);
-       else
-               writefd_unbuffered(iobuf_f_out, iobuf_out, iobuf_out_cnt);
-       iobuf_out_cnt = 0;
+       if (no_flush)
+               return 0;
+
+       if (iobuf_out_cnt) {
+               if (io_multiplexing_out)
+                       mplex_write(sock_f_out, MSG_DATA, iobuf_out, iobuf_out_cnt, 0);
+               else
+                       writefd_unbuffered(iobuf_f_out, iobuf_out, iobuf_out_cnt);
+               iobuf_out_cnt = 0;
+               flushed_something = 1;
+       }
 
-       if (flush_it_all && !defer_forwarding_messages)
+       if (flush_it_all && !defer_forwarding_messages && msg_queue.head) {
                msg_flush();
+               flushed_something = 1;
+       }
+
+       return flushed_something;
 }
 
 static void writefd(int fd, const char *buf, size_t len)