summaryrefslogtreecommitdiff
path: root/testsuite/devices.test
blob: ad5f936b36775cb681242fcd120aa1ae52c17d65 (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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#!/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"

# Build some hardlinks

case $0 in
*fake*)
    $RSYNC -VV | grep '"xattrs": true' >/dev/null || test_skipped "Rsync needs xattrs for fake device tests"
    RSYNC="$RSYNC --fake-super"
    TLS_ARGS="$TLS_ARGS --fake-super"
    case "$HOST_OS" in
    darwin*)
	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"
	}
	;;
    solaris*)
	mknod() {
	    fn="$1"
	    case "$2" in
	    p) mode=10644 ;;
	    c) mode=20644 ;;
	    b) mode=60644 ;;
	    esac
	    maj="${3:-0}"
	    min="${4:-0}"
	    touch "$fn"
	    runat "$fn" "$SHELL_PATH" <<EOF
echo "$mode $maj,$min 0:0" > rsync.%stat
EOF
	}
	;;
    freebsd*)
	mknod() {
	    fn="$1"
	    case "$2" in
	    p) mode=10644 ;;
	    c) mode=20644 ;;
	    b) mode=60644 ;;
	    esac
	    maj="${3:-0}"
	    min="${4:-0}"
	    touch "$fn"
	    setextattr -h user "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
    ;;
*)
    my_uid=`get_testuid`
    root_uid=`get_rootuid`
    if test x"$my_uid" = x; then
	: # If "id" failed, try to continue...
    elif test x"$my_uid" != x"$root_uid"; then
	if [ -e "$FAKEROOT_PATH" ]; then
	    echo "Let's try re-running the script under fakeroot..."
	    exec "$FAKEROOT_PATH" "$SHELL_PATH" $RUNSHFLAGS "$0"
	fi
	test_skipped "Rsync needs root/fakeroot for device tests"
    fi
    ;;
esac

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

$RSYNC -VV | grep '"hardlink_specials": true' >/dev/null && CAN_HLINK_SPECIAL=yes || CAN_HLINK_SPECIAL=no

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"
if test "$CAN_HLINK_SPECIAL" = yes; then
    ln "$fromdir/block3" "$fromdir/block3.5"
else
    echo "Skipping hard-linked device test..."
fi
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"

checkdiff "$RSYNC -ai '$fromdir/block' '$todir/block2'" <<EOT
cD$all_plus block
EOT

checkdiff "$RSYNC -ai '$fromdir/block2' '$todir/block'" <<EOT
cD$all_plus block2
EOT

sleep 1

checkdiff "$RSYNC -Di '$fromdir/block3' '$todir/block'" <<EOT
cDc.T.$dots block3
EOT

cat >"$chkfile" <<EOT
.d..t.$dots ./
cDc.t.$dots block
cDc...$dots block2
cD$all_plus block3
hD$all_plus block3.5 => block3
cD$all_plus char
cD$all_plus char2
cD$all_plus char3
cS$all_plus fifo
EOT
if test "$CAN_HLINK_SPECIAL" = no; then
    grep -v block3.5 <"$chkfile" >"$chkfile.new"
    mv "$chkfile.new" "$chkfile"
fi

checkdiff2 "$RSYNC -aiHvv '$fromdir/' '$todir/'" v_filt

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 "$CAN_HLINK_SPECIAL" = yes; then
    set -x
    checkdiff "$RSYNC -aii --link-dest='$todir' '$fromdir/' '$chkdir/'" <<EOT
created directory $chkdir
cd$allspace ./
hD$allspace block
hD$allspace block2
hD$allspace block3
hD$allspace block3.5
hD$allspace char
hD$allspace char2
hD$allspace char3
hS$allspace fifo
EOT
fi

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