X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/8e41b68e8f975c02a5d9281be780ba5d1a385107..71845bd2a07eef21074e9f1907d0ba952dafd310:/rsync.c diff --git a/rsync.c b/rsync.c index 4fcdea1d..4f387d63 100644 --- a/rsync.c +++ b/rsync.c @@ -33,7 +33,6 @@ extern int preserve_xattrs; extern int preserve_perms; extern int preserve_executability; extern int preserve_times; -extern int omit_dir_times; extern int am_root; extern int am_server; extern int am_sender; @@ -275,6 +274,7 @@ int set_file_attrs(const char *fname, struct file_struct *file, statx *sxp, statx sx2; int change_uid, change_gid; mode_t new_mode = file->mode; + int inherit; if (!sxp) { if (dry_run) @@ -290,13 +290,15 @@ int set_file_attrs(const char *fname, struct file_struct *file, statx *sxp, #ifdef SUPPORT_XATTRS sx2.xattr = NULL; #endif - if (!preserve_perms && S_ISDIR(new_mode) - && sx2.st.st_mode & S_ISGID) { - /* We just created this directory and its setgid - * bit is on, so make sure it stays on. */ - new_mode |= S_ISGID; - } sxp = &sx2; + inherit = !preserve_perms; + } else + inherit = !preserve_perms && file->flags & FLAG_DIR_CREATED; + + if (inherit && S_ISDIR(new_mode) && sxp->st.st_mode & S_ISGID) { + /* We just created this directory and its setgid + * bit is on, so make sure it stays on. */ + new_mode |= S_ISGID; } #ifdef SUPPORT_ACLS @@ -311,7 +313,7 @@ int set_file_attrs(const char *fname, struct file_struct *file, statx *sxp, set_stat_xattr(fname, file); #endif - if (!preserve_times || (S_ISDIR(sxp->st.st_mode) && omit_dir_times)) + if (!preserve_times || (S_ISDIR(sxp->st.st_mode) && preserve_times == 1)) flags |= ATTRS_SKIP_MTIME; if (!(flags & ATTRS_SKIP_MTIME) && cmp_time(sxp->st.st_mtime, file->modtime) != 0) {