X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/6087ef2a84efd4e40cc9527d71da317845a1ea53..96b7b48efa86bf3fa164d85532dc8bf520d80531:/sender.c diff --git a/sender.c b/sender.c index adfe7d55..f54542b5 100644 --- a/sender.c +++ b/sender.c @@ -125,8 +125,8 @@ void successful_send(int ndx) } } -static void write_item_attrs(int f_out, int ndx, int iflags, - uchar fnamecmp_type, char *buf, int len) +static void write_ndx_and_attrs(int f_out, int ndx, int iflags, + uchar fnamecmp_type, char *buf, int len) { write_int(f_out, ndx); if (protocol_version < 29) @@ -134,11 +134,8 @@ static void write_item_attrs(int f_out, int ndx, int iflags, write_shortint(f_out, iflags); if (iflags & ITEM_BASIS_TYPE_FOLLOWS) write_byte(f_out, fnamecmp_type); - if (iflags & ITEM_XNAME_FOLLOWS) { - if (len < 0) - len = strlen(buf); + if (iflags & ITEM_XNAME_FOLLOWS) write_vstring(f_out, buf, len); - } } /* This is also used by receive.c with f_out = -1. */ @@ -149,18 +146,17 @@ int read_item_attrs(int f_in, int f_out, int ndx, uchar *type_ptr, uchar fnamecmp_type = FNAMECMP_FNAME; int iflags = protocol_version >= 29 ? read_shortint(f_in) : ITEM_TRANSFER | ITEM_MISSING_DATA; - int isave = iflags; /* XXX remove soon */ /* Handle the new keep-alive (no-op) packet. */ if (ndx == the_file_list->count && iflags == ITEM_IS_NEW) ; else if (ndx < 0 || ndx >= the_file_list->count) { - rprintf(FERROR, "Invalid file index %d (count=%d) [%s]\n", + rprintf(FERROR, "Invalid file index: %d (count=%d) [%s]\n", ndx, the_file_list->count, who_am_i()); exit_cleanup(RERR_PROTOCOL); } else if (iflags == ITEM_IS_NEW) { - rprintf(FERROR, "Invalid itemized flag word [%s]\n", - who_am_i()); + rprintf(FERROR, "Invalid itemized flag word: %x [%s]\n", + iflags, who_am_i()); exit_cleanup(RERR_PROTOCOL); } @@ -177,23 +173,20 @@ int read_item_attrs(int f_in, int f_out, int ndx, uchar *type_ptr, } *len_ptr = len; - /* XXX Temporary backward compatibility when talking to 2.6.4pre[12] */ - if (protocol_version >= 29 && iflags & ITEM_TRANSFER - && !S_ISREG(the_file_list->files[ndx]->mode)) { - iflags &= ~ITEM_TRANSFER; - iflags |= ITEM_LOCAL_CHANGE; - } + /* Temporary handling of 2.6.4pre3 */ + if (iflags & ITEM_DUMMY_BIT && iflags & (ITEM_LOCAL_CHANGE|ITEM_TRANSFER)) + iflags &= ~ITEM_DUMMY_BIT; if (iflags & ITEM_TRANSFER) { if (!S_ISREG(the_file_list->files[ndx]->mode)) { rprintf(FERROR, - "received index of non-regular file: %d [%s]\n", + "received request to transfer non-regular file: %d [%s]\n", ndx, who_am_i()); exit_cleanup(RERR_PROTOCOL); } } else if (f_out >= 0) { - write_item_attrs(f_out, ndx, isave /*XXX iflags */, - fnamecmp_type, buf, len); + write_ndx_and_attrs(f_out, ndx, iflags, + fnamecmp_type, buf, len); } return iflags; @@ -210,7 +203,7 @@ void send_files(struct file_list *flist, int f_out, int f_in) uchar fnamecmp_type; int iflags, xlen; struct file_struct *file; - int phase = 0; + int phase = 0, max_phase = protocol_version >= 29 ? 2 : 1; struct stats initial_stats; int save_make_backups = make_backups; int itemizing = am_daemon ? daemon_log_format_has_i @@ -225,18 +218,16 @@ void send_files(struct file_list *flist, int f_out, int f_in) i = read_int(f_in); if (i == -1) { - if (phase == 0) { - phase++; - csum_length = SUM_LENGTH; - write_int(f_out, -1); - if (verbose > 2) - rprintf(FINFO, "send_files phase=%d\n", phase); - /* For inplace: redo phase turns off the backup - * flag so that we do a regular inplace send. */ - make_backups = 0; - continue; - } - break; + if (++phase > max_phase) + break; + csum_length = SUM_LENGTH; + if (verbose > 2) + rprintf(FINFO, "send_files phase=%d\n", phase); + write_int(f_out, -1); + /* For inplace: redo phase turns off the backup + * flag so that we do a regular inplace send. */ + make_backups = 0; + continue; } iflags = read_item_attrs(f_in, f_out, i, &fnamecmp_type, @@ -261,6 +252,12 @@ void send_files(struct file_list *flist, int f_out, int f_in) maybe_log_item(file, iflags, itemizing, xname); continue; } + if (phase == 2) { + rprintf(FERROR, + "got transfer request in phase 2 [%s]\n", + who_am_i()); + exit_cleanup(RERR_PROTOCOL); + } updating_basis_file = inplace && (protocol_version >= 29 ? fnamecmp_type == FNAMECMP_FNAME : !make_backups); @@ -272,8 +269,8 @@ void send_files(struct file_list *flist, int f_out, int f_in) if (dry_run) { /* log the transfer */ if (!am_server && log_format) log_item(file, &stats, iflags, NULL); - write_item_attrs(f_out, i, iflags, fnamecmp_type, - xname, xlen); + write_ndx_and_attrs(f_out, i, iflags, fnamecmp_type, + xname, xlen); continue; } @@ -324,7 +321,8 @@ void send_files(struct file_list *flist, int f_out, int f_in) safe_fname(fname), (double)st.st_size); } - write_item_attrs(f_out, i, iflags, fnamecmp_type, xname, xlen); + write_ndx_and_attrs(f_out, i, iflags, fnamecmp_type, + xname, xlen); write_sum_head(f_out, s); if (verbose > 2) {