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