grub2/0229-blscfg-handle-multiple-initramfs-images.patch
Javier Martinez Canillas afb0baacd6
Use BLS fragment filename as menu entry id and for sort criterion
The BLS config filenames are guaranteed to be unique, so they can be
used as GRUB2 entry id and can also be used to sort the menu entries.

Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
2018-07-02 17:33:09 +02:00

108 lines
3.1 KiB
Diff

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