#!/bin/sh
# Fallback in case nothing else works. Look for vmlinu[xz] file in root and
# /boot, see if there is a matching initrd, and wing it.
. /usr/share/os-prober/common.sh
set -e

is_loong64=0

# The current system from which os-prober is run is a LoongArch system.
# Marked by 00_flag-loong64.
if [ -e "$OS_PROBER_TMP/is_loong64" ]; then
        is_loong64=1
fi

partition="$1"
bootpart="$2"
mpoint="$3"
type="$4"

mappedpartition=$(mapdevfs "$partition" 2>/dev/null) || mappedpartition="$partition"

exitcode=1
for kernpat in /vmlinuz /vmlinux /boot/vmlinuz /boot/vmlinux "/boot/vmlinuz*" \
	        "/boot/vmlinux*" "/vmlinuz*" "/vmlinux*" "/kernel-*" "/boot/kernel-*"; do
	if echo "$kernpat" | grep -q boot/; then
		kernbootpart="$bootpart"
	else
		kernbootpart="$partition"
	fi
	for kernfile in $(eval ls -vr "$mpoint$kernpat" 2>/dev/null); do
		kernbasefile=$(echo "$kernfile" | sed "s!^$mpoint!!")
		if [ -f "$kernfile" ] && [ ! -L "$kernfile" ]; then
			# Detect if the kernel image is non-PE (non-EFI-stub).
			# Non-EFI-stub kernels can be assumed to be old-world
			# ones, which needs to be booted from an old-world
			# GRUB2 bootloader (new-world GRUB2 can't yet boot
			# old-world kernels.
			if [ "$is_loong64" = "1" ] && ! is_efi_stub "$kernfile"; then
				touch "$OS_PROBER_TMP/loong64_have_non_pe_kernel"
				continue
			fi
			initrdname=$(echo "$kernfile" | sed "s/vmlinu[zx]/initrd\*/")
			# Yellow Dog Linux appends .img to it.
			initrdname1="${initrdname}.img"
			# Arch Linux names its initrds weirdly.  We take
			# some care here to avoid false positives on other
			# systems, since kernel.img could conceivably be a
			# kernel itself.
			initrdname2=$(echo "$kernfile" | sed -n 's/vmlinu[zx]\([0-9][0-9]*\)/kernel\1/p' | sed 's/$/.img/')
			# Dracut initramfses are named differently again.
			initrdname3=$(echo "$kernfile" | sed "s/vmlinu[zx]/initramfs\*/" | sed 's/$/.img/')
			# And Gentoo's also
			initrdname4=$(echo "$kernfile" | sed "s/kernel/initramfs\*/")
			# Also Alpine
			initrdname5=$(echo "$kernfile" | sed "s/vmlinu[zx]/initramfs\*/")
			foundinitrd=0
			for initrd in $(eval ls "$initrdname" "$initrdname1" "$initrdname2" "$initrdname3" "$initrdname4" "$initrdname5" 2>/dev/null); do
				if [ "$initrd" != "$kernfile" ] && [ -f "$initrd" ] && [ ! -L "$initrd" ]; then
					initrd=$(echo "$initrd" | sed "s!^$mpoint!!")
					result "$partition:$kernbootpart::$kernbasefile:$initrd:root=$mappedpartition"
					exitcode=0
					foundinitrd=1
				fi
			done
			if [ "$foundinitrd" = 0 ]; then
				result "$partition:$kernbootpart::$kernbasefile::root=$mappedpartition"
				exitcode=0
			fi
		fi
	done
done
exit "$exitcode"
