summaryrefslogtreecommitdiff
path: root/testsuite/devices.test
blob: bb73aad39555b7c3ed79c95f62d8948a8d03eb38 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#! /bin/sh

# Copyright (C) 2002 by Martin Pool <mbp@samba.org>

# This program is distributable under the terms of the GNU GPL (see
# COPYING).

# Test rsync handling of devices.  This can only run if you're root.

. "$suitedir/rsync.fns"

chkfile="$scratchdir/rsync.chk"
outfile="$scratchdir/rsync.out"

# Build some hardlinks

case $0 in
*fake*)
    $RSYNC --version | grep ", xattrs" >/dev/null || test_skipped "Rsync needs xattrs for fake device tests"
    RSYNC="$RSYNC --fake-super"
    TLS_ARGS="$TLS_ARGS --fake-super"
    case "`xattr 2>&1`" in
    *--list:*)
	mknod() {
	    fn="$1"
	    case "$2" in
	    p) mode=10644 ;;
	    c) mode=20644 ;;
	    b) mode=60644 ;;
	    esac
	    maj="${3:-0}"
	    min="${4:-0}"
	    touch "$fn"
	    xattr -s 'rsync.%stat' "$mode $maj,$min 0:0" "$fn"
	}
	;;
    *)
	mknod() {
	    fn="$1"
	    case "$2" in
	    p) mode=10644 ;;
	    c) mode=20644 ;;
	    b) mode=60644 ;;
	    esac
	    maj="${3:-0}"
	    min="${4:-0}"
	    touch "$fn"
	    setfattr -n 'user.rsync.%stat' -v "$mode $maj,$min 0:0" "$fn"
	}
	;;
    esac
    ;;
*)
    case `get_testuid` in
    '') ;; # If "id" failed, try to continue...
    0)  ;;
    *)  if [ -f /usr/bin/fakeroot ]; then
	    echo "Let's try re-running the script under fakeroot..."
	    exec /usr/bin/fakeroot /bin/sh $RUNSHFLAGS "$0"
	fi
	test_skipped "Rsync needs root/fakeroot for device tests"
	;;
    esac
    ;;
esac

# TODO: Need to test whether hardlinks are possible on this OS/filesystem

mkdir "$fromdir"
mkdir "$todir"
mknod "$fromdir/char" c 41 67  || test_skipped "Can't create char device node"
mknod "$fromdir/char2" c 42 68  || test_skipped "Can't create char device node"
mknod "$fromdir/char3" c 42 69  || test_skipped "Can't create char device node"
mknod "$fromdir/block" b 42 69 || test_skipped "Can't create block device node"
mknod "$fromdir/block2" b 42 73 || test_skipped "Can't create block device node"
mknod "$fromdir/block3" b 105 73 || test_skipped "Can't create block device node"
ln "$fromdir/block3" "$fromdir/block2.5" || echo "Skipping hard-linked device test..."
mkfifo "$fromdir/fifo" || mknod "$fromdir/fifo" p || test_skipped "Can't run mkfifo"
# Work around time rounding/truncating issue by touching both files.
touch -r "$fromdir/block" "$fromdir/block" "$fromdir/block2"

$RSYNC -ai "$fromdir/block" "$todir/block2" \
    | tee "$outfile"
cat <<EOT >"$chkfile"
cD$all_plus block
EOT
diff $diffopt "$chkfile" "$outfile" || test_fail "test 1 failed"

$RSYNC -ai "$fromdir/block2" "$todir/block" \
    | tee "$outfile"
cat <<EOT >"$chkfile"
cD$all_plus block2
EOT
diff $diffopt "$chkfile" "$outfile" || test_fail "test 2 failed"

sleep 1

$RSYNC -Di "$fromdir/block3" "$todir/block" \
    | tee "$outfile"
cat <<EOT >"$chkfile"
cDc.T.$dots block3
EOT
diff $diffopt "$chkfile" "$outfile" || test_fail "test 3 failed"

$RSYNC -aiHvv "$fromdir/" "$todir/" \
    | tee "$outfile"
filter_outfile
cat <<EOT >"$chkfile"
.d..t.$dots ./
cDc.t.$dots block
cDc...$dots block2
cD$all_plus block2.5
hD$all_plus block3 => block2.5
cD$all_plus char
cD$all_plus char2
cD$all_plus char3
cS$all_plus fifo
EOT
if test ! -r "$fromdir/block2.5"; then
    sed -e '/block2\.5/d' <"$chkfile" >"$chkfile.new"
    mv "$chkfile.new" "$chkfile"
fi
diff $diffopt "$chkfile" "$outfile" || test_fail "test 4 failed"

echo "check how the directory listings compare with diff:"
echo ""
( cd "$fromdir" && rsync_ls_lR . ) > "$tmpdir/ls-from"
( cd "$todir" && rsync_ls_lR . ) > "$tmpdir/ls-to"
diff $diffopt "$tmpdir/ls-from" "$tmpdir/ls-to"

if test -b "$fromdir/block2.5"; then
    set -x
    $RSYNC -aii --link-dest="$todir" "$fromdir/" "$chkdir/" \
	| tee "$outfile"
    cat <<EOT >"$chkfile"
cd$allspace ./
hD$allspace block
hD$allspace block2
hD$allspace block2.5
hD$allspace block3
hD$allspace char
hD$allspace char2
hD$allspace char3
hS$allspace fifo
EOT
    diff $diffopt "$chkfile" "$outfile" || test_fail "test 4 failed"
fi

# The script would have aborted on error, so getting here means we've won.
exit 0