Fixed some backward-compatibility issues with --files-from.
[rsync/rsync.git] / flist.c
diff --git a/flist.c b/flist.c
index 5a1ab9d..622fb4e 100644 (file)
--- a/flist.c
+++ b/flist.c
@@ -52,6 +52,7 @@ extern int preserve_hard_links;
 extern int preserve_devices;
 extern int preserve_specials;
 extern int missing_args;
+extern int sock_f_in;
 extern int uid_ndx;
 extern int gid_ndx;
 extern int eol_nulls;
@@ -731,7 +732,7 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
                INIT_CONST_XBUF(outbuf, thisname);
                INIT_XBUF(inbuf, lastname, basename_len, (size_t)-1);
 
-               if (iconvbufs(ic_recv, &inbuf, &outbuf, 0) < 0) {
+               if (iconvbufs(ic_recv, &inbuf, &outbuf, ICB_INIT) < 0) {
                        io_error |= IOERR_GENERAL;
                        rprintf(FERROR_UTF8,
                            "[%s] cannot convert filename: %s (%s)\n",
@@ -1049,7 +1050,7 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
                                read_sbuf(f, inbuf.buf, inbuf.len);
                                INIT_XBUF(outbuf, bp, 0, alloc_len);
 
-                               if (iconvbufs(ic_recv, &inbuf, &outbuf, 0) < 0) {
+                               if (iconvbufs(ic_recv, &inbuf, &outbuf, ICB_INIT) < 0) {
                                        io_error |= IOERR_GENERAL;
                                        rprintf(FERROR_XFER,
                                            "[%s] cannot convert symlink data for: %s (%s)\n",
@@ -1464,14 +1465,14 @@ static struct file_struct *send_file_name(int f, struct file_list *flist,
                        if (file->dirname) {
                                INIT_XBUF_STRLEN(inbuf, (char*)file->dirname);
                                outbuf.size -= 2; /* Reserve room for '/' & 1 more char. */
-                               if (iconvbufs(ic_send, &inbuf, &outbuf, 0) < 0)
+                               if (iconvbufs(ic_send, &inbuf, &outbuf, ICB_INIT) < 0)
                                        goto convert_error;
                                outbuf.size += 2;
                                fbuf[outbuf.len++] = '/';
                        }
 
                        INIT_XBUF_STRLEN(inbuf, (char*)file->basename);
-                       if (iconvbufs(ic_send, &inbuf, &outbuf, 0) < 0) {
+                       if (iconvbufs(ic_send, &inbuf, &outbuf, ICB_INIT) < 0) {
                          convert_error:
                                io_error |= IOERR_GENERAL;
                                rprintf(FERROR_XFER,
@@ -1485,7 +1486,7 @@ static struct file_struct *send_file_name(int f, struct file_list *flist,
                        if (symlink_len && sender_symlink_iconv) {
                                INIT_XBUF(inbuf, (char*)symlink_name, symlink_len, (size_t)-1);
                                INIT_CONST_XBUF(outbuf, symlink_buf);
-                               if (iconvbufs(ic_send, &inbuf, &outbuf, 0) < 0) {
+                               if (iconvbufs(ic_send, &inbuf, &outbuf, ICB_INIT) < 0) {
                                        io_error |= IOERR_GENERAL;
                                        f_name(file, fbuf);
                                        rprintf(FERROR_XFER,
@@ -2092,6 +2093,13 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
                                full_fname(argv[0]));
                        exit_cleanup(RERR_FILESELECT);
                }
+               if (protocol_version == 30) {
+                       /* Older protocols send the files-from data w/o packaging it in
+                        * multiplexed I/O packets, but protocol 30 messed up and did
+                        * this after starting multiplexing.  We'll temporarily switch
+                        * to buffered I/O to match this behavior. */
+                       io_end_multiplex_in(MPLX_TO_BUFFERED);
+               }
                use_ff_fd = 1;
        }
 
@@ -2297,6 +2305,9 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
                        send_file_name(f, flist, fbuf, &st, flags, NO_FILTERS);
        }
 
+       if (use_ff_fd && protocol_version == 30)
+               io_start_multiplex_in(sock_f_in);
+
        gettimeofday(&end_tv, NULL);
        stats.flist_buildtime = (int64)(end_tv.tv_sec - start_tv.tv_sec) * 1000
                              + (end_tv.tv_usec - start_tv.tv_usec) / 1000;
@@ -2352,7 +2363,7 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
                send_msg_int(MSG_IO_ERROR, io_error);
 
        if (disable_buffering)
-               io_end_buffering_out(True);
+               io_end_buffering_out(IOBUF_FREE_BUFS);
 
        stats.flist_size = stats.total_written - start_write;
        stats.num_files = flist->used;