2005-08-14 Yoshinori K. Okuji <okuji@enbug.org>

* normal/menu.c (run_menu_entry):

        * normal/command.c (grub_command_execute): If INTERACTIVE is
        false and GRUB_COMMAND_FLAG_NO_ECHO is not specified, print
        CMDLINE. Disable the pager if INTERACTIVE is true.
        All callers are changed.

        * normal/main.c (grub_normal_execute): Read command.lst and fs.lst
        before reading a config file.
        * normal/main.c (read_config_file): Even if a command is not
        found, register it if it is within an entry.

        * util/grub-emu.c: Include sys/types.h and unistd.h.
        (options): Added --hold.
        (struct arguments): Added a new member "hold".
        (parse_opt): If KEY is 'H', set ARGS->HOLD to ARG or -1 if ARG is
        missing.
        (main): Initialize ARGS.HOLD to zero. Wait until ARGS.HOLD is
        cleared by a debugger, if it is not zero.

        * include/grub/normal.h (grub_command_execute): Add an argument
        INTERACTIVE.
This commit is contained in:
okuji 2005-08-14 19:36:55 +00:00
parent e51f85ae35
commit 0a74e62fde
8 changed files with 98 additions and 67 deletions

View file

@ -160,7 +160,7 @@ grub_cmdline_run (int nested)
if (! *cmdline)
continue;
grub_command_execute (cmdline);
grub_command_execute (cmdline, 1);
}
}

View file

@ -182,7 +182,7 @@ grub_iterate_commands (int (*iterate) (grub_command_t))
}
int
grub_command_execute (char *cmdline)
grub_command_execute (char *cmdline, int interactive)
{
auto grub_err_t cmdline_get (char **s);
grub_err_t cmdline_get (char **s)
@ -210,7 +210,12 @@ grub_command_execute (char *cmdline)
of calling a function. */
if (num == 0 && grub_strchr (args[0], '='))
{
char *val = grub_strchr (args[0], '=');
char *val;
if (! interactive)
grub_printf ("%s\n", cmdline);
val = grub_strchr (args[0], '=');
val[0] = 0;
grub_env_set (args[0], val + 1);
val[0] = '=';
@ -221,8 +226,14 @@ grub_command_execute (char *cmdline)
if (! cmd)
return -1;
if (! (cmd->flags & GRUB_COMMAND_FLAG_NO_ECHO) && ! interactive)
grub_printf ("%s\n", cmdline);
/* Enable the pager if the environment pager is set to 1. */
pager = grub_env_get ("pager");
if (interactive)
pager = grub_env_get ("pager");
else
pager = 0;
if (pager && (! grub_strcmp (pager, "1")))
grub_set_more (1);

View file

@ -178,9 +178,35 @@ read_config_file (const char *config)
while (get_line (file, cmdline, sizeof (cmdline)))
{
grub_command_t cmd;
cmd = grub_command_find (cmdline);
grub_errno = GRUB_ERR_NONE;
if (cur_entry)
{
if (! cmd || ! (cmd->flags & GRUB_COMMAND_FLAG_TITLE))
{
cur_cmd = (grub_command_list_t) grub_malloc (sizeof (*cur_cmd));
if (! cur_cmd)
goto fail;
cur_cmd->command = grub_strdup (cmdline);
if (! cur_cmd->command)
{
grub_free (cur_cmd);
goto fail;
}
cur_cmd->next = 0;
*next_cmd = cur_cmd;
next_cmd = &(cur_cmd->next);
cur_entry->num++;
continue;
}
}
if (! cmd)
{
grub_printf ("Unknown command `%s' is ignored.\n", cmdline);
@ -218,12 +244,12 @@ read_config_file (const char *config)
menu->size++;
}
else if (! cur_entry)
else
{
/* Run the command if possible. */
if (cmd->flags & GRUB_COMMAND_FLAG_MENU)
{
grub_command_execute (cmdline);
grub_command_execute (cmdline, 0);
if (grub_errno != GRUB_ERR_NONE)
{
grub_print_error ();
@ -236,26 +262,6 @@ read_config_file (const char *config)
continue;
}
}
else
{
cur_cmd = (grub_command_list_t) grub_malloc (sizeof (*cur_cmd));
if (! cur_cmd)
goto fail;
cur_cmd->command = grub_strdup (cmdline);
if (! cur_cmd->command)
{
grub_free (cur_cmd);
goto fail;
}
cur_cmd->next = 0;
*next_cmd = cur_cmd;
next_cmd = &(cur_cmd->next);
cur_entry->num++;
}
}
fail:
@ -463,6 +469,9 @@ grub_normal_execute (const char *config, int nested)
{
grub_menu_t menu = 0;
read_command_list ();
read_fs_list ();
if (config)
{
menu = read_config_file (config);
@ -471,9 +480,6 @@ grub_normal_execute (const char *config, int nested)
grub_errno = GRUB_ERR_NONE;
}
read_command_list ();
read_fs_list ();
if (menu)
{
grub_menu_run (menu, nested);

View file

@ -319,34 +319,17 @@ run_menu_entry (grub_menu_entry_t entry)
for (cl = entry->command_list; cl != 0; cl = cl->next)
{
grub_command_t c;
if (cl->command[0] == '\0')
/* Ignore an empty command line. */
continue;
c = grub_command_find (cl->command);
if (! c)
break;
if (! (c->flags & GRUB_COMMAND_FLAG_CMDLINE))
{
grub_error (GRUB_ERR_INVALID_COMMAND,
"invalid command `%s'",
cl->command);
break;
}
if (! (c->flags & GRUB_COMMAND_FLAG_NO_ECHO))
grub_printf ("%s\n", cl->command);
if (grub_command_execute (cl->command) != 0)
if (grub_command_execute (cl->command, 0) != 0)
break;
}
if (grub_errno == GRUB_ERR_NONE && grub_loader_is_loaded ())
/* Implicit execution of boot, only if something is loaded. */
grub_command_execute ("boot");
grub_command_execute ("boot", 0);
}
void

View file

@ -822,7 +822,6 @@ run (struct screen *screen)
{
struct line *linep = screen->lines + i;
char *p;
grub_command_t c;
/* Trim down space characters. */
for (p = linep->buf + linep->len - 1;
@ -839,26 +838,13 @@ run (struct screen *screen)
/* Ignore an empty command line. */
continue;
c = grub_command_find (p);
if (! c)
break;
if (! (c->flags & GRUB_COMMAND_FLAG_CMDLINE))
{
grub_error (GRUB_ERR_INVALID_COMMAND, "invalid command `%s'", p);
break;
}
if (! (c->flags & GRUB_COMMAND_FLAG_NO_ECHO))
grub_printf ("%s\n", p);
if (grub_command_execute (p) != 0)
if (grub_command_execute (p, 0) != 0)
break;
}
if (grub_errno == GRUB_ERR_NONE && grub_loader_is_loaded ())
/* Implicit execution of boot, only if something is loaded. */
grub_command_execute ("boot");
grub_command_execute ("boot", 0);
if (grub_errno != GRUB_ERR_NONE)
{