15b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* main.c - experimental GRUB stage2 that runs under Unix */
25b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
35b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  GRUB  --  GRand Unified Bootloader
45b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  Copyright (C) 1999,2000,2001,2002  Free Software Foundation, Inc.
55b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
65b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  This program is free software; you can redistribute it and/or modify
75b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  it 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,
125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  but WITHOUT ANY WARRANTY; without even the implied warranty of
135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  GNU 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., 675 Mass Ave, Cambridge, MA 02139, USA.
195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Simulator entry point. */
225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint grub_stage2 (void);
235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <stdio.h>
255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <getopt.h>
265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <unistd.h>
275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <string.h>
285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <stdlib.h>
295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <limits.h>
305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <setjmp.h>
315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define WITHOUT_LIBC_STUBS 1
335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <shared.h>
345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <term.h>
355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectchar *program_name = 0;
375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint use_config_file = 1;
385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint use_preset_menu = 0;
395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef HAVE_LIBCURSES
405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint use_curses = 1;
415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#else
425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint use_curses = 0;
435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint verbose = 0;
455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint read_only = 0;
465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint floppy_disks = 1;
475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectchar *device_map_file = 0;
485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int default_boot_drive;
495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int default_install_partition;
505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic char *default_config_file;
515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define OPT_HELP		-2
535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define OPT_VERSION		-3
545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define OPT_HOLD		-4
555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define OPT_CONFIG_FILE		-5
565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define OPT_INSTALL_PARTITION	-6
575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define OPT_BOOT_DRIVE		-7
585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define OPT_NO_CONFIG_FILE	-8
595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define OPT_NO_CURSES		-9
605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define OPT_BATCH		-10
615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define OPT_VERBOSE		-11
625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define OPT_READ_ONLY		-12
635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define OPT_PROBE_SECOND_FLOPPY	-13
645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define OPT_NO_FLOPPY		-14
655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define OPT_DEVICE_MAP		-15
665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define OPT_PRESET_MENU		-16
675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define OPT_NO_PAGER		-17
685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define OPTSTRING ""
695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic struct option longopts[] =
715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  {"batch", no_argument, 0, OPT_BATCH},
735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  {"boot-drive", required_argument, 0, OPT_BOOT_DRIVE},
745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  {"config-file", required_argument, 0, OPT_CONFIG_FILE},
755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  {"device-map", required_argument, 0, OPT_DEVICE_MAP},
765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  {"help", no_argument, 0, OPT_HELP},
775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  {"hold", optional_argument, 0, OPT_HOLD},
785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  {"install-partition", required_argument, 0, OPT_INSTALL_PARTITION},
795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  {"no-config-file", no_argument, 0, OPT_NO_CONFIG_FILE},
805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  {"no-curses", no_argument, 0, OPT_NO_CURSES},
815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  {"no-floppy", no_argument, 0, OPT_NO_FLOPPY},
825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  {"no-pager", no_argument, 0, OPT_NO_PAGER},
835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  {"preset-menu", no_argument, 0, OPT_PRESET_MENU},
845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  {"probe-second-floppy", no_argument, 0, OPT_PROBE_SECOND_FLOPPY},
855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  {"read-only", no_argument, 0, OPT_READ_ONLY},
865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  {"verbose", no_argument, 0, OPT_VERBOSE},
875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  {"version", no_argument, 0, OPT_VERSION},
885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  {0},
895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project};
905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void
935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectusage (int status)
945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  if (status)
965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    fprintf (stderr, "Try ``grub --help'' for more information.\n");
975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  else
985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    printf ("\
995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectUsage: grub [OPTION]...\n\
1005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project\n\
1015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectEnter the GRand Unified Bootloader command shell.\n\
1025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project\n\
1035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    --batch                  turn on batch mode for non-interactive use\n\
1045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    --boot-drive=DRIVE       specify stage2 boot_drive [default=0x%x]\n\
1055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    --config-file=FILE       specify stage2 config_file [default=%s]\n\
1065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    --device-map=FILE        use the device map file FILE\n\
1075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    --help                   display this message and exit\n\
1085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    --hold                   wait until a debugger will attach\n\
1095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    --install-partition=PAR  specify stage2 install_partition [default=0x%x]\n\
1105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    --no-config-file         do not use the config file\n\
1115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    --no-curses              do not use curses\n\
1125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    --no-floppy              do not probe any floppy drive\n\
1135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    --no-pager               do not use internal pager\n\
1145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    --preset-menu            use the preset menu\n\
1155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    --probe-second-floppy    probe the second floppy drive\n\
1165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    --read-only              do not write anything to devices\n\
1175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    --verbose                print verbose messages\n\
1185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    --version                print version information and exit\n\
1195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project\n\
1205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectReport bugs to <bug-grub@gnu.org>.\n\
1215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project",
1225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    default_boot_drive, default_config_file,
1235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    default_install_partition);
1245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  exit (status);
1265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
1275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint
1305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectmain (int argc, char **argv)
1315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
1325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  int c;
1335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  int hold = 0;
1345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* First of all, call sync so that all in-core data is scheduled to be
1365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     actually written to disks. This is very important because GRUB does
1375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     not use ordinary stdio interface but raw devices.  */
1385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  sync ();
1395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  program_name = argv[0];
1415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  default_boot_drive = boot_drive;
1425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  default_install_partition = install_partition;
1435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  if (config_file)
1445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    default_config_file = config_file;
1455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  else
1465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    default_config_file = "NONE";
1475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* Parse command-line options. */
1495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  do
1505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
1515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      c = getopt_long (argc, argv, OPTSTRING, longopts, 0);
1525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      switch (c)
1535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
1545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case EOF:
1555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  /* Fall through the bottom of the loop. */
1565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
1575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case OPT_HELP:
1595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  usage (0);
1605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
1615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case OPT_VERSION:
1635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  printf ("grub (GNU GRUB " VERSION ")\n");
1645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  exit (0);
1655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
1665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case OPT_HOLD:
1685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  if (! optarg)
1695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    hold = -1;
1705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  else
1715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    hold = atoi (optarg);
1725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
1735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case OPT_CONFIG_FILE:
1755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  strncpy (config_file, optarg, 127); /* FIXME: arbitrary */
1765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  config_file[127] = '\0';
1775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
1785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case OPT_INSTALL_PARTITION:
1805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  install_partition = strtoul (optarg, 0, 0);
1815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  if (install_partition == ULONG_MAX)
1825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    {
1835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      perror ("strtoul");
1845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      exit (1);
1855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    }
1865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
1875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case OPT_BOOT_DRIVE:
1895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  boot_drive = strtoul (optarg, 0, 0);
1905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  if (boot_drive == ULONG_MAX)
1915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    {
1925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      perror ("strtoul");
1935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      exit (1);
1945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    }
1955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
1965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case OPT_NO_CONFIG_FILE:
1985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  use_config_file = 0;
1995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
2005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case OPT_NO_CURSES:
2025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  use_curses = 0;
2035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
2045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case OPT_NO_PAGER:
2065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  use_pager = 0;
2075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
2085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case OPT_BATCH:
2105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  /* This is the same as "--no-config-file --no-curses --no-pager".  */
2115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  use_config_file = 0;
2125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  use_curses = 0;
2135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  use_pager = 0;
2145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
2155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case OPT_READ_ONLY:
2175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  read_only = 1;
2185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
2195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case OPT_VERBOSE:
2215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  verbose = 1;
2225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
2235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case OPT_NO_FLOPPY:
2255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  floppy_disks = 0;
2265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
2275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case OPT_PROBE_SECOND_FLOPPY:
2295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  floppy_disks = 2;
2305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
2315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case OPT_DEVICE_MAP:
2335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  device_map_file = strdup (optarg);
2345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
2355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	case OPT_PRESET_MENU:
2375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  use_preset_menu = 1;
2385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  break;
2395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	default:
2415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  usage (1);
2425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
2435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
2445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  while (c != EOF);
2455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* Wait until the HOLD variable is cleared by an attached debugger. */
2475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  if (hold && verbose)
2485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    printf ("Run \"gdb %s %d\", and set HOLD to zero.\n",
2495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    program_name, (int) getpid ());
2505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  while (hold)
2515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
2525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      if (hold > 0)
2535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	hold--;
2545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      sleep (1);
2565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
2575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* If we don't have curses (!HAVE_LIBCURSES or --no-curses or
2595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     --batch) put terminal to dumb for better handling of line i/o */
2605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  if (! use_curses)
2615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    current_term->flags = TERM_NO_EDIT | TERM_DUMB;
2625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* Transfer control to the stage2 simulator. */
2645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  exit (grub_stage2 ());
2655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
266