#! /bin/sh

ccd=/dev/ccd0

tryme ()
{
	if ! "$@" ; then
		echo Failed: "$@" 1>&2
	fi
	
}

cleanup ()
{
	local md
	mount | grep -q /mnt/tmp && tryme umount /mnt/tmp
	for file in /dev/md*.nop ; do
		test -b $file && trymegnop destroy $file
	done
	ccdconfig -g | while read foo ; do
		set -- $foo
		ccdconfig -u /dev/$1
	done
	for md in `mdconfig -l | sed 's/md0//'` ; do
		tryme mdconfig -d -u /dev/$md
	done
	mds=""
}

guarded_run ()
{
	if ! "$@" > log.tmp 2>&1 ; then
		echo "$@" was not happy:
		cat log.tmp
		return 1
	else
		return 0
	fi
}

foo ()
{
	local cmd files ochunk n_parts mds
	# ccd_cmd is not local

	files=/tmp/$1*
	ochunk=`echo $1 | perl -p -e 's/^.*-c([0-9]+)-.*$/$1/'`
	n_parts=`echo $1 | perl -p -e 's/^.*-n([0-9]+).*$/$1/'`
	mds=""
	flags=""
	case $1
	in
		raidtest_1f*)
			flags="linux,mirror";;
		raidtest_0f*)
			flags="linux";;
		*)
			echo Cannot parse: $1 1>&2;;
		
	esac

	shift

#	nchunk=$(($ochunk * ($n_parts - 1)))
	nchunk=$ochunk

	trap cleanup EXIT

	for file in $files ; do
		md=`mdconfig -a -t vnode -f $file`
		mds="$mds /dev/$md"
	done
	ccd_cmd="ccdconfig -c $ccd $nchunk $flags $mds"
	$ccd_cmd || return 1
	guarded_run fsck.ext2 -nf $ccd || return 1
	guarded_run fsck.ext3 -nf $ccd || return 1
	mount -r -t ext2fs $ccd /mnt/tmp || return 1
	echo `md5 < /mnt/tmp/filler2` ' '- | diff /mnt/tmp/filler2.md5 - || return 1
}

all ()
{
	stuff=`cd /tmp ; ls raidtest_[01]fs* | while read foo ; do
		echo ${foo%.?}
	done | sort | uniq`
	for tryme in $stuff ; do
		if foo $tryme ] ; then
			if [ "$VERBOSE" = 1 ] ; then
				echo Worked: $tryme: $ccd_cmd
			fi
		else
			echo Failed: $tryme: $ccd_cmd
		fi
		cleanup
	done
}

one ()
{
	foo raidtest_1fs-c128-s128-n2
	cleanup
	foo raidtest_1fs-c128-s1024-n4
#	foo raidtest_0fs-c64-s128-n4
}

if [ $# = 0 ] ; then
	all
else
	for cmd in "$@" ; do
		$cmd
	done
fi
