Switching to GPL 3.
[rsync/rsync.git] / receiver.c
index f7db385..efeb2a9 100644 (file)
@@ -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,
  * 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);