#!/bin/sh
. /usr/share/os-prober/common.sh
set -e

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

found_item=0

title=""
rootdev=""
kernel=""
parameters=""
initrd=""
read_only=""
default_rootdev=""
default_kernel=""
default_parameters=""
default_initrd=""
default_read_only=""

dequote () {
	item="${1%\"}"
	echo "${item#\"}"
}

recordstanza () {
	if [ -n "$kernel" ] && [ -n "$title" ]; then
		if [ -e "$mpoint/$kernel" ] || [ -e "$mpoint/boot$kernel" ]; then
			if [ -e "$mpoint/boot$initrd" ] || [ -e "$mpoint/$initrd" ]; then
				if [ "$read_only" ]; then
					parameters="ro $parameters"
				fi
				if [ "$rootdev" ]; then
					parameters="root=$rootdev $parameters"
				fi
				parameters="${parameters% }"
				result "$rootpart:$bootpart:$title:$kernel:$initrd:$parameters"
				found_item=1
			else
				debug "cannot find $initrd, not recording"
			fi
		else
			debug "cannot find $kernel, not recording"
		fi
		title=""
		rootdev="$default_rootdev"
		kernel="$default_kernel"
		parameters="$default_parameters"
		initrd="$default_initrd"
		read_only="$default_read_only"
	else
		# Everything before set default values.
		default_rootdev="$rootdev"
		default_kernel="$kernel"
		default_parameters="$parameters"
		default_initrd="$initrd"
		default_read_only="$read_only"
	fi
}

parse_silo_conf () {
	mpoint="$1"
	rootpart="$2"
	bootpart="$3"
	IFS=" 	="
	while read line; do
		debug "parsing: $line"
		set -f
		set -- $line
		set +f
		case "$1" in
			root)
				rootdev=$(dequote "$2")
			;;
			image)
				recordstanza
				# Dereference if symbolic link
				if echo "$2" | grep -qs "/boot/"; then
					kernel="$(readlink -f "$(dequote "$mpoint$2")" | sed -e 's#'"$mpoint"'##g')"
				else
					kernel="$(readlink -f "$(dequote "$mpoint/boot$2")" | sed -e 's#'"$mpoint"'/boot##g')"
				fi
			;;
			append)
				shift 1
				parameters=$(dequote "${line#append=}")
			;;
			initrd)
				# Dereference if symbolic link
				if echo "$2" | grep -qs "/boot/"; then
					initrd="$(readlink -f "$(dequote "$mpoint$2")" | sed -e 's#'"$mpoint"'##g')"
				else
					initrd="$(readlink -f "$(dequote "$mpoint/boot$2")" | sed -e 's#'"$mpoint"'/boot##g')"
				fi
			;;
			label)
				shift 1
				title=$(dequote "$*" | sed -e 's/:/ /g')
			;;
			other)
				recordstanza
			;;
			read-only)
				read_only=1
			;;
		esac
	done
	recordstanza
}

if [ -e "$mpoint/boot/silo.conf" ]; then
	debug "parsing silo.conf"
	parse_silo_conf "$mpoint" "$partition" "$bootpart" < "$mpoint/boot/silo.conf"
fi

if [ "$found_item" = 0 ]; then
	exit 1
else
	exit 0
fi
