[SCM] The rsync repository. - branch master updated
Rsync CVS commit messages
rsync-cvs at lists.samba.org
Sat Dec 18 14:09:07 MST 2010
The branch, master has been updated
via 743348e Fix issues with unchanged_attrs() for symlinks.
from 14ebc5b Fix crash when --backup-dir is excessively long.
;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 743348e848915aa1217d970bd5673364345174e0
Author: Wayne Davison <wayned at samba.org>
Date: Sat Dec 18 08:48:07 2010 -0800
Fix issues with unchanged_attrs() for symlinks.
-----------------------------------------------------------------------
Summary of changes:
generator.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++----------
rsync.c | 2 +-
rsync.h | 8 +++++
3 files changed, 83 insertions(+), 17 deletions(-)
Changeset truncated at 500 lines:
diff --git a/generator.c b/generator.c
index be36e63..61a2305 100644
--- a/generator.c
+++ b/generator.c
@@ -388,42 +388,100 @@ static void do_delete_pass(void)
rprintf(FINFO, " \r");
}
-int unchanged_attrs(const char *fname, struct file_struct *file, stat_x *sxp)
+static inline int time_differs(struct file_struct *file, stat_x *sxp)
{
- if (!(preserve_times & PRESERVE_LINK_TIMES) && S_ISLNK(file->mode)) {
- ;
- } else if (preserve_times && cmp_time(sxp->st.st_mtime, file->modtime) != 0)
- return 0;
+ return cmp_time(sxp->st.st_mtime, file->modtime);
+}
- if (preserve_perms) {
- if (!BITS_EQUAL(sxp->st.st_mode, file->mode, CHMOD_BITS))
- return 0;
- } else if (preserve_executability
- && ((sxp->st.st_mode & 0111 ? 1 : 0) ^ (file->mode & 0111 ? 1 : 0)))
- return 0;
+static inline int perms_differ(struct file_struct *file, stat_x *sxp)
+{
+ if (preserve_perms)
+ return !BITS_EQUAL(sxp->st.st_mode, file->mode, CHMOD_BITS);
+ if (preserve_executability)
+ return (sxp->st.st_mode & 0111 ? 1 : 0) ^ (file->mode & 0111 ? 1 : 0);
+
+ return 0;
+}
+
+static inline int ownership_differs(struct file_struct *file, stat_x *sxp)
+{
if (am_root && uid_ndx && sxp->st.st_uid != (uid_t)F_OWNER(file))
- return 0;
+ return 1;
if (gid_ndx && !(file->flags & FLAG_SKIP_GROUP) && sxp->st.st_gid != (gid_t)F_GROUP(file))
- return 0;
+ return 1;
+
+ return 0;
+}
#ifdef SUPPORT_ACLS
- if (preserve_acls && !S_ISLNK(file->mode)) {
+static inline int acls_differ(const char *fname, struct file_struct *file, stat_x *sxp)
+{
+ if (preserve_acls) {
if (!ACL_READY(*sxp))
get_acl(fname, sxp);
if (set_acl(NULL, file, sxp, file->mode))
- return 0;
+ return 1;
}
+
+ return 0;
+}
#endif
+
#ifdef SUPPORT_XATTRS
+static inline int xattrs_differ(const char *fname, struct file_struct *file, stat_x *sxp)
+{
if (preserve_xattrs) {
if (!XATTR_READY(*sxp))
get_xattr(fname, sxp);
if (xattr_diff(file, sxp, 0))
- return 0;
+ return 1;
}
+
+ return 0;
+}
+#endif
+
+int unchanged_attrs(const char *fname, struct file_struct *file, stat_x *sxp)
+{
+ if (S_ISLNK(file->mode)) {
+#ifdef CAN_SET_SYMLINK_TIMES
+ if (preserve_times & PRESERVE_LINK_TIMES && time_differs(file, sxp))
+ return 0;
+#endif
+#ifdef CAN_CHMOD_SYMLINK
+ if (perms_differ(file, sxp))
+ return 0;
+#endif
+#ifndef CAN_CHOWN_SYMLINK
+ if (ownership_differs(file, sxp))
+ return 0;
+#endif
+#if defined SUPPORT_ACLS && 0 /* no current symlink-ACL support */
+ if (acls_differ(fname, file, sxp))
+ return 0;
#endif
+#if defined SUPPORT_XATTRS && !defined NO_SYMLINK_XATTRS
+ if (xattrs_differ(fname, file, sxp))
+ return 0;
+#endif
+ } else {
+ if (preserve_times && time_differs(file, sxp))
+ return 0;
+ if (perms_differ(file, sxp))
+ return 0;
+ if (ownership_differs(file, sxp))
+ return 0;
+#ifdef SUPPORT_ACLS
+ if (acls_differ(fname, file, sxp))
+ return 0;
+#endif
+#ifdef SUPPORT_XATTRS
+ if (xattrs_differ(fname, file, sxp))
+ return 0;
+#endif
+ }
return 1;
}
diff --git a/rsync.c b/rsync.c
index a0da86d..17ce76a 100644
--- a/rsync.c
+++ b/rsync.c
@@ -510,7 +510,7 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
change_uid = am_root && uid_ndx && sxp->st.st_uid != (uid_t)F_OWNER(file);
change_gid = gid_ndx && !(file->flags & FLAG_SKIP_GROUP)
&& sxp->st.st_gid != (gid_t)F_GROUP(file);
-#if !defined HAVE_LCHOWN && !defined CHOWN_MODIFIES_SYMLINK
+#ifndef CAN_CHOWN_SYMLINK
if (S_ISLNK(sxp->st.st_mode)) {
;
} else
diff --git a/rsync.h b/rsync.h
index 3404da7..1b73031 100644
--- a/rsync.h
+++ b/rsync.h
@@ -370,6 +370,14 @@ enum delret {
#define CAN_SET_SYMLINK_TIMES 1
#endif
+#if defined HAVE_LCHOWN || defined CHOWN_MODIFIES_SYMLINK
+#define CAN_CHOWN_SYMLINK 1
+#endif
+
+#if defined HAVE_LCHMOD || defined HAVE_SETATTRLIST
+#define CAN_CHMOD_SYMLINK 1
+#endif
+
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif
--
The rsync repository.
More information about the rsync-cvs
mailing list