Implement multiboot filename duplication in legacy parser

This commit is contained in:
Vladimir 'phcoder' Serbinenko 2010-09-11 22:18:41 +02:00
parent 09695ab80c
commit 9fb175ed9a
2 changed files with 22 additions and 11 deletions

View file

@ -179,6 +179,8 @@ grub_cmd_legacy_kernel (struct grub_command *mycmd __attribute__ ((unused)),
int i; int i;
int no_mem_option = 0; int no_mem_option = 0;
struct grub_command *cmd; struct grub_command *cmd;
char **cutargs;
int cutargc;
for (i = 0; i < 2; i++) for (i = 0; i < 2; i++)
{ {
/* FIXME: really support this. */ /* FIXME: really support this. */
@ -233,9 +235,14 @@ grub_cmd_legacy_kernel (struct grub_command *mycmd __attribute__ ((unused)),
} }
} }
if (!argc) if (argc < 2)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "filename required"); return grub_error (GRUB_ERR_BAD_ARGUMENT, "filename required");
cutargs = grub_malloc (sizeof (cutargsp[0]) * (argc - 1));
cutargc = argc - 1;
grub_memcpy (cutargs + 1, args + 2, sizeof (cutargsp[0]) * (argc - 2));
cutargs[0] = args[0];
do do
{ {
/* First try Linux. */ /* First try Linux. */
@ -244,7 +251,7 @@ grub_cmd_legacy_kernel (struct grub_command *mycmd __attribute__ ((unused)),
cmd = grub_command_find ("linux16"); cmd = grub_command_find ("linux16");
if (cmd) if (cmd)
{ {
if (!(cmd->func) (cmd, argc, args)) if (!(cmd->func) (cmd, cutargc, cutargs))
{ {
kernel_type = LINUX; kernel_type = LINUX;
return GRUB_ERR_NONE; return GRUB_ERR_NONE;
@ -275,7 +282,7 @@ grub_cmd_legacy_kernel (struct grub_command *mycmd __attribute__ ((unused)),
cmd = grub_command_find ("kfreebsd"); cmd = grub_command_find ("kfreebsd");
if (cmd) if (cmd)
{ {
if (!(cmd->func) (cmd, argc, args)) if (!(cmd->func) (cmd, cutargc, cutargs))
{ {
kernel_type = KFREEBSD; kernel_type = KFREEBSD;
return GRUB_ERR_NONE; return GRUB_ERR_NONE;
@ -288,7 +295,7 @@ grub_cmd_legacy_kernel (struct grub_command *mycmd __attribute__ ((unused)),
cmd = grub_command_find ("knetbsd"); cmd = grub_command_find ("knetbsd");
if (cmd) if (cmd)
{ {
if (!(cmd->func) (cmd, argc, args)) if (!(cmd->func) (cmd, cutargc, cutargs))
{ {
kernel_type = KNETBSD; kernel_type = KNETBSD;
return GRUB_ERR_NONE; return GRUB_ERR_NONE;
@ -301,7 +308,7 @@ grub_cmd_legacy_kernel (struct grub_command *mycmd __attribute__ ((unused)),
cmd = grub_command_find ("kopenbsd"); cmd = grub_command_find ("kopenbsd");
if (cmd) if (cmd)
{ {
if (!(cmd->func) (cmd, argc, args)) if (!(cmd->func) (cmd, cutargc, cutargs))
{ {
kernel_type = KOPENBSD; kernel_type = KOPENBSD;
return GRUB_ERR_NONE; return GRUB_ERR_NONE;

View file

@ -33,6 +33,7 @@ struct legacy_command
TYPE_NOAPM_OPTION, TYPE_NOAPM_OPTION,
TYPE_TYPE_OR_NOMEM_OPTION, TYPE_TYPE_OR_NOMEM_OPTION,
TYPE_FILE, TYPE_FILE,
TYPE_FILE_NO_CONSUME,
TYPE_PARTITION, TYPE_PARTITION,
TYPE_BOOL, TYPE_BOOL,
TYPE_INT, TYPE_INT,
@ -113,7 +114,8 @@ struct legacy_command legacy_commands[] =
/* ifconfig unsupported. */ /* ifconfig unsupported. */
/* impsprobe unsupported. */ /* impsprobe unsupported. */
/* FIXME: dublicate multiboot filename. */ /* FIXME: dublicate multiboot filename. */
{"initrd", "legacy_initrd '%s' %s\n", 2, {TYPE_FILE, TYPE_REST_VERBATIM}, 0, {"initrd", "legacy_initrd '%s' %s\n", 2, {TYPE_FILE_NO_CONSUME,
TYPE_REST_VERBATIM}, 0,
"FILE [ARG ...]", "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."},
@ -123,7 +125,7 @@ struct legacy_command legacy_commands[] =
/* FIXME: dublicate multiboot filename. */ /* FIXME: dublicate multiboot filename. */
{"kernel", "legacy_kernel %s %s '%s' %s\n", 4, {TYPE_TYPE_OR_NOMEM_OPTION, {"kernel", "legacy_kernel %s %s '%s' %s\n", 4, {TYPE_TYPE_OR_NOMEM_OPTION,
TYPE_TYPE_OR_NOMEM_OPTION, TYPE_TYPE_OR_NOMEM_OPTION,
TYPE_FILE, TYPE_FILE_NO_CONSUME,
TYPE_REST_VERBATIM}, 0, TYPE_REST_VERBATIM}, 0,
"[--no-mem-option] [--type=TYPE] FILE [ARG ...]", "[--no-mem-option] [--type=TYPE] FILE [ARG ...]",
"Attempt to load the primary boot image from FILE. The rest of the" "Attempt to load the primary boot image from FILE. The rest of the"
@ -143,7 +145,8 @@ struct legacy_command legacy_commands[] =
" when you chain-load some operating systems, such as DOS, if such an" " when you chain-load some operating systems, such as DOS, if such an"
" OS resides at a non-first drive."}, " OS resides at a non-first drive."},
/* md5crypt unsupported. */ /* md5crypt unsupported. */
{"module", "legacy_initrd '%s' %s\n", 1, {TYPE_FILE, TYPE_REST_VERBATIM}, 0, {"module", "legacy_initrd '%s' %s\n", 1, {TYPE_FILE_NO_CONSUME,
TYPE_REST_VERBATIM}, 0,
"FILE [ARG ...]", "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 is made, so users of this" " interpretation of the file contents is made, so users of this"
@ -210,7 +213,6 @@ struct legacy_command legacy_commands[] =
" compares them, to test the filesystem code. " " compares them, to test the filesystem code. "
" If this test succeeds, then a good next" " If this test succeeds, then a good next"
" step is to try loading a kernel."}, " step is to try loading a kernel."},
"Print the contents of the file FILE."},
/* testvbe unsupported. */ /* testvbe unsupported. */
/* tftpserver unsupported. */ /* tftpserver unsupported. */
{"timeout", "set timeout=%s\n", 1, {TYPE_INT}, 0, "SEC", {"timeout", "set timeout=%s\n", 1, {TYPE_INT}, 0, "SEC",
@ -399,6 +401,8 @@ grub_legacy_parse (const char *buf, char **entryname)
ptr++; ptr++;
switch (legacy_commands[cmdnum].argt[i]) switch (legacy_commands[cmdnum].argt[i])
{ {
case TYPE_FILE_NO_CONSUME:
hold_arg = 1;
case TYPE_PARTITION: case TYPE_PARTITION:
case TYPE_FILE: case TYPE_FILE:
args[j++] = adjust_file (curarg, curarglen); args[j++] = adjust_file (curarg, curarglen);