X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/1c3344a105f656a45f6b46e1710c3fc4ab862a9a..16edf86595a5a990a942fa045dfb523dae1fe6cb:/receiver.c diff --git a/receiver.c b/receiver.c index 3b3c51e3..21528a7c 100644 --- a/receiver.c +++ b/receiver.c @@ -22,6 +22,7 @@ #include "rsync.h" extern int verbose; +extern int dry_run; extern int do_xfers; extern int am_server; extern int do_progress; @@ -37,6 +38,7 @@ extern int protocol_version; extern int relative_paths; extern int preserve_hard_links; extern int preserve_perms; +extern int preserve_xattrs; extern int basis_dir_cnt; extern int make_backups; extern int cleanup_got_literal; @@ -123,13 +125,13 @@ int get_tmpname(char *fnametmp, char *fname) static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r, - char *fname, int fd, OFF_T total_size) + const char *fname, int fd, OFF_T total_size) { - static char file_sum1[MD4_SUM_LENGTH]; - static char file_sum2[MD4_SUM_LENGTH]; + static char file_sum1[MAX_DIGEST_LEN]; + static char file_sum2[MAX_DIGEST_LEN]; struct map_struct *mapbuf; struct sum_struct sum; - int32 len; + int32 len, sum_len; OFF_T offset = 0; OFF_T offset2; char *data; @@ -257,15 +259,15 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r, exit_cleanup(RERR_FILEIO); } - sum_end(file_sum1); + sum_len = sum_end(file_sum1); if (mapbuf) unmap_file(mapbuf); - read_buf(f_in,file_sum2,MD4_SUM_LENGTH); + read_buf(f_in, file_sum2, sum_len); if (verbose > 2) rprintf(FINFO,"got file_sum\n"); - if (fd != -1 && memcmp(file_sum1, file_sum2, MD4_SUM_LENGTH) != 0) + if (fd != -1 && memcmp(file_sum1, file_sum2, sum_len) != 0) return 0; return 1; } @@ -366,8 +368,8 @@ int recv_files(int f_in, char *local_name) cleanup_disable(); /* This call also sets cur_flist. */ - ndx = read_ndx_and_attrs(f_in, -1, &iflags, - &fnamecmp_type, xname, &xlen); + ndx = read_ndx_and_attrs(f_in, &iflags, &fnamecmp_type, + xname, &xlen); if (ndx == NDX_DONE) { if (inc_recurse && first_flist) { flist_free(first_flist); @@ -397,8 +399,17 @@ int recv_files(int f_in, char *local_name) if (verbose > 2) rprintf(FINFO, "recv_files(%s)\n", fname); +#ifdef SUPPORT_XATTRS + if (iflags & ITEM_REPORT_XATTR && !dry_run) + recv_xattr_request(file, f_in); +#endif + if (!(iflags & ITEM_TRANSFER)) { maybe_log_item(file, iflags, itemizing, xname); +#ifdef SUPPORT_XATTRS + if (preserve_xattrs && iflags & ITEM_REPORT_XATTR && !dry_run) + set_file_attrs(fname, file, NULL, fname, 0); +#endif continue; } if (phase == 2) { @@ -655,15 +666,15 @@ int recv_files(int f_in, char *local_name) temp_copy_name = NULL; else temp_copy_name = partialptr; - finish_transfer(fname, fnametmp, temp_copy_name, - file, recv_ok, 1); + finish_transfer(fname, fnametmp, fnamecmp, + temp_copy_name, file, recv_ok, 1); if (fnamecmp == partialptr) { do_unlink(partialptr); handle_partial_dir(partialptr, PDIR_DELETE); } } else if (keep_partial && partialptr && handle_partial_dir(partialptr, PDIR_CREATE)) { - finish_transfer(partialptr, fnametmp, NULL, + finish_transfer(partialptr, fnametmp, fnamecmp, NULL, file, recv_ok, !partial_dir); if (delay_updates && recv_ok) { bitbag_set_bit(delayed_bits, ndx);