#! /bin/sh

# Set a default boot entry for GRUB
#   Copyright (C) 2004 Free Software Foundation, Inc.
#
# This file 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 2 of the License, or
# (at your option) any later version.
#
# This program 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 this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

# Initialize some variables.
PACKAGE=@PACKAGE@
VERSION=@VERSION@

rootdir=
entry=

# Usage: usage
# Print the usage.
usage () {
    cat <<EOF
Usage: grub-set-default [OPTION] entry
Set the default boot entry for GRUB.

  -h, --help              print this message and exit
  -v, --version           print the version information and exit
  --root-directory=DIR    Use the directory DIR instead of the root directory

ENTRY is a number or the special keyword \`default\'.

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

# Check the arguments.
for option in "$@"; do
    case "$option" in
    -h | --help)
	usage
	exit 0 ;;
    -v | --version)
	echo "grub-set-default (GNU GRUB ${VERSION})"
	exit 0 ;;
    --root-directory=*)
	rootdir=`echo "$option" | sed 's/--root-directory=//'` ;;
    -*)
	echo "Unrecognized option \`$option'" 1>&2
	usage
	exit 1
	;;
    *)
	if test "x$entry" != x; then
	    echo "More than one entries?" 1>&2
	    usage
	    exit 1
	fi
	# We don't care about what the user specified actually.
	entry="${option}" ;;
    esac
done

if test "x$entry" = x; then
    echo "entry not specified." 1>&2
    usage
    exit 1
fi

# Determine the GRUB directory. This is different among OSes.
grubdir=${rootdir}/boot/grub
if test -d ${grubdir}; then
    :
else
    grubdir=${rootdir}/grub
    if test -d ${grubdir}; then
	:
    else
	echo "No GRUB directory found under ${rootdir}/" 1>&2
	exit 1
    fi
fi

file=${grubdir}/default
if test -f ${file}; then
    chmod 0600 ${file}
    rm -f ${file}
fi
cat <<EOF > $file
$entry
#
#
#
#
#
#
#
#
#
#
# WARNING: If you want to edit this file directly, do not remove any line
# from this file, including this warning. Using \`grub-set-default\' is
# strongly recommended.
EOF

# Bye.
exit 0
