When using --iconv, if a server-side receiver can't convert a filename,
[rsync/rsync.git] / io.c
diff --git a/io.c b/io.c
index b21dff4..2756b14 100644 (file)
--- a/io.c
+++ b/io.c
@@ -36,7 +36,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 +46,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,10 +58,12 @@ 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;
+int check_for_io_err = 0;
 
 /* Ignore an EOF error if non-zero. See whine_about_eof(). */
 int kluge_around_eof = 0;
@@ -380,6 +380,8 @@ static void read_msg_fd(void)
        len = tag & 0xFFFFFF;
        tag = (tag >> 24) - MPLEX_BASE;
 
+       check_for_io_err = 0;
+
        switch (tag) {
        case MSG_DONE:
                if (len < 0 || len > 1 || !am_generator) {
@@ -414,6 +416,9 @@ static void read_msg_fd(void)
                }
                flist = recv_file_list(fd);
                flist->parent_ndx = IVAL(buf,0);
+               /* If the sender is going to send us an MSG_IO_ERROR value, it
+                * will always be the very next message following MSG_FLIST. */
+               check_for_io_err = 1;
 #ifdef SUPPORT_HARD_LINKS
                if (preserve_hard_links)
                        match_hard_links(flist);
@@ -449,6 +454,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;
@@ -512,7 +518,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);
@@ -629,8 +635,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, 0), who_am_i());
 
        exit_cleanup(RERR_STREAMIO);
 }
@@ -1061,6 +1067,8 @@ static int readfd_unbuffered(int fd, char *buf, size_t len)
                msg_bytes = tag & 0xFFFFFF;
                tag = (tag >> 24) - MPLEX_BASE;
 
+               check_for_io_err = 0;
+
                switch (tag) {
                case MSG_DATA:
                        if (msg_bytes > iobuf_in_siz) {
@@ -1092,10 +1100,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
@@ -1107,7 +1114,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)