15b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#! /bin/sh
25b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
35b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Install GRUB on your drive.
45b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#   Copyright (C) 1999,2000,2001,2002,2003,2004 Free Software Foundation, Inc.
55b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#
65b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# This file is free software; you can redistribute it and/or modify it
75b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# under the terms of the GNU General Public License as published by
85b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# the Free Software Foundation; either version 2 of the License, or
95b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# (at your option) any later version.
105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#
115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# This program is distributed in the hope that it will be useful, but
125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# WITHOUT ANY WARRANTY; without even the implied warranty of
135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# General Public License for more details.
155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#
165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# You should have received a copy of the GNU General Public License
175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# along with this program; if not, write to the Free Software
185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Initialize some variables.
215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectprefix=@prefix@
225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectexec_prefix=@exec_prefix@
235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectsbindir=@sbindir@
245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectlibdir=@libdir@
255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectPACKAGE=@PACKAGE@
265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectVERSION=@VERSION@
275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthost_cpu=@host_cpu@
285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthost_os=@host_os@
295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthost_vendor=@host_vendor@
305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectpkglibdir=${libdir}/${PACKAGE}/${host_cpu}-${host_vendor}
315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgrub_shell=${sbindir}/grub
335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgrub_set_default=${sbindir}/grub-set-default
345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectlog_file=/tmp/grub-install.log.$$
355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectimg_file=/tmp/grub-install.img.$$
365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectrootdir=
375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgrub_prefix=/boot/grub
385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectinstall_device=
405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectno_floppy=
415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectforce_lba=
425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectrecheck=no
435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectdebug=no
445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# look for secure tempfile creation wrappers on this platform
465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectif test -x /bin/tempfile; then
475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    mklog="/bin/tempfile --prefix=grub"
485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    mkimg="/bin/tempfile --prefix=grub"
495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectelif test -x /bin/mktemp; then
505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    mklog="/bin/mktemp /tmp/grub-install.log.XXXXXX"
515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    mkimg="/bin/mktemp /tmp/grub-install.img.XXXXXX"
525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectelse
535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    mklog=""
545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    mkimg=""
555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfi
565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Usage: usage
585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Print the usage.
595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectusage () {
605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    cat <<EOF
615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectUsage: grub-install [OPTION] install_device
625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectInstall GRUB on your drive.
635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  -h, --help              print this message and exit
655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  -v, --version           print the version information and exit
665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  --root-directory=DIR    install GRUB images under the directory DIR
675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project                          instead of the root directory
685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  --grub-shell=FILE       use FILE as the grub shell
695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  --no-floppy             do not probe any floppy drive
705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  --force-lba             force GRUB to use LBA mode even for a buggy
715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project                          BIOS
725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  --recheck               probe a device map even if it already exists
735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectINSTALL_DEVICE can be a GRUB device name or a system device filename.
755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgrub-install copies GRUB images into the DIR/boot directory specfied by
775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project--root-directory, and uses the grub shell to install grub into the boot
785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectsector.
795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectReport bugs to <bug-grub@gnu.org>.
815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectEOF
825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Usage: convert os_device
855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Convert an OS device to the corresponding GRUB drive.
865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# This part is OS-specific.
875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectconvert () {
885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    # First, check if the device file exists.
895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    if test -e "$1"; then
905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	:
915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    else
925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	echo "$1: Not found or not a block device." 1>&2
935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	exit 1
945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    fi
955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    # Break the device name into the disk part and the partition part.
975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    case "$host_os" in
985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    linux*)
995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tmp_disk=`echo "$1" | sed -e 's%\([sh]d[a-z]\)[0-9]*$%\1%' \
1005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project				  -e 's%\(d[0-9]*\)p[0-9]*$%\1%' \
1015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project				  -e 's%\(fd[0-9]*\)$%\1%' \
1025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project				  -e 's%/part[0-9]*$%/disc%' \
1035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project				  -e 's%\(c[0-7]d[0-9]*\).*$%\1%'`
1045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tmp_part=`echo "$1" | sed -e 's%.*/[sh]d[a-z]\([0-9]*\)$%\1%' \
1055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project				  -e 's%.*d[0-9]*p%%' \
1065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project				  -e 's%.*/fd[0-9]*$%%' \
1075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project				  -e 's%.*/floppy/[0-9]*$%%' \
1085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project				  -e 's%.*/\(disc\|part\([0-9]*\)\)$%\2%' \
1095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project				  -e 's%.*c[0-7]d[0-9]*p%%'`
1105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	;;
1115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    gnu*)
1125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tmp_disk=`echo "$1" | sed 's%\([sh]d[0-9]*\).*%\1%'`
1135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tmp_part=`echo "$1" | sed "s%$tmp_disk%%"` ;;
1145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    freebsd* | kfreebsd*-gnu)
1155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tmp_disk=`echo "$1" | sed 's%r\{0,1\}\([saw]d[0-9]*\).*$%r\1%' \
1165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			    | sed 's%r\{0,1\}\(da[0-9]*\).*$%r\1%'`
1175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tmp_part=`echo "$1" \
1185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    | sed "s%.*/r\{0,1\}[saw]d[0-9]\(s[0-9]*[a-h]\)%\1%" \
1195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project       	    | sed "s%.*/r\{0,1\}da[0-9]\(s[0-9]*[a-h]\)%\1%"`
1205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	;;
1215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    netbsd* | knetbsd*-gnu)
1225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tmp_disk=`echo "$1" | sed 's%r\{0,1\}\([sw]d[0-9]*\).*$%r\1d%' \
1235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    | sed 's%r\{0,1\}\(fd[0-9]*\).*$%r\1a%'`
1245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tmp_part=`echo "$1" \
1255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    | sed "s%.*/r\{0,1\}[sw]d[0-9]\([abe-p]\)%\1%"`
1265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	;;
1275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    *)
1285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	echo "grub-install does not support your OS yet." 1>&2
1295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	exit 1 ;;
1305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    esac
1315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    # Get the drive name.
1335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    tmp_drive=`grep -v '^#' $device_map | grep "$tmp_disk *$" \
1345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	| sed 's%.*\(([hf]d[0-9][a-g0-9,]*)\).*%\1%'`
1355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    # If not found, print an error message and exit.
1375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    if test "x$tmp_drive" = x; then
1385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	echo "$1 does not have any corresponding BIOS drive." 1>&2
1395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	exit 1
1405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    fi
1415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    if test "x$tmp_part" != x; then
1435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	# If a partition is specified, we need to translate it into the
1445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	# GRUB's syntax.
1455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case "$host_os" in
1465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	linux*)
1475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    echo "$tmp_drive" | sed "s%)$%,`expr $tmp_part - 1`)%" ;;
1485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	gnu*)
1495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    if echo $tmp_part | grep "^s" >/dev/null; then
1505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		tmp_pc_slice=`echo $tmp_part \
1515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    | sed "s%s\([0-9]*\)[a-g]*$%\1%"`
1525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		tmp_drive=`echo "$tmp_drive" \
1535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    | sed "s%)%,\`expr "$tmp_pc_slice" - 1\`)%"`
1545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    fi
1555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    if echo $tmp_part | grep "[a-g]$" >/dev/null; then
1565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		tmp_bsd_partition=`echo "$tmp_part" \
1575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    | sed "s%[^a-g]*\([a-g]\)$%\1%"`
1585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		tmp_drive=`echo "$tmp_drive" \
1595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    | sed "s%)%,$tmp_bsd_partition)%"`
1605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    fi
1615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    echo "$tmp_drive" ;;
1625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	freebsd* | kfreebsd*-gnu)
1635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    if echo $tmp_part | grep "^s" >/dev/null; then
1645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		tmp_pc_slice=`echo $tmp_part \
1655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    | sed "s%s\([0-9]*\)[a-h]*$%\1%"`
1665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		tmp_drive=`echo "$tmp_drive" \
1675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    | sed "s%)%,\`expr "$tmp_pc_slice" - 1\`)%"`
1685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    fi
1695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    if echo $tmp_part | grep "[a-h]$" >/dev/null; then
1705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		tmp_bsd_partition=`echo "$tmp_part" \
1715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    | sed "s%s\{0,1\}[0-9]*\([a-h]\)$%\1%"`
1725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		tmp_drive=`echo "$tmp_drive" \
1735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    | sed "s%)%,$tmp_bsd_partition)%"`
1745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    fi
1755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    echo "$tmp_drive" ;;
1765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	netbsd* | knetbsd*-gnu)
1775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    if echo $tmp_part | grep "^[abe-p]$" >/dev/null; then
1785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		tmp_bsd_partition=`echo "$tmp_part" \
1795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    | sed "s%\([a-p]\)$%\1%"`
1805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		tmp_drive=`echo "$tmp_drive" \
1815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    | sed "s%)%,$tmp_bsd_partition)%"`
1825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    fi
1835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    echo "$tmp_drive" ;;
1845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	esac
1855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    else
1865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	# If no partition is specified, just print the drive name.
1875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	echo "$tmp_drive"
1885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    fi
1895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
1905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Usage: resolve_symlink file
1925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Find the real file/device that file points at
1935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectresolve_symlink () {
1945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tmp_fname=$1
1955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	# Resolve symlinks
1965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	while test -L $tmp_fname; do
1975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		tmp_new_fname=`ls -al $tmp_fname | sed -n 's%.*-> \(.*\)%\1%p'`
1985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		if test -z "$tmp_new_fname"; then
1995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			echo "Unrecognized ls output" 2>&1
2005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			exit 1
2015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		fi
2025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		# Convert relative symlinks
2045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		case $tmp_new_fname in
2055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			/*) tmp_fname="$tmp_new_fname"
2065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			;;
2075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			*) tmp_fname="`echo $tmp_fname | sed 's%/[^/]*$%%'`/$tmp_new_fname"
2085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			;;
2095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		esac
2105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	done
2115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	echo "$tmp_fname"
2125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
2135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Usage: find_device file
2155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Find block device on which the file resides.
2165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfind_device () {
2175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    # For now, this uses the program `df' to get the device name, but is
2185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    # this really portable?
2195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    tmp_fname=`df $1/ | sed -n 's%.*\(/dev/[^ 	]*\).*%\1%p'`
2205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    if test -z "$tmp_fname"; then
2225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	echo "Could not find device for $1" 2>&1
2235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	exit 1
2245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    fi
2255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	tmp_fname=`resolve_symlink $tmp_fname`
2275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    echo "$tmp_fname"
2295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
2305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Check the arguments.
2325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfor option in "$@"; do
2335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    case "$option" in
2345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    -h | --help)
2355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	usage
2365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	exit 0 ;;
2375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    -v | --version)
2385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	echo "grub-install (GNU GRUB ${VERSION})"
2395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	exit 0 ;;
2405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    --root-directory=*)
2415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	rootdir=`echo "$option" | sed 's/--root-directory=//'` ;;
2425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    --grub-shell=*)
2435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	grub_shell=`echo "$option" | sed 's/--grub-shell=//'` ;;
2445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    --no-floppy)
2455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	no_floppy="--no-floppy" ;;
2465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    --force-lba)
2475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	force_lba="--force-lba" ;;
2485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    --recheck)
2495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	recheck=yes ;;
2505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    # This is an undocumented feature...
2515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    --debug)
2525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	debug=yes ;;
2535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    -*)
2545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	echo "Unrecognized option \`$option'" 1>&2
2555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	usage
2565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	exit 1
2575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	;;
2585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    *)
2595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	if test "x$install_device" != x; then
2605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    echo "More than one install_devices?" 1>&2
2615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    usage
2625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    exit 1
2635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	fi
2645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	install_device="${option}" ;;
2655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    esac
2665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectdone
2675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectif test "x$install_device" = x; then
2695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    echo "install_device not specified." 1>&2
2705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    usage
2715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    exit 1
2725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfi
2735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# If the debugging feature is enabled, print commands.
2755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectif test $debug = yes; then
2765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    set -x
2775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfi
2785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Initialize these directories here, since ROOTDIR was initialized.
2805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectcase "$host_os" in
2815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectnetbsd* | openbsd*)
2825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    # Because /boot is used for the boot block in NetBSD and OpenBSD, use /grub
2835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    # instead of /boot/grub.
2845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    grub_prefix=/grub
2855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    bootdir=${rootdir}
2865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    ;;
2875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*)
2885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    # Use /boot/grub by default.
2895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    bootdir=${rootdir}/boot
2905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    ;;
2915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectesac
2925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgrubdir=${bootdir}/grub
2945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectdevice_map=${grubdir}/device.map
2955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Check if GRUB is installed.
2975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# This is necessary, because the user can specify "grub --read-only".
2985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectset $grub_shell dummy
2995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectif test -f "$1"; then
3005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    :
3015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectelse
3025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    echo "$1: Not found." 1>&2
3035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    exit 1
3045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfi
3055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectif test -f "$pkglibdir/stage1"; then
3075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    :
3085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectelse
3095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    echo "${pkglibdir}/stage1: Not found." 1>&2
3105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    exit 1
3115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfi
3125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectif test -f "$pkglibdir/stage2"; then
3145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    :
3155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectelse
3165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    echo "${pkglibdir}/stage2: Not found." 1>&2
3175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    exit 1
3185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfi
3195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Don't check for *stage1_5, because it is not fatal even if any
3215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Stage 1.5 does not exist.
3225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Create the GRUB directory if it is not present.
3245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttest -d "$bootdir" || mkdir "$bootdir" || exit 1
3255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttest -d "$grubdir" || mkdir "$grubdir" || exit 1
3265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# If --recheck is specified, remove the device map, if present.
3285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectif test $recheck = yes; then
3295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    rm -f $device_map
3305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfi
3315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Create the device map file if it is not present.
3335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectif test -f "$device_map"; then
3345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    :
3355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectelse
3365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    # Create a safe temporary file.
3375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    test -n "$mklog" && log_file=`$mklog`
3385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    $grub_shell --batch $no_floppy --device-map=$device_map <<EOF >$log_file
3405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectquit
3415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectEOF
3425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    if grep "Error [0-9]*: " $log_file >/dev/null; then
3435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	cat $log_file 1>&2
3445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	exit 1
3455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    fi
3465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    rm -f $log_file
3485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfi
3495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Make sure that there is no duplicated entry.
3515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttmp=`sed -n '/^([fh]d[0-9]*)/s/\(^(.*)\).*/\1/p' $device_map \
3525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    | sort | uniq -d | sed -n 1p`
3535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectif test -n "$tmp"; then
3545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    echo "The drive $tmp is defined multiple times in the device map $device_map" 1>&2
3555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    exit 1
3565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfi
3575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Check for INSTALL_DEVICE.
3595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectcase "$install_device" in
3605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/dev/*)
3615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    install_device=`resolve_symlink "$install_device"`
3625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    install_drive=`convert "$install_device"`
3635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    # I don't know why, but some shells wouldn't die if exit is
3645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    # called in a function.
3655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    if test "x$install_drive" = x; then
3665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	exit 1
3675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    fi ;;
3685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project\([hf]d[0-9]*\))
3695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    install_drive="$install_device" ;;
3705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project[hf]d[0-9]*)
3715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    # The GRUB format with no parenthesis.
3725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    install_drive="($install_device)" ;;
3735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*)
3745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    echo "Format of install_device not recognized." 1>&2
3755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    usage
3765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    exit 1 ;;
3775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectesac
3785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Get the root drive.
3805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectroot_device=`find_device ${rootdir}`
3815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectbootdir_device=`find_device ${bootdir}`
3825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Check if the boot directory is in the same device as the root directory.
3845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectif test "x$root_device" != "x$bootdir_device"; then
3855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    # Perhaps the user has a separate boot partition.
3865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    root_device=$bootdir_device
3875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    grub_prefix="/grub"
3885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfi
3895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Convert the root device to a GRUB drive.
3915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectroot_drive=`convert "$root_device"`
3925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectif test "x$root_drive" = x; then
3935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    exit 1
3945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfi
3955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Check if the root directory exists in the same device as the grub
3975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# directory.
3985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgrubdir_device=`find_device ${grubdir}`
3995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectif test "x$grubdir_device" != "x$root_device"; then
4015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    # For now, cannot deal with this situation.
4025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    cat <<EOF 1>&2
4035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectYou must set the root directory by the option --root-directory, because
4045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project$grubdir does not exist in the root device $root_device.
4055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectEOF
4065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    exit 1
4075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfi
4085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Copy the GRUB images to the GRUB directory.
4105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfor file in ${grubdir}/stage1 ${grubdir}/stage2 ${grubdir}/*stage1_5; do
4115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    rm -f $file || exit 1
4125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectdone
4135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfor file in \
4145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    ${pkglibdir}/stage1 ${pkglibdir}/stage2 ${pkglibdir}/*stage1_5; do
4155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    cp -f $file ${grubdir} || exit 1
4165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectdone
4175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Make a default file.
4195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project${grub_set_default} --root-directory=${rootdir} default
4205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Make sure that GRUB reads the same images as the host OS.
4225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttest -n "$mkimg" && img_file=`$mkimg`
4235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttest -n "$mklog" && log_file=`$mklog`
4245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfor file in ${grubdir}/stage1 ${grubdir}/stage2 ${grubdir}/*stage1_5; do
4265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    count=5
4275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    tmp=`echo $file | sed "s|^${grubdir}|${grub_prefix}|"`
4285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    while test $count -gt 0; do
4295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	$grub_shell --batch $no_floppy --device-map=$device_map <<EOF >$log_file
4305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectdump ${root_drive}${tmp} ${img_file}
4315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectquit
4325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectEOF
4335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	if grep "Error [0-9]*: " $log_file >/dev/null; then
4345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    :
4355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	elif cmp $file $img_file >/dev/null; then
4365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    break
4375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	fi
4385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	sleep 1
4395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	count=`expr $count - 1`    
4405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    done
4415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    if test $count -eq 0; then
4425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	echo "The file $file not read correctly." 1>&2
4435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	exit 1
4445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    fi
4455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectdone
4465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectrm -f $img_file
4485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectrm -f $log_file
4495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Create a safe temporary file.
4515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttest -n "$mklog" && log_file=`$mklog`
4525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Now perform the installation.
4545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project$grub_shell --batch $no_floppy --device-map=$device_map <<EOF >$log_file
4555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectroot $root_drive
4565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectsetup $force_lba --stage2=$grubdir/stage2 --prefix=$grub_prefix $install_drive
4575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectquit
4585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectEOF
4595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectif grep "Error [0-9]*: " $log_file >/dev/null || test $debug = yes; then
4615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    cat $log_file 1>&2
4625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    exit 1
4635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfi
4645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectrm -f $log_file
4665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Prompt the user to check if the device map is correct.
4685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectecho "Installation finished. No error reported."
4695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectecho "This is the contents of the device map $device_map."
4705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectecho "Check if this is correct or not. If any of the lines is incorrect,"
4715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectecho "fix it and re-run the script \`grub-install'."
4725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectecho
4735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectcat $device_map
4755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Bye.
4775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectexit 0
478