1: #! /bin/sh
2:
3: # This program is distributable under the terms of the GNU GPL (see
4: # COPYING).
5:
6: # Test that rsync handles basic xattr preservation.
7:
8: . $srcdir/testsuite/rsync.fns
9: lnkdir="$tmpdir/lnk"
10:
11: $RSYNC --version | grep ", xattrs" >/dev/null || test_skipped "Rsync is configured without xattr support"
12:
13: case "`xattr 2>&1`" in
14: *--list:*)
15: xset() {
16: xnam="$1"
17: xval="$2"
18: shift 2
19: xattr -s "$xnam" "$xval" "${@}"
20: }
21: xls() {
22: xattr -l "${@}" | sed "s/^[ $tab_ch]*//"
23: }
24: RSYNC_PREFIX='rsync'
25: RUSR='rsync.nonuser'
26: ;;
27: *)
28: xset() {
29: xnam="$1"
30: xval="$2"
31: shift 2
32: setfattr -n "$xnam" -v "$xval" "${@}"
33: }
34: xls() {
35: getfattr -d "${@}"
36: }
37: RSYNC_PREFIX='user.rsync'
38: RUSR='user.rsync'
39: ;;
40: esac
41:
42: makepath "$lnkdir" "$fromdir/foo/bar"
43: echo now >"$fromdir/file0"
44: echo something >"$fromdir/file1"
45: echo else >"$fromdir/file2"
46: echo deep >"$fromdir/foo/file3"
47: echo normal >"$fromdir/file4"
48: echo deeper >"$fromdir/foo/bar/file5"
49:
50: makepath "$chkdir/foo"
51: echo wow >"$chkdir/file1"
52: cp_touch "$fromdir/foo/file3" "$chkdir/foo"
53:
54: dirs='foo foo/bar'
55: files='file0 file1 file2 foo/file3 file4 foo/bar/file5'
56:
57: uid_gid=`"$TOOLDIR/tls" "$fromdir/foo" | sed 's/^.* \([0-9][0-9]*\)\.\([0-9][0-9]*\) .*/\1:\2/'`
58:
59: cd "$fromdir"
60:
61: xset user.foo foo file0 2>/dev/null || test_skipped "Unable to set an xattr"
62: xset user.bar bar file0
63:
64: xset user.short 'this is short' file1
65: xset user.long 'this is a long attribute that will be truncated in the initial data send' file1
66: xset user.good 'this is good' file1
67: xset user.nice 'this is nice' file1
68:
69: xset user.foo foo file2
70: xset user.bar bar file2
71: xset user.long 'a long attribute for our new file that tests to ensure that this works' file2
72:
73: xset user.dir1 'need to test directory xattrs too' foo
74: xset user.dir2 'another xattr' foo
75: xset user.dir3 'this is one last one for the moment' foo
76:
77: xset user.dir4 'another dir test' foo/bar
78: xset user.dir5 'one last one' foo/bar
79:
80: xset user.foo 'new foo' foo/file3 foo/bar/file5
81: xset user.bar 'new bar' foo/file3 foo/bar/file5
82: xset user.long 'this is also a long attribute that will be truncated in the initial data send' foo/file3 foo/bar/file5
83: xset $RUSR.equal 'this long attribute should remain the same and not need to be transferred' foo/file3 foo/bar/file5
84:
85: xset user.dir0 'old extra value' "$chkdir/foo"
86: xset user.dir1 'old dir value' "$chkdir/foo"
87:
88: xset user.short 'old short' "$chkdir/file1"
89: xset user.extra 'remove me' "$chkdir/file1"
90:
91: xset user.foo 'old foo' "$chkdir/foo/file3"
92: xset $RUSR.equal 'this long attribute should remain the same and not need to be transferred' "$chkdir/foo/file3"
93:
94: case $0 in
95: *hlink*)
96: ln foo/bar/file5 foo/bar/file6 || test_skipped "Can't create hardlink"
97: files="$files foo/bar/file6"
98: dashH='-H'
99: altDest='--link-dest'
100: ;;
101: *)
102: dashH=''
103: altDest='--copy-dest'
104: ;;
105: esac
106:
107: xls $dirs $files >"$scratchdir/xattrs.txt"
108:
109: # OK, let's try a simple xattr copy.
110: checkit "$RSYNC -avX $dashH --super . '$chkdir/'" "$fromdir" "$chkdir"
111:
112: cd "$chkdir"
113: xls $dirs $files | diff $diffopt "$scratchdir/xattrs.txt" -
114:
115: cd "$fromdir"
116:
117: if [ "$dashH" ]; then
118: for fn in $files; do
119: name=`basename $fn`
120: ln $fn ../lnk/$name
121: done
122: fi
123:
124: checkit "$RSYNC -aiX $dashH --super $altDest=../chk . ../to" "$fromdir" "$todir"
125:
126: cd "$todir"
127: xls $dirs $files | diff $diffopt "$scratchdir/xattrs.txt" -
128:
129: [ "$dashH" ] && rm -rf "$lnkdir"
130:
131: cd "$fromdir"
132: rm -rf "$todir"
133:
134: xset user.nice 'this is nice, but different' file1
135:
136: xls $dirs $files >"$scratchdir/xattrs.txt"
137:
138: checkit "$RSYNC -aiX $dashH --fake-super --link-dest=../chk . ../to" "$chkdir" "$todir"
139:
140: cd "$todir"
141: xls $dirs $files | diff $diffopt "$scratchdir/xattrs.txt" -
142:
143: sed -n -e '/^[^ ][^ ]* *[^ ][^ ]* *[^ ][^ ]* *1 /p' "$scratchdir/ls-to" >"$scratchdir/ls-diff-all"
144: fgrep -v './file1' "$scratchdir/ls-diff-all" >"$scratchdir/ls-diff" || :
145: if [ -s "$scratchdir/ls-diff" ]; then
146: echo "Missing hard links on:"
147: cat "$scratchdir/ls-diff"
148: exit 1
149: fi
150: if [ ! -s "$scratchdir/ls-diff-all" ]; then
151: echo "Too many hard links on file1!"
152: exit 1
153: fi
154:
155: cd "$chkdir"
156: chmod go-rwx . $dirs $files
157:
158: xset user.nice 'this is nice, but different' file1
159: xset $RSYNC_PREFIX.%stat "40000 0,0 $uid_gid" $dirs
160: xset $RSYNC_PREFIX.%stat "100000 0,0 $uid_gid" $files
161:
162: xls $dirs $files >"$scratchdir/xattrs.txt"
163:
164: cd "$fromdir"
165: rm -rf "$todir"
166:
167: # When run by a non-root tester, this checks if no-user-perm files/dirs can be copied.
168: checkit "$RSYNC -aiX $dashH --fake-super --chmod=a= . ../to" "$chkdir" "$todir" # 2>"$scratchdir/errors.txt"
169:
170: cd "$todir"
171: xls $dirs $files | diff $diffopt "$scratchdir/xattrs.txt" -
172:
173: cd "$fromdir"
174: rm -rf "$todir" "$chkdir"
175:
176: $RSYNC -aX file1 file2
177: $RSYNC -aX file1 file2 ../chk/
178: $RSYNC -aX --del ../chk/ .
179: $RSYNC -aX file1 ../lnk/
180: [ "$dashH" ] && ln "$chkdir/file1" ../lnk/extra-link
181:
182: xls file1 file2 >"$scratchdir/xattrs.txt"
183:
184: checkit "$RSYNC -aiiX $dashH $altDest=../lnk . ../to" "$chkdir" "$todir"
185:
186: [ "$dashH" ] && rm ../lnk/extra-link
187:
188: cd "$todir"
189: xls file1 file2 | diff $diffopt "$scratchdir/xattrs.txt" -
190:
191: cd "$fromdir"
192: rm "$todir/file2"
193:
194: echo extra >file1
195: $RSYNC -aX . ../chk/
196:
197: checkit "$RSYNC -aiiX . ../to" "$chkdir" "$todir"
198:
199: cd "$todir"
200: xls file1 file2 | diff $diffopt "$scratchdir/xattrs.txt" -
201:
202: # The script would have aborted on error, so getting here means we've won.
203: exit 0
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>