+ 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() {
+ for p in "${@}"; do
+ (echo " makepath $p"
+
+ # Absolut Unix.
+ if echo $p | grep '^/' >/dev/null
+ then
+ cd /
+ fi
+
+ # This will break if $p 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)
+ 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="$failed status=$status"
+ fi
+
+ 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="$failed dir-diff"
+
+ echo "-------------"
+ echo "check how the files compare with diff:"
+ echo ""
+ if [ "x$4" != x ]; then
+ echo " === Skipping (as directed) ==="
+ else
+ diff -r $diffopt "$2" "$3" || failed="$failed file-diff"
+ fi
+
+ echo "-------------"
+ if [ -z "$failed" ] ; then
+ return 0
+ fi
+
+ echo "Failed: $failed"
+ return 1
+}
+
+
+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"
+ hostname=`uname -n`
+
+ uid_setting='uid = 0'
+ gid_setting='gid = 0'
+ case `get_testuid` in
+ 0) ;;
+ *)
+ # Non-root cannot specify uid & gid settings
+ uid_setting="#$uid_setting"
+ gid_setting="#$gid_setting"
+ ;;
+ esac
+
+ cat >"$conf" <<EOF
+# rsyncd configuration file autogenerated by $0
+
+pid file = $pidfile
+use chroot = no
+munge symlinks = no
+hosts allow = localhost 127.0.0.0/24 192.168.0.0/16 10.0.0.0/8 $hostname
+log file = $logfile
+log format = %i %h [%a] %m (%u) %l %f%L
+transfer logging = yes
+exclude = ? foobar.baz
+max verbosity = 4
+$uid_setting
+$gid_setting
+
+[test-from]
+ path = $fromdir
+ read only = yes
+ comment = r/o
+
+[test-to]
+ path = $todir
+ read only = no
+ comment = r/w
+
+[test-scratch]
+ path = $scratchdir
+ read only = no
+
+[test-hidden]
+ path = $fromdir
+ list = no
+EOF
+
+ # Build a helper script to ignore exit code 23
+ ignore23="$scratchdir/ignore23"
+ echo "building help script $ignore23"
+
+ cat >"$ignore23" <<'EOT'
+if "${@}"; then
+ exit
+fi
+
+ret=$?
+
+if test $ret = 23; then
+ exit
+fi
+
+exit $ret
+EOT
+chmod +x "$ignore23"
+}
+
+
+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