#! /bin/sh
set -e

# grub-mkconfig helper script.
# Copyright (C) 2006,2007,2008,2009,2010,2011  Free Software Foundation, Inc.
#
# GRUB is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GRUB is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GRUB.  If not, see <http://www.gnu.org/licenses/>.

prefix="@prefix@"
exec_prefix="@exec_prefix@"
datarootdir="@datarootdir@"
. "$pkgdatadir/grub-mkconfig_lib"

export TEXTDOMAIN=@PACKAGE@
export TEXTDOMAINDIR="@localedir@"

CLASS="--class os"

case "${GRUB_DISTRIBUTOR}" in
  Debian)
	OS="${GRUB_DISTRIBUTOR} GNU/kFreeBSD"
	CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr 'A-Z' 'a-z' | cut -d' ' -f1|LC_ALL=C sed 's,[^[:alnum:]_],_,g') --class gnu-kfreebsd --class gnu ${CLASS}"
  ;;
  *)
	OS="FreeBSD"
	CLASS="--class freebsd --class bsd ${CLASS}"
  ;;
esac

load_kfreebsd_module ()
{
  mod="$1"
  allow_fail="$2"

  if ! test -e "${module_dir}/${mod}.ko" ; then
    if [ "${allow_fail}" = "true" ] ; then
      # Return silently
      return
    else
      # Print an error and fail.
      ls "${module_dir}/${mod}.ko" > /dev/null
    fi
  fi

  if [ -z "${prepare_module_dir_cache}" ]; then
    prepare_module_dir_cache="$(prepare_grub_to_access_device $(${grub_probe} -t device "${module_dir}") | grub_add_tab)"
  fi

  printf '%s\n' "${prepare_module_dir_cache}"
  cat << EOF
	kfreebsd_module_elf	${module_dir_rel}/${mod}.ko
EOF
}

title_correction_code=

kfreebsd_entry ()
{
  os="$1"
  version="$2"
  type="$3"
  args="$4"
  if [ -z "$boot_device_id" ]; then
      boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
  fi
  if [ x$type != xsimple ] ; then
      if [ x$type = xrecovery ] ; then
	  title="$(gettext_printf "%s, with kFreeBSD %s (recovery mode)" "${os}" "${version}")"
      else
	  title="$(gettext_printf "%s, with kFreeBSD %s" "${os}" "${version}")"
      fi
      replacement_title="$(echo "Advanced options for ${OS}" | sed 's,>,>>,g')>$(echo "$title" | sed 's,>,>>,g')"
      if [ x"$title" = x"$GRUB_ACTUAL_DEFAULT" ]; then
	  quoted="$(echo "$GRUB_ACTUAL_DEFAULT" | grub_quote)"
	  title_correction_code="${title_correction_code}if [ \"x\$default\" = '$quoted' ]; then default='$(echo "$replacement_title" | grub_quote)'; fi;"
	  grub_warn "$(gettext_printf "Please don't use old title \`%s' for GRUB_DEFAULT, use \`%s' (for versions before 2.00) or \`%s' (for 2.00 or later)" "$GRUB_ACTUAL_DEFAULT" "$replacement_title" "kfreebsd-advanced-$boot_device_id>kfreebsd-$version-$type-$boot_device_id")"
      fi
      echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'kfreebsd-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
  else
      echo "menuentry '$(echo "$OS" | grub_quote)' ${CLASS} \$menuentry_id_option 'kfreebsd-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
  fi
  if [ x$type != xrecovery ] ; then
      save_default_entry | grub_add_tab | sed "s/^/$submenu_indentation/"
  fi
  if [ -z "${prepare_boot_cache}" ]; then
    prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | grub_add_tab)"
  fi

  printf '%s\n' "${prepare_boot_cache}" | sed "s/^/$submenu_indentation/"
  message="$(gettext_printf "Loading kernel of FreeBSD %s ..." ${version})"
  sed "s/^/$submenu_indentation/" << EOF
	echo			'$(echo "$message" | grub_quote)'
	kfreebsd		${rel_dirname}/${basename} ${args}
EOF

  if test -n "${devices}" ; then
      sed "s/^/$submenu_indentation/" << EOF
	kfreebsd_loadenv	${devices_rel_dirname}/${devices_basename}
EOF
  fi

  load_kfreebsd_module acpi true

  for abstraction in dummy $(${grub_probe} -t abstraction --device ${GRUB_DEVICE}) ; do
    case $abstraction in
      lvm) load_kfreebsd_module geom_linux_lvm false ;;
    esac
  done

  case "${kfreebsd_fs}" in
    zfs)
      load_kfreebsd_module opensolaris false

      ls "/boot/zfs/zpool.cache" > /dev/null
      printf '%s\n' "${prepare_boot_cache}"
      sed "s/^/$submenu_indentation/" << EOF
	kfreebsd_module		$(make_system_path_relative_to_its_root /boot)/zfs/zpool.cache type=/boot/zfs/zpool.cache
EOF
    ;;
  esac

  if [ x${kfreebsd_fs} = xufs ]; then
	load_kfreebsd_module ${kfreebsd_fs} true | sed "s/^/$submenu_indentation/"
  else
	load_kfreebsd_module ${kfreebsd_fs} false | sed "s/^/$submenu_indentation/"
  fi

  sed "s/^/$submenu_indentation/" << EOF
	set kFreeBSD.vfs.root.mountfrom=${kfreebsd_fs}:${kfreebsd_device}
	set kFreeBSD.vfs.root.mountfrom.options=rw
}
EOF
}

list=
for i in /boot/kfreebsd-* /boot/kernel/kernel ; do
  if grub_file_is_not_garbage "$i" ; then
    list="$list $i"
  fi
done
prepare_boot_cache=
boot_device_id=
title_correction_code=

# Extra indentation to add to menu entries in a submenu. We're not in a submenu
# yet, so it's empty. In a submenu it will be equal to '\t' (one tab).
submenu_indentation=""

is_top_level=true

while [ "x$list" != "x" ] ; do
  kfreebsd=`version_find_latest $list`
  gettext_printf "Found kernel of FreeBSD: %s\n" "$kfreebsd" >&2
  basename=`basename $kfreebsd`
  dirname=`dirname $kfreebsd`
  rel_dirname=`make_system_path_relative_to_its_root $dirname`

  if [ -f /boot/device.hints ] ; then
    devices=/boot/device.hints
    devices_basename=`basename $devices`
    devices_dirname=`dirname $devices`
    devices_rel_dirname=`make_system_path_relative_to_its_root $devices_dirname`
  fi

  case ${GRUB_FS} in
    ufs1 | ufs2)	kfreebsd_fs=ufs ;;
    ext2)		kfreebsd_fs=ext2fs ;;
    *)			kfreebsd_fs=${GRUB_FS} ;;
  esac

  case ${GRUB_FS} in
    zfs)
			# zpool name
			kfreebsd_device=$(${grub_probe} -t fs_label --device ${GRUB_DEVICE})
			# filesystem name (empty string for the main filesystem)
			kfreebsd_device="${kfreebsd_device}$(${grub_mkrelpath} / | sed -e "s,/*@$,,")"
    ;;
    *)
	  kfreebsd_device=${kfreebsd_fs}id/${GRUB_DEVICE_UUID}
	  # Debian GNU/kFreeBSD can't remount root if it's supplied as UUID but
	  # as an UUID
	  if [ "x${GRUB_DISTRIBUTOR}" = "xDebian" ] \
	      && ! (cat /etc/fstab | awk '!/^[[:space:]]*#/ && $2=="/" { print $1; }' \
	      | grep "${kfreebsd_fs}id/${GRUB_DEVICE_UUID}" > /dev/null); then
	      kfreebsd_device=${GRUB_DEVICE} 
	  fi
	  ;;
  esac

  version=`echo $basename | sed -e "s,^[^0-9]*-,,g;s/\.gz$//g"`
  alt_version=`echo $version | sed -e "s,\.old$,,g"`

  module_dir=
  for i in "/lib/modules/${version}" "/lib/modules/${alt_version}" \
      "/boot/kernel"; do
    if test -e "$i" ; then
      module_dir="$i"
      break
    fi
  done
  if test -n "${module_dir}" ; then
    gettext_printf "Found kernel module directory: %s\n" "${module_dir}" >&2
    module_dir_rel=$(make_system_path_relative_to_its_root $module_dir)
  fi

  if [ "x$is_top_level" = xtrue ] && [ "x${GRUB_DISABLE_SUBMENU}" != xy ]; then
      kfreebsd_entry "${OS}" "${version}" simple
      submenu_indentation="$grub_tab"
    
      if [ -z "$boot_device_id" ]; then
	  boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
      fi
      # TRANSLATORS: %s is replaced with an OS name
      echo "submenu '$(gettext_printf "Advanced options for %s" "${OS}" | grub_quote)' \$menuentry_id_option 'kfreebsd-advanced-$boot_device_id' {"
      is_top_level=false
  fi

  kfreebsd_entry "${OS}" "${version}" advanced
  if [ "x${GRUB_DISABLE_RECOVERY}" != "xtrue" ]; then
    kfreebsd_entry "${OS}" "${version}" recovery "-s"
  fi

  list=`echo $list | tr ' ' '\n' | fgrep -vx "$kfreebsd" | tr '\n' ' '`
done

# If at least one kernel was found, then we need to
# add a closing '}' for the submenu command.
if [ x"$is_top_level" != xtrue ]; then
  echo '}'
fi

echo "$title_correction_code"

