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
Grub-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to