X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/340bd68f5932ef6087a5eaf099dd5db0e90ef646..afc65a5acffdf2a3e8c4b35b4d8ace3aa42773bc:/sender.c diff --git a/sender.c b/sender.c index e771a9e7..9ba82113 100644 --- a/sender.c +++ b/sender.c @@ -35,6 +35,7 @@ extern int make_backups; extern int do_progress; extern int inplace; extern struct stats stats; +extern struct file_list *the_file_list; extern char *log_format; @@ -99,18 +100,16 @@ static struct sum_struct *receive_sums(int f) return s; } -static struct file_list *the_flist; - -void successful_send(int i) +void successful_send(int ndx) { char fname[MAXPATHLEN]; struct file_struct *file; unsigned int offset; - if (!the_flist || i < 0 || i >= the_flist->count) + if (ndx < 0 || ndx >= the_file_list->count) return; - file = the_flist->files[i]; + file = the_file_list->files[ndx]; /* The generator might tell us about symlinks we didn't send. */ if (!(file->flags & FLAG_SENT) && !S_ISLNK(file->mode)) return; @@ -145,8 +144,6 @@ void send_files(struct file_list *flist, int f_out, int f_in) if (verbose > 2) rprintf(FINFO, "send_files starting\n"); - the_flist = flist; - while (1) { unsigned int offset; @@ -167,6 +164,13 @@ void send_files(struct file_list *flist, int f_out, int f_in) } if (i < 0 || i >= flist->count) { + /* Handle the new keep-alive (no-op) packet. */ + if (i == flist->count && protocol_version >= 29 + && read_shortint(f_in) == ITEM_IS_NEW) { + write_int(f_out, i); + write_shortint(f_out, ITEM_IS_NEW); + continue; + } rprintf(FERROR, "Invalid file index %d (count=%d)\n", i, flist->count); exit_cleanup(RERR_PROTOCOL); @@ -204,7 +208,7 @@ void send_files(struct file_list *flist, int f_out, int f_in) iflags = ITEM_UPDATING | ITEM_MISSING_DATA; if (inplace && protocol_version >= 29) { - updating_basis_file = iflags & ITEM_USING_ALT_BASIS; + updating_basis_file = !(iflags & ITEM_USING_ALT_BASIS); } else updating_basis_file = inplace && !make_backups;