#! /bin/sh -

set -e
SIZE=$1
LANG=$2
TYPE=$3
SRC=$4

if [ "${TYPE}" = "dial" ]
then
	suffix="-D"
fi
if [ "${TYPE}" = "net" ]
then
	suffix="-N"
fi
if [ "${TYPE}" = "isp" ]
then
	suffix="-I"
fi

if [ ! -f ${SRC}/sys/compile/PICOBSD${suffix}.${SIZE}/kernel ]; then
	echo "-> ERROR: you must build PICOBSD${suffix}.${SIZE} first"
	exit 1
fi

echo "-> Preparing kernel..."
cp -p ${SRC}/sys/compile/PICOBSD${suffix}.${SIZE}/kernel kernel
if [ "${TYPE}" != "dial" ]
then
	echo "-> Preparing kvm database..."
	mv /var/db/kvm_kernel.db /var/db/old.db
	kvm_mkdb kernel
	mv /var/db/kvm_kernel.db ../${TYPE}/mfs.tree/var/db/kvm_kernel.db
	mv /var/db/old.db /var/db/kvm_kernel.db
fi

echo "-> Preparing MFS filesystem..."
umount /dev/vn0 2> /dev/null || true
umount /mnt 2> /dev/null || true
vnconfig -u /dev/rvn0 2> /dev/null || true

dd of=fs.PICOBSD if=/dev/zero count=${SIZE} bs=1k 2> /dev/null

awk 'BEGIN {printf "%c%c", 85, 170}' | \
                dd of=fs.PICOBSD obs=1 seek=510 conv=notrunc  2> /dev/null

vnconfig -s labels -c /dev/rvn0 fs.PICOBSD 2>/dev/null
#vnconfig -c /dev/rvn0 fs.PICOBSD 2>/dev/null
if [ "X$?" != "X0" ]
then
	echo "-> Error while doing vnconfig of fs.PICOBSD on /dev/rvn0..."
	echo "-> Aborting $0"
	exit 10
fi

dd if=/usr/mdec/boot1 of=fs.PICOBSD conv=notrunc 2> /dev/null

# This command does weird things on 2.2.x systems. In such case use normal
# disktype here instead
disklabel -rw vn0 auto
if [ "X$?" != "X0" ]
then
	echo "-> Error while labeling fs.PICOBSD (vn0)..."
	echo "-> Aborting $0"
	exit 10
fi

# You can save some space on MFS if you don't want so many inodes...
if [ "${TYPE}" = "dial" ]
then
	newfs -i 32768 -m 0 -p 0 -o space /dev/rvn0c 2>&1 >/dev/null
else
	newfs -i 32768 -m 0 -p 0 -o space /dev/rvn0c 2>&1 >/dev/null
fi
mount /dev/vn0c /mnt
if [ "X$?" != "X0" ]
then
	echo "-> Error while mounting fs.PICOBSD (/dev/vn0c) on /mnt..."
	echo "-> Aborting $0"
	exit 10
fi
