(SAME_OWNER, SAME_GROUP, SAME_OWNER_AND_GROUP): Define.
authorJim Meyering <jim@meyering.net>
Sat, 9 Sep 2000 07:29:38 +0000 (07:29 +0000)
committerJim Meyering <jim@meyering.net>
Sat, 9 Sep 2000 07:29:38 +0000 (07:29 +0000)
(copy_internal): Avoid calling chown if we know it's not necessary.

src/copy.c

index 742ff4a24c375ec09d93dfc2e93829691bc36afd..2be91a223851daa46626f3e6d0fadd422538c4eb 100644 (file)
       or if the target system doesn't support file ownership.  */      \
    && ((errno != EPERM && errno != EINVAL) || x->myeuid == 0))
 
+#define SAME_OWNER(A, B) ((A).st_uid == (B).st_uid)
+#define SAME_GROUP(A, B) ((A).st_gid == (B).st_gid)
+#define SAME_OWNER_AND_GROUP(A, B) (SAME_OWNER (A, B) && SAME_GROUP (A, B))
+
 struct dir_list
 {
   struct dir_list *parent;
@@ -1078,7 +1082,9 @@ copy_internal (const char *src_path, const char *dst_path,
        }
     }
 
-  if (x->preserve_owner_and_group)
+  /* Avoid calling chown if we know it's not necessary.  */
+  if (x->preserve_owner_and_group
+      && (new_dst || !SAME_OWNER_AND_GROUP (src_sb, dst_sb)))
     {
       if (DO_CHOWN (chown, dst_path, src_sb.st_uid, src_sb.st_gid))
        {