File grub2-bls-loader-entry-default.patch of Package grub2

Factoring out get_entry_from_efivar helper to reduce code duplication
and add support for LoaderEntryDefault.

Index: grub-2.12/grub-core/normal/menu.c
===================================================================
--- grub-2.12.orig/grub-core/normal/menu.c
+++ grub-2.12/grub-core/normal/menu.c
@@ -741,6 +741,38 @@ workaround_snapshot_menu_default_entry (
   return;
 }
 
+#ifdef GRUB_MACHINE_EFI
+static int
+get_entry_from_efivar(grub_menu_t menu, const char* efivar)
+{
+  grub_efi_status_t status;
+  grub_size_t entry_size;
+  grub_efi_char16_t *entry_efi = NULL;
+  char *entry_name = NULL;
+  int entry_index = -1;
+  status = grub_efi_get_variable(efivar,
+								 &grub_efi_loader_guid,
+								 &entry_size,
+								 (void**) &entry_efi);
+  if (status == GRUB_EFI_SUCCESS)
+	{
+	  grub_efi_char16_t *src = entry_efi;
+	  int size = 0;
+	  while (*src++)
+		size++;
+	  if (size != 0)
+		{
+		  entry_name = grub_malloc (size * sizeof (char));
+		  grub_utf16_to_utf8 ((grub_uint8_t*) entry_name,
+							  (grub_uint16_t*) entry_efi, size);
+		  entry_index = search_entry (menu, entry_name);
+		}
+	}
+  grub_free(entry_name);
+  return entry_index;
+}
+#endif
+
 #define GRUB_MENU_PAGE_SIZE 10
 
 /* Show the menu and handle menu entry selection.  Returns the menu entry
@@ -766,36 +798,19 @@ run_menu (grub_menu_t menu, int nested,
   const char* val = grub_env_get ("enable_blscfg");
   if (val && (val[0] == '1' || val[0] == 'y'))
 	{
-	  grub_efi_status_t status;
-	  int oneshot_entry_index;
-	  grub_efi_char16_t *oneshot_entry_efi = NULL;
-	  char *oneshot_entry = NULL;
-	  grub_size_t oneshot_entry_size;
-	  status = grub_efi_get_variable("LoaderEntryOneShot",
-									 &grub_efi_loader_guid,
-									 &oneshot_entry_size,
-									 (void**) &oneshot_entry_efi);
-	  if (status == GRUB_EFI_SUCCESS)
+	  int oneshot_entry, default_entry_efi;
+	  oneshot_entry = get_entry_from_efivar(menu, "LoaderEntryOneShot");
+	  if (oneshot_entry != -1)
 		{
-		  grub_efi_char16_t *src = oneshot_entry_efi;
-		  int size = 0;
-		  while (*src++)
-			size++;
-		  if (size == 0)
+		  default_entry = oneshot_entry;
+		  grub_efi_set_variable_to_string("LoaderEntryOneShot",
+										  &grub_efi_loader_guid, "", 0);
+		} else {
+		  default_entry_efi = get_entry_from_efivar(menu, "LoaderEntryDefault");
+		  if (default_entry_efi != -1)
 			{
-			  oneshot_entry = grub_malloc (size * sizeof (char));
-			  grub_utf16_to_utf8 ((grub_uint8_t*) oneshot_entry,
-								  (grub_uint16_t*) oneshot_entry_efi, size);
-			  oneshot_entry_index = search_entry (menu, oneshot_entry);
-			  if (oneshot_entry_index != -1)
-				{
-				  default_entry = oneshot_entry_index;
-				  grub_efi_set_variable_to_string("LoaderEntryOneShot",
-						  						  &grub_efi_loader_guid, "", 0);
-				}
-			  grub_free(oneshot_entry);
+			  default_entry = default_entry_efi;
 			}
-		  grub_free(oneshot_entry_efi);
 		}
 	}
 #endif
openSUSE Build Service is sponsored by