On 2025-05-26 23:48, Jiří Wolker via Grub-devel wrote:
---
 grub-core/commands/menuentry.c | 50 ++++++++++++++++++++++++++++++++++
 1 file changed, 50 insertions(+)

diff --git a/grub-core/commands/menuentry.c b/grub-core/commands/menuentry.c
index 720e6d8ea..c40b27d8b 100644
--- a/grub-core/commands/menuentry.c
+++ b/grub-core/commands/menuentry.c
@@ -43,6 +43,9 @@ static const struct grub_arg_option options[] =
        anyone can boot it.  */
{"unrestricted", 0, 0, N_("This entry can be booted by any user."),
      0, ARG_TYPE_NONE},
+    {"menutitle", 0, 0,
+ N_("Use STRING as menu title. When omitted, use the entry label."),
+     N_("TITLE"), ARG_TYPE_STRING},
     {0, 0, 0, 0, 0, 0}
   };

@@ -252,12 +255,46 @@ setparams_prefix (int argc, char **args)
   return result;
 }

+static char *
+menutitle_prefix (char *old_prefix, const char *title)
+{
+  const char *t;
+  char *p;
+  char *result;
+  grub_size_t len = 22;
+  grub_size_t old_len = grub_strlen (old_prefix);
+
+  /* Count resulting string length. */
+  for (t = title; *t; t++)
+    {
+      len += (*t++ == '\'' ? 4 : 1);
+    }
+

remove the brackets in one liner For loop

+  result = grub_malloc (old_len + len + 2);
+  if (! result)

s/! result/!result

+    return 0;
+
+  p = result;
+  grub_strcpy (p, old_prefix);
+  p = result + old_len;
+  grub_strcpy (p, "set grub_menu_title='");
+  p += 21;
+
+  p = grub_strchrsub (p, title, '\'', "'\\''");
+  *p++ = '\'';
+  *p++ = '\n';
+  *p = '\0';
+
+  return result;
+}
+
 static grub_err_t
 grub_cmd_menuentry (grub_extcmd_context_t ctxt, int argc, char **args)
 {
   char ch;
   char *src;
   char *prefix;
+  char *old_prefix;
   unsigned len;
   grub_err_t r;
   const char *users;
@@ -299,6 +336,19 @@ grub_cmd_menuentry (grub_extcmd_context_t ctxt,
int argc, char **args)
   if (! prefix)
     return grub_errno;

s/! prefix/!prefix

+  /* Prepend the menu title line. */
+  if (ctxt->state[6].arg)
+    {
+      old_prefix = prefix;
+      prefix = menutitle_prefix (old_prefix,
+                                (ctxt->state[6].arg
+                                 && grub_strlen(ctxt->state[6].arg) > 0)
+                                ? ctxt->state[6].arg : args[0]);
+      if (! prefix)

ditto

+       return grub_errno;
+      grub_free(old_prefix);
+    }
+
   r = grub_normal_add_menu_entry (argc - 1, (const char **) args,
                                  ctxt->state[0].args, ctxt->state[4].arg,
                                  users,

Indentation looks off in couple of places. Please fix it.

Thanks,
Sudhakar

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to