On Mon, Sep 30, 2024 at 1:03 PM Vladimir 'phcoder' Serbinenko <
phco...@gmail.com> wrote:

> Using titles is broken concept and the only reason we support it in
> default is backwards compatibility. Maybe it's better to restrict it to
> just IDs
>
>
The word 'title' is still on the doc
https://www.gnu.org/software/grub/manual/grub/html_node/default.html#default
, so we should support it, correct?  or update the doc instead and
completely remove the title option?



> Le lun. 30 sept. 2024, 20:48, Leo Sandoval <lsand...@redhat.com> a écrit :
>
>> From: Peter Jones <pjo...@redhat.com>
>>
>> Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1026084
>>
>> Signed-off-by: Peter Jones <pjo...@redhat.com>
>> ---
>>  grub-core/normal/menu.c | 85 ++++++++++++++++++++++++++++-------------
>>  1 file changed, 58 insertions(+), 27 deletions(-)
>>
>> diff --git a/grub-core/normal/menu.c b/grub-core/normal/menu.c
>> index 6a90e091f..6444ee6f9 100644
>> --- a/grub-core/normal/menu.c
>> +++ b/grub-core/normal/menu.c
>> @@ -163,15 +163,40 @@ grub_menu_set_timeout (int timeout)
>>      }
>>  }
>>
>> +static int
>> +menuentry_eq (const char *id, const char *spec)
>> +{
>> +  const char *ptr1, *ptr2;
>> +  ptr1 = id;
>> +  ptr2 = spec;
>> +  while (1)
>> +    {
>> +      if (*ptr2 == '>' && ptr2[1] != '>' && *ptr1 == 0)
>> +       return ptr2 - spec;
>> +      if (*ptr2 == '>' && ptr2[1] != '>')
>> +       return 0;
>> +      if (*ptr2 == '>')
>> +       ptr2++;
>> +      if (*ptr1 != *ptr2)
>> +       return 0;
>> +      if (*ptr1 == 0)
>> +       return ptr1 - id;
>> +      ptr1++;
>> +      ptr2++;
>> +    }
>> +  return 0;
>> +}
>> +
>>  /* Get the first entry number from the value of the environment variable
>> NAME,
>>     which is a space-separated list of non-negative integers.  The entry
>> number
>>     which is returned is stripped from the value of NAME.  If no entry
>> number
>>     can be found, -1 is returned.  */
>>  static int
>> -get_and_remove_first_entry_number (const char *name)
>> +get_and_remove_first_entry_number (grub_menu_t menu, const char *name)
>>  {
>>    const char *val, *tail;
>>    int entry;
>> +  int sz = 0;
>>
>>    val = grub_env_get (name);
>>    if (! val)
>> @@ -181,9 +206,39 @@ get_and_remove_first_entry_number (const char *name)
>>
>>    entry = (int) grub_strtoul (val, &tail, 0);
>>
>> +  if (grub_errno == GRUB_ERR_BAD_NUMBER)
>> +    {
>> +      /* See if the variable matches the title of a menu entry.  */
>> +      grub_menu_entry_t e = menu->entry_list;
>> +      int i;
>> +
>> +      for (i = 0; e; i++)
>> +       {
>> +         sz = menuentry_eq (e->title, val);
>> +         if (sz < 1)
>> +           sz = menuentry_eq (e->id, val);
>> +
>> +         if (sz >= 1)
>> +           {
>> +             entry = i;
>> +             break;
>> +           }
>> +         e = e->next;
>> +       }
>> +
>> +      if (sz > 0)
>> +       grub_errno = GRUB_ERR_NONE;
>> +
>> +      if (! e)
>> +       entry = -1;
>> +    }
>> +
>>    if (grub_errno == GRUB_ERR_NONE)
>>      {
>> -      /* Skip whitespace to find the next digit.  */
>> +      if (sz > 0)
>> +       tail += sz;
>> +
>> +      /* Skip whitespace to find the next entry.  */
>>        while (*tail && grub_isspace (*tail))
>>         tail++;
>>        grub_env_set (name, tail);
>> @@ -346,7 +401,7 @@ grub_menu_execute_with_fallback (grub_menu_t menu,
>>    grub_menu_execute_entry (entry, 1);
>>
>>    /* Deal with fallback entries.  */
>> -  while ((fallback_entry = get_and_remove_first_entry_number
>> ("fallback"))
>> +  while ((fallback_entry = get_and_remove_first_entry_number (menu,
>> "fallback"))
>>          >= 0)
>>      {
>>        grub_print_error ();
>> @@ -464,30 +519,6 @@ grub_menu_register_viewer (struct grub_menu_viewer
>> *viewer)
>>    viewers = viewer;
>>  }
>>
>> -static int
>> -menuentry_eq (const char *id, const char *spec)
>> -{
>> -  const char *ptr1, *ptr2;
>> -  ptr1 = id;
>> -  ptr2 = spec;
>> -  while (1)
>> -    {
>> -      if (*ptr2 == '>' && ptr2[1] != '>' && *ptr1 == 0)
>> -       return 1;
>> -      if (*ptr2 == '>' && ptr2[1] != '>')
>> -       return 0;
>> -      if (*ptr2 == '>')
>> -       ptr2++;
>> -      if (*ptr1 != *ptr2)
>> -       return 0;
>> -      if (*ptr1 == 0)
>> -       return 1;
>> -      ptr1++;
>> -      ptr2++;
>> -    }
>> -}
>> -
>> -
>>  /* Get the entry number from the variable NAME.  */
>>  static int
>>  get_entry_number (grub_menu_t menu, const char *name)
>> --
>> 2.46.1
>>
>>
>> _______________________________________________
>> Grub-devel mailing list
>> Grub-devel@gnu.org
>> https://lists.gnu.org/mailman/listinfo/grub-devel
>>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel
>
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to