+ touch "$fromdir/empty"
+ mkdir "$fromdir/emptydir"
+
+ # a hundred lines of text or so
+ rsync_ls_lR "$srcdir" > "$fromdir/filelist"
+
+ echo $ECHO_N "This file has no trailing lf$ECHO_C" > "$fromdir/nolf"
+ umask 0
+ ln -s nolf "$fromdir/nolf-symlink"
+ umask 022
+
+ cat $srcdir/*.c > "$fromdir/text"
+ mkdir "$fromdir/dir"
+ cp "$fromdir/text" "$fromdir/dir"
+ mkdir "$fromdir/dir/subdir"
+ echo some data > "$fromdir/dir/subdir/foobar.baz"
+ mkdir "$fromdir/dir/subdir/subsubdir"
+ if [ -r /etc ]; then
+ ls -ltr /etc > "$fromdir/dir/subdir/subsubdir/etc-ltr-list"
+ else
+ ls -ltr / > "$fromdir/dir/subdir/subsubdir/etc-ltr-list"
+ fi
+ mkdir "$fromdir/dir/subdir/subsubdir2"
+ if [ -r /bin ]; then
+ ls -lt /bin > "$fromdir/dir/subdir/subsubdir2/bin-lt-list"
+ else
+ ls -lt / > "$fromdir/dir/subdir/subsubdir2/bin-lt-list"
+ fi
+
+# echo testing head:
+# ls -lR "$srcdir" | head -10 || echo failed
+}
+
+
+####################
+# Many machines do not have "mkdir -p", so we have to build up long paths.
+# How boring.
+makepath () {
+ echo " makepath $1"
+ p="$1"
+ (
+ # Absolut Unix.
+ if echo $p | grep '^/' >/dev/null
+ then
+ cd /
+ fi
+
+ # This will break if $1 contains a space.
+ for c in `echo $p | tr '/' ' '`
+ do
+ if [ -d "$c" ] || mkdir "$c"
+ then
+ cd "$c" || return $?
+ else
+ echo "failed to create $c" >&2; return $?
+ fi
+ done
+ )
+}
+
+
+
+###########################
+# Run a test (in '$1') then compare directories $2 and $3 to see if
+# there are any difference. If there are, explain them.
+
+# So normally basically $1 should be an rsync command, and $2 and $3
+# the source and destination directories. This is only good when you
+# expect to transfer the whole directory exactly as is. If some files
+# should be excluded, you might need to use something else.
+
+checkit() {
+ failed=
+
+ # We can just write everything to stdout/stderr, because the
+ # wrapper hides it unless there is a problem.
+
+ echo "Running: \"$1\""
+ eval "$1"
+ status=$?
+ if [ $status != 0 ]; then
+ failed="YES";
+ fi
+
+ echo "-------------"
+ echo "check how the files compare with diff:"
+ echo ""
+ diff -r $diffopt "$2" "$3" || failed=YES
+
+ echo "-------------"
+ echo "check how the directory listings compare with diff:"
+ echo ""
+ ( cd "$2" && rsync_ls_lR . ) > "$tmpdir/ls-from"
+ ( cd "$3" && rsync_ls_lR . ) > "$tmpdir/ls-to"
+ diff $diffopt "$tmpdir/ls-from" "$tmpdir/ls-to" || failed=YES
+ if [ -z "$failed" ] ; then
+ return 0
+ else
+ return 1
+ fi
+}
+
+
+build_rsyncd_conf() {
+ # Build an appropriate configuration file
+ conf="$scratchdir/test-rsyncd.conf"
+ echo "building configuration $conf"
+
+ port=2612
+ pidfile="$scratchdir/rsyncd.pid"
+ logfile="$scratchdir/rsyncd.log"
+
+ cat >"$conf" <<EOF
+# rsyncd configuration file autogenerated by $0
+
+pid file = $pidfile
+use chroot = no
+hosts allow = localhost, 127.0.0.1
+log file = $logfile
+exclude = foobar.baz
+max verbosity = 9
+
+uid = 0
+gid = 0
+
+[test-from]
+ path = $fromdir
+ read only = yes
+
+[test-to]
+ path = $todir
+ read only = no
+EOF
+}
+
+
+build_symlinks() {
+ mkdir "$fromdir"
+ date >"$fromdir/referent"
+ ln -s referent "$fromdir/relative"
+ ln -s "$fromdir/referent" "$fromdir/absolute"
+ ln -s nonexistent "$fromdir/dangling"
+ ln -s "$srcdir/rsync.c" "$fromdir/unsafe"
+}
+
+test_fail() {
+ echo "$@" >&2
+ exit 1
+}
+
+test_skipped() {
+ echo "$@" >&2
+ echo "$@" > "$tmpdir/whyskipped"
+ exit 77
+}
+
+# It failed, but we expected that. don't dump out error logs,
+# because most users won't want to see them. But do leave
+# the working directory around.
+test_xfail() {
+ echo "$@" >&2
+ exit 78