15a2072
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
15a2072
From: Peter Jones <pjones@redhat.com>
15a2072
Date: Wed, 11 Apr 2018 13:44:29 -0400
15a2072
Subject: [PATCH] blscfg: handle multiple initramfs images.
15a2072
15a2072
Signed-off-by: Peter Jones <pjones@redhat.com>
15a2072
---
15a2072
 grub-core/commands/blscfg.c | 54 ++++++++++++++++++++++++++++++++++++---------
15a2072
 1 file changed, 44 insertions(+), 10 deletions(-)
15a2072
15a2072
diff --git a/grub-core/commands/blscfg.c b/grub-core/commands/blscfg.c
15a2072
index e775c6b8794..6ab85df6b3a 100644
15a2072
--- a/grub-core/commands/blscfg.c
15a2072
+++ b/grub-core/commands/blscfg.c
15a2072
@@ -587,6 +587,7 @@ static void create_entry (struct bls_entry *entry, const char *cfgfile)
15a2072
   char *title = NULL;
15a2072
   char *clinux = NULL;
15a2072
   char *options = NULL;
15a2072
+  char **initrds = NULL;
15a2072
   char *initrd = NULL;
15a2072
   char *id = NULL;
15a2072
   char *hotkey = NULL;
15a2072
@@ -609,7 +610,7 @@ static void create_entry (struct bls_entry *entry, const char *cfgfile)
15a2072
 
15a2072
   title = bls_get_val (entry, "title", NULL);
15a2072
   options = bls_get_val (entry, "options", NULL);
15a2072
-  initrd = bls_get_val (entry, "initrd", NULL);
15a2072
+  initrds = bls_make_list (entry, "initrd", NULL);
15a2072
   id = bls_get_val (entry, "id", NULL);
15a2072
 
15a2072
   hotkey = bls_get_val (entry, "grub_hotkey", NULL);
15a2072
@@ -624,30 +625,63 @@ static void create_entry (struct bls_entry *entry, const char *cfgfile)
15a2072
     argv[i] = args[i-1];
15a2072
   argv[argc] = NULL;
15a2072
 
15a2072
-  grub_dprintf("blscfg", "adding menu entry for \"%s\"\n", title);
15a2072
+  grub_dprintf ("blscfg", "adding menu entry for \"%s\"\n", title);
15a2072
+  if (initrds)
15a2072
+    {
15a2072
+      int initrd_size = sizeof (GRUB_INITRD_CMD);
15a2072
+      char *tmp;
15a2072
+
15a2072
+      for (i = 0; initrds != NULL && initrds[i] != NULL; i++)
15a2072
+	initrd_size += sizeof (" " GRUB_BOOT_DEVICE) \
15a2072
+		       + grub_strlen (initrds[i]) + 1;
15a2072
+      initrd_size += 1;
15a2072
+
15a2072
+      initrd = grub_malloc (initrd_size);
15a2072
+      if (!initrd)
15a2072
+	{
15a2072
+	  grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory"));
15a2072
+	  goto finish;
15a2072
+	}
15a2072
+
15a2072
+
15a2072
+      tmp = grub_stpcpy(initrd, GRUB_INITRD_CMD);
15a2072
+      for (i = 0; initrds != NULL && initrds[i] != NULL; i++)
15a2072
+	{
15a2072
+	  grub_dprintf ("blscfg", "adding initrd %s\n", initrds[i]);
15a2072
+	  tmp = grub_stpcpy (tmp, " " GRUB_BOOT_DEVICE);
15a2072
+	  tmp = grub_stpcpy (tmp, initrds[i]);
15a2072
+	}
15a2072
+      tmp = grub_stpcpy (tmp, "\n");
15a2072
+    }
15a2072
+
15a2072
   src = grub_xasprintf ("load_video\n"
15a2072
 			"set gfx_payload=keep\n"
15a2072
 			"insmod gzio\n"
15a2072
 			GRUB_LINUX_CMD " %s%s%s%s\n"
15a2072
-			"%s%s%s%s",
15a2072
+			"%s",
15a2072
 			GRUB_BOOT_DEVICE, clinux, options ? " " : "", options ? options : "",
15a2072
-			initrd ? GRUB_INITRD_CMD " " : "", initrd ? GRUB_BOOT_DEVICE : "", initrd ? initrd : "", initrd ? "\n" : "");
15a2072
+			initrd ? initrd : "");
15a2072
 
15a2072
   grub_normal_add_menu_entry (argc, argv, classes, id, users, hotkey, NULL, src, 0);
15a2072
 
15a2072
 finish:
15a2072
+  if (initrd)
15a2072
+    grub_free (initrd);
15a2072
+
15a2072
+  if (initrds)
15a2072
+    grub_free (initrds);
15a2072
+
15a2072
   if (classes)
15a2072
-      grub_free (classes);
15a2072
-  grub_dprintf("blscfg", "%s got here\n", __func__);
15a2072
+    grub_free (classes);
15a2072
+
15a2072
   if (args)
15a2072
-      grub_free (args);
15a2072
+    grub_free (args);
15a2072
 
15a2072
   if (argv)
15a2072
-      grub_free (argv);
15a2072
+    grub_free (argv);
15a2072
 
15a2072
   if (src)
15a2072
-      grub_free (src);
15a2072
-  grub_dprintf("blscfg", "%s got here\n", __func__);
15a2072
+    grub_free (src);
15a2072
 }
15a2072
 
15a2072
 struct find_entry_info {