#!/bin/bash -eu
# SPDX-License-Identifier: GPL-3.0-or-later

. sh-functions

mkdir "$ROOTDIR"/overlay

find -P "$ROOTDIR" -type f -execdir touch -c -m --date="1970-01-01 00:00:00 +0000" '{}' '+'

suffix="$RUNTIME_COMPRESSED_FS"

mv -- "$ROOTDIR" "$ROOTDIR.$suffix"
mkdir -- "$ROOTDIR"

base_layer="${RUNTIME_BASE_LAYER-}"

[ -n "$base_layer" ] ||
	! type -P mksquashfs >/dev/null 2>&1 ||
	base_layer="squashfs"

[ -n "$base_layer" ] ||
	! type -P mkfs.erofs >/dev/null 2>&1 ||
	base_layer="erofs"

case "$base_layer" in
	squashfs)
		kmodule_requires="${RUNTIME_LAYER_SQUASHFS_MODULES-}"
		layerfs=squashfs

		mksquashfs "$ROOTDIR.$suffix" "$ROOTDIR"/initramfs.img -quiet -no-progress -no-xattrs \
			${RUNTIME_LAYER_SQUASHFS_ARGS-} \
			${RUNTIME_LAYER_SQUASHFS_COMPRESS:+-comp "$RUNTIME_LAYER_SQUASHFS_COMPRESS"} \
			-all-root \
			-p '/dev/ram     b 0644 0 0 1 1' \
			-p '/dev/null    c 0666 0 0 1 3' \
			-p '/dev/zero    c 0666 0 0 1 5' \
			-p '/dev/full    c 0666 0 0 1 7' \
			-p '/dev/random  c 0666 0 0 1 8' \
			-p '/dev/systty  c 0666 0 0 4 0' \
			-p '/dev/tty0    c 0666 0 0 4 0' \
			-p '/dev/tty1    c 0666 0 0 4 1' \
			-p '/dev/tty     c 0666 0 0 5 0' \
			-p '/dev/console c 0600 0 0 5 1' \
			-p '/dev/ptmx    c 0666 0 0 5 2' \
			#
		;;
	erofs)
		kmodule_requires="${RUNTIME_LAYER_EROFS_MODULES-}"
		layerfs=erofs

		mkfs.erofs --quiet -x -1 \
			${RUNTIME_LAYER_EROFS_ARGS=} \
			${RUNTIME_LAYER_EROFS_COMPRESS:+-z "$RUNTIME_LAYER_EROFS_COMPRESS"} \
			--all-root \
			"$ROOTDIR"/initramfs.img "$ROOTDIR.$suffix"
		;;
	*)
		fatal "unknown base layer: $base_layer"
		;;
esac

printf '%s\n' "$base_layer" > "$WORKDIR"/compressed-fs

mkdir -p -- \
	"$ROOTDIR"/bin \
	"$ROOTDIR"/dev \
	"$ROOTDIR"/root \
	"$ROOTDIR"/overlay \
	"$ROOTDIR"/usr \
#

ln -s -- ../bin  "$ROOTDIR"/usr/bin
ln -s -- ../sbin "$ROOTDIR"/usr/bin

put-file -r "$ROOTDIR.$suffix" "$ROOTDIR" "$ROOTDIR.$suffix"/bin/busybox

cat > "$ROOTDIR"/init <<EOF
#!/bin/busybox ash
EOF

if [ -n "$kmodule_requires" ]; then
	depinfo --set-version="$KERNEL" --no-prefix --no-builtin \
		$kmodule_requires | tac |
	while read -r modname; do
		mkdir -p -- "$ROOTDIR/${modname%/*}"
		cp -- "$modname" "$ROOTDIR/$modname"
		printf '/bin/busybox insmod %s\n' "$modname"
	done >> "$ROOTDIR/init"
fi

cat >> "$ROOTDIR"/init <<EOF
/bin/busybox mount -t ramfs ramfs /overlay
/bin/busybox mkdir /overlay/root /overlay/upper /overlay/work
/bin/busybox mount -t $layerfs -o loop /initramfs.img /overlay/root
/bin/busybox mount -t overlay overlay -o lowerdir=/overlay/root,upperdir=/overlay/upper,workdir=/overlay/work /root
/bin/busybox mount --move /overlay /root/overlay
exec /bin/busybox switch_root /root /init
EOF
chmod +x "$ROOTDIR"/init
