Calling maybe_send_keepalive() for protocol_version < 29 is
[rsync/rsync.git] / generator.c
index 5bad8a5..e91a3c0 100644 (file)
@@ -52,6 +52,7 @@ extern int ignore_times;
 extern int size_only;
 extern OFF_T max_size;
 extern int io_timeout;
+extern int ignore_timeout;
 extern int protocol_version;
 extern int fuzzy_basis;
 extern int always_checksum;
@@ -89,12 +90,14 @@ static int unchanged_attrs(struct file_struct *file, STRUCT_STAT *st)
 
 #define SID_UPDATING             ITEM_UPDATING
 #define SID_REPORT_CHECKSUM      ITEM_REPORT_CHECKSUM
+#define SID_USING_ALT_BASIS      ITEM_USING_ALT_BASIS
+/* This flag doesn't get sent, so it must be outside 0xffff. */
 #define SID_NO_DEST_AND_NO_UPDATE (1<<16)
 
 static void itemize(struct file_struct *file, int statret, STRUCT_STAT *st,
                    int32 sflags, int f_out, int ndx)
 {
-       int iflags = sflags & (SID_UPDATING | SID_REPORT_CHECKSUM);
+       int iflags = sflags & 0xffff;
 
        if (statret >= 0) {
                if (S_ISREG(file->mode) && file->length != st->st_size)
@@ -821,11 +824,12 @@ prepare_to_open:
 notify_others:
        write_int(f_out, ndx);
        if (itemizing) {
-               itemize(file, statret, &st, SID_UPDATING
-                       | (always_checksum ? SID_REPORT_CHECKSUM : 0),
-                       f_out, -1);
-               if (inplace && !read_batch)
-                       write_byte(f_out, fnamecmp_type);
+               int iflags = SID_UPDATING;
+               if (always_checksum)
+                       iflags |= SID_REPORT_CHECKSUM;
+               if (fnamecmp_type != FNAMECMP_FNAME)
+                       iflags |= SID_USING_ALT_BASIS;
+               itemize(file, statret, &st, iflags, f_out, -1);
        }
        if (f_out_name >= 0) {
                write_byte(f_out_name, fnamecmp_type);
@@ -878,6 +882,7 @@ void generate_files(int f_out, struct file_list *flist, char *local_name,
        int need_retouch_dir_perms = 0;
        int save_only_existing = only_existing;
        int save_opt_ignore_existing = opt_ignore_existing;
+       int allowed_lull = protocol_version >= 29 ? io_timeout / 2 : 0;
 
        if (verbose > 2) {
                rprintf(FINFO, "generator starting pid=%ld count=%d\n",
@@ -891,9 +896,8 @@ void generate_files(int f_out, struct file_list *flist, char *local_name,
                        : "enabled");
        }
 
-       /* We expect to just sit around now, so don't exit on a timeout.
-        * If we really get a timeout then the other process should exit. */
-       io_timeout = 0;
+       if (protocol_version < 29)
+               io_timeout = 0; /* kluge for older protocol versions */
 
        for (i = 0; i < flist->count; i++) {
                struct file_struct *file = flist->files[i];
@@ -914,6 +918,9 @@ void generate_files(int f_out, struct file_list *flist, char *local_name,
 
                recv_generator(local_name ? local_name : f_name_to(file, fbuf),
                               flist, file, i, f_out, f_out_name);
+
+               if (allowed_lull && !(i % 100))
+                       maybe_send_keepalive(allowed_lull, flist->count);
        }
        recv_generator(NULL, NULL, NULL, 0, -1, -1);
        if (delete_during)
@@ -925,6 +932,10 @@ void generate_files(int f_out, struct file_list *flist, char *local_name,
        update_only = always_checksum = size_only = 0;
        ignore_times = 1;
 
+       /* We expect to just sit around now, so don't exit on a timeout.
+        * If we really get a timeout then the other process should exit. */
+       ignore_timeout = 1;
+
        if (verbose > 2)
                rprintf(FINFO,"generate_files phase=%d\n",phase);
 
@@ -936,6 +947,8 @@ void generate_files(int f_out, struct file_list *flist, char *local_name,
                struct file_struct *file = flist->files[i];
                recv_generator(local_name ? local_name : f_name_to(file, fbuf),
                               flist, file, i, f_out, f_out_name);
+               if (allowed_lull)
+                       maybe_send_keepalive(allowed_lull, flist->count);
        }
 
        phase++;