Add --omit-link-times and use CAN_SET_SYMLINK_TIMES less.
[rsync.git] / rsync.c
diff --git a/rsync.c b/rsync.c
index c9be42477056a9a001e312abea138a764c2921fd..91fb9e3088e50b4203ee0084a74929233be71d8a 100644 (file)
--- a/rsync.c
+++ b/rsync.c
@@ -489,11 +489,13 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
                set_xattr(fname, file, fnamecmp, sxp);
 #endif
 
-       if (!preserve_times || (S_ISDIR(sxp->st.st_mode) && preserve_times == 1))
+       if (!preserve_times
+        || (!(preserve_times & PRESERVE_DIR_TIMES) && S_ISDIR(sxp->st.st_mode))
+        || (!(preserve_times & PRESERVE_LINK_TIMES) && S_ISLNK(sxp->st.st_mode)))
                flags |= ATTRS_SKIP_MTIME;
        if (!(flags & ATTRS_SKIP_MTIME)
            && cmp_time(sxp->st.st_mtime, file->modtime) != 0) {
-               int ret = set_modtime(fname, file->modtime, F_MOD_NSEC(file), sxp->st.st_mode);
+               int ret = set_modtime(fname, file->modtime, F_MOD_NSEC(file), file->mode);
                if (ret < 0) {
                        rsyserr(FERROR_XFER, errno, "failed to set times on %s",
                                full_fname(fname));