#!/bin/busybox sh

/bin/busybox --install -s /bin

NEWROOT=/newroot
init=/sbin/init
root=
rootdelay=
rootfstype=auto
ro="ro"
rootflags=
device=

mkdir -p $NEWROOT
mount -t proc     proc  /proc
mount -t sysfs    sysfs /sys
mount -t tmpfs    run   /run
mount -t devtmpfs dev   /dev

read -r cmdline < /proc/cmdline

for param in $cmdline; do
	case $param in
		init=*      ) init=${param#init=}             ;;
		root=*      ) root=${param#root=}             ;;
		rootdelay=* ) rootdelay=${param#rootdelay=}   ;;
		rootfstype=*) rootfstype=${param#rootfstype=} ;;
		rootflags=* ) rootflags=${param#rootflags=}   ;;
		ro          ) ro="ro"                         ;;
		rw          ) ro="rw"                         ;;
		shell       ) shell=1                         ;;
		liveos      ) live=1                          ;;
	esac
done

# mdev
[ -f /proc/sys/kernel/hotplug ] && \
	which mdev > /proc/sys/kernel/hotplug
mdev -s

# load modules using modalias
find /sys -name 'modalias' -type f -exec cat '{}' + | sort -u | xargs modprobe -b -a 2>/dev/null

# load modules
for m in virtio virtio_ring virtio_pci virtio_blk virtio_scsi nvme \
	ata_piix sd_mod sr_mod cdrom loop squashfs isofs overlay mbcache \
	jbd jbd2 ext2 ext3 ext4 xfs btrfs f2fs reiserfs jfs fat vfat exfat ntfs3; do
	modprobe "$m" 2>/dev/null
done

[ "$shell" ] && sh

[ "$rootflags" ] && rootflags="$rootflags,"
rootflags="$rootflags$ro"

if [ "$live" ]; then
	INITRAMFS=/run/initramfs
	MEDIA=$INITRAMFS/media
	LOWER=$INITRAMFS/lower
	UPPER=$INITRAMFS/upper
	WORK=$INITRAMFS/work
	SFSIMAGE=$MEDIA/liveos/rootfs.sfs

	mkdir -p $LOWER $MEDIA $UPPER $WORK

	# figure out media
	if [ -f /proc/sys/dev/cdrom/info ]; then
		CDROM=$(grep name /proc/sys/dev/cdrom/info | awk -F : '{print $2}' | awk '{print $1}')
	fi

	while [ "$wait" != 10 ]; do
		BLOCK=$(grep -E '[vsh]d' /proc/partitions | awk '{print $4}')
		for i in $CDROM $BLOCK; do
			mount -r /dev/"$i" $MEDIA >/dev/null 2>&1 || continue
			[ -d $MEDIA/liveos ] || { umount $MEDIA; continue; }
			MEDIAFOUND=1
			break 2
		done
		wait=$(( wait + 1 ))
		sleep 1
	done

	if [ ! "$MEDIAFOUND" ]; then
		echo "Media not found even after 10 seconds"
		sh
		echo "Cannot go further"
		sleep 99999
		exit 1
	fi

	# mount stuff
	loopdevice=$(losetup -f)
	losetup -f $SFSIMAGE
	mount -r "$loopdevice" $LOWER
	mount -t overlay overlay -o lowerdir=$LOWER,upperdir=$UPPER,workdir=$WORK $NEWROOT
	if [ -f $MEDIA/liveos/live.gz ]; then
		tar -xzf $MEDIA/liveos/live.gz -C $NEWROOT
	fi
else
	case "$root" in
		/dev/*    ) device=$root ;;
		UUID=*    ) eval "$root"; device="$(blkid | grep "$UUID"  | cut -d : -f1 | head -n1)" ;;
		LABEL=*   ) eval "$root"; device="$(blkid | grep "$LABEL" | cut -d : -f1 | head -n1)" ;;
		""        ) echo "!! no root device specified" ; exec sh;;
	esac

	if [ "$rootdelay" ]; then
		i=0
		while [ ! -b "$device" ] && [ "$i" -lt "$rootdelay" ]; do
			echo ">> waiting for $device..."
			sleep 1
			i=$((i+1))
		done
	fi

	while [ ! -b "$device" ] ; do
		echo "!! device '$device' not found"
		exec sh
	done

	if ! mount -n -t "$rootfstype" -o "$rootflags" "$device" $NEWROOT; then
		echo "!! failed to mount device '$device'"
		exec sh
	fi

fi

[ "$shell" ] && sh

pkill mdev

mount --move /sys $NEWROOT/sys
mount --move /proc $NEWROOT/proc
mount --move /dev $NEWROOT/dev
mount --move /run $NEWROOT/run

# execute live script if exist
if [ -f $NEWROOT/"$MEDIA"/liveos/live.sh ]; then
	chroot $NEWROOT sh "$MEDIA"/liveos/live.sh
fi

# switch to newroot
exec switch_root $NEWROOT "$init" $@

echo ">> this is the end of initramfs"
echo ">> nothing further, here's the shell"
busybox sh
