31004e6
From dfb57206eb4beaa16b99e3dc69221d351b29c7c3 Mon Sep 17 00:00:00 2001
31004e6
From: Paulo Flabiano Smorigo <pfsmorigo@br.ibm.com>
31004e6
Date: Wed, 19 Sep 2012 21:22:55 -0300
f74b50e
Subject: [PATCH 444/482] Add fw_path variable (revised)
31004e6
31004e6
This patch makes grub look for its config file on efi where the app was
31004e6
found. It was originally written by Matthew Garrett, and adapted to fix the
31004e6
"No modules are loaded on grub2 network boot" issue:
31004e6
31004e6
https://bugzilla.redhat.com/show_bug.cgi?id=857936
31004e6
---
31004e6
 grub-core/kern/main.c   | 16 ++++++++++++++--
31004e6
 grub-core/normal/main.c | 25 ++++++++++++++++++++++++-
31004e6
 2 files changed, 38 insertions(+), 3 deletions(-)
31004e6
31004e6
diff --git a/grub-core/kern/main.c b/grub-core/kern/main.c
31004e6
index 19dc988..8ab7794 100644
31004e6
--- a/grub-core/kern/main.c
31004e6
+++ b/grub-core/kern/main.c
31004e6
@@ -125,6 +125,20 @@ grub_set_prefix_and_root (void)
31004e6
 
31004e6
   grub_register_variable_hook ("root", 0, grub_env_write_root);
31004e6
 
31004e6
+  grub_machine_get_bootlocation (&fwdevice, &fwpath);
31004e6
+
31004e6
+  if (fwdevice && fwpath)
31004e6
+    {
31004e6
+      char *fw_path;
31004e6
+
31004e6
+      fw_path = grub_xasprintf ("(%s)/%s", fwdevice, fwpath);
31004e6
+      if (fw_path)
31004e6
+	{
31004e6
+	  grub_env_set ("fw_path", fw_path);
31004e6
+	  grub_free (fw_path);
31004e6
+	}
31004e6
+    }
31004e6
+
31004e6
   if (prefix)
31004e6
     {
31004e6
       char *pptr = NULL;
31004e6
@@ -142,8 +156,6 @@ grub_set_prefix_and_root (void)
31004e6
       if (pptr[0])
31004e6
 	path = grub_strdup (pptr);
31004e6
     }
31004e6
-  if ((!device || device[0] == ',' || !device[0]) || !path)
31004e6
-    grub_machine_get_bootlocation (&fwdevice, &fwpath);
31004e6
 
31004e6
   if (!device && fwdevice)
31004e6
     device = fwdevice;
31004e6
diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c
31004e6
index ffc2cd2..a1d5589 100644
31004e6
--- a/grub-core/normal/main.c
31004e6
+++ b/grub-core/normal/main.c
31004e6
@@ -355,7 +355,30 @@ grub_cmd_normal (struct grub_command *cmd __attribute__ ((unused)),
31004e6
       /* Guess the config filename. It is necessary to make CONFIG static,
31004e6
 	 so that it won't get broken by longjmp.  */
31004e6
       char *config;
31004e6
-      const char *prefix;
31004e6
+      const char *prefix, *fw_path;
31004e6
+
31004e6
+      fw_path = grub_env_get ("fw_path");
31004e6
+      if (fw_path)
31004e6
+	{
31004e6
+	  config = grub_xasprintf ("%s/grub.cfg", fw_path);
31004e6
+	  if (config)
31004e6
+	    {
31004e6
+	      grub_file_t file;
31004e6
+
31004e6
+	      file = grub_file_open (config);
31004e6
+	      if (file)
31004e6
+		{
31004e6
+		  grub_file_close (file);
31004e6
+		  grub_enter_normal_mode (config);
31004e6
+		}
31004e6
+              else
31004e6
+                {
31004e6
+                  /*  Ignore all errors.  */
31004e6
+                  grub_errno = 0;
31004e6
+                }
31004e6
+	      grub_free (config);
31004e6
+	    }
31004e6
+	}
31004e6
 
31004e6
       prefix = grub_env_get ("prefix");
31004e6
       if (prefix)
31004e6
-- 
31004e6
1.8.2.1
31004e6