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