You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
3.6 KiB
135 lines
3.6 KiB
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Javier Martinez Canillas <javierm@redhat.com>
|
|
Date: Tue, 26 Jun 2018 14:01:26 +0200
|
|
Subject: [PATCH] Use BLS fragment filename as menu entry id and for criteria
|
|
to sort
|
|
|
|
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>
|
|
---
|
|
grub-core/commands/blscfg.c | 62 +++++++++------------------------------------
|
|
1 file changed, 12 insertions(+), 50 deletions(-)
|
|
|
|
diff --git a/grub-core/commands/blscfg.c b/grub-core/commands/blscfg.c
|
|
index 70939a818..cd8659384 100644
|
|
--- a/grub-core/commands/blscfg.c
|
|
+++ b/grub-core/commands/blscfg.c
|
|
@@ -70,6 +70,7 @@ struct bls_entry
|
|
{
|
|
struct keyval **keyvals;
|
|
int nkeyvals;
|
|
+ char *filename;
|
|
};
|
|
|
|
static struct bls_entry **entries;
|
|
@@ -166,6 +167,7 @@ static void bls_free_entry(struct bls_entry *entry)
|
|
|
|
grub_free (entry->keyvals);
|
|
grub_memset (entry, 0, sizeof (*entry));
|
|
+ grub_free (entry->filename);
|
|
grub_free (entry);
|
|
}
|
|
|
|
@@ -327,58 +329,12 @@ finish:
|
|
|
|
typedef int (*void_cmp_t)(void *, void *);
|
|
|
|
-static int nulcmp(char *s0, char *s1, void_cmp_t cmp)
|
|
-{
|
|
- grub_dprintf("blscfg", "%s got here\n", __func__);
|
|
- if (s1 && !s0)
|
|
- return 1;
|
|
- if (s0 && !s1)
|
|
- return -1;
|
|
- if (!s0 && !s1)
|
|
- return 0;
|
|
- if (cmp)
|
|
- return cmp(s0, s1);
|
|
- return grub_strcmp(s0, s1);
|
|
-}
|
|
-
|
|
-static int
|
|
-bls_keyval_cmp(struct bls_entry *e0, struct bls_entry *e1, const char *keyname)
|
|
-{
|
|
- char *val0, *val1;
|
|
-
|
|
- val0 = bls_get_val (e0, keyname, NULL);
|
|
- val1 = bls_get_val (e1, keyname, NULL);
|
|
-
|
|
- if (val1 && !val0)
|
|
- return 1;
|
|
-
|
|
- if (val0 && !val1)
|
|
- return -1;
|
|
-
|
|
- if (!val0 && !val1)
|
|
- return 0;
|
|
-
|
|
- return nulcmp(val0, val1, (void_cmp_t)vercmp);
|
|
-}
|
|
-
|
|
static int bls_cmp(const void *p0, const void *p1, void *state UNUSED)
|
|
{
|
|
struct bls_entry * e0 = *(struct bls_entry **)p0;
|
|
struct bls_entry * e1 = *(struct bls_entry **)p1;
|
|
- int rc = 0;
|
|
|
|
- rc = bls_keyval_cmp (e0, e1, "id");
|
|
-
|
|
- if (rc == 0)
|
|
- rc = bls_keyval_cmp (e0, e1, "version");
|
|
-
|
|
- if (rc == 0)
|
|
- rc = bls_keyval_cmp (e0, e1, "title");
|
|
-
|
|
- if (rc == 0)
|
|
- rc = bls_keyval_cmp (e0, e1, "linux");
|
|
-
|
|
- return rc;
|
|
+ return vercmp(e0->filename, e1->filename);
|
|
}
|
|
|
|
struct read_entry_info {
|
|
@@ -424,6 +380,12 @@ static int read_entry (
|
|
if (!entry)
|
|
goto finish;
|
|
|
|
+ entry->filename = grub_strndup(filename, n - 5);
|
|
+ if (!entry->filename)
|
|
+ goto finish;
|
|
+
|
|
+ entry->filename[n - 5] = '\0';
|
|
+
|
|
for (;;)
|
|
{
|
|
char *buf;
|
|
@@ -548,7 +510,7 @@ static void create_entry (struct bls_entry *entry, const char *cfgfile)
|
|
char *options = NULL;
|
|
char **initrds = NULL;
|
|
char *initrd = NULL;
|
|
- char *id = NULL;
|
|
+ char *id = entry->filename;
|
|
char *hotkey = NULL;
|
|
|
|
char *users = NULL;
|
|
@@ -570,7 +532,6 @@ 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);
|
|
initrds = bls_make_list (entry, "initrd", NULL);
|
|
- id = bls_get_val (entry, "id", NULL);
|
|
|
|
hotkey = bls_get_val (entry, "grub_hotkey", NULL);
|
|
users = bls_get_val (entry, "grub_users", NULL);
|
|
@@ -584,7 +545,8 @@ 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\" with id \"%s\"\n",
|
|
+ title, id);
|
|
if (initrds)
|
|
{
|
|
int initrd_size = sizeof (GRUB_INITRD_CMD);
|