15b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
25b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  GRUB  --  GRand Unified Bootloader
35b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  Copyright (C) 2000,2001,2002,2004,2005  Free Software Foundation, Inc.
45b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
55b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  This program is free software; you can redistribute it and/or modify
65b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  it under the terms of the GNU General Public License as published by
75b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  the Free Software Foundation; either version 2 of the License, or
85b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  (at your option) any later version.
95b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  This program is distributed in the hope that it will be useful,
115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  but WITHOUT ANY WARRANTY; without even the implied warranty of
125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  GNU General Public License for more details.
145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  You should have received a copy of the GNU General Public License
165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  along with this program; if not, write to the Free Software
175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <shared.h>
215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <term.h>
225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgrub_jmp_buf restart_env;
245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#if defined(PRESET_MENU_STRING) && defined(PRESET_MENU_EXTERNAL)
265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#error Defining both PRESET_MENU_STRING and PRESET_MENU_EXTERNAL does not \
275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project       make sense. Please only define one.
285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#if defined(PRESET_MENU_STRING) || defined(SUPPORT_DISKLESS) || \
315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    defined(PRESET_MENU_EXTERNAL)
325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# if defined(PRESET_MENU_STRING)
345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic const char *preset_menu = PRESET_MENU_STRING;
355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# elif defined(PRESET_MENU_EXTERNAL)
365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectextern const char *preset_menu;
375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# elif defined(SUPPORT_DISKLESS)
385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Execute the command "bootp" automatically.  */
395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic const char *preset_menu = "bootp\n";
405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# endif /* SUPPORT_DISKLESS */
415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int preset_menu_offset;
435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int
455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectopen_preset_menu (void)
465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef GRUB_UTIL
485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* Unless the user explicitly requests to use the preset menu,
495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     always opening the preset menu fails in the grub shell.  */
505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  if (! use_preset_menu)
515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    return 0;
525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif /* GRUB_UTIL */
535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  preset_menu_offset = 0;
555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  return preset_menu != 0;
565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int
595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectread_from_preset_menu (char *buf, int maxlen)
605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  int len = grub_strlen (preset_menu + preset_menu_offset);
625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  if (len > maxlen)
645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    len = maxlen;
655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  grub_memmove (buf, preset_menu + preset_menu_offset, len);
675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  preset_menu_offset += len;
685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  return len;
705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void
735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectclose_preset_menu (void)
745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* Disable the preset menu.  */
765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  preset_menu = 0;
775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#else /* ! PRESET_MENU_STRING && ! SUPPORT_DISKLESS */
805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define open_preset_menu()	0
825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define read_from_preset_menu(buf, maxlen)	0
835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define close_preset_menu()
845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif /* ! PRESET_MENU_STRING && ! SUPPORT_DISKLESS */
865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic char *
885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectget_entry (char *list, int num, int nested)
895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  int i;
915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  for (i = 0; i < num; i++)
935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      do
955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  while (*(list++));
975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      while (nested && *(list++));
995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
1005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  return list;
1025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
1035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Print an entry in a line of the menu box.  */
1055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void
1065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectprint_entry (int y, int highlight, char *entry)
1075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
1085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  int x;
1095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  if (current_term->setcolorstate)
1115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    current_term->setcolorstate (COLOR_STATE_NORMAL);
1125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  if (highlight && current_term->setcolorstate)
1145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    current_term->setcolorstate (COLOR_STATE_HIGHLIGHT);
1155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  gotoxy (2, y);
1175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  grub_putchar (' ');
1185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  for (x = 3; x < 75; x++)
1195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
1205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      if (*entry && x <= 72)
1215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
1225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  if (x == 72)
1235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    grub_putchar (DISP_RIGHT);
1245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  else
1255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    grub_putchar (*entry++);
1265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
1275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      else
1285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	grub_putchar (' ');
1295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
1305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  gotoxy (74, y);
1315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  if (current_term->setcolorstate)
1335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    current_term->setcolorstate (COLOR_STATE_STANDARD);
1345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
1355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Print entries in the menu box.  */
1375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void
1385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectprint_entries (int y, int size, int first, int entryno, char *menu_entries)
1395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
1405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  int i;
1415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  gotoxy (77, y + 1);
1435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  if (first)
1455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    grub_putchar (DISP_UP);
1465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  else
1475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    grub_putchar (' ');
1485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  menu_entries = get_entry (menu_entries, first, 0);
1505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  for (i = 0; i < size; i++)
1525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
1535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      print_entry (y + i + 1, entryno == i, menu_entries);
1545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      while (*menu_entries)
1565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	menu_entries++;
1575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      if (*(menu_entries - 1))
1595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	menu_entries++;
1605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
1615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  gotoxy (77, y + size);
1635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  if (*menu_entries)
1655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    grub_putchar (DISP_DOWN);
1665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  else
1675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    grub_putchar (' ');
1685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  gotoxy (74, y + entryno + 1);
1705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
1715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void
1735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectprint_entries_raw (int size, int first, char *menu_entries)
1745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
1755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  int i;
1765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define LINE_LENGTH 67
1785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  for (i = 0; i < LINE_LENGTH; i++)
1805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    grub_putchar ('-');
1815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  grub_putchar ('\n');
1825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  for (i = first; i < size; i++)
1845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
1855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      /* grub's printf can't %02d so ... */
1865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      if (i < 10)
1875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	grub_putchar (' ');
1885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      grub_printf ("%d: %s\n", i, get_entry (menu_entries, i, 0));
1895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
1905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  for (i = 0; i < LINE_LENGTH; i++)
1925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    grub_putchar ('-');
1935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  grub_putchar ('\n');
1945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#undef LINE_LENGTH
1965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
1975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void
2005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectprint_border (int y, int size)
2015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
2025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  int i;
2035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  if (current_term->setcolorstate)
2055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    current_term->setcolorstate (COLOR_STATE_NORMAL);
2065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  gotoxy (1, y);
2085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  grub_putchar (DISP_UL);
2105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  for (i = 0; i < 73; i++)
2115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    grub_putchar (DISP_HORIZ);
2125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  grub_putchar (DISP_UR);
2135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  i = 1;
2155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  while (1)
2165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
2175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      gotoxy (1, y + i);
2185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      if (i > size)
2205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	break;
2215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      grub_putchar (DISP_VERT);
2235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      gotoxy (75, y + i);
2245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      grub_putchar (DISP_VERT);
2255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      i++;
2275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
2285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  grub_putchar (DISP_LL);
2305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  for (i = 0; i < 73; i++)
2315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    grub_putchar (DISP_HORIZ);
2325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  grub_putchar (DISP_LR);
2335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  if (current_term->setcolorstate)
2355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    current_term->setcolorstate (COLOR_STATE_STANDARD);
2365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
2375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void
2395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectrun_menu (char *menu_entries, char *config_entries, int num_entries,
2405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  char *heap, int entryno)
2415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
2425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  int c, time1, time2 = -1, first_entry = 0;
2435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  char *cur_entry = 0;
2445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /*
2465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   *  Main loop for menu UI.
2475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project   */
2485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectrestart:
2505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* Dumb terminal always use all entries for display
2515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     invariant for TERM_DUMB: first_entry == 0  */
2525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  if (! (current_term->flags & TERM_DUMB))
2535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
2545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      while (entryno > 11)
2555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
2565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  first_entry++;
2575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  entryno--;
2585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
2595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
2605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* If the timeout was expired or wasn't set, force to show the menu
2625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project     interface. */
2635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  if (grub_timeout < 0)
2645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    show_menu = 1;
2655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* If SHOW_MENU is false, don't display the menu until ESC is pressed.  */
2675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  if (! show_menu)
2685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
2695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      /* Get current time.  */
2705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      while ((time1 = getrtsecs ()) == 0xFF)
2715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	;
2725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      while (1)
2745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
2755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  /* Check if ESC is pressed.  */
2765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  if (checkkey () != -1 && ASCII_CHAR (getkey ()) == '\e')
2775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    {
2785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      grub_timeout = -1;
2795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      show_menu = 1;
2805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      break;
2815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    }
2825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  /* If GRUB_TIMEOUT is expired, boot the default entry.  */
2845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  if (grub_timeout >=0
2855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      && (time1 = getrtsecs ()) != time2
2865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      && time1 != 0xFF)
2875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    {
2885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      if (grub_timeout <= 0)
2895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		{
2905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  grub_timeout = -1;
2915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  goto boot_entry;
2925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		}
2935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      time2 = time1;
2955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      grub_timeout--;
2965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      /* Print a message.  */
2985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      grub_printf ("\rPress `ESC' to enter the menu... %d   ",
2995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			   grub_timeout);
3005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    }
3015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
3025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
3035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* Only display the menu if the user wants to see it. */
3055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  if (show_menu)
3065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
3075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      init_page ();
3085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      setcursor (0);
3095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      if (current_term->flags & TERM_DUMB)
3115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	print_entries_raw (num_entries, first_entry, menu_entries);
3125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      else
3135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	print_border (3, 12);
3145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      grub_printf ("\n\
3165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      Use the %c and %c keys to select which entry is highlighted.\n",
3175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		   DISP_UP, DISP_DOWN);
3185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      if (! auth && password)
3205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
3215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  printf ("\
3225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      Press enter to boot the selected OS or \'p\' to enter a\n\
3235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      password to unlock the next set of features.");
3245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
3255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      else
3265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
3275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  if (config_entries)
3285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    printf ("\
3295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      Press enter to boot the selected OS, \'e\' to edit the\n\
3305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      commands before booting, or \'c\' for a command-line.");
3315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  else
3325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    printf ("\
3335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      Press \'b\' to boot, \'e\' to edit the selected command in the\n\
3345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      boot sequence, \'c\' for a command-line, \'o\' to open a new line\n\
3355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      after (\'O\' for before) the selected line, \'d\' to remove the\n\
3365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      selected line, or escape to go back to the main menu.");
3375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
3385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      if (current_term->flags & TERM_DUMB)
3405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	grub_printf ("\n\nThe selected entry is %d ", entryno);
3415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      else
3425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	print_entries (3, 12, first_entry, entryno, menu_entries);
3435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
3445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* XX using RT clock now, need to initialize value */
3465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  while ((time1 = getrtsecs()) == 0xFF);
3475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  while (1)
3495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
3505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      /* Initialize to NULL just in case...  */
3515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      cur_entry = NULL;
3525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      if (grub_timeout >= 0 && (time1 = getrtsecs()) != time2 && time1 != 0xFF)
3545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
3555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  if (grub_timeout <= 0)
3565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    {
3575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      grub_timeout = -1;
3585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      break;
3595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    }
3605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  /* else not booting yet! */
3625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  time2 = time1;
3635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  if (current_term->flags & TERM_DUMB)
3655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      grub_printf ("\r    Entry %d will be booted automatically in %d seconds.   ",
3665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			   entryno, grub_timeout);
3675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  else
3685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    {
3695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      gotoxy (3, 22);
3705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      grub_printf ("The highlighted entry will be booted automatically in %d seconds.    ",
3715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			   grub_timeout);
3725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      gotoxy (74, 4 + entryno);
3735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  }
3745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  grub_timeout--;
3765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
3775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      /* Check for a keypress, however if TIMEOUT has been expired
3795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 (GRUB_TIMEOUT == -1) relax in GETKEY even if no key has been
3805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 pressed.
3815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 This avoids polling (relevant in the grub-shell and later on
3825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 in grub if interrupt driven I/O is done).  */
3835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      if (checkkey () >= 0 || grub_timeout < 0)
3845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
3855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  /* Key was pressed, show which entry is selected before GETKEY,
3865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	     since we're comming in here also on GRUB_TIMEOUT == -1 and
3875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	     hang in GETKEY */
3885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  if (current_term->flags & TERM_DUMB)
3895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    grub_printf ("\r    Highlighted entry is %d: ", entryno);
3905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  c = ASCII_CHAR (getkey ());
3925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  if (grub_timeout >= 0)
3945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    {
3955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      if (current_term->flags & TERM_DUMB)
3965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		grub_putchar ('\r');
3975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      else
3985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		gotoxy (3, 22);
3995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      printf ("                                                                    ");
4005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      grub_timeout = -1;
4015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      fallback_entryno = -1;
4025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      if (! (current_term->flags & TERM_DUMB))
4035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		gotoxy (74, 4 + entryno);
4045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    }
4055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  /* We told them above (at least in SUPPORT_SERIAL) to use
4075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	     '^' or 'v' so accept these keys.  */
4085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  if (c == 16 || c == '^')
4095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    {
4105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      if (current_term->flags & TERM_DUMB)
4115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		{
4125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  if (entryno > 0)
4135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    entryno--;
4145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		}
4155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      else
4165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		{
4175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  if (entryno > 0)
4185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    {
4195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      print_entry (4 + entryno, 0,
4205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project				   get_entry (menu_entries,
4215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project					      first_entry + entryno,
4225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project					      0));
4235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      entryno--;
4245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      print_entry (4 + entryno, 1,
4255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project				   get_entry (menu_entries,
4265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project					      first_entry + entryno,
4275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project					      0));
4285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    }
4295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  else if (first_entry > 0)
4305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    {
4315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      first_entry--;
4325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      print_entries (3, 12, first_entry, entryno,
4335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project				     menu_entries);
4345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    }
4355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		}
4365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    }
4375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  else if ((c == 14 || c == 'v')
4385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		   && first_entry + entryno + 1 < num_entries)
4395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    {
4405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      if (current_term->flags & TERM_DUMB)
4415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		entryno++;
4425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      else
4435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		{
4445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  if (entryno < 11)
4455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    {
4465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      print_entry (4 + entryno, 0,
4475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project				   get_entry (menu_entries,
4485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project					      first_entry + entryno,
4495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project					      0));
4505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      entryno++;
4515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      print_entry (4 + entryno, 1,
4525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project				   get_entry (menu_entries,
4535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project					      first_entry + entryno,
4545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project					      0));
4555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  }
4565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		else if (num_entries > 12 + first_entry)
4575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  {
4585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    first_entry++;
4595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    print_entries (3, 12, first_entry, entryno, menu_entries);
4605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  }
4615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		}
4625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    }
4635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  else if (c == 7)
4645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    {
4655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      /* Page Up */
4665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      first_entry -= 12;
4675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      if (first_entry < 0)
4685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		{
4695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  entryno += first_entry;
4705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  first_entry = 0;
4715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  if (entryno < 0)
4725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    entryno = 0;
4735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		}
4745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      print_entries (3, 12, first_entry, entryno, menu_entries);
4755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    }
4765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  else if (c == 3)
4775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    {
4785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      /* Page Down */
4795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      first_entry += 12;
4805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      if (first_entry + entryno + 1 >= num_entries)
4815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		{
4825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  first_entry = num_entries - 12;
4835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  if (first_entry < 0)
4845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    first_entry = 0;
4855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  entryno = num_entries - first_entry - 1;
4865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		}
4875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      print_entries (3, 12, first_entry, entryno, menu_entries);
4885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    }
4895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  if (config_entries)
4915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    {
4925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      if ((c == '\n') || (c == '\r') || (c == 6))
4935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		break;
4945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    }
4955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  else
4965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    {
4975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      if ((c == 'd') || (c == 'o') || (c == 'O'))
4985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		{
4995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  if (! (current_term->flags & TERM_DUMB))
5005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    print_entry (4 + entryno, 0,
5015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project				 get_entry (menu_entries,
5025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project					    first_entry + entryno,
5035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project					    0));
5045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  /* insert after is almost exactly like insert before */
5065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  if (c == 'o')
5075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    {
5085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      /* But `o' differs from `O', since it may causes
5095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			 the menu screen to scroll up.  */
5105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      if (entryno < 11 || (current_term->flags & TERM_DUMB))
5115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			entryno++;
5125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      else
5135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			first_entry++;
5145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      c = 'O';
5165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    }
5175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  cur_entry = get_entry (menu_entries,
5195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project					 first_entry + entryno,
5205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project					 0);
5215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  if (c == 'O')
5235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    {
5245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      grub_memmove (cur_entry + 2, cur_entry,
5255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project				    ((int) heap) - ((int) cur_entry));
5265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      cur_entry[0] = ' ';
5285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      cur_entry[1] = 0;
5295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      heap += 2;
5315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      num_entries++;
5335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    }
5345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  else if (num_entries > 0)
5355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    {
5365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      char *ptr = get_entry(menu_entries,
5375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project					    first_entry + entryno + 1,
5385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project					    0);
5395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      grub_memmove (cur_entry, ptr,
5415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project				    ((int) heap) - ((int) ptr));
5425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      heap -= (((int) ptr) - ((int) cur_entry));
5435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      num_entries--;
5455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      if (entryno >= num_entries)
5475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			entryno--;
5485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      if (first_entry && num_entries < 12 + first_entry)
5495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			first_entry--;
5505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    }
5515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  if (current_term->flags & TERM_DUMB)
5535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    {
5545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      grub_printf ("\n\n");
5555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      print_entries_raw (num_entries, first_entry,
5565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project					 menu_entries);
5575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      grub_printf ("\n");
5585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    }
5595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  else
5605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    print_entries (3, 12, first_entry, entryno, menu_entries);
5615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		}
5625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      cur_entry = menu_entries;
5645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      if (c == 27)
5655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		return;
5665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      if (c == 'b')
5675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		break;
5685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    }
5695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  if (! auth && password)
5715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    {
5725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      if (c == 'p')
5735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		{
5745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  /* Do password check here! */
5755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  char entered[32];
5765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  char *pptr = password;
5775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  if (current_term->flags & TERM_DUMB)
5795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    grub_printf ("\r                                    ");
5805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  else
5815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    gotoxy (1, 21);
5825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  /* Wipe out the previously entered password */
5845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  grub_memset (entered, 0, sizeof (entered));
5855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  get_cmdline (" Password: ", entered, 31, '*', 0);
5865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  while (! isspace (*pptr) && *pptr)
5885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    pptr++;
5895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  /* Make sure that PASSWORD is NUL-terminated.  */
5915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  *pptr++ = 0;
5925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  if (! check_password (entered, password, password_type))
5945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    {
5955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      char *new_file = config_file;
5965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      while (isspace (*pptr))
5975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			pptr++;
5985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
5995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      /* If *PPTR is NUL, then allow the user to use
6005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			 privileged instructions, otherwise, load
6015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			 another configuration file.  */
6025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      if (*pptr != 0)
6035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			{
6045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  while ((*(new_file++) = *(pptr++)) != 0)
6055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			    ;
6065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  /* Make sure that the user will not have
6085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			     authority in the next configuration.  */
6095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  auth = 0;
6105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  return;
6115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			}
6125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      else
6135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			{
6145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  /* Now the user is superhuman.  */
6155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  auth = 1;
6165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  goto restart;
6175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			}
6185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    }
6195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  else
6205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    {
6215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      grub_printf ("Failed!\n      Press any key to continue...");
6225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      getkey ();
6235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      goto restart;
6245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    }
6255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		}
6265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    }
6275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  else
6285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    {
6295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      if (c == 'e')
6305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		{
6315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  int new_num_entries = 0, i = 0;
6325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  char *new_heap;
6335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  if (config_entries)
6355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    {
6365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      new_heap = heap;
6375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      cur_entry = get_entry (config_entries,
6385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project					     first_entry + entryno,
6395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project					     1);
6405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    }
6415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  else
6425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    {
6435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      /* safe area! */
6445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      new_heap = heap + NEW_HEAPSIZE + 1;
6455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      cur_entry = get_entry (menu_entries,
6465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project					     first_entry + entryno,
6475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project					     0);
6485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    }
6495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  do
6515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    {
6525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      while ((*(new_heap++) = cur_entry[i++]) != 0);
6535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      new_num_entries++;
6545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    }
6555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  while (config_entries && cur_entry[i]);
6565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  /* this only needs to be done if config_entries is non-NULL,
6585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		     but it doesn't hurt to do it always */
6595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  *(new_heap++) = 0;
6605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  if (config_entries)
6625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    run_menu (heap, NULL, new_num_entries, new_heap, 0);
6635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  else
6645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    {
6655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      cls ();
6665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      print_cmdline_message (0);
6675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      new_heap = heap + NEW_HEAPSIZE + 1;
6695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      saved_drive = boot_drive;
6715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      saved_partition = install_partition;
6725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      current_drive = GRUB_INVALID_DRIVE;
6735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      if (! get_cmdline (PACKAGE " edit> ", new_heap,
6755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project					 NEW_HEAPSIZE + 1, 0, 1))
6765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			{
6775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  int j = 0;
6785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  /* get length of new command */
6805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  while (new_heap[j++])
6815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			    ;
6825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  if (j < 2)
6845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			    {
6855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			      j = 2;
6865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			      new_heap[0] = ' ';
6875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			      new_heap[1] = 0;
6885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			    }
6895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  /* align rest of commands properly */
6915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  grub_memmove (cur_entry + j, cur_entry + i,
6925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project					(int) heap - ((int) cur_entry + i));
6935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  /* copy command to correct area */
6955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  grub_memmove (cur_entry, new_heap, j);
6965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
6975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  heap += (j - i);
6985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			}
6995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    }
7005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  goto restart;
7025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		}
7035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      if (c == 'c')
7045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		{
7055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  enter_cmdline (heap, 0);
7065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  goto restart;
7075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		}
7085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef GRUB_UTIL
7095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      if (c == 'q')
7105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		{
7115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  /* The same as ``quit''.  */
7125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  stop ();
7135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		}
7145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
7155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    }
7165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
7175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
7185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* Attempt to boot an entry.  */
7205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project boot_entry:
7225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  cls ();
7245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  setcursor (1);
7255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  while (1)
7275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
7285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      if (config_entries)
7295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	printf ("  Booting \'%s\'\n\n",
7305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		get_entry (menu_entries, first_entry + entryno, 0));
7315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      else
7325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	printf ("  Booting command-list\n\n");
7335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      if (! cur_entry)
7355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	cur_entry = get_entry (config_entries, first_entry + entryno, 1);
7365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      /* Set CURRENT_ENTRYNO for the command "savedefault".  */
7385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      current_entryno = first_entry + entryno;
7395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      if (run_script (cur_entry, heap))
7415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
7425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  if (fallback_entryno >= 0)
7435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    {
7445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      cur_entry = NULL;
7455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      first_entry = 0;
7465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      entryno = fallback_entries[fallback_entryno];
7475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      fallback_entryno++;
7485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      if (fallback_entryno >= MAX_FALLBACK_ENTRIES
7495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  || fallback_entries[fallback_entryno] < 0)
7505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		fallback_entryno = -1;
7515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    }
7525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  else
7535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    break;
7545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
7555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      else
7565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	break;
7575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
7585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  show_menu = 1;
7605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  goto restart;
7615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
7625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int
7655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectget_line_from_config (char *cmdline, int maxlen, int read_from_file)
7665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
7675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  int pos = 0, literal = 0, comment = 0;
7685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  char c;  /* since we're loading it a byte at a time! */
7695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  while (1)
7715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
7725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      if (read_from_file)
7735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
7745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  if (! grub_read (&c, 1))
7755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    break;
7765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
7775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      else
7785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
7795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  if (! read_from_preset_menu (&c, 1))
7805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    break;
7815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
7825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      /* Skip all carriage returns.  */
7845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      if (c == '\r')
7855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	continue;
7865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      /* Replace tabs with spaces.  */
7885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      if (c == '\t')
7895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	c = ' ';
7905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      /* The previous is a backslash, then...  */
7925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      if (literal)
7935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
7945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  /* If it is a newline, replace it with a space and continue.  */
7955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  if (c == '\n')
7965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    {
7975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      c = ' ';
7985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
7995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      /* Go back to overwrite a backslash.  */
8005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      if (pos > 0)
8015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		pos--;
8025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    }
8035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  literal = 0;
8055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
8065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      /* translate characters first! */
8085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      if (c == '\\' && ! literal)
8095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	literal = 1;
8105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      if (comment)
8125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
8135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  if (c == '\n')
8145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    comment = 0;
8155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
8165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      else if (! pos)
8175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
8185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  if (c == '#')
8195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    comment = 1;
8205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  else if ((c != ' ') && (c != '\n'))
8215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    cmdline[pos++] = c;
8225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
8235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      else
8245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
8255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  if (c == '\n')
8265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    break;
8275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  if (pos < maxlen)
8295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    cmdline[pos++] = c;
8305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
8315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
8325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  cmdline[pos] = 0;
8345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  return pos;
8365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
8375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* This is the starting function in C.  */
8405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid
8415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectcmain (void)
8425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{
8435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  int config_len, menu_len, num_entries;
8445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  char *config_entries, *menu_entries;
8455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  char *kill_buf = (char *) KILL_BUF;
8465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  auto void reset (void);
8485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  void reset (void)
8495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
8505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      count_lines = -1;
8515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      config_len = 0;
8525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      menu_len = 0;
8535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      num_entries = 0;
8545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      config_entries = (char *) mbi.drives_addr + mbi.drives_length;
8555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      menu_entries = (char *) MENU_BUF;
8565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      init_config ();
8575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
8585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* Initialize the environment for restarting Stage 2.  */
8605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  grub_setjmp (restart_env);
8615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* Initialize the kill buffer.  */
8635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  *kill_buf = 0;
8645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  /* Never return.  */
8665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project  for (;;)
8675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    {
8685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      int is_opened, is_preset;
8695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      reset ();
8715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      /* Here load the configuration file.  */
8735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef GRUB_UTIL
8755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      if (use_config_file)
8765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif /* GRUB_UTIL */
8775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
8785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  char *default_file = (char *) DEFAULT_FILE_BUF;
8795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  int i;
8805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  /* Get a saved default entry if possible.  */
8825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  saved_entryno = 0;
8835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  *default_file = 0;
8845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  grub_strncat (default_file, config_file, DEFAULT_FILE_BUFLEN);
8855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  for (i = grub_strlen(default_file); i >= 0; i--)
8865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    if (default_file[i] == '/')
8875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      {
8885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		i++;
8895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		break;
8905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      }
8915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  default_file[i] = 0;
8925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  grub_strncat (default_file + i, "default", DEFAULT_FILE_BUFLEN - i);
8935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  if (grub_open (default_file))
8945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    {
8955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      char buf[10]; /* This is good enough.  */
8965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      char *p = buf;
8975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      int len;
8985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
8995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      len = grub_read (buf, sizeof (buf));
9005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      if (len > 0)
9015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		{
9025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  buf[sizeof (buf) - 1] = 0;
9035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  safe_parse_maxint (&p, &saved_entryno);
9045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		}
9055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      grub_close ();
9075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    }
9085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  errnum = ERR_NONE;
9095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  do
9115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    {
9125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      /* STATE 0:  Before any title command.
9135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		 STATE 1:  In a title command.
9145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		 STATE >1: In a entry after a title command.  */
9155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      int state = 0, prev_config_len = 0, prev_menu_len = 0;
9165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      char *cmdline;
9175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      /* Try the preset menu first. This will succeed at most once,
9195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		 because close_preset_menu disables the preset menu.  */
9205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      is_opened = is_preset = open_preset_menu ();
9215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      if (! is_opened)
9225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		{
9235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  is_opened = grub_open (config_file);
9245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  errnum = ERR_NONE;
9255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		}
9265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      if (! is_opened)
9285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		break;
9295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      /* This is necessary, because the menu must be overrided.  */
9315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      reset ();
9325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      cmdline = (char *) CMDLINE_BUF;
9345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      while (get_line_from_config (cmdline, NEW_HEAPSIZE,
9355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project					   ! is_preset))
9365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		{
9375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  struct builtin *builtin;
9385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  /* Get the pointer to the builtin structure.  */
9405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  builtin = find_command (cmdline);
9415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  errnum = 0;
9425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  if (! builtin)
9435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    /* Unknown command. Just skip now.  */
9445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    continue;
9455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  if (builtin->flags & BUILTIN_TITLE)
9475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    {
9485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      char *ptr;
9495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      /* the command "title" is specially treated.  */
9515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      if (state > 1)
9525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			{
9535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  /* The next title is found.  */
9545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  num_entries++;
9555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  config_entries[config_len++] = 0;
9565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  prev_menu_len = menu_len;
9575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  prev_config_len = config_len;
9585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			}
9595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      else
9605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			{
9615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  /* The first title is found.  */
9625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  menu_len = prev_menu_len;
9635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  config_len = prev_config_len;
9645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			}
9655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      /* Reset the state.  */
9675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      state = 1;
9685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      /* Copy title into menu area.  */
9705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      ptr = skip_to (1, cmdline);
9715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      while ((menu_entries[menu_len++] = *(ptr++)) != 0)
9725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			;
9735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    }
9745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  else if (! state)
9755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    {
9765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      /* Run a command found is possible.  */
9775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      if (builtin->flags & BUILTIN_MENU)
9785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			{
9795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  char *arg = skip_to (1, cmdline);
9805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  (builtin->func) (arg, BUILTIN_MENU);
9815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  errnum = 0;
9825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			}
9835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      else
9845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			/* Ignored.  */
9855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			continue;
9865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    }
9875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  else
9885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    {
9895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      char *ptr = cmdline;
9905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      state++;
9925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      /* Copy config file data to config area.  */
9935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      while ((config_entries[config_len++] = *ptr++) != 0)
9945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			;
9955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    }
9965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		}
9975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
9985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      if (state > 1)
9995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		{
10005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  /* Finish the last entry.  */
10015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  num_entries++;
10025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  config_entries[config_len++] = 0;
10035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		}
10045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      else
10055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		{
10065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  menu_len = prev_menu_len;
10075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  config_len = prev_config_len;
10085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		}
10095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      menu_entries[menu_len++] = 0;
10115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      config_entries[config_len++] = 0;
10125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      grub_memmove (config_entries + config_len, menu_entries,
10135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			    menu_len);
10145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      menu_entries = config_entries + config_len;
10155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      /* Make sure that all fallback entries are valid.  */
10175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      if (fallback_entryno >= 0)
10185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		{
10195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  for (i = 0; i < MAX_FALLBACK_ENTRIES; i++)
10205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    {
10215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      if (fallback_entries[i] < 0)
10225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			break;
10235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      if (fallback_entries[i] >= num_entries)
10245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			{
10255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  grub_memmove (fallback_entries + i,
10265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project					fallback_entries + i + 1,
10275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project					((MAX_FALLBACK_ENTRIES - i - 1)
10285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project					 * sizeof (int)));
10295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  i--;
10305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			}
10315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    }
10325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  if (fallback_entries[0] < 0)
10345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    fallback_entryno = -1;
10355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		}
10365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      /* Check if the default entry is present. Otherwise reset
10375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		 it to fallback if fallback is valid, or to DEFAULT_ENTRY
10385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		 if not.  */
10395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      if (default_entry >= num_entries)
10405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		{
10415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  if (fallback_entryno >= 0)
10425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    {
10435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      default_entry = fallback_entries[0];
10445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      fallback_entryno++;
10455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		      if (fallback_entryno >= MAX_FALLBACK_ENTRIES
10465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			  || fallback_entries[fallback_entryno] < 0)
10475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			fallback_entryno = -1;
10485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    }
10495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		  else
10505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    default_entry = 0;
10515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		}
10525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      if (is_preset)
10545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		close_preset_menu ();
10555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	      else
10565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		grub_close ();
10575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	    }
10585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  while (is_preset);
10595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
10605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
10615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      if (! num_entries)
10625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
10635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  /* If no acceptable config file, goto command-line, starting
10645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	     heap from where the config entries would have been stored
10655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	     if there were any.  */
10665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  enter_cmdline (config_entries, 1);
10675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
10685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project      else
10695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	{
10705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  /* Run menu interface.  */
10715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	  run_menu (menu_entries, config_entries, num_entries,
10725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		    menu_entries + menu_len, default_entry);
10735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	}
10745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project    }
10755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}
1076