Changed the test for the 2.6.8 bug to preserve owner and group.
[rsync/rsync.git] / generator.c
index a98ba9a..55f0e4a 100644 (file)
@@ -520,8 +520,7 @@ static void do_delete_pass(struct file_list *flist)
 
 int unchanged_attrs(struct file_struct *file, STRUCT_STAT *st)
 {
-       if (preserve_perms
-        && (unsigned)(st->st_mode & CHMOD_BITS) != (file->mode & CHMOD_BITS))
+       if (preserve_perms && !BITS_EQUAL(st->st_mode, file->mode, CHMOD_BITS))
                return 0;
 
        if (am_root && preserve_uid && st->st_uid != F_UID(file))
@@ -548,7 +547,7 @@ void itemize(struct file_struct *file, int ndx, int statret, STRUCT_STAT *st,
                  && (!(iflags & ITEM_XNAME_FOLLOWS) || *xname))
                 || (keep_time && cmp_time(file->modtime, st->st_mtime) != 0))
                        iflags |= ITEM_REPORT_TIME;
-               if ((unsigned)(st->st_mode & CHMOD_BITS) != (file->mode & CHMOD_BITS))
+               if (!BITS_EQUAL(st->st_mode, file->mode, CHMOD_BITS))
                        iflags |= ITEM_REPORT_PERMS;
                if (preserve_uid && am_root && F_UID(file) != st->st_uid)
                        iflags |= ITEM_REPORT_OWNER;
@@ -1239,7 +1238,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
        }
 
 #ifdef SUPPORT_HARD_LINKS
-       if (preserve_hard_links && F_NOT_HLINK_FIRST(file)
+       if (preserve_hard_links && F_HLINK_NOT_FIRST(file)
         && hard_link_check(file, ndx, fname, statret, &st, itemizing, code))
                return;
 #endif
@@ -1298,7 +1297,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
                                statret = 1;
                }
 #ifdef SUPPORT_HARD_LINKS
-               if (preserve_hard_links && F_NOT_HLINK_LAST(file))
+               if (preserve_hard_links && F_HLINK_NOT_LAST(file))
                        return;
 #endif
                if (do_symlink(sl, fname) != 0) {
@@ -1342,7 +1341,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
                                t = "special file";
                        }
                        if (statret == 0
-                        && (unsigned)(st.st_mode & ~CHMOD_BITS) == (file->mode & ~CHMOD_BITS)
+                        && BITS_EQUAL(st.st_mode, file->mode, _S_IFMT)
                         && st.st_rdev == rdev) {
                                /* The device or special file is identical. */
                                if (itemizing)
@@ -1375,7 +1374,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
                                statret = 1;
                }
 #ifdef SUPPORT_HARD_LINKS
-               if (preserve_hard_links && F_NOT_HLINK_LAST(file))
+               if (preserve_hard_links && F_HLINK_NOT_LAST(file))
                        return;
 #endif
                if (verbose > 2) {
@@ -1495,7 +1494,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
 
        if (statret != 0) {
 #ifdef SUPPORT_HARD_LINKS
-               if (preserve_hard_links && F_NOT_HLINK_LAST(file))
+               if (preserve_hard_links && F_HLINK_NOT_LAST(file))
                        return;
 #endif
                if (stat_errno == ENOENT)
@@ -1558,7 +1557,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
          pretend_missing:
                /* pretend the file didn't exist */
 #ifdef SUPPORT_HARD_LINKS
-               if (preserve_hard_links && F_NOT_HLINK_LAST(file))
+               if (preserve_hard_links && F_HLINK_NOT_LAST(file))
                        return;
 #endif
                statret = real_ret = -1;