X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/a0456b9c4635be8832fc5712454a75ec102b1176..4fd842f98df4970f6e49a0365dbed60774e56c09:/receiver.c diff --git a/receiver.c b/receiver.c index f7db385b..efeb2a96 100644 --- a/receiver.c +++ b/receiver.c @@ -6,7 +6,7 @@ * Copyright (C) 2003-2007 Wayne Davison * * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as + * it under the terms of the GNU General Public License version 3 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, @@ -15,13 +15,13 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + * with this program; if not, visit the http://fsf.org website. */ #include "rsync.h" extern int verbose; +extern int dry_run; extern int do_xfers; extern int am_server; extern int do_progress; @@ -37,6 +37,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,7 +124,7 @@ 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[MAX_DIGEST_LEN]; static char file_sum2[MAX_DIGEST_LEN]; @@ -366,8 +367,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); @@ -387,7 +388,7 @@ int recv_files(int f_in, char *local_name) rprintf(FINFO, "recv_files phase=%d\n", phase); if (phase == 2 && delay_updates) handle_delayed_updates(local_name); - send_msg(MSG_DONE, "", 0); + send_msg(MSG_DONE, "", 0, 0); continue; } @@ -397,8 +398,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) { @@ -459,6 +469,8 @@ int recv_files(int f_in, char *local_name) "(Skipping batched update for \"%s\")\n", fname); discard_receive_data(f_in, F_LENGTH(file)); + if (inc_recurse) + send_msg_int(MSG_NO_SEND, ndx); continue; } next_gen_ndx = -1; @@ -542,6 +554,8 @@ int recv_files(int f_in, char *local_name) full_fname(fnamecmp)); discard_receive_data(f_in, F_LENGTH(file)); close(fd1); + if (inc_recurse) + send_msg_int(MSG_NO_SEND, ndx); continue; } @@ -555,6 +569,8 @@ int recv_files(int f_in, char *local_name) full_fname(fnamecmp)); discard_receive_data(f_in, F_LENGTH(file)); close(fd1); + if (inc_recurse) + send_msg_int(MSG_NO_SEND, ndx); continue; } @@ -588,6 +604,8 @@ int recv_files(int f_in, char *local_name) discard_receive_data(f_in, F_LENGTH(file)); if (fd1 != -1) close(fd1); + if (inc_recurse) + send_msg_int(MSG_NO_SEND, ndx); continue; } } else { @@ -595,6 +613,8 @@ int recv_files(int f_in, char *local_name) discard_receive_data(f_in, F_LENGTH(file)); if (fd1 != -1) close(fd1); + if (inc_recurse) + send_msg_int(MSG_NO_SEND, ndx); continue; } @@ -621,6 +641,8 @@ int recv_files(int f_in, char *local_name) discard_receive_data(f_in, F_LENGTH(file)); if (fd1 != -1) close(fd1); + if (inc_recurse) + send_msg_int(MSG_NO_SEND, ndx); continue; } @@ -655,15 +677,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);