Mention that --keep-dirlinks can be dangerous if there are
[rsync/rsync.git] / io.c
diff --git a/io.c b/io.c
index e8a0709..cb485b8 100644 (file)
--- a/io.c
+++ b/io.c
@@ -53,7 +53,7 @@ extern int protocol_version;
 extern int remove_source_files;
 extern int preserve_hard_links;
 extern struct stats stats;
-extern struct file_list *cur_flist, *first_flist;
+extern struct file_list *cur_flist;
 #ifdef ICONV_OPTION
 extern int filesfrom_convert;
 extern iconv_t ic_send, ic_recv;
@@ -181,7 +181,6 @@ static void got_flist_entry_status(enum festatus status, const char *buf)
        struct file_list *flist = flist_for_ndx(ndx);
 
        assert(flist != NULL);
-       assert(ndx >= flist->ndx_start);
 
        if (remove_source_files) {
                active_filecnt--;
@@ -197,8 +196,10 @@ static void got_flist_entry_status(enum festatus status, const char *buf)
                        send_msg(MSG_SUCCESS, buf, 4, 0);
                if (preserve_hard_links) {
                        struct file_struct *file = flist->files[ndx - flist->ndx_start];
-                       if (F_IS_HLINKED(file))
+                       if (F_IS_HLINKED(file)) {
                                flist_ndx_push(&hlink_list, ndx);
+                               flist->in_progress++;
+                       }
                }
                break;
        case FES_REDO:
@@ -388,6 +389,12 @@ static void read_msg_fd(void)
                        goto invalid_msg;
                flist_eof = 1;
                break;
+       case MSG_IO_ERROR:
+               if (len != 4)
+                       goto invalid_msg;
+               readfd(fd, buf, len);
+               io_error |= IVAL(buf, 0);
+               break;
        case MSG_DELETED:
                if (len >= (int)sizeof buf || !am_generator)
                        goto invalid_msg;
@@ -1041,6 +1048,7 @@ static int readfd_unbuffered(int fd, char *buf, size_t len)
                        if (msg_bytes != 4)
                                goto invalid_msg;
                        read_loop(fd, line, msg_bytes);
+                       send_msg_int(MSG_IO_ERROR, IVAL(line, 0));
                        io_error |= IVAL(line, 0);
                        break;
                case MSG_DELETED:
@@ -1854,6 +1862,8 @@ void start_write_batch(int fd)
         * actual communication so far depends on whether a daemon
         * is involved. */
        write_int(batch_fd, protocol_version);
+       if (protocol_version >= 30)
+               write_byte(batch_fd, inc_recurse);
        write_int(batch_fd, checksum_seed);
 
        if (am_sender)