improve the performance of find_command a bit, and capitalize the variable names in the short docs.
This commit is contained in:
parent
3b34bb5343
commit
6fdc01aaf8
3 changed files with 70 additions and 23 deletions
22
ChangeLog
22
ChangeLog
|
@ -1,3 +1,25 @@
|
||||||
|
1999-09-06 OKUJI Yoshinori <okuji@kuicr.kyoto-u.ac.jp>
|
||||||
|
|
||||||
|
* stage2/cmdline.c (find_command): If COMMAND is less than
|
||||||
|
(*BUILTIN)->NAME in dictionary order, break the loop.
|
||||||
|
* stage2/builtins.c (builtin_chainloader): Capitalize the
|
||||||
|
variable name in the short doc.
|
||||||
|
(builtin_color): Likewise.
|
||||||
|
(builtin_geometry): Likewise.
|
||||||
|
(builtin_help): Likewise.
|
||||||
|
(builtin_hide): Likewise.
|
||||||
|
(builtin_initrd): Likewise.
|
||||||
|
(builtin_install): Likewise.
|
||||||
|
(builtin_kernel): Likewise.
|
||||||
|
(builtin_module): Likewise.
|
||||||
|
(builtin_modulenounzip): Likewise.
|
||||||
|
(builtin_pause): Likewise.
|
||||||
|
(builtin_read): Likewise.
|
||||||
|
(builtin_root): Likewise.
|
||||||
|
(builtin_testload): Likewise.
|
||||||
|
(builtin_unhide): Likewise.
|
||||||
|
(builtin_uppermem): Likewise.
|
||||||
|
|
||||||
1999-09-05 OKUJI Yoshinori <okuji@kuicr.kyoto-u.ac.jp>
|
1999-09-05 OKUJI Yoshinori <okuji@kuicr.kyoto-u.ac.jp>
|
||||||
|
|
||||||
The internal of the command handling is heavily modified, and
|
The internal of the command handling is heavily modified, and
|
||||||
|
|
|
@ -152,7 +152,7 @@ static struct builtin builtin_chainloader =
|
||||||
"chainloader",
|
"chainloader",
|
||||||
chainloader_func,
|
chainloader_func,
|
||||||
BUILTIN_CMDLINE,
|
BUILTIN_CMDLINE,
|
||||||
"chainloader file",
|
"chainloader FILE",
|
||||||
"Load FILE as a chain-loader."
|
"Load FILE as a chain-loader."
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -186,7 +186,7 @@ static struct builtin builtin_color =
|
||||||
"color",
|
"color",
|
||||||
color_func,
|
color_func,
|
||||||
BUILTIN_CMDLINE | BUILTIN_MENU,
|
BUILTIN_CMDLINE | BUILTIN_MENU,
|
||||||
"color normal [highlight]",
|
"color NORMAL [HIGHLIGHT]",
|
||||||
"Change the menu colors. The color NORMAL is used for the normal"
|
"Change the menu colors. The color NORMAL is used for the normal"
|
||||||
" line in the menu, and the color HIGHLIGHT is used to highlight the"
|
" line in the menu, and the color HIGHLIGHT is used to highlight the"
|
||||||
" line where the cursor points to. If you omit HIGHLIGHT, then the"
|
" line where the cursor points to. If you omit HIGHLIGHT, then the"
|
||||||
|
@ -242,7 +242,7 @@ static struct builtin builtin_default =
|
||||||
default_func,
|
default_func,
|
||||||
BUILTIN_MENU,
|
BUILTIN_MENU,
|
||||||
#if 0
|
#if 0
|
||||||
"default num",
|
"default NUM",
|
||||||
"Set the default entry to entry number NUM (if not specified, it is"
|
"Set the default entry to entry number NUM (if not specified, it is"
|
||||||
" 0, the first entry)."
|
" 0, the first entry)."
|
||||||
#endif
|
#endif
|
||||||
|
@ -317,7 +317,7 @@ static struct builtin builtin_fallback =
|
||||||
fallback_func,
|
fallback_func,
|
||||||
BUILTIN_MENU,
|
BUILTIN_MENU,
|
||||||
#if 0
|
#if 0
|
||||||
"fallback num",
|
"fallback NUM",
|
||||||
"Go into unattended boot mode: if the default boot entry has any"
|
"Go into unattended boot mode: if the default boot entry has any"
|
||||||
" errors, instead of waiting for the user to do anything, it"
|
" errors, instead of waiting for the user to do anything, it"
|
||||||
" immediately starts over using the NUM entry (same numbering as the"
|
" immediately starts over using the NUM entry (same numbering as the"
|
||||||
|
@ -399,7 +399,7 @@ static struct builtin builtin_geometry =
|
||||||
"geometry",
|
"geometry",
|
||||||
geometry_func,
|
geometry_func,
|
||||||
BUILTIN_CMDLINE,
|
BUILTIN_CMDLINE,
|
||||||
"geometry drive",
|
"geometry DRIVE",
|
||||||
"Print the information for the drive DRIVE."
|
"Print the information for the drive DRIVE."
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -511,7 +511,7 @@ static struct builtin builtin_help =
|
||||||
"help",
|
"help",
|
||||||
help_func,
|
help_func,
|
||||||
BUILTIN_CMDLINE,
|
BUILTIN_CMDLINE,
|
||||||
"help [pattern ...]",
|
"help [PATTERN ...]",
|
||||||
"Display helpful information about builtin commands."
|
"Display helpful information about builtin commands."
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -536,7 +536,7 @@ static struct builtin builtin_hide =
|
||||||
"hide",
|
"hide",
|
||||||
hide_func,
|
hide_func,
|
||||||
BUILTIN_CMDLINE | BUILTIN_MENU,
|
BUILTIN_CMDLINE | BUILTIN_MENU,
|
||||||
"hide drive",
|
"hide DRIVE",
|
||||||
"Hide the drive DRIVE by adding 0x10 into the partition type."
|
"Hide the drive DRIVE by adding 0x10 into the partition type."
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -590,7 +590,7 @@ static struct builtin builtin_initrd =
|
||||||
"initrd",
|
"initrd",
|
||||||
initrd_func,
|
initrd_func,
|
||||||
BUILTIN_CMDLINE,
|
BUILTIN_CMDLINE,
|
||||||
"initrd file [arg ...]",
|
"initrd FILE [ARG ...]",
|
||||||
"Load an initial ramdisk FILE for a Linux format boot image and set the"
|
"Load an initial ramdisk FILE for a Linux format boot image and set the"
|
||||||
" appropriate parameters in the Linux setup area in memory."
|
" appropriate parameters in the Linux setup area in memory."
|
||||||
};
|
};
|
||||||
|
@ -847,7 +847,7 @@ static struct builtin builtin_install =
|
||||||
"install",
|
"install",
|
||||||
install_func,
|
install_func,
|
||||||
BUILTIN_CMDLINE,
|
BUILTIN_CMDLINE,
|
||||||
"install stage1 [d] device stage2 addr [p] [config_file]",
|
"install STAGE1 [d] DEVICE STAGE2 ADDR [p] [CONFIG_FILE]",
|
||||||
"Install STAGE1 into DEVICE, and install a blocklist for loading STAGE2"
|
"Install STAGE1 into DEVICE, and install a blocklist for loading STAGE2"
|
||||||
" as a Stage 2. If the option `d' is present, the Stage 1 will always"
|
" as a Stage 2. If the option `d' is present, the Stage 1 will always"
|
||||||
" look for the actual disk STAGE2 is installed on, rather than using"
|
" look for the actual disk STAGE2 is installed on, rather than using"
|
||||||
|
@ -890,7 +890,7 @@ static struct builtin builtin_kernel =
|
||||||
"kernel",
|
"kernel",
|
||||||
kernel_func,
|
kernel_func,
|
||||||
BUILTIN_CMDLINE,
|
BUILTIN_CMDLINE,
|
||||||
"kernel file [arg ...]",
|
"kernel FILE [ARG ...]",
|
||||||
"Attempt to load the primary boot image (Multiboot a.out or ELF,"
|
"Attempt to load the primary boot image (Multiboot a.out or ELF,"
|
||||||
" Linux zImage or bzImage, FreeBSD a.out, or NetBSD a.out) from"
|
" Linux zImage or bzImage, FreeBSD a.out, or NetBSD a.out) from"
|
||||||
" FILE. This command ignores the rest of the contents of the line,"
|
" FILE. This command ignores the rest of the contents of the line,"
|
||||||
|
@ -961,7 +961,7 @@ static struct builtin builtin_module =
|
||||||
"module",
|
"module",
|
||||||
module_func,
|
module_func,
|
||||||
BUILTIN_CMDLINE,
|
BUILTIN_CMDLINE,
|
||||||
"module file [arg ...]",
|
"module FILE [ARG ...]",
|
||||||
"Load a boot module FILE for a Multiboot format boot image (no"
|
"Load a boot module FILE for a Multiboot format boot image (no"
|
||||||
" interpretation of the file contents are made, so that user of this"
|
" interpretation of the file contents are made, so that user of this"
|
||||||
" command must know what the kernel in question works with). The"
|
" command must know what the kernel in question works with). The"
|
||||||
|
@ -994,7 +994,7 @@ static struct builtin builtin_modulenounzip =
|
||||||
"modulenounzip",
|
"modulenounzip",
|
||||||
modulenounzip_func,
|
modulenounzip_func,
|
||||||
BUILTIN_CMDLINE,
|
BUILTIN_CMDLINE,
|
||||||
"modulenounzip file [arg ...]",
|
"modulenounzip FILE [ARG ...]",
|
||||||
"Exactly like `module=', except that automatic decompression is"
|
"Exactly like `module=', except that automatic decompression is"
|
||||||
" disabled."
|
" disabled."
|
||||||
};
|
};
|
||||||
|
@ -1023,7 +1023,7 @@ static struct builtin builtin_password =
|
||||||
password_func,
|
password_func,
|
||||||
BUILTIN_MENU,
|
BUILTIN_MENU,
|
||||||
#if 0
|
#if 0
|
||||||
"password passwd file",
|
"password PASSWD FILE",
|
||||||
"Disable all interactive editing control (menu entry editor and"
|
"Disable all interactive editing control (menu entry editor and"
|
||||||
" command line). If the password PASSWD is entered, it loads the"
|
" command line). If the password PASSWD is entered, it loads the"
|
||||||
" FILE as a new config file and restarts the GRUB Stage 2."
|
" FILE as a new config file and restarts the GRUB Stage 2."
|
||||||
|
@ -1047,7 +1047,7 @@ static struct builtin builtin_pause =
|
||||||
"pause",
|
"pause",
|
||||||
pause_func,
|
pause_func,
|
||||||
BUILTIN_CMDLINE,
|
BUILTIN_CMDLINE,
|
||||||
"pause [message ...]",
|
"pause [MESSAGE ...]",
|
||||||
"Print the MESSAGE, then wait until a key is pressed. Note that"
|
"Print the MESSAGE, then wait until a key is pressed. Note that"
|
||||||
" placing <^G> (ASCII code 7) in the message will cause the speaker"
|
" placing <^G> (ASCII code 7) in the message will cause the speaker"
|
||||||
" to emit the standard beep sound, which is useful when prompting"
|
" to emit the standard beep sound, which is useful when prompting"
|
||||||
|
@ -1095,7 +1095,7 @@ static struct builtin builtin_read =
|
||||||
"read",
|
"read",
|
||||||
read_func,
|
read_func,
|
||||||
BUILTIN_CMDLINE,
|
BUILTIN_CMDLINE,
|
||||||
"read addr",
|
"read ADDR",
|
||||||
"Read a 32-bit unsigned value from memory at address ADDR and"
|
"Read a 32-bit unsigned value from memory at address ADDR and"
|
||||||
" displays it in hex format."
|
" displays it in hex format."
|
||||||
};
|
};
|
||||||
|
@ -1139,7 +1139,7 @@ static struct builtin builtin_root =
|
||||||
"root",
|
"root",
|
||||||
root_func,
|
root_func,
|
||||||
BUILTIN_CMDLINE,
|
BUILTIN_CMDLINE,
|
||||||
"root device [hdbias]",
|
"root DEVICE [HDBIAS]",
|
||||||
"Set the current \"root partition\" to the device DEVICE, then"
|
"Set the current \"root partition\" to the device DEVICE, then"
|
||||||
" attempt to mount it to get the partition size (for passing the"
|
" attempt to mount it to get the partition size (for passing the"
|
||||||
" partition descriptor in `ES:ESI', used by some chain-loaded"
|
" partition descriptor in `ES:ESI', used by some chain-loaded"
|
||||||
|
@ -1258,7 +1258,7 @@ static struct builtin builtin_testload =
|
||||||
"testload",
|
"testload",
|
||||||
testload_func,
|
testload_func,
|
||||||
BUILTIN_CMDLINE,
|
BUILTIN_CMDLINE,
|
||||||
"testload file",
|
"testload FILE",
|
||||||
"Read the entire contents of FILE in several different ways and"
|
"Read the entire contents of FILE in several different ways and"
|
||||||
" compares them, to test the filesystem code. The output is somewhat"
|
" compares them, to test the filesystem code. The output is somewhat"
|
||||||
" cryptic, but if no errors are reported and the final `i=X,"
|
" cryptic, but if no errors are reported and the final `i=X,"
|
||||||
|
@ -1285,7 +1285,7 @@ static struct builtin builtin_timeout =
|
||||||
timeout_func,
|
timeout_func,
|
||||||
BUILTIN_MENU,
|
BUILTIN_MENU,
|
||||||
#if 0
|
#if 0
|
||||||
"timeout sec",
|
"timeout SEC",
|
||||||
"Set a timeout, in SEC seconds, before automatically booting the"
|
"Set a timeout, in SEC seconds, before automatically booting the"
|
||||||
" default entry (normally the first entry defined)."
|
" default entry (normally the first entry defined)."
|
||||||
#endif
|
#endif
|
||||||
|
@ -1296,7 +1296,7 @@ static struct builtin builtin_timeout =
|
||||||
static int
|
static int
|
||||||
title_func (char *arg, int flags)
|
title_func (char *arg, int flags)
|
||||||
{
|
{
|
||||||
/* This function is not actually at least currently. */
|
/* This function is not actually used at least currently. */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1306,7 +1306,7 @@ static struct builtin builtin_title =
|
||||||
title_func,
|
title_func,
|
||||||
BUILTIN_TITLE,
|
BUILTIN_TITLE,
|
||||||
#if 0
|
#if 0
|
||||||
"title name [...]",
|
"title [NAME ...]",
|
||||||
"Start a new boot entry, and set its name to the contents of the"
|
"Start a new boot entry, and set its name to the contents of the"
|
||||||
" rest of the line, starting with the first non-space character."
|
" rest of the line, starting with the first non-space character."
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -45,7 +45,7 @@ skip_to (int after_equal, char *cmdline)
|
||||||
return cmdline;
|
return cmdline;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Print a helpful message for the command-line interface. */
|
||||||
void
|
void
|
||||||
print_cmdline_message (void)
|
print_cmdline_message (void)
|
||||||
{
|
{
|
||||||
|
@ -73,11 +73,16 @@ find_command (char *command)
|
||||||
/* Seek out the builtin whose command name is COMMAND. */
|
/* Seek out the builtin whose command name is COMMAND. */
|
||||||
for (builtin = builtin_table; *builtin != 0; builtin++)
|
for (builtin = builtin_table; *builtin != 0; builtin++)
|
||||||
{
|
{
|
||||||
if (grub_strcmp (command, (*builtin)->name) == 0)
|
int ret = grub_strcmp (command, (*builtin)->name);
|
||||||
|
|
||||||
|
if (ret == 0)
|
||||||
{
|
{
|
||||||
|
/* Find the builtin for COMMAND. */
|
||||||
*ptr = c;
|
*ptr = c;
|
||||||
return *builtin;
|
return *builtin;
|
||||||
}
|
}
|
||||||
|
else if (ret < 0)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Cannot find COMMAND. */
|
/* Cannot find COMMAND. */
|
||||||
|
@ -86,6 +91,7 @@ find_command (char *command)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Initialize the data for the command-line. */
|
||||||
static void
|
static void
|
||||||
init_cmdline (void)
|
init_cmdline (void)
|
||||||
{
|
{
|
||||||
|
@ -100,9 +106,12 @@ init_cmdline (void)
|
||||||
if (mbi.mmap_length)
|
if (mbi.mmap_length)
|
||||||
mbi.flags |= MB_INFO_MEM_MAP;
|
mbi.flags |= MB_INFO_MEM_MAP;
|
||||||
|
|
||||||
|
/* Initialize the data for the builtin commands. */
|
||||||
init_builtins ();
|
init_builtins ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Enter the command-line interface. HEAP is used for the command-line
|
||||||
|
buffer. Return only if get_cmdline returns non-zero (ESC is pushed). */
|
||||||
void
|
void
|
||||||
enter_cmdline (char *heap)
|
enter_cmdline (char *heap)
|
||||||
{
|
{
|
||||||
|
@ -123,21 +132,27 @@ enter_cmdline (char *heap)
|
||||||
if (get_cmdline (PACKAGE "> ", heap, 2048, 0, 1))
|
if (get_cmdline (PACKAGE "> ", heap, 2048, 0, 1))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* Find a builtin. */
|
||||||
builtin = find_command (heap);
|
builtin = find_command (heap);
|
||||||
if (! builtin)
|
if (! builtin)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* If BUILTIN cannot be run in the command-line, skip it. */
|
||||||
if (! (builtin->flags & BUILTIN_CMDLINE))
|
if (! (builtin->flags & BUILTIN_CMDLINE))
|
||||||
{
|
{
|
||||||
errnum = ERR_UNRECOGNIZED;
|
errnum = ERR_UNRECOGNIZED;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Run BUILTIN->FUNC. */
|
||||||
arg = skip_to (1, heap);
|
arg = skip_to (1, heap);
|
||||||
(builtin->func) (arg, BUILTIN_CMDLINE);
|
(builtin->func) (arg, BUILTIN_CMDLINE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Run an entry from the script SCRIPT. HEAP is used for the
|
||||||
|
command-line buffer. If an error occurs, return non-zero, otherwise
|
||||||
|
return zero. */
|
||||||
int
|
int
|
||||||
run_script (char *script, char *heap)
|
run_script (char *script, char *heap)
|
||||||
{
|
{
|
||||||
|
@ -156,6 +171,8 @@ run_script (char *script, char *heap)
|
||||||
|
|
||||||
if (errnum)
|
if (errnum)
|
||||||
{
|
{
|
||||||
|
/* If FALLBACK_ENTRY does not have any meaningful value, do
|
||||||
|
not wait for the input. */
|
||||||
if (fallback_entry < 0)
|
if (fallback_entry < 0)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
@ -164,6 +181,7 @@ run_script (char *script, char *heap)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Copy the first string in CUR_ENTRY to HEAP. */
|
||||||
old_entry = cur_entry;
|
old_entry = cur_entry;
|
||||||
while (*cur_entry++)
|
while (*cur_entry++)
|
||||||
;
|
;
|
||||||
|
@ -173,22 +191,29 @@ run_script (char *script, char *heap)
|
||||||
|
|
||||||
if (! *heap)
|
if (! *heap)
|
||||||
{
|
{
|
||||||
|
/* If there is no more command in SCRIPT... */
|
||||||
|
|
||||||
|
/* If any kernel is not loaded, just exit successfully. */
|
||||||
if (kernel_type == KERNEL_TYPE_NONE)
|
if (kernel_type == KERNEL_TYPE_NONE)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
/* Otherwise, the command boot is run implicitly. */
|
||||||
grub_memmove (heap, "boot", 5);
|
grub_memmove (heap, "boot", 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Find a builtin. */
|
||||||
builtin = find_command (heap);
|
builtin = find_command (heap);
|
||||||
if (! builtin)
|
if (! builtin)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* If BUILTIN cannot be run in the command-line, skip it. */
|
||||||
if (! (builtin->flags & BUILTIN_CMDLINE))
|
if (! (builtin->flags & BUILTIN_CMDLINE))
|
||||||
{
|
{
|
||||||
errnum = ERR_UNRECOGNIZED;
|
errnum = ERR_UNRECOGNIZED;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Run BUILTIN->FUNC. */
|
||||||
arg = skip_to (1, heap);
|
arg = skip_to (1, heap);
|
||||||
(builtin->func) (arg, BUILTIN_CMDLINE);
|
(builtin->func) (arg, BUILTIN_CMDLINE);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue