[PATCH] xattrs not set on locked files that already exist on target
Mike Bombich
mike at bombich.com
Mon Apr 14 19:07:57 GMT 2008
Working with rsync 3.0.2, it appears that rsync isn't unlocking files
before setting the file attributes when those files already exist.
This generates error messages on subsequent such as:
rsync: rsync_xal_set: lsetxattr("locked_file","test_xattr") failed:
Operation not permitted (1)
rsync: rsync_xal_clear: lremovexattr("locked_file","test_xattr.temp")
failed: Operation not permitted (1)
I assume this would also affect ACLs. Presumably, this is what --
force-change is supposed to do, so I extended that functionality to
apply to this test case.
Here's the test case (tested on HEAD+fileflags+crtime, but the patch
below applies to 3.0.2):
######
#!/bin/sh
xattr=/usr/local/bin/xattr
rsync="/Users/bombich/Desktop/rsync-HEAD-20080412-0558GMT/rsync"
src=`mktemp -d /tmp/src.XXXXXX`
tgt=`mktemp -d /tmp/tgt.XXXXXX`
touch $src/locked_file
$xattr -s test_xattr "Test attribute" $src/locked_file
$xattr -s test_xattr.temp "Temp attribute" $src/locked_file
chflags uchg $src/locked_file
## First backup
printf "### Initial backup ###\n\n"
"$rsync" -vaX --fileflags --force-change $src/ $tgt/
## Change the source file
chflags nouchg $src/locked_file
$xattr -s test_xattr "Modified attribute" $src/locked_file
$xattr -d test_xattr.temp $src/locked_file
chflags uchg $src/locked_file
## Second backup
printf "\n### Second backup ###\n\n"
"$rsync" -vaX --fileflags --force-change $src/ $tgt/
# Cleanup
chflags -R nouchg $src
chflags -R nouchg $tgt
rm -rf $src $tgt
######
Example output:
[bombich:~] ~/Desktop/locked_xattrs.sh
### Initial backup ###
sending incremental file list
locked_file
sent 173 bytes received 32 bytes 410.00 bytes/sec
total size is 0 speedup is 0.00
### Second backup ###
sending incremental file list
rsync: rsync_xal_set: lsetxattr("locked_file","test_xattr") failed:
Operation not permitted (1)
rsync: rsync_xal_clear: lremovexattr("locked_file","test_xattr.temp")
failed: Operation not permitted (1)
sent 104 bytes received 16 bytes 240.00 bytes/sec
total size is 0 speedup is 0.00
rsync error: some files could not be transferred (code 23) at
main.c(1031) [sender=3.0.3dev]
PATCH:
--- rsync-3.0.2_base/rsync.c 2008-04-08 21:37:18.000000000 -0500
+++ rsync-3.0.2/rsync.c 2008-04-14 13:05:44.000000000 -0500
@@ -31,6 +31,7 @@
extern int dry_run;
extern int preserve_acls;
extern int preserve_xattrs;
+extern int force_change;
extern int preserve_perms;
extern int preserve_fileflags;
extern int preserve_executability;
@@ -445,6 +446,11 @@
if (daemon_chmod_modes && !S_ISLNK(new_mode))
new_mode = tweak_mode(new_mode, daemon_chmod_modes);
+#ifdef SUPPORT_FORCE_CHANGE
+ if (force_change)
+ make_mutable(fname, sxp->st.st_mode, sxp->st.st_flags, force_change);
+#endif
+
#ifdef SUPPORT_ACLS
if (preserve_acls && !S_ISLNK(file->mode) && !ACL_READY(*sxp))
get_acl(fname, sxp);
## Note: I'm not using undo_make_mutable because set_fileflags is
called at the end of this method if we care about fileflags.
More information about the rsync
mailing list