15a2072
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
15a2072
From: Javier Martinez Canillas <javierm@redhat.com>
15a2072
Date: Tue, 26 Jun 2018 14:01:26 +0200
15a2072
Subject: [PATCH] Use BLS fragment filename as menu entry id and for criteria
15a2072
 to sort
15a2072
15a2072
The BLS config filenames are guaranteed to be unique, so they can be
15a2072
used as GRUB2 entry id and can also be used to sort the menu entries.
15a2072
15a2072
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
15a2072
---
15a2072
 grub-core/commands/blscfg.c | 62 +++++++++------------------------------------
15a2072
 1 file changed, 12 insertions(+), 50 deletions(-)
15a2072
15a2072
diff --git a/grub-core/commands/blscfg.c b/grub-core/commands/blscfg.c
15a2072
index 70939a81826..cd8659384e4 100644
15a2072
--- a/grub-core/commands/blscfg.c
15a2072
+++ b/grub-core/commands/blscfg.c
15a2072
@@ -70,6 +70,7 @@ struct bls_entry
15a2072
 {
15a2072
   struct keyval **keyvals;
15a2072
   int nkeyvals;
15a2072
+  char *filename;
15a2072
 };
15a2072
 
15a2072
 static struct bls_entry **entries;
15a2072
@@ -166,6 +167,7 @@ static void bls_free_entry(struct bls_entry *entry)
15a2072
 
15a2072
   grub_free (entry->keyvals);
15a2072
   grub_memset (entry, 0, sizeof (*entry));
15a2072
+  grub_free (entry->filename);
15a2072
   grub_free (entry);
15a2072
 }
15a2072
 
15a2072
@@ -327,58 +329,12 @@ finish:
15a2072
 
15a2072
 typedef int (*void_cmp_t)(void *, void *);
15a2072
 
15a2072
-static int nulcmp(char *s0, char *s1, void_cmp_t cmp)
15a2072
-{
15a2072
-  grub_dprintf("blscfg", "%s got here\n", __func__);
15a2072
-  if (s1 && !s0)
15a2072
-    return 1;
15a2072
-  if (s0 && !s1)
15a2072
-    return -1;
15a2072
-  if (!s0 && !s1)
15a2072
-    return 0;
15a2072
-  if (cmp)
15a2072
-    return cmp(s0, s1);
15a2072
-  return grub_strcmp(s0, s1);
15a2072
-}
15a2072
-
15a2072
-static int
15a2072
-bls_keyval_cmp(struct bls_entry *e0, struct bls_entry *e1, const char *keyname)
15a2072
-{
15a2072
-  char *val0, *val1;
15a2072
-
15a2072
-  val0 = bls_get_val (e0, keyname, NULL);
15a2072
-  val1 = bls_get_val (e1, keyname, NULL);
15a2072
-
15a2072
-  if (val1 && !val0)
15a2072
-    return 1;
15a2072
-
15a2072
-  if (val0 && !val1)
15a2072
-    return -1;
15a2072
-
15a2072
-  if (!val0 && !val1)
15a2072
-    return 0;
15a2072
-
15a2072
-  return nulcmp(val0, val1, (void_cmp_t)vercmp);
15a2072
-}
15a2072
-
15a2072
 static int bls_cmp(const void *p0, const void *p1, void *state UNUSED)
15a2072
 {
15a2072
   struct bls_entry * e0 = *(struct bls_entry **)p0;
15a2072
   struct bls_entry * e1 = *(struct bls_entry **)p1;
15a2072
-  int rc = 0;
15a2072
 
15a2072
-  rc = bls_keyval_cmp (e0, e1, "id");
15a2072
-
15a2072
-  if (rc == 0)
15a2072
-    rc = bls_keyval_cmp (e0, e1, "version");
15a2072
-
15a2072
-  if (rc == 0)
15a2072
-    rc = bls_keyval_cmp (e0, e1, "title");
15a2072
-
15a2072
-  if (rc == 0)
15a2072
-    rc = bls_keyval_cmp (e0, e1, "linux");
15a2072
-
15a2072
-  return rc;
15a2072
+  return vercmp(e0->filename, e1->filename);
15a2072
 }
15a2072
 
15a2072
 struct read_entry_info {
15a2072
@@ -424,6 +380,12 @@ static int read_entry (
15a2072
   if (!entry)
15a2072
     goto finish;
15a2072
 
15a2072
+  entry->filename = grub_strndup(filename, n - 5);
15a2072
+  if (!entry->filename)
15a2072
+    goto finish;
15a2072
+
15a2072
+  entry->filename[n - 5] = '\0';
15a2072
+
15a2072
   for (;;)
15a2072
     {
15a2072
       char *buf;
15a2072
@@ -548,7 +510,7 @@ static void create_entry (struct bls_entry *entry, const char *cfgfile)
15a2072
   char *options = NULL;
15a2072
   char **initrds = NULL;
15a2072
   char *initrd = NULL;
15a2072
-  char *id = NULL;
15a2072
+  char *id = entry->filename;
15a2072
   char *hotkey = NULL;
15a2072
 
15a2072
   char *users = NULL;
15a2072
@@ -570,7 +532,6 @@ static void create_entry (struct bls_entry *entry, const char *cfgfile)
15a2072
   title = bls_get_val (entry, "title", NULL);
15a2072
   options = bls_get_val (entry, "options", 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
   users = bls_get_val (entry, "grub_users", NULL);
15a2072
@@ -584,7 +545,8 @@ 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\" with id \"%s\"\n",
15a2072
+		title, id);
15a2072
   if (initrds)
15a2072
     {
15a2072
       int initrd_size = sizeof (GRUB_INITRD_CMD);