#!/bin/sh

INIT=/sbin/init.sysvinit
#OVERLAYS=/media/ram /media/cf /media/card
ROOTBACKUP=/media/realroot
UNION=/media/union
PATH=/usr/bin:/usr/sbin:/bin:/sbin

if ! test -e ${INIT}; then
	echo >&2 "ERROR: ${INIT} not found"
	exit 1
fi

if test x"$*" != "x"; then
	exec ${INIT} $*
fi

if ! which unionctl; then
	exec ${INIT}
fi

nodupmount () {
	opts=""
	type=""
	while true; do
		if test "$1" = "-o"; then
			shift
			opts="-o $1"
			shift
		elif test "$1" = "-t"; then
			shift
			type="$1"
			shift
		else
			break
		fi
	done
	if test x"$2" = "x"; then
		mountpt="$1"
	else
		device="$1"
		mountpt="$2"
	fi
	mountmatch="^[^ ]+ $mountpt $type"
	# echo "NOTE: grep -E -q \"$mountmatch\" /proc/mounts"
	if grep -E -q "$mountmatch" /proc/mounts; then
		return 0;
	fi
	if test x"$type" != "x"; then
		type="-t $type"
	fi
	echo >&2 "NOTE: executing mount $type $opts $device $mountpt"
	mkdir -p $mountpt
	/bin/mount.busybox $type $opts $device $mountpt
	ret="$?"
	if test "$ret" = "0"; then
		wemounted="$wemounted $mountpt"
	fi
	return $ret
}

#set -x
wemounted=""
(
	set -e
	/bin/mount.busybox /proc
	insmod /lib/modules/`uname -r`/kernel/fs/unionfs.o
	nodupmount -t unionfs -o dirs=/.=rw,setattr=all none ${UNION}
#	nodupmount -o bind / ${UNION}/${ROOTBACKUP}
#	for OVERLAY in ${OVERLAYS}; do
#		nodupmount ${OVERLAY}
#		union-ctl /. --add --mode rw ${OVERLAY}
#		nodupmount -o bind ${OVERLAY} ${UNION}/${OVERLAY}
#	done
	/bin/umount.busybox /proc
#	nodupmount -o bind /proc ${UNION}/proc
#	nodupmount -o bind / ${ROOTBACKUP}
) || (
	echo >&2 "ERROR: unable to setup mounts for chroot";
	if test x"$wemounted" != "x"; then
		# cleanup
		for mount in $wemounted; do
			/bin/umount.busybox $mount
		done
	fi
	exec ${INIT}
)
cd ${UNION}
pivot_root . ./${ROOTBACKUP}
exec chroot . ${INIT}