#! /bin/sh -e

# Make GRUB rescue image
# Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006,2007,2008  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/>.

# Initialize some variables.
transform="@program_transform_name@"

prefix=@prefix@
exec_prefix=@exec_prefix@
bindir=@bindir@
libdir=@libdir@
PACKAGE_NAME=@PACKAGE_NAME@
PACKAGE_TARNAME=@PACKAGE_TARNAME@
PACKAGE_VERSION=@PACKAGE_VERSION@
target_cpu=@target_cpu@
platform=@platform@
pkglibdir=${libdir}/`echo ${PACKAGE_TARNAME}/${target_cpu}-${platform} | sed ${transform}`

grub_mkimage=${bindir}/`echo grub-mkimage | sed ${transform}`

# Usage: usage
# Print the usage.
usage () {
    cat <<EOF
Usage: grub-mkrescue [OPTION] output_image
Make GRUB rescue image.

  -h, --help              print this message and exit
  -v, --version           print the version information and exit
  --modules=MODULES       pre-load specified modules MODULES
  --overlay=DIR           overlay directory DIR in the memdisk image
                          (may be specified multiple times)
  --pkglibdir=DIR         use images from directory DIR instead of ${pkglibdir}
  --grub-mkimage=FILE     use FILE as grub-mkimage
  --image-type=TYPE       select floppy or cdrom (default)
  --emulation=TYPE        select El Torito boot emulation type floppy
                          or none (default) (cdrom only)

grub-mkimage generates a bootable rescue image of the specified type.

Report bugs to <bug-grub@gnu.org>.
EOF
}

image_type=cdrom
input_dir=${pkglibdir}
emulation=none

# Check the arguments.
for option in "$@"; do
    case "$option" in
    -h | --help)
	usage
	exit 0 ;;
    -v | --version)
	echo "grub-mkrescue (GNU GRUB ${PACKAGE_VERSION})"
	exit 0 ;;
    --modules=*)
	modules=`echo "$option" | sed 's/--modules=//'` ;;
    --overlay=*)
	overlay=${overlay}${overlay:+ }`echo "$option" | sed 's/--overlay=//'` ;;
    --pkglibdir=*)
	input_dir=`echo "$option" | sed 's/--pkglibdir=//'` ;;
    --grub-mkimage=*)
	grub_mkimage=`echo "$option" | sed 's/--grub-mkimage=//'` ;;
    --image-type=*)
    	image_type=`echo "$option" | sed 's/--image-type=//'`
        case "$image_type" in
          floppy|cdrom) ;;
          *)
            echo "Unknown image type \`$image_type'" 1>&2
            exit 1 ;;
        esac ;;
    --emulation=*)
    	emulation=`echo "$option" | sed 's/--emulation=//'`
        case "$emulation" in
          floppy|none) ;;
          *)
            echo "Unknown emulation type \`$emulation'" 1>&2
            exit 1 ;;
        esac ;;
    -*)
	echo "Unrecognized option \`$option'" 1>&2
	usage
	exit 1
	;;
    *)
	if test "x$output_image" != x; then
	    echo "Unrecognized option \`$option'" 1>&2
	    usage
	    exit 1
	fi
	output_image="${option}" ;;
    esac
done

if test "x$output_image" = x; then
  usage
  exit 1
fi

aux_dir=`mktemp -d`
mkdir -p ${aux_dir}/boot/grub

for file in ${input_dir}/*.mod ${input_dir}/efiemu??.o \
  ${input_dir}/command.lst ${input_dir}/moddep.lst ${input_dir}/fs.lst \
  ${input_dir}/handler.lst ${input_dir}/parttool.lst; do
  if test -f "$file"; then
    cp -f "$file" ${aux_dir}/boot/grub/
  fi
done

modules="biosdisk `cat ${input_dir}/partmap.lst` ${modules}"
for i in ${modules} ; do
  echo "insmod $i"
done > ${aux_dir}/boot/grub/grub.cfg

for d in ${overlay}; do
  echo "Overlaying $d"
  cp -dpR "${d}"/* "${aux_dir}"/
done

if [ "x${image_type}" = xfloppy -o "x${emulation}" = xfloppy ] ; then
  # build memdisk
  memdisk_img=`mktemp`
  tar -C ${aux_dir} -cf ${memdisk_img} boot
  rm -rf ${aux_dir}

  # build core.img
  core_img=`mktemp`
  ${grub_mkimage} -d ${input_dir}/ -m ${memdisk_img} -o ${core_img} memdisk tar
  rm -f ${memdisk_img}

  # build floppy image
  if [ "x${image_type}" = xcdrom ] ; then
    floppy_dir=`mktemp -d`
    floppy_img=${floppy_dir}/grub_floppy.img
  else
    floppy_img=${output_image}
  fi
  cat ${input_dir}/boot.img ${core_img} /dev/zero | dd bs=1024 count=1440 > ${floppy_img}
  rm -f ${core_img}

  if [ "x${image_type}" = xcdrom ] ; then
    # build iso image
    genisoimage -b grub_floppy.img \
      -o ${output_image} -r -J ${floppy_dir}
    rm -rf ${floppy_dir}
  fi
else
  # build core.img
  core_img=`mktemp`
  ${grub_mkimage} -d ${input_dir}/ -o ${core_img} biosdisk iso9660

  # build grub_eltorito image
  cat ${input_dir}/cdboot.img ${core_img} > ${aux_dir}/boot/grub/grub_eltorito
  rm -f ${core_img}

  # build iso image
  genisoimage -b boot/grub/grub_eltorito \
    -no-emul-boot -boot-load-size 4 -boot-info-table \
    -o ${output_image} -r -J ${aux_dir}
  rm -rf ${aux_dir}
fi

exit 0
