This should fix another checker warning.
[rsync/rsync.git] / generator.c
index 5f6afd6..b5db075 100644 (file)
@@ -91,7 +91,6 @@ extern int max_delete;
 extern int force_delete;
 extern int one_file_system;
 extern int skipped_deletes;
-extern struct stats stats;
 extern dev_t filesystem_dev;
 extern mode_t orig_umask;
 extern uid_t our_uid;
@@ -392,7 +391,7 @@ static void do_delete_pass(void)
 
 int unchanged_attrs(const char *fname, struct file_struct *file, stat_x *sxp)
 {
-#if !defined HAVE_LUTIMES || !defined HAVE_UTIMES
+#ifndef CAN_SET_SYMLINK_TIMES
        if (S_ISLNK(file->mode)) {
                ;
        } else
@@ -417,7 +416,7 @@ int unchanged_attrs(const char *fname, struct file_struct *file, stat_x *sxp)
        if (preserve_acls && !S_ISLNK(file->mode)) {
                if (!ACL_READY(*sxp))
                        get_acl(fname, sxp);
-               if (set_acl(NULL, file, sxp) == 0)
+               if (set_acl(NULL, file, sxp, file->mode))
                        return 0;
        }
 #endif
@@ -440,7 +439,7 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
        if (statret >= 0) { /* A from-dest-dir statret can == 1! */
                int keep_time = !preserve_times ? 0
                    : S_ISDIR(file->mode) ? preserve_times > 1 :
-#if defined HAVE_LUTIMES && defined HAVE_UTIMES
+#ifdef CAN_SET_SYMLINK_TIMES
                    1;
 #else
                    !S_ISLNK(file->mode);
@@ -476,7 +475,7 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
                if (preserve_acls && !S_ISLNK(file->mode)) {
                        if (!ACL_READY(*sxp))
                                get_acl(fnamecmp, sxp);
-                       if (set_acl(NULL, file, sxp) == 0)
+                       if (set_acl(NULL, file, sxp, file->mode))
                                iflags |= ITEM_REPORT_ACL;
                }
 #endif
@@ -516,7 +515,7 @@ void itemize(const char *fnamecmp, struct file_struct *file, int ndx, int statre
 #endif
                } else if (ndx >= 0) {
                        enum logcode code = logfile_format_has_i ? FINFO : FCLIENT;
-                       log_item(code, file, &stats, iflags, xname);
+                       log_item(code, file, iflags, xname);
                }
        }
 }
@@ -1893,6 +1892,7 @@ static void touch_up_dirs(struct file_list *flist, int ndx)
        static int counter = 0;
        struct file_struct *file;
        char *fname;
+       BOOL fix_dir_perms;
        int i, start, end;
 
        if (ndx < 0) {
@@ -1913,17 +1913,19 @@ static void touch_up_dirs(struct file_list *flist, int ndx)
                        rprintf(FINFO, "touch_up_dirs: %s (%d)\n",
                                NS(fname), i);
                }
+               /* Be sure not to retouch permissions with --fake-super. */
+               fix_dir_perms = !am_root && !(file->mode & S_IWUSR);
                if (!F_IS_ACTIVE(file) || file->flags & FLAG_MISSING_DIR
-                || (!need_retouch_dir_times && file->mode & S_IWUSR))
+                || !(need_retouch_dir_times || fix_dir_perms))
                        continue;
                fname = f_name(file, NULL);
-               if (!(file->mode & S_IWUSR))
+               if (fix_dir_perms)
                        do_chmod(fname, file->mode);
                if (need_retouch_dir_times) {
                        STRUCT_STAT st;
                        if (link_stat(fname, &st, 0) == 0
                         && cmp_time(st.st_mtime, file->modtime) != 0)
-                               set_modtime(fname, file->modtime, file->mode);
+                               set_modtime(fname, file->modtime, F_MOD_NSEC(file), file->mode);
                }
                if (counter >= loopchk_limit) {
                        if (allowed_lull)