+
+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`
+
+ cat >"$conf" <<EOF
+# rsyncd configuration file autogenerated by $0
+
+pid file = $pidfile
+use chroot = no
+hosts allow = localhost 127.0.0.1 $hostname
+log file = $logfile
+log format = %i %h [%a] %m (%u) %l %f%L
+transfer logging = yes
+exclude = foobar.baz
+max verbosity = 9
+uid = 0
+gid = 0
+
+[test-from]
+ path = $fromdir
+ read only = yes
+
+[test-to]
+ path = $todir
+ read only = no
+
+[test-scratch]
+ path = $scratchdir
+ 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
+}
+
+# Determine what shell command will appropriately test for links.
+ln -s foo "$scratchdir/testlink"
+for cmd in test /bin/test /usr/bin/test /usr/ucb/bin/test /usr/ucb/test
+do
+ for switch in -h -L
+ do
+ if $cmd $switch "$scratchdir/testlink" 2>/dev/null
+ then
+ # how nice
+ TEST_SYMLINK_CMD="$cmd $switch"
+ # i wonder if break 2 is portable?
+ break 2
+ fi
+ done
+done
+# ok, now get rid of it
+rm "$scratchdir/testlink"
+
+
+if [ "x$TEST_SYMLINK_CMD" = 'x' ]
+then
+ test_fail "Couldn't determine how to test for symlinks"
+else
+ echo "Testing for symlinks using '$TEST_SYMLINK_CMD'"
+fi
+
+
+# Test whether something is a link, allowing for shell peculiarities
+is_a_link() {
+ # note the variable contains the first option and therefore is not quoted
+ $TEST_SYMLINK_CMD "$1"
+}
+
+
+# We need to set the umask to be reproducible. Note also that when we
+# do some daemon tests as root, we will setuid() and therefore the
+# directory has to be writable by the nobody user in some cases. The
+# best thing is probably to explicitly chmod those directories after
+# creation.
+
+umask 022