X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/8365126b8db2f32522c1d73ddaaa86d8dc4ca1e0..236adddc18cd4f0e3d91183220af10c11c5cc8a2:/generator.c diff --git a/generator.c b/generator.c index eb130150..f4f15bb8 100644 --- a/generator.c +++ b/generator.c @@ -27,6 +27,7 @@ extern int dry_run; extern int do_xfers; extern int stdout_format_has_i; extern int logfile_format_has_i; +extern int receiver_symlink_times; extern int am_root; extern int am_server; extern int am_daemon; @@ -553,7 +554,7 @@ static void do_delete_pass(void) int unchanged_attrs(const char *fname, struct file_struct *file, stat_x *sxp) { -#ifndef HAVE_LUTIMES +#if !defined HAVE_LUTIMES || !defined HAVE_UTIMES if (S_ISLNK(file->mode)) { ; } else @@ -564,7 +565,7 @@ int unchanged_attrs(const char *fname, struct file_struct *file, stat_x *sxp) if (preserve_perms && !BITS_EQUAL(sxp->st.st_mode, file->mode, CHMOD_BITS)) return 0; - if (preserve_executability && ((sxp->st.st_mode & 0111) != 0) ^ ((file->mode & 0111) != 0)) + if (preserve_executability && ((sxp->st.st_mode & 0111 ? 1 : 0) ^ (file->mode & 0111 ? 1 : 0))) return 0; if (am_root && uid_ndx && sxp->st.st_uid != (uid_t)F_OWNER(file)) @@ -599,8 +600,11 @@ 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 - : !S_ISLNK(file->mode); + : S_ISDIR(file->mode) ? preserve_times > 1 : +#if defined HAVE_LUTIMES && defined HAVE_UTIMES + (receiver_symlink_times && !(file->flags & FLAG_TIME_FAILED)) || +#endif + !S_ISLNK(file->mode); if (S_ISREG(file->mode) && F_LENGTH(file) != sxp->st.st_size) iflags |= ITEM_REPORT_SIZE;