The ACL support has arrived! This version has a brand new protocol
[rsync/rsync.git] / receiver.c
index 62d024c..3b3c51e 100644 (file)
@@ -3,12 +3,11 @@
  *
  * Copyright (C) 1996-2000 Andrew Tridgell
  * Copyright (C) 1996 Paul Mackerras
- * Copyright (C) 2003, 2004, 2005, 2006 Wayne Davison
+ * 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 as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -26,7 +25,7 @@ extern int verbose;
 extern int do_xfers;
 extern int am_server;
 extern int do_progress;
-extern int incremental;
+extern int inc_recurse;
 extern int log_before_transfer;
 extern int stdout_format_has_i;
 extern int logfile_format_has_i;
@@ -36,16 +35,19 @@ extern int write_batch;
 extern int batch_gen_fd;
 extern int protocol_version;
 extern int relative_paths;
+extern int preserve_hard_links;
 extern int preserve_perms;
 extern int basis_dir_cnt;
 extern int make_backups;
 extern int cleanup_got_literal;
+extern int remove_source_files;
 extern int append_mode;
 extern int sparse_files;
 extern int keep_partial;
 extern int checksum_seed;
 extern int inplace;
 extern int delay_updates;
+extern mode_t orig_umask;
 extern struct stats stats;
 extern char *tmpdir;
 extern char *partial_dir;
@@ -316,7 +318,7 @@ static int get_next_gen_ndx(int fd, int next_gen_ndx, int desired_ndx)
                }
                next_gen_ndx = read_int(fd);
                if (next_gen_ndx == -1) {
-                       if (incremental)
+                       if (inc_recurse)
                                next_gen_ndx = first_flist->prev->count + first_flist->prev->ndx_start;
                        else
                                next_gen_ndx = cur_flist->count;
@@ -346,6 +348,10 @@ int recv_files(int f_in, char *local_name)
        int itemizing = am_server ? logfile_format_has_i : stdout_format_has_i;
        enum logcode log_code = log_before_transfer ? FLOG : FINFO;
        int max_phase = protocol_version >= 29 ? 2 : 1;
+       int dflt_perms = (ACCESSPERMS & ~orig_umask);
+#ifdef SUPPORT_ACLS
+       const char *parent_dirname = "";
+#endif
        int ndx, recv_ok;
 
        if (verbose > 2)
@@ -363,13 +369,13 @@ int recv_files(int f_in, char *local_name)
                ndx = read_ndx_and_attrs(f_in, -1, &iflags,
                                         &fnamecmp_type, xname, &xlen);
                if (ndx == NDX_DONE) {
-                       if (incremental && first_flist) {
+                       if (inc_recurse && first_flist) {
                                flist_free(first_flist);
                                if (first_flist)
                                        continue;
                        }
                        if (read_batch && cur_flist) {
-                               int high = incremental
+                               int high = inc_recurse
                                    ? first_flist->prev->count + first_flist->prev->ndx_start
                                    : cur_flist->count;
                                get_next_gen_ndx(batch_gen_fd, next_gen_ndx, high);
@@ -561,7 +567,16 @@ int recv_files(int f_in, char *local_name)
                 * mode based on the local permissions and some heuristics. */
                if (!preserve_perms) {
                        int exists = fd1 != -1;
-                       file->mode = dest_mode(file->mode, st.st_mode, exists);
+#ifdef SUPPORT_ACLS
+                       const char *dn = file->dirname ? file->dirname : ".";
+                       if (parent_dirname != dn
+                        && strcmp(parent_dirname, dn) != 0) {
+                               dflt_perms = default_perms_for_dir(dn);
+                               parent_dirname = dn;
+                       }
+#endif
+                       file->mode = dest_mode(file->mode, st.st_mode,
+                                              dflt_perms, exists);
                }
 
                /* We now check to see if we are writing the file "inplace" */
@@ -662,7 +677,7 @@ int recv_files(int f_in, char *local_name)
                cleanup_disable();
 
                if (recv_ok > 0) {
-                       if (remove_source_files || incremental
+                       if (remove_source_files || inc_recurse
                         || (preserve_hard_links && F_IS_HLINKED(file)))
                                send_msg_int(MSG_SUCCESS, ndx);
                } else if (!recv_ok) {
@@ -689,7 +704,7 @@ int recv_files(int f_in, char *local_name)
                        if (!redoing) {
                                send_msg_int(MSG_REDO, ndx);
                                file->flags |= FLAG_FILE_SENT;
-                       } else if (incremental)
+                       } else if (inc_recurse)
                                send_msg_int(MSG_NO_SEND, ndx);
                }
        }