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

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

found_item=0

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

recordstanza () {
	if [ -n "$kernel" ]; then
		# TODO: handle device=/partition= to find images
		if ! [ -e "$mpoint/$kernel" ]; then
			debug "cannot find $kernel; not recording"
			return
		fi
		if [ "$initrd" ] && ! [ -e "$mpoint/$initrd" ]; then
			debug "cannot find $initrd: not recording"
			return
		fi

		if [ -z "$title" ]; then
			title="$(basename "$kernel")"
		fi
		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

		title=
		rootdev="$default_rootdev"
		kernel="$default_kernel"
		parameters="$default_parameters"
		initrd="$default_initrd"
		read_only="$default_read_only"
	else
		# Everything in the global options section set default values.
		default_rootdev="$rootdev"
		default_kernel="$kernel"
		default_parameters="$parameters"
		default_initrd="$initrd"
		default_read_only="$read_only"
	fi
}

parse_yaboot_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
				kernel="$(dequote "$2")"
			;;
			append)
				shift 1
				parameters="$(dequote "${line#append=}")"
			;;
			initrd)
				initrd="$(dequote "$2")"
			;;
			label)
				shift 1
				title="$(dequote "$*")"
			;;
			alias)
				shift 1
				titlealias="$(dequote "$*")"
			;;
			read-only)
				read_only=1
			;;
		esac
	done
	recordstanza
}

# Avoid failing if archdetect is missing (running outside d-i). This is
# suboptimal but will do for now.
if type archdetect >/dev/null 2>&1; then
	case "`archdetect`" in
		powerpc/powermac_newworld)
		;;
		powerpc/chrp*)
		;;
		*)
			exit 1
		;;
	esac
fi

if [ -e "$mpoint/etc/yaboot.conf" ]; then
	debug "parsing yaboot.conf"
	parse_yaboot_conf "$mpoint" "$partition" "$bootpart" < "$mpoint/etc/yaboot.conf"
fi

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