On Mon, Nov 09, 2009 at 03:13:38PM +0100, Robert Millan wrote:
> On Sun, Nov 08, 2009 at 06:09:33PM +0100, Christian Franke wrote:
> >
> > After 'insmod ata', loading of further modules typically fails because
> > the drive in the 'prefix' variable is no longer valid.
>
> Actually, there's a bit more to it: even if you reset prefix, it won't
> use the new path.
>
> I'm working on a fix for that right now.
Here. The problem is that command.lst (and friends) are only processed
once. I fixed this by inserting a write hook in ${prefix}.
Would you please test and/or review?
--
Robert Millan
The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
how) you may access your data; but nobody's threatening your freedom: we
still allow you to remove your data and not access it at all."
sftp://bzr.savannah.gnu.org/srv/bzr/grub/people/robertmh/prefix-redefinition-fix/
=== modified file 'normal/autofs.c'
--- normal/autofs.c 2009-11-09 14:45:28 +0000
+++ normal/autofs.c 2009-11-09 14:55:27 +0000
@@ -51,12 +51,6 @@
read_fs_list (void)
{
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");
if (prefix)
@@ -72,6 +66,15 @@
file = grub_file_open (filename);
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)
{
char *buf;
=== modified file 'normal/dyncmd.c'
--- normal/dyncmd.c 2009-11-09 14:50:20 +0000
+++ normal/dyncmd.c 2009-11-09 14:55:27 +0000
@@ -62,12 +62,6 @@
read_command_list (void)
{
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");
if (prefix)
@@ -84,6 +78,16 @@
if (file)
{
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))
{
char *p, *name, *modname;
=== modified file 'normal/handler.c'
--- normal/handler.c 2009-11-09 14:50:20 +0000
+++ normal/handler.c 2009-11-09 14:55:27 +0000
@@ -135,7 +135,6 @@
read_handler_list (void)
{
const char *prefix;
- static int first_time = 1;
const char *class_name;
auto int iterate_handler (grub_handler_t handler);
@@ -162,11 +161,6 @@
return 0;
}
- /* Make sure that this function does not get executed twice. */
- if (! first_time)
- return;
- first_time = 0;
-
prefix = grub_env_get ("prefix");
if (prefix)
{
@@ -182,6 +176,16 @@
if (file)
{
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))
{
char *p;
=== modified file 'normal/main.c'
--- normal/main.c 2009-08-24 23:55:06 +0000
+++ normal/main.c 2009-11-09 14:55:27 +0000
@@ -404,6 +404,16 @@
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
the command line interface if BATCH is false. */
void
@@ -411,9 +421,8 @@
{
grub_menu_t menu = 0;
- read_command_list ();
- read_fs_list ();
- read_handler_list ();
+ read_lists (NULL, NULL);
+ grub_register_variable_hook ("prefix", NULL, read_lists);
grub_command_execute ("parser.sh", 0, 0);
reader_nested = nested;
_______________________________________________
Grub-devel mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/grub-devel