#!/bin/busybox sh
# Stage-1 rc: sourced by /init (still PID 1, initramfs root) when a virtio
# disk is present. Emulates U-Boot's slot choice — parse warden.slot= from the
# cmdline, mount that rootfs, switch_root into it. This is an EMULATION of the
# A/B selection outcome, not the BCB/bootcount mechanism itself.

# /dev/block/by-name/<PARTNAME> symlinks: the contract flare-edge slotctl.rs
# relies on. blkdevparts= gives every vda partition a PARTNAME in sysfs.
mkdir -p /dev/block/by-name
for uev in /sys/class/block/vda*/uevent; do
    [ -f "$uev" ] || continue
    partname=""
    devname=""
    while IFS='=' read -r k v; do
        case "$k" in
            PARTNAME) partname="$v" ;;
            DEVNAME)  devname="$v" ;;
        esac
    done < "$uev"
    [ -n "$partname" ] && [ -n "$devname" ] \
        && ln -sf "/dev/$devname" "/dev/block/by-name/$partname"
done

# Slot select: whole-token parse of warden.slot= (never a substring match).
slot="_a"
for tok in $(cat /proc/cmdline); do
    case "$tok" in
        warden.slot=*) slot="${tok#warden.slot=}" ;;
    esac
done
case "$slot" in
    _a|_b) ;;
    *) echo "rc: bad warden.slot='$slot', falling back to _a"; slot="_a" ;;
esac

root="/dev/block/by-name/rootfs${slot}"
if [ ! -e "$root" ]; then
    echo "rc: $root missing — staying in initramfs"
    return 0
fi

mkdir -p /mnt
if ! mount -t ext4 "$root" /mnt; then
    echo "rc: mount of $root failed — staying in initramfs"
    return 0
fi
if [ ! -x /mnt/sbin/init ]; then
    echo "rc: $root has no /sbin/init — staying in initramfs"
    umount /mnt
    return 0
fi

echo "rc: switching root to rootfs${slot} ($root)"
exec switch_root /mnt /sbin/init
