File grub2-bls-loader-config-timeout.patch of Package grub2

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
@@ -749,34 +749,38 @@ workaround_snapshot_menu_default_entry (
 }
 
 #ifdef GRUB_MACHINE_EFI
-static int
-get_entry_from_efivar(grub_menu_t menu, const char* efivar)
+static char*
+get_efivar(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;
+  grub_size_t size;
+  grub_efi_char16_t *val_efi = NULL;
+  char *val = NULL;
   status = grub_efi_get_variable(efivar,
-								 &grub_efi_loader_guid,
-								 &entry_size,
-								 (void**) &entry_efi);
-  if (status == GRUB_EFI_SUCCESS)
+      &grub_efi_loader_guid,
+      &size,
+      (void**) &val_efi);
+  if (status == GRUB_EFI_SUCCESS && size != 0)
 	{
-	  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);
-		}
+          val = grub_malloc (size * sizeof (char));
+          grub_utf16_to_utf8 ((grub_uint8_t*) val,
+                                                  (grub_uint16_t*) val_efi, size);
 	}
-  grub_free(entry_name);
-  return entry_index;
+  return val;
+}
+
+static int
+get_entry_from_efivar(grub_menu_t menu, const char* efivar)
+{
+  char* entry_name = get_efivar(efivar);
+  if (entry_name)
+    {
+      int idx = search_entry (menu, entry_name);
+      grub_free(entry_name);
+      return idx;
+    } else {
+      return -1;
+    }
 }
 #endif
 
@@ -806,6 +810,8 @@ run_menu (grub_menu_t menu, int nested,
   if (val && (val[0] == '1' || val[0] == 'y'))
 	{
 	  static long loader_features =
+		  GRUB_EFI_LOADER_FEATURE_CONFIG_TIMEOUT |
+		  GRUB_EFI_LOADER_FEATURE_CONFIG_TIMEOUT_ONE_SHOT |
 		  GRUB_EFI_LOADER_FEATURE_ENTRY_DEFAULT |
 		  GRUB_EFI_LOADER_FEATURE_ENTRY_ONESHOT |
 		  GRUB_EFI_LOADER_FEATURE_BOOT_COUNTING |
@@ -837,6 +843,77 @@ run_menu (grub_menu_t menu, int nested,
   if (default_entry < 0 || default_entry >= menu->size)
     default_entry = 0;
 
+#ifdef GRUB_MACHINE_EFI
+  if (val && (val[0] == '1' || val[0] == 'y'))
+    {
+      int timeout_oneshot = -1;
+      /* https://systemd.io/BOOT_LOADER_INTERFACE/ */
+      char* loader_config_timeout_oneshot = get_efivar("LoaderConfigTimeoutOneShot");
+      grub_dprintf("bls", "%s\n", loader_config_timeout_oneshot);
+      if (loader_config_timeout_oneshot)
+      {
+        grub_efi_set_variable_to_string("LoaderConfigTimeoutOneShot",
+                &grub_efi_loader_guid, "", 0);
+        timeout_oneshot = (int) grub_strtoul (loader_config_timeout_oneshot, 0, 0);
+        if (grub_errno != GRUB_ERR_NONE)
+          {
+            grub_errno = GRUB_ERR_NONE;
+            timeout_oneshot = -1;
+          }
+        /* We have a valid value */
+        if (timeout_oneshot != -1)
+          {
+            if (timeout_oneshot == 0)
+              {
+                /* Wait indefinitely. In this cas we want to set the timeout value to -1.
+                   In this case unsetting timeout will have the same effect. */
+                grub_env_unset ("timeout");
+              } else {
+                grub_menu_set_timeout (timeout_oneshot);
+              }
+              grub_env_set("timeout_style", "menu");
+          }
+        grub_free(loader_config_timeout_oneshot);
+      }
+    /* If there was no LoaderConfigTimeoutOneShot value or it was invalid
+       read LoaderConfigTimeout */
+      grub_dprintf("bls", "%d\n", timeout_oneshot);
+    if (timeout_oneshot == -1)
+      {
+        char* loader_config_timeout = get_efivar("LoaderConfigTimeout");
+      grub_dprintf("bls", "%s\n", loader_config_timeout);
+        if (loader_config_timeout)
+          {
+            if (grub_strcmp(loader_config_timeout, "menu-force") == 0)
+              {
+                grub_env_unset ("timeout");
+              } else if (grub_strcmp(loader_config_timeout, "0") == 0 ||
+                      grub_strcmp(loader_config_timeout, "menu-hidden") == 0)
+              {
+                grub_menu_set_timeout (1);
+                grub_env_set("timeout_style", "hidden");
+              } else if (grub_strcmp(loader_config_timeout, "menu-disabled") == 0)
+              {
+                grub_menu_set_timeout (0);
+              } else {
+                int loader_timeout = (int) grub_strtoul (loader_config_timeout, 0, 0);
+                grub_dprintf("bls", "%d", loader_timeout);
+                if (grub_errno == GRUB_ERR_NONE)
+                  {
+                    grub_menu_set_timeout (loader_timeout);
+                    grub_env_set("timeout_style", "menu");
+                  } else {
+                    grub_errno = GRUB_ERR_NONE;
+                  }
+              }
+            grub_free(loader_config_timeout);
+          }
+      }
+    }
+    grub_dprintf("bls", "HERE\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
+    grub_dprintf("bls", "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
+#endif
+
   timeout = grub_menu_get_timeout ();
   if (timeout < 0)
     /* If there is no timeout, the "countdown" and "hidden" styles result in
@@ -847,6 +924,7 @@ run_menu (grub_menu_t menu, int nested,
 
   timeout_style = get_timeout_style ();
 
+
   if (timeout_style == TIMEOUT_STYLE_COUNTDOWN
       || timeout_style == TIMEOUT_STYLE_HIDDEN)
     {
openSUSE Build Service is sponsored by