#! /bin/sh

# not checked (list incomplete):
# --timeout
# --rate-limit

shortcut=0 # or 0 for full test

TZ=right/UTC # get rid of TAI / UTC difference
export TZ

for i in `echo $PATH | sed 's/:/ /g'` ; do
	if test -x $i/printenv ; then
		PRINTENV=$i/printenv
	fi
done
if test "x$PRINTENV" = x ; then echo "printenv not found" >&2 ; exit 1 ; fi


rm -rf tmp.check
mkdir tmp.check || exit 1
O=`pwd`
cd tmp.check
N=`pwd`
mkdir client || exit 1

if test "x$shortcut" = "x0" ; then

echo '--- ftpcopy prints usage message without enough arguments'
$O/ftpcopy ; echo $?
$O/ftpcopy 127.255.255.255 ; echo $?
echo '--- ftpcopy refuses default localdir . without -n option'
$O/ftpcopy ftp://127.255.255.255:0/ ; echo $?
$O/ftpcopy 127.255.255.255 0 ; echo $?
echo '--- ftpcopy prints usage message with too many arguments'
$O/ftpcopy ftp://127.255.255.255:0/ client superfluous ; echo $?
$O/ftpcopy ftp://127.255.255.255:0/ client superfluous super2 ; echo $?
$O/ftpcopy 127.255.255.255:0 / client superfluous ; echo $?
$O/ftpcopy 127.255.255.255:0 / client superfluous super2 ; echo $?
echo '--- ftpcopy refuses unknown url schemes'
$O/ftpcopy ftpcopy://127.255.255.255:0/ ; echo $?
$O/ftpcopy http://127.255.255.255:0/ ; echo $?
$O/ftpcopy Ftp://127.255.255.255:0/ ; echo $?
echo '--- ftpcopy prints error message with unknown port name'
$O/ftpcopy ftp://127.255.255.255:nonexistantport/ client ; echo $?
$O/ftpcopy 127.255.255.255:nonexistantport / client ; echo $?
echo '--- ftpcopy prints error message with unknown host name'
$O/ftpcopy ftp://nonexistinghost:ftp/ client ; echo $?
$O/ftpcopy nonexistinghost:ftp / client ; echo $?
echo '--- ftpcopy prints error message with unresolvable host name'
$O/ftpcopy ftp://thislabelistoolongbecausednshasalimitof63charactersinasinglelabel.:ftp/ client ; echo $?
$O/ftpcopy thislabelistoolongbecausednshasalimitof63charactersinasinglelabel.:ftp / client ; echo $?

fi

echo '--- set up ftp service'
mkdir $N/server 
mkdir $N/server/ftpd
mkdir $N/server/file
mkdir $N/server/file/0
cat >$N/server/ftpd/run <<EOF
#!/bin/sh
# one million bytes for the shell ...
exec softlimit -o20 -d1000000 tcpserver \
-vDRHl0 -b20 -c40 -B'220 Features: a p .
' 127.0.0.1 50000 \
sh -c "cd '$N'/server/file ; exec /usr/local/publicfile/bin/ftpd"
EOF
chmod +x $N/server/ftpd/run
supervise $N/server/ftpd 2>$N/server.log &
sleep 2
F="$N/server/file/0"

if test "x$shortcut" = "x0" ; then

echo '--- empty start directory test'
$O/ftpcopy ftp://127.0.0.1:50000/ client ; echo $?
echo '--- nonexistant start entity'
$O/ftpcopy ftp://127.0.0.1:50000/nonexistant client ; echo $?
#mkdir "$F/t1"
#mkdir "$F/t1" ; touch "$F/t1/file"; chmod 000 "$F/t1/file"
echo '--- start entity is a file'
touch $F/file
$O/ftpcopy ftp://127.0.0.1:50000/file ./file ; echo $?
$O/ftpcopy ftp://127.0.0.1:50000/file ./file ; echo $?
$O/ftpcopy ftp://127.0.0.1:50000/file file ; echo $?
rm file
$O/ftpcopy ftp://127.0.0.1:50000/file file ; echo $?
$O/ftpcopy ftp://127.0.0.1:50000/file ./file ; echo $?
$O/ftpcopy ftp://127.0.0.1:50000/file file ; echo $?
rm file
$O/ftpcopy ftp://127.0.0.1:50000/file client ; echo $?
$O/ftpcopy ftp://127.0.0.1:50000/file client ; echo $?
rm client/file
$O/ftpcopy ftp://127.0.0.1:50000/file client/ ; echo $?
$O/ftpcopy ftp://127.0.0.1:50000/file client/ ; echo $?
rm client/file
$O/ftpcopy ftp://127.0.0.1:50000/file client/file ; echo $?
rm client/file
echo '--- start entity is a file, ftpcopy creates parent directory'
$O/ftpcopy ftp://127.0.0.1:50000/file createit/file ; echo $?
rm createit/file ; rmdir createit
$O/ftpcopy ftp://127.0.0.1:50000/file createit/ ; echo $?
rm createit/file ; rmdir createit
echo '--- start entity is a file, ftpcopy handles different local name'
$O/ftpcopy ftp://127.0.0.1:50000/file createit ; echo $?
rm createit

echo '--- start entity is a directory with one file'
rm -rf client/*
$O/ftpcopy ftp://127.0.0.1:50000/ client ; echo $?
rm -rf client/*
$O/ftpcopy ftp://127.0.0.1:50000/ client/subdir ; echo $?
echo '--- start entity is a directory with two files'
rm $F/file
touch $F/one $F/two
rm -rf client/*
$O/ftpcopy ftp://127.0.0.1:50000/ client ; echo $?
rm -rf client/*
$O/ftpcopy ftp://127.0.0.1:50000/ client/subdir ; echo $?
echo '--- start entity contains one directory with two files'
rm -rf client/*
rm -rf $F/*
mkdir $F/dir
touch $F/dir/one $F/dir/two
$O/ftpcopy ftp://127.0.0.1:50000/ client ; echo $?
rm -rf client/*
$O/ftpcopy ftp://127.0.0.1:50000/ client/subdir ; echo $?
echo '--- ftpcopy deletes superfluous files'
rm -rf client/*
rm -rf $F/*
mkdir $F/dir
touch $F/dir/one $F/dir/two
cp -pr $F/dir client/dir
touch client/dir/three
$O/ftpcopy ftp://127.0.0.1:50000/ client ; echo $?
echo '--- ftpcopy deletes superfluous directories'
rm -rf client/*
rm -rf $F/*
mkdir $F/dir
touch $F/dir/one $F/dir/two
cp -pr $F/dir client/dir
mkdir client/dir2
mkdir client/dir/dir4
$O/ftpcopy ftp://127.0.0.1:50000/ client ; echo $?
find client -print | sort
echo '--- ftpcopy survives if a file is turned into a directory'
rm $F/dir/one
mkdir $F/dir/one
touch $F/dir/one/three # so something is downloaded
$O/ftpcopy ftp://127.0.0.1:50000/ client ; echo $?
find client -print | sort
echo '--- ftpcopy survives if a directory is turned into a file'
rm -rf $F/dir/one
touch $F/dir/one
$O/ftpcopy ftp://127.0.0.1:50000/ client ; echo $?
find client -print | sort

echo '--- ftpcopy survives local symlink loops'
rm client/dir/one
ln -s one client/dir/one
echo "first symlink loop test" >$F/dir/one
$O/ftpcopy ftp://127.0.0.1:50000/ client ; echo $?
cat client/dir/one
find client -print | sort

rm client/dir/one
ln -s one client/dir/one
rm $F/dir/one
mkdir $F/dir/one
echo "second symlink loop test" >$F/dir/one/file
$O/ftpcopy ftp://127.0.0.1:50000/ client ; echo $?
cat client/dir/one/file
find client -print | sort

echo '--- ftpcopy recognizes changed symbolic links to directories'
rm -rf client/* $F/*
mkdir $F/dir1
touch $F/dir1/one
(cd $F ; ln -s dir1 dir2 )
$O/ftpcopy ftp://127.0.0.1:50000/ client ; echo $?
find client -print | sort
rm $F/dir2
mkdir $F/dir2
touch $F/dir2/two
$O/ftpcopy ftp://127.0.0.1:50000/ client ; echo $?
find client -print | sort
echo '--- ftpcopy handles dir -> symbolic link change'
rm -rf $F/dir2
(cd $F ; ln -s dir1 dir2 )
$O/ftpcopy ftp://127.0.0.1:50000/ client ; echo $?
find client -print | sort

echo '--- ftpcopy deals with rename situation 1'
rm -rf client/* $F/*
mkdir $F/dir1
touch $F/dir1/one
$O/ftpcopy ftp://127.0.0.1:50000/ client ; echo $?
find client -print | sort
(cd $F ; ln -s dir1 dir2 )
$O/ftpcopy ftp://127.0.0.1:50000/ client ; echo $?
find client -print | sort
(cd $F ; rm dir2 ; mv dir1 dir2 ; ln -s dir2 dir1 )
$O/ftpcopy ftp://127.0.0.1:50000/ client ; echo $?
find client -print | sort
(cd $F ; rm dir1 )
$O/ftpcopy ftp://127.0.0.1:50000/ client ; echo $?
find client -print | sort

echo '--- ftpcopy deals with symlink to upper level directories'
rm -rf client/* $F/*
mkdir $F/dir1
mkdir $F/dir1/dir2
touch $F/dir1/dir2/one
(cd $F/dir1/dir2 ; ln -s ../../dir1 dir1 )
(cd $F/dir1/dir2 ; ln -s ../../dir1 dir2 )
$O/ftpcopy ftp://127.0.0.1:50000/ client ; echo $?
touch client/dir1/dir2/dir1/1
touch client/dir1/dir2/dir2/2
find client -print | sort
echo '--- ftpcopy deals with symlink to current directories'
rm -rf client/* $F/*
mkdir $F/dir1
mkdir $F/dir1/dir2
touch $F/dir1/dir2/one
(cd $F/dir1 ; ln -s . dir1 )
(cd $F/dir1/dir2 ; ln -s . dir2 )
$O/ftpcopy ftp://127.0.0.1:50000/ client ; echo $?
touch client/dir1/dir1/1
touch client/dir1/dir2/dir2/2
find client -print | sort
echo '--- ftpcopy deals with symlink to top level directory'
rm -rf client/* $F/*
touch $F/one
mkdir $F/dir1
mkdir $F/dir1/dir2
touch $F/dir1/dir2/two
# can't do this since the server isn't chrooted:
# (cd $F/dir1/dir2 ; ln -s / dir3 )
(cd $F/dir1 ; ln -s $F dir1 )
(cd $F/dir1 ; ln -s $F/one . )
(cd $F/dir1/dir2 ; ln -s $F dir2 )
(cd $F/dir1/dir2 ; ln -s $F/one . )
$O/ftpcopy ftp://127.0.0.1:50000/ client ; echo $?
touch client/dir1/dir1/1
touch client/dir1/dir2/dir2/2
find client -print | sort
echo "really a (sym)link" >client/one
cat client/dir1/one

echo '--- ftpcopy deals with symlink to lower level directory'
rm -rf client/* $F/*
(cd $F ; ln -s dir2/dir1 dir1)
(cd $F ; ln -s dir2/file1 file1)
mkdir $F/dir2
(cd $F ; ln -s dir2/dir3 dir3)
(cd $F ; ln -s dir2/file3 file3)
mkdir $F/dir2/dir1
touch $F/dir2/dir1/one
touch $F/dir2/file1
touch $F/dir2/file3
mkdir $F/dir2/dir3
touch $F/dir2/dir3/three
$O/ftpcopy ftp://127.0.0.1:50000/ client ; echo $?
touch client/dir2/dir1/1
touch client/dir3/3
find client -print | sort
echo "really a (sym)link 1" >client/dir2/dir1/new
echo "really a (sym)link 2" >client/dir2/file1
echo "really a (sym)link 3" >client/dir2/file3
cat client/dir1/new
cat client/file1
cat client/file3

echo '--- ftpcopy deals with /../ in local file names'
# this checks a few lines of canonization code.
# canonization is mainly used for the hashed file names,
# the (untestable) hacking symbolic link mode, and 
# remote path names.
rm -rf client/* $F/*
echo 1 >$F/one
mkdir $F/dir1
( cd $F/dir1 ; ln -s ../one two)

$O/ftpcopy -l2 ftp://127.0.0.1:50000/ client/../client/ ; echo $?
find client -print | sort
echo "changed" >client/one
cat client/dir1/two


echo '--- ftpcopy --max-days works'
# to make things more interesting publicfiles ftpd doesn't output 
# modification time for files modified in the last 60 seconds.
# ftpparse() returns them as modified 1970, and ftpcopy thinks 
# they are "too old". Ugly, but this is how things work.
# "1" and "3" are dated 2000-01-01         -> not downloaded
# "2" and "5" are one day old.             -> downloaded
# "3" and "6" are very young (<60 seconds) -> not downloaded
cat >oneday.c <<EOF
#include <time.h>
int main(void)
{
time_t x=time(0) - 86400;
printf("%lu\n",x);
exit(0);
}
EOF
$O/auto-compile.sh -o oneday oneday.c 
oneday="`./oneday`"
rm oneday.c oneday

cat >onetouch.c <<EOF
#include <sys/time.h>
#include <fcntl.h>
int main(int argc, char **argv)
{ unsigned long x=strtol(argv[1],0,10);
  int fd;
  struct timeval tv[2];
  fd=open(argv[2],O_WRONLY|O_CREAT,0644);
  tv[0].tv_sec=x;
  tv[1].tv_sec=x;
  tv[0].tv_usec=0;
  tv[1].tv_usec=0;
  return utimes(argv[2],tv);
}
EOF
$O/auto-compile.sh -o onetouch onetouch.c 
rm onetouch.c

rm -rf client/* $F/*
#touch -r $O/Makefile.pre $F/1
mkdir $F/dir
./onetouch 946753200 $F/1
./onetouch 946753200 $F/dir/4
./onetouch $oneday $F/2
./onetouch $oneday $F/dir/5
touch $F/3
touch $F/dir/6
$O/ftpcopy --max-days 10 -l2 ftp://127.0.0.1:50000/ client ; echo $?
#gdb $O/ftpcopy #--max-days 10 -l2 ftp://127.0.0.1:50000/ client ; echo $?
find client -print | sort


echo '--- ftpcopy handles excludes and includes'
rm -rf client/* $F/*
touch $F/0
mkdir $F/d1
touch $F/d1/1
mkdir $F/d1/d2
touch $F/d1/d2/2
mkdir $F/d1/d2/d3
touch $F/d1/d2/d3/3

echo '- e&i: download /0'
rm -rf client
$O/ftpcopy --exclude '*' --include /0 \
   ftp://127.0.0.1:50000/ client ; echo $?

echo '- e&i: no download due to not included upper level directory'
rm -rf client
$O/ftpcopy --exclude '*' --include /d1/1 \
   ftp://127.0.0.1:50000/ client ; echo $?

echo '- e&i: download /d1/1 (include /d1 and /d1/1)'
rm -rf client
$O/ftpcopy --exclude '*' --include '/d1' --include /d1/1 \
   ftp://127.0.0.1:50000/ client ; echo $?
echo '- e&i: download /d1/1 (include /d1 and /d1/?)'
rm -rf client
$O/ftpcopy --exclude '*' --include '/d1' --include '/d1/?' \
   ftp://127.0.0.1:50000/ client ; echo $?
echo '- e&i: download all (include /d1*)'
rm -rf client
$O/ftpcopy --exclude '*' --include '/d1*' \
   ftp://127.0.0.1:50000/ client ; echo $?
echo '- e&i: just get the directories (include *d?)'
rm -rf client
$O/ftpcopy --exclude '*' --include '*d?' \
   ftp://127.0.0.1:50000/ client ; echo $?
find client -print | sort
echo '- e&i: just get the directories (include /d1, /d1/d2, /d1/d2/d3)'
rm -rf client
$O/ftpcopy --exclude '*' --include '/d1' --include '/d1/d2' \
--include '/d1/d2/d3' \
   ftp://127.0.0.1:50000/ client ; echo $?
find client -print | sort
echo '- e&i: get all but */2*'
rm -rf client
$O/ftpcopy --exclude '*/2*' \
   ftp://127.0.0.1:50000/ client ; echo $?
find client -print | sort


echo '--- ftpcopy handles subdirectory mirroring'
rm -rf client/* $F/*
mkdir $F/dir1
(cd $F/dir1 ; ln -s ../dir2 .)
(cd $F/dir1 ; ln -s ../dir2/file21 .)
mkdir $F/dir11
mkdir $F/dir2
mkdir $F/dir2/dir21
echo file211 >$F/dir2/dir21/file211
(cd $F/dir2 ; ln -s dir21/file211 file21 )
mkdir $F/dir3
(cd $F/dir3 ; ln -s . dir3)
mkdir $F/dir3/dir31
echo file31 >$F/dir3/file31
echo file311 >$F/dir3/dir31/file31

echo '- subdir1:'
$O/ftpcopy ftp://127.0.0.1:50000/dir1 client ; echo $?
find client -print | sort
echo "changed" >client/file21
cat client/dir2/file21
echo '- subdir2:' # including deletes
$O/ftpcopy ftp://127.0.0.1:50000/dir2 client ; echo $?
find client -print | sort
echo '- subdir3:' # including deletes
$O/ftpcopy ftp://127.0.0.1:50000/dir3 client ; echo $?
touch client/dir3/newfile
find client -print | sort

echo '--- ftpcopy --directories-only works'
# depends on previous file structure
$O/ftpcopy --directories-only ftp://127.0.0.1:50000/ client ; echo $?
find client -print | sort
rm -rf client
$O/ftpcopy -d 127.0.0.1:50000 / client ; echo $?
find client -print | sort

echo '--- ftpcopy handles absolute local directories'
# this is more superfluous than not. But then again it doesn't cost that much.
rm -rf client/* $F/*
touch $F/0
mkdir $F/d1
touch $F/d1/1
mkdir $F/d1/d2
(cd $F/d1/d2 ; ln -s ../../0 .)
(cd $F/d1/d2 ; ln -s ../1 .)
(cd $F/d1/d2 ; ln -s ../.. d0)
(cd $F/d1/d2 ; ln -s .. d1)
(cd $F/d1/d2 ; ln -s . d2)
touch $F/d1/d2/2
$O/ftpcopy 127.0.0.1:50000 / `pwd`/client ; echo $?
touch client/d1/d2/d0/t0
touch client/d1/d2/d1/t1
touch client/d1/d2/d2/t2
echo "changed0" >client/0
echo "changed1" >client/d1/1
find client -print | sort
cat client/d1/d2/0
cat client/d1/d2/1

echo '--- ftpcopy recognizes --user and --pass'
# we can't really test whether these options work. common.c is too 
# smart for that.
rm -rf client/* $F/*
$O/ftpcopy -l3 --user uwe --pass 42 127.0.0.1:50000 / `pwd`/client ; echo $?
$O/ftpcopy -l3 -u uwe -p 42 127.0.0.1:50000 / `pwd`/client ; echo $?
echo '--- ftpcopy recognizes username in urls'
$O/ftpcopy -l3 ftp://uwe@127.0.0.1:50000/ client ; echo $?

echo '--- ftpcopy --dry-run works'
rm -rf client/* $F/*
touch $F/file0
mkdir $F/dir1
touch $F/dir1/file1
mkdir $F/dir1/dir2
touch $F/dir1/dir2/file2
(cd $F/dir1/dir2 ; ln -s '../../file0' 'linkf0')
(cd $F/dir1/dir2 ; ln -s '../file1' 'linkf1')
(cd $F/dir1/dir2 ; ln -s 'file2' 'linkf2')
(cd $F ; ln -s 'dir1/dir2/file2' 'linkf2')
(cd $F ; ln -s 'dir1/file1' 'linkf1')
touch client/do_not_delete

$O/ftpcopy --dry-run 127.0.0.1:50000 / client ; echo $?
find client -print | sort
fi

echo '--- ftpcopy --interactive works'
rm -rf client/* $F/*
mkdir $F/dir1
(cd $F/dir1 ; ln -s ../dir2 .)
(cd $F/dir1 ; ln -s ../dir2/file21 .)
mkdir $F/dir11
mkdir $F/dir2
mkdir $F/dir2/dir21
echo file211 >$F/dir2/dir21/file211
(cd $F/dir2 ; ln -s dir21/file211 file21 )
mkdir $F/dir3
(cd $F/dir3 ; ln -s . dir3)
mkdir $F/dir3/dir31
echo file31 >$F/dir3/file31
echo file311 >$F/dir3/dir31/file31

# This also checks how ftpcopy deals with absolute remote paths.
(
cat <<EOF
dir1
client/dir1
/dir1
client/dir1a
dir2
client/dir2
dir3
client/dir3
/ dir3
EOF
) | $O/ftpcopy --interactive 127.0.0.1:50000 ; echo $?
find client -print | sort
$O/ftpcopy 127.0.0.1:50000 / client; echo $?
find client -print | sort

echo '--- ftpcopy --tolower works'
rm -rf client/* $F/*
touch $F/file0
mkdir $F/dir1
touch $F/dir1/FiLe1
mkdir $F/dir1/DIR2
touch $F/dir1/DIR2/FILE2
(cd $F ; ln -s 'dir1/DIR2/FILE2' 'LINK')

$O/ftpcopy -l2 --tolower 127.0.0.1:50000 / client ; echo $?
find client -print | sort

echo '--- ftpcopy --tolower does not needlessly reget files'
$O/ftpcopy -l2 --tolower 127.0.0.1:50000 / client ; echo $?

echo '--- ftpcopy --tolower deals with collisions'
# in this case it loses and downloads the files more than once. Oh well.
echo 123 >$F/dir1/FILE1
(cd $F ; ln -s 'dir1/FILE1' 'link')
# "wc" tends to add different amounts of white space, depending on the
# vendor. Oh.
$O/ftpcopy  --tolower 127.0.0.1:50000 / client | wc -l | tr -d ' ' # 1 download
$O/ftpcopy  --tolower 127.0.0.1:50000 / client | wc -l | tr -d ' ' # 2 downloads
$O/ftpcopy  --tolower 127.0.0.1:50000 / client | wc -l | tr -d ' ' # 2 downloads

echo '--- ftpcopy --ignore-size works'
rm -rf client/* $F/*
echo 123 >$F/FILE1
$O/ftpcopy 127.0.0.1:50000 / client
echo 1234 >$F/FILE1
$O/ftpcopy --ignore-size 127.0.0.1:50000 / client
echo '--- ftpcopy without --ignore-size works'
$O/ftpcopy 127.0.0.1:50000 / client

echo '--- ftpcopy --ignore-time works'
rm -rf client/* $F/*
echo 123 >$F/FILE1
./onetouch 946000000 $F/FILE1
$O/ftpcopy 127.0.0.1:50000 / client
./onetouch 947000000 $F/FILE1
$O/ftpcopy --ignore-time 127.0.0.1:50000 / client
echo '--- ftpcopy --ignore-size --ignore-time works'
echo >$F/FILE1
./onetouch 945000000 $F/FILE1
$O/ftpcopy --ignore-time --ignore-size 127.0.0.1:50000 / client
echo '--- ftpcopy without --ignore-time works'
echo 123 >$F/FILE1
./onetouch 944000000 $F/FILE1
$O/ftpcopy 127.0.0.1:50000 / client

echo '--- ftpcopy has no file descriptor leak in remove_dir'
rm -rf client/* $F/*
for i in 0 1 2 3 ; do
  for j in 1 2 3 4 5 6 7 8 9 0 ; do
    mkdir client/d$i$j
    touch $F/d$i$j
  done
done
(
	ulimit -n 12
	$O/ftpcopy  127.0.0.1:50000 / client
)

echo '--- ftpcopy has no file descriptor leak in loop'
rm -rf client/* $F/*
for i in 0 1 2 3 ; do
  for j in 1 2 3 4 5 6 7 8 9 0 ; do
    mkdir $F/d$i$j
    touch $F/d$i$j/f$i$j
  done
done
(
	ulimit -n 12
	$O/ftpcopy  127.0.0.1:50000 / client
)

echo '--- ftpcopy has no file descriptor leak in delete'
rm -rf client/* $F/*
for i in 0 1 2 3 ; do
  for j in 1 2 3 4 5 6 7 8 9 0 ; do
    mkdir client/d$i$j
    touch client/d$i$j/f$i$j
  done
done
(
	ulimit -n 12
	$O/ftpcopy  127.0.0.1:50000 / client
)

echo '--- ftpcopy has no file descriptor leak in download'
rm -rf client/* $F/*
for i in 0 1 2 3 ; do
  for j in 1 2 3 4 5 6 7 8 9 0 ; do
    mkdir $F/d$i$j
    touch $F/d$i$j/f$i$j
  done
done
(
	ulimit -n 12
	$O/ftpcopy 127.0.0.1:50000 / client
)
echo '--- ftpcopy --max-deletes works'
rm -rf client/* $F/*
touch $F/1
(cd client; touch 1 2 3 4 5 6 7 8 9 a b c d e f )
$O/ftpcopy -l 0 --max-deletes 10 127.0.0.1:50000 / client
# note: finds directory "client", too, so the numbers are one off ...
find client -print | wc -l | tr -d ' '
$O/ftpcopy -l 0 -M 1 127.0.0.1:50000 / client
find client -print | wc -l | tr -d ' ' 

svc -dtx $N/server/ftpd
sleep 1 # give supervise time to exit. otherwise race with supervise/status file
#cat $N/server.log |grep -v ^tcpserver
rm onetouch

cd $O || exit 1
rm -rf tmp.check

exit 0
