Fix *.lst handling after ${prefix} redefinition.

This commit is contained in:
Robert Millan 2009-11-09 14:55:27 +00:00
parent 34f4a5b005
commit e880248e79
4 changed files with 41 additions and 21 deletions

View file

@ -51,12 +51,6 @@ void
read_fs_list (void) read_fs_list (void)
{ {
const char *prefix; const char *prefix;
static int first_time = 1;
/* Make sure that this function does not get executed twice. */
if (! first_time)
return;
first_time = 0;
prefix = grub_env_get ("prefix"); prefix = grub_env_get ("prefix");
if (prefix) if (prefix)
@ -72,6 +66,15 @@ read_fs_list (void)
file = grub_file_open (filename); file = grub_file_open (filename);
if (file) if (file)
{ {
/* Override previous fs.lst. */
while (fs_module_list)
{
grub_named_list_t tmp;
tmp = fs_module_list->next;
grub_free (fs_module_list);
fs_module_list = tmp;
}
while (1) while (1)
{ {
char *buf; char *buf;

View file

@ -62,12 +62,6 @@ void
read_command_list (void) read_command_list (void)
{ {
const char *prefix; const char *prefix;
static int first_time = 1;
/* Make sure that this function does not get executed twice. */
if (! first_time)
return;
first_time = 0;
prefix = grub_env_get ("prefix"); prefix = grub_env_get ("prefix");
if (prefix) if (prefix)
@ -84,6 +78,16 @@ read_command_list (void)
if (file) if (file)
{ {
char *buf = NULL; char *buf = NULL;
/* Override previous commands.lst. */
while (grub_command_list)
{
grub_command_t tmp;
tmp = grub_command_list->next;
grub_free (grub_command_list);
grub_command_list = tmp;
}
for (;; grub_free (buf)) for (;; grub_free (buf))
{ {
char *p, *name, *modname; char *p, *name, *modname;

View file

@ -135,7 +135,6 @@ void
read_handler_list (void) read_handler_list (void)
{ {
const char *prefix; const char *prefix;
static int first_time = 1;
const char *class_name; const char *class_name;
auto int iterate_handler (grub_handler_t handler); auto int iterate_handler (grub_handler_t handler);
@ -162,11 +161,6 @@ read_handler_list (void)
return 0; return 0;
} }
/* Make sure that this function does not get executed twice. */
if (! first_time)
return;
first_time = 0;
prefix = grub_env_get ("prefix"); prefix = grub_env_get ("prefix");
if (prefix) if (prefix)
{ {
@ -182,6 +176,16 @@ read_handler_list (void)
if (file) if (file)
{ {
char *buf = NULL; char *buf = NULL;
/* Override previous handler.lst. */
while (grub_handler_class_list)
{
grub_handler_class_t tmp;
tmp = grub_handler_class_list->next;
grub_free (grub_handler_class_list);
grub_handler_class_list = tmp;
}
for (;; grub_free (buf)) for (;; grub_free (buf))
{ {
char *p; char *p;

View file

@ -404,6 +404,16 @@ grub_normal_init_page (void)
static int reader_nested; static int reader_nested;
static char *
read_lists (struct grub_env_var *var __attribute__ ((unused)),
const char *val)
{
read_command_list ();
read_fs_list ();
read_handler_list ();
return val ? grub_strdup (val) : NULL;
}
/* Read the config file CONFIG and execute the menu interface or /* Read the config file CONFIG and execute the menu interface or
the command line interface if BATCH is false. */ the command line interface if BATCH is false. */
void void
@ -411,9 +421,8 @@ grub_normal_execute (const char *config, int nested, int batch)
{ {
grub_menu_t menu = 0; grub_menu_t menu = 0;
read_command_list (); read_lists (NULL, NULL);
read_fs_list (); grub_register_variable_hook ("prefix", NULL, read_lists);
read_handler_list ();
grub_command_execute ("parser.sh", 0, 0); grub_command_execute ("parser.sh", 0, 0);
reader_nested = nested; reader_nested = nested;