15b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#! /bin/sh
25b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# grub-image - Create a GRUB boot filesystem image and tarball
35b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Gordon Matzigkeit <gord@fig.org>, 2000-07-25
45b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#
55b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#   Copyright (C) 2000, 2002 Free Software Foundation, Inc.
65b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#
75b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# This file is free software; you can redistribute it and/or modify it
85b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# under the terms of the GNU General Public License as published by
95b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# the Free Software Foundation; either version 2 of the License, or
105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# (at your option) any later version.
115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#
125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# This program is distributed in the hope that it will be useful, but
135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# WITHOUT ANY WARRANTY; without even the implied warranty of
145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# General Public License for more details.
165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#
175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# You should have received a copy of the GNU General Public License
185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# along with this program; if not, write to the Free Software
195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectprefix=/usr/local
225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectexec_prefix=${prefix}
235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectsbindir=${exec_prefix}/sbin
245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectlibdir=${exec_prefix}/lib
255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectPACKAGE=grub
265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthost_cpu=x86_64
275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthost_os=linux-gnu
285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthost_vendor=unknown
295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectcontext=${host_cpu}-${host_vendor}
305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectpkglibdir=${libdir}/${PACKAGE}/${context}
315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectmke2fs=`which mke2fs`
335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectprogname=`echo "$0" | sed 's%^.*/%%'`
355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectthisdir=`echo "$0" | sed 's%/[^/]*$%%'`
365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttest "X$thisdir" = "X$0" && thisdir=.
375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# See if we were invoked from within the build directory, and if so,
395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# use the built files rather than the installed ones.
405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectif test -f $thisdir/../stage2/stage2; then
415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  grub_shell="$thisdir/../grub/grub"
425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  stage1dir="$thisdir/../stage1"
435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  stage2dir="$thisdir/../stage2"
445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectelse
455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  grub_shell=${sbindir}/grub
465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  stage1dir="$pkglibdir"
475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  stage2dir="$pkglibdir"
485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfi
495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Exit on any error.
515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectset -e
525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Get GRUB's version from the Grub shell, since we use the
545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# installed files.
555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectVERSION=`$grub_shell --version | sed -e 's/^.* \([0-9.]*\).*$/\1/'`
565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttest "X$VERSION" != X
575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectbootdir=${PACKAGE}-${VERSION}-${context}
595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectimage=$bootdir.ext2fs
605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Create the tarball.
625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectif test ! -f $bootdir.tar.gz; then
635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  echo "# Creating \`$bootdir.tar.gz'"
645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  mkdir -p $bootdir/boot/grub
655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  cp -p $stage1dir/stage1 $stage2dir/*_stage1_5 $stage2dir/stage2 \
665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    $bootdir/boot/grub
675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  test ! -f menu.lst || cp -p menu.lst $bootdir/boot/grub
685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  trap "rm -f $bootdir.tar.gz" 0
695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  GZIP=-9 tar -zcf $bootdir.tar.gz $bootdir
705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  trap '' 0
715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  rm -rf $bootdir
725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfi
735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Create a new filesystem image of the specified size.
755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectif test ! -f $image; then
765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  tarsize=`zcat $bootdir.tar.gz | wc -c`
775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  # Add about 30% (20% overhead plus 10% breathing room), and convert
795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  # to kilobytes.  This factor was determined empirically.
805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  SIZE=`expr $tarsize \* 130 / 100 / 1024`k
815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  echo "# Creating $SIZE disk image \`$image'"
825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  trap "rm -f $image" 0
835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  dd if=/dev/zero of=$image bs=$SIZE count=1 >/dev/null
845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  $mke2fs -F $image
855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  trap '' 0
865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfi
875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Attempt to mount the image.
905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectecho "# Mounting \`$image'"
915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttest -d $bootdir || mkdir $bootdir
925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectcase "$host_os" in
935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgnu*)
945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  settrans -a $bootdir /hurd/ext2fs $image
955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  umount="settrans -a $bootdir"
965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  ;;
975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectlinux*)
995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  # This requires running as root, and using the loop device.
1005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  i=0
1015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  while test -e /dev/loop$i; do
1025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    if /sbin/losetup /dev/loop$i $image; then
1035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      break
1045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    fi
1055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    i=`expr $i + 1`
1065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  done
1075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  # Silly losetup doesn't report an error!
1095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  mount /dev/loop$i $bootdir
1105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  umount="umount $bootdir && /sbin/losetup -d /dev/loop$i && trap '' 0"
1115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  ;;
1125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*)
1145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  echo "$progname: Mounting \`$image' under \`$host_os' is not supported" 1>&2
1155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  exit 1
1165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  ;;
1175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectesac
1185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttrap "$umount" 0
1195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Extract our tarball into the image, then unmount it.
1215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectecho "# Copying files into \`$image':"
1225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttar -zxvf $bootdir.tar.gz
1235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectecho "# \`$image' usage:"
1255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectdf $bootdir
1265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecteval $umount
1275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectrmdir $bootdir || :
1285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Use the GRUB shell to properly set up GRUB on the image.
1305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectecho "# Installing GRUB in \`$image'"
1315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectcat <<EOF | $grub_shell --batch --device-map=/dev/null
1325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectdevice (fd0) $image
1335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectroot (fd0)
1345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectinstall /boot/grub/stage1 (fd0) /boot/grub/stage2
1355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectquit
1365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectEOF
1375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectexit 0
139