Annotation of embedaddon/rsync/testsuite/devices.test, revision 1.1.1.1
1.1 misho 1: #! /bin/sh
2:
3: # Copyright (C) 2002 by Martin Pool <mbp@samba.org>
4:
5: # This program is distributable under the terms of the GNU GPL (see
6: # COPYING).
7:
8: # Test rsync handling of devices. This can only run if you're root.
9:
10: . "$suitedir/rsync.fns"
11:
12: chkfile="$scratchdir/rsync.chk"
13: outfile="$scratchdir/rsync.out"
14:
15: # Build some hardlinks
16:
17: case $0 in
18: *fake*)
19: $RSYNC --version | grep ", xattrs" >/dev/null || test_skipped "Rsync needs xattrs for fake device tests"
20: RSYNC="$RSYNC --fake-super"
21: TLS_ARGS="$TLS_ARGS --fake-super"
22: case "`xattr 2>&1`" in
23: *--list:*)
24: mknod() {
25: fn="$1"
26: case "$2" in
27: p) mode=10644 ;;
28: c) mode=20644 ;;
29: b) mode=60644 ;;
30: esac
31: maj="${3:-0}"
32: min="${4:-0}"
33: touch "$fn"
34: xattr -s 'rsync.%stat' "$mode $maj,$min 0:0" "$fn"
35: }
36: ;;
37: *)
38: mknod() {
39: fn="$1"
40: case "$2" in
41: p) mode=10644 ;;
42: c) mode=20644 ;;
43: b) mode=60644 ;;
44: esac
45: maj="${3:-0}"
46: min="${4:-0}"
47: touch "$fn"
48: setfattr -n 'user.rsync.%stat' -v "$mode $maj,$min 0:0" "$fn"
49: }
50: ;;
51: esac
52: ;;
53: *)
54: case `get_testuid` in
55: '') ;; # If "id" failed, try to continue...
56: 0) ;;
57: *) if [ -f /usr/bin/fakeroot ]; then
58: echo "Let's try re-running the script under fakeroot..."
59: exec /usr/bin/fakeroot /bin/sh $RUNSHFLAGS "$0"
60: fi
61: test_skipped "Rsync needs root/fakeroot for device tests"
62: ;;
63: esac
64: ;;
65: esac
66:
67: # TODO: Need to test whether hardlinks are possible on this OS/filesystem
68:
69: mkdir "$fromdir"
70: mkdir "$todir"
71: mknod "$fromdir/char" c 41 67 || test_skipped "Can't create char device node"
72: mknod "$fromdir/char2" c 42 68 || test_skipped "Can't create char device node"
73: mknod "$fromdir/char3" c 42 69 || test_skipped "Can't create char device node"
74: mknod "$fromdir/block" b 42 69 || test_skipped "Can't create block device node"
75: mknod "$fromdir/block2" b 42 73 || test_skipped "Can't create block device node"
76: mknod "$fromdir/block3" b 105 73 || test_skipped "Can't create block device node"
77: ln "$fromdir/block3" "$fromdir/block2.5" || echo "Skipping hard-linked device test..."
78: mkfifo "$fromdir/fifo" || mknod "$fromdir/fifo" p || test_skipped "Can't run mkfifo"
79: # Work around time rounding/truncating issue by touching both files.
80: touch -r "$fromdir/block" "$fromdir/block" "$fromdir/block2"
81:
82: $RSYNC -ai "$fromdir/block" "$todir/block2" \
83: | tee "$outfile"
84: cat <<EOT >"$chkfile"
85: cD$all_plus block
86: EOT
87: diff $diffopt "$chkfile" "$outfile" || test_fail "test 1 failed"
88:
89: $RSYNC -ai "$fromdir/block2" "$todir/block" \
90: | tee "$outfile"
91: cat <<EOT >"$chkfile"
92: cD$all_plus block2
93: EOT
94: diff $diffopt "$chkfile" "$outfile" || test_fail "test 2 failed"
95:
96: sleep 1
97:
98: $RSYNC -Di "$fromdir/block3" "$todir/block" \
99: | tee "$outfile"
100: cat <<EOT >"$chkfile"
101: cDc.T.$dots block3
102: EOT
103: diff $diffopt "$chkfile" "$outfile" || test_fail "test 3 failed"
104:
105: $RSYNC -aiHvv "$fromdir/" "$todir/" \
106: | tee "$outfile"
107: filter_outfile
108: cat <<EOT >"$chkfile"
109: .d..t.$dots ./
110: cDc.t.$dots block
111: cDc...$dots block2
112: cD$all_plus block3
113: hD$all_plus block2.5 => block3
114: cD$all_plus char
115: cD$all_plus char2
116: cD$all_plus char3
117: cS$all_plus fifo
118: EOT
119: if test ! -r "$fromdir/block2.5"; then
120: grep -v block2.5 <"$chkfile" >"$chkfile.new"
121: mv "$chkfile.new" "$chkfile"
122: fi
123: diff $diffopt "$chkfile" "$outfile" || test_fail "test 4 failed"
124:
125: echo "check how the directory listings compare with diff:"
126: echo ""
127: ( cd "$fromdir" && rsync_ls_lR . ) > "$tmpdir/ls-from"
128: ( cd "$todir" && rsync_ls_lR . ) > "$tmpdir/ls-to"
129: diff $diffopt "$tmpdir/ls-from" "$tmpdir/ls-to"
130:
131: if test -r "$fromdir/block2.5"; then
132: set -x
133: $RSYNC -aii --link-dest="$todir" "$fromdir/" "$chkdir/" \
134: | tee "$outfile"
135: cat <<EOT >"$chkfile"
136: cd$allspace ./
137: hD$allspace block
138: hD$allspace block2
139: hD$allspace block2.5
140: hD$allspace block3
141: hD$allspace char
142: hD$allspace char2
143: hD$allspace char3
144: hS$allspace fifo
145: EOT
146: diff $diffopt "$chkfile" "$outfile" || test_fail "test 5 failed"
147: fi
148:
149: # The script would have aborted on error, so getting here means we've won.
150: exit 0
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>