#!/bin/sh

overlayfs_enabled() {
	# If the root image is read-write, do nothing.
	! touch $ROOTFS_DIR/bin 2>/dev/null
	return $?
}

overlayfs_run() {
	if grep -q -w "overlay" /proc/filesystems; then
		failed=0
		mkdir -p /rootfs /rootfs.ro /rootfs.rw
		mount -n --move $ROOTFS_DIR /rootfs.ro
		mount -t tmpfs -o rw,noatime,mode=755 tmpfs /rootfs
		mkdir -p /rootfs/lowerdir /rootfs/upperdir/boot /rootfs/upperdir/rootfs /rootfs/workdir
		if [ "$ROOT_DISK" ]; then
			# rootfs is imagefile
			boot_dev=$ROOT_DISK
			cp -a /run/media/$boot_dev/* /rootfs/upperdir/boot/ 2>/dev/null || failed=1
			mv /rootfs/upperdir/boot/rootfs.img /rootfs/ 2>/dev/null || failed=1
		else
			# rootfs is partition
			root_dev=$(mount | sed -n "s|^/dev/\(.*\) on /rootfs.ro .*|\1|p")
			boot_dev=${root_dev%2}1
			mkdir -p /run/media/$boot_dev
			mount /dev/$boot_dev /run/media/$boot_dev
			cp -a /run/media/$boot_dev/* /rootfs/upperdir/boot/ 2>/dev/null || failed=1
			dd if=/dev/$root_dev of=/rootfs/rootfs.img bs=1M 2>/dev/null || failed=1
		fi
		if [ $failed = 0 ]; then
			# use ramdisk
			mount /rootfs/rootfs.img /rootfs/lowerdir
			umount /rootfs.ro
			umount /run/media/$boot_dev
		else
			# use boot device
			rm -rf /rootfs/upperdir/boot/ /rootfs/rootfs.img
			mount --move /run/media/$boot_dev /rootfs/upperdir/boot
			mount -n --move /rootfs.ro /rootfs/lowerdir
		fi
		mount -t overlay overlay -o "lowerdir=/rootfs/lowerdir,upperdir=/rootfs/upperdir,workdir=/rootfs/workdir" /rootfs.rw
		mount --move /rootfs rootfs.rw/rootfs
		mount --move /rootfs.rw $ROOTFS_DIR
	fi
}
