+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.
+
2005-08-14 Vesa Jaaskelainen <chaac@nic.fi>
* DISTLIST: Added include/grub/i386/pc/vbe.h.
grub_command_t grub_command_find (char *cmdline);
grub_err_t grub_set_history (int newsize);
int grub_iterate_commands (int (*iterate) (grub_command_t));
-int grub_command_execute (char *cmdline);
+int grub_command_execute (char *cmdline, int interactive);
void grub_command_init (void);
void grub_normal_init_page (void);
void grub_menu_init_page (int nested, int edit);
if (! *cmdline)
continue;
- grub_command_execute (cmdline);
+ grub_command_execute (cmdline, 1);
}
}
}
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)
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] = '=';
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);
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);
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 ();
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:
{
grub_menu_t menu = 0;
+ read_command_list ();
+ read_fs_list ();
+
if (config)
{
menu = read_config_file (config);
grub_errno = GRUB_ERR_NONE;
}
- read_command_list ();
- read_fs_list ();
-
if (menu)
{
grub_menu_run (menu, nested);
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
{
struct line *linep = screen->lines + i;
char *p;
- grub_command_t c;
/* Trim down space characters. */
for (p = linep->buf + linep->len - 1;
/* 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)
{
#include <argp.h>
#include <string.h>
#include <signal.h>
+#include <sys/types.h>
+#include <unistd.h>
#include <grub/mm.h>
#include <grub/setjmp.h>
{"device-map", 'm', "FILE", 0, "use FILE as the device map", 0},
{"directory", 'd', "DIR", 0, "use GRUB files in the directory DIR", 0},
{"verbose", 'v', 0 , 0, "print verbose messages", 0},
+ {"hold", 'H', "SECONDS", OPTION_ARG_OPTIONAL, "wait until a debugger will attach", 0},
{ 0, 0, 0, 0, 0, 0 }
};
char *root_dev;
char *dev_map;
char *dir;
+ int hold;
};
static error_t
case 'v':
verbosity++;
break;
+ case 'H':
+ args->hold = arg ? atoi (arg) : -1;
+ break;
case ARGP_KEY_END:
break;
default:
struct arguments args =
{
.dir = DEFAULT_DIRECTORY,
- .dev_map = DEFAULT_DEVICE_MAP
+ .dev_map = DEFAULT_DEVICE_MAP,
+ .hold = 0
};
progname = "grub-emu";
argp_parse (&argp, argc, argv, 0, 0, &args);
+ /* Wait until the ARGS.HOLD variable is cleared by an attached debugger. */
+ if (args.hold && verbosity > 0)
+ printf ("Run \"gdb %s %d\", and set ARGS.HOLD to zero.\n",
+ progname, (int) getpid ());
+ while (args.hold)
+ {
+ if (args.hold > 0)
+ args.hold--;
+
+ sleep (1);
+ }
+
/* Make sure that there is a root device. */
if (! args.root_dev)
{