#!/usr/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

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
			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"
