grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2] Add hidden menu entries


From: Andrei Borzenkov
Subject: Re: [PATCH v2] Add hidden menu entries
Date: Thu, 28 Apr 2016 20:57:55 +0300
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.7.2

28.04.2016 14:14, Alexander Graf пишет:
> The menu infrastructure is quite powerful. It allows you to define menu
> entries that can contain arbitrary grub commands that can do a lot more
> than just boot kernel entries.
> 
> For some of these it makes sense to hide them inside the normal menu
> though and instead have them available through hotkeys that get advertised
> differently. My main use case is to switch to the serial console when
> gfxterm is loaded.
> 
> So this patch adds support for hidden menu entries that are accessible
> using hotkeys, but are not accessible in the grub menu.
> 

Could you explain your use case? I only have SUSE bug number as
reference and of course it is not public so I have no idea what this
patch tries to solve :)

> Signed-off-by: Alexander Graf <address@hidden>
> 
> ---
> 
> v1 -> v2:
> 
>   - fix default entry selection
> ---
>  grub-core/commands/legacycfg.c |  4 ++--
>  grub-core/commands/menuentry.c | 18 ++++++++++++++----
>  grub-core/normal/menu.c        | 30 ++++++++++++++++++++++++++----
>  grub-core/normal/menu_text.c   |  4 ++++
>  include/grub/menu.h            |  2 ++
>  include/grub/normal.h          |  2 +-
>  6 files changed, 49 insertions(+), 11 deletions(-)
> 

What about gfxmenu? It looks like only text menu can hide entries, or do
I miss something?

> diff --git a/grub-core/commands/legacycfg.c b/grub-core/commands/legacycfg.c
> index dd9d9f1..b282c4f 100644
> --- a/grub-core/commands/legacycfg.c
> +++ b/grub-core/commands/legacycfg.c
> @@ -133,7 +133,7 @@ legacy_file (const char *filename)
>           args[0] = oldname;
>           grub_normal_add_menu_entry (1, args, NULL, NULL, "legacy",
>                                       NULL, NULL,
> -                                     entrysrc, 0);
> +                                     entrysrc, 0, 0);
>           grub_free (args);
>           entrysrc[0] = 0;
>           grub_free (oldname);
> @@ -186,7 +186,7 @@ legacy_file (const char *filename)
>       }
>        args[0] = entryname;
>        grub_normal_add_menu_entry (1, args, NULL, NULL, NULL,
> -                               NULL, NULL, entrysrc, 0);
> +                               NULL, NULL, entrysrc, 0, 0);
>        grub_free (args);
>      }
>  
> diff --git a/grub-core/commands/menuentry.c b/grub-core/commands/menuentry.c
> index 58d4dad..d73bbc9 100644
> --- a/grub-core/commands/menuentry.c
> +++ b/grub-core/commands/menuentry.c
> @@ -43,6 +43,8 @@ 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},
> +    {"hidden", 0, 0, N_("This entry is invisible in menus."),
> +     0, ARG_TYPE_NONE},
>      {0, 0, 0, 0, 0, 0}
>    };
>  
> @@ -78,7 +80,7 @@ grub_normal_add_menu_entry (int argc, const char **args,
>                           char **classes, const char *id,
>                           const char *users, const char *hotkey,
>                           const char *prefix, const char *sourcecode,
> -                         int submenu)
> +                         int submenu, int hidden)
>  {
>    int menu_hotkey = 0;
>    char **menu_args = NULL;
> @@ -188,8 +190,11 @@ grub_normal_add_menu_entry (int argc, const char **args,
>    (*last)->args = menu_args;
>    (*last)->sourcecode = menu_sourcecode;
>    (*last)->submenu = submenu;
> +  (*last)->hidden = hidden;
> +
> +  if (!hidden)
> +    menu->size++;
>  
> -  menu->size++;
>    return GRUB_ERR_NONE;
>  
>   fail:
> @@ -261,6 +266,7 @@ grub_cmd_menuentry (grub_extcmd_context_t ctxt, int argc, 
> char **args)
>    unsigned len;
>    grub_err_t r;
>    const char *users;
> +  int hidden = 0;
>  
>    if (! argc)
>      return grub_error (GRUB_ERR_BAD_ARGUMENT, "missing arguments");
> @@ -278,6 +284,9 @@ grub_cmd_menuentry (grub_extcmd_context_t ctxt, int argc, 
> char **args)
>    else
>      users = "";
>  
> +  if (ctxt->state[6].set)
> +    hidden = 1;
> +
>    if (! ctxt->script)
>      return grub_normal_add_menu_entry (argc, (const char **) args,
>                                      (ctxt->state[0].set ? ctxt->state[0].args
> @@ -286,7 +295,8 @@ grub_cmd_menuentry (grub_extcmd_context_t ctxt, int argc, 
> char **args)
>                                      users,
>                                      ctxt->state[2].arg, 0,
>                                      ctxt->state[3].arg,
> -                                    ctxt->extcmd->cmd->name[0] == 's');
> +                                    ctxt->extcmd->cmd->name[0] == 's',
> +                                    hidden);
>  
>    src = args[argc - 1];
>    args[argc - 1] = NULL;
> @@ -303,7 +313,7 @@ grub_cmd_menuentry (grub_extcmd_context_t ctxt, int argc, 
> char **args)
>                                 ctxt->state[0].args, ctxt->state[4].arg,
>                                 users,
>                                 ctxt->state[2].arg, prefix, src + 1,
> -                               ctxt->extcmd->cmd->name[0] == 's');
> +                               ctxt->extcmd->cmd->name[0] == 's', hidden);
>  
>    src[len - 1] = ch;
>    args[argc - 1] = src;
> diff --git a/grub-core/normal/menu.c b/grub-core/normal/menu.c
> index 719e2fb..2a151fe 100644
> --- a/grub-core/normal/menu.c
> +++ b/grub-core/normal/menu.c
> @@ -40,6 +40,8 @@
>  grub_err_t (*grub_gfxmenu_try_hook) (int entry, grub_menu_t menu,
>                                    int nested) = NULL;
>  
> +#define MENU_INCLUDE_HIDDEN 0x10000
> +
>  enum timeout_style {
>    TIMEOUT_STYLE_MENU,
>    TIMEOUT_STYLE_COUNTDOWN,
> @@ -80,8 +82,20 @@ grub_menu_get_entry (grub_menu_t menu, int no)
>  {
>    grub_menu_entry_t e;
>  
> -  for (e = menu->entry_list; e && no > 0; e = e->next, no--)
> -    ;
> +  if (no & MENU_INCLUDE_HIDDEN) {
> +    no &= ~MENU_INCLUDE_HIDDEN;
> +
> +    for (e = menu->entry_list; e && no > 0; e = e->next, no--)
> +      ;
> +  } else {
> +    for (e = menu->entry_list; e && no > 0; e = e->next, no--) {
> +      /* Skip hidden entries */
> +      while (e && e->hidden)
> +        e = e->next;
> +    }
> +    while (e && e->hidden)
> +      e = e->next;
> +  }
>  
>    return e;
>  }
> @@ -93,10 +107,10 @@ get_entry_index_by_hotkey (grub_menu_t menu, int hotkey)
>    grub_menu_entry_t entry;
>    int i;
>  
> -  for (i = 0, entry = menu->entry_list; i < menu->size;
> +  for (i = 0, entry = menu->entry_list; entry;
>         i++, entry = entry->next)
>      if (entry->hotkey == hotkey)
> -      return i;
> +      return i | MENU_INCLUDE_HIDDEN;
>  
>    return -1;
>  }
> @@ -510,6 +524,10 @@ get_entry_number (grub_menu_t menu, const char *name)
>        grub_menu_entry_t e = menu->entry_list;
>        int i;
>  
> +      /* Skip hidden entries */
> +      while (e && e->hidden)
> +     e = e->next;
> +
>        grub_errno = GRUB_ERR_NONE;
>  
>        for (i = 0; e; i++)
> @@ -521,6 +539,10 @@ get_entry_number (grub_menu_t menu, const char *name)
>             break;
>           }
>         e = e->next;
> +
> +       /* Skip hidden entries */
> +       while (e && e->hidden)
> +         e = e->next;
>       }
>  
>        if (! e)
> diff --git a/grub-core/normal/menu_text.c b/grub-core/normal/menu_text.c
> index e22bb91..4ac2d6b 100644
> --- a/grub-core/normal/menu_text.c
> +++ b/grub-core/normal/menu_text.c
> @@ -290,6 +290,10 @@ print_entries (grub_menu_t menu, const struct 
> menu_viewer_data *data)
>                  e, data);
>        if (e)
>       e = e->next;
> +
> +      /* Skip hidden entries */
> +      while (e && e->hidden)
> +        e = e->next;
>      }
>  
>    grub_term_gotoxy (data->term,
> diff --git a/include/grub/menu.h b/include/grub/menu.h
> index ee2b5e9..eb8a86b 100644
> --- a/include/grub/menu.h
> +++ b/include/grub/menu.h
> @@ -58,6 +58,8 @@ struct grub_menu_entry
>  
>    int submenu;
>  
> +  int hidden;
> +
>    /* The next element.  */
>    struct grub_menu_entry *next;
>  };
> diff --git a/include/grub/normal.h b/include/grub/normal.h
> index 218cbab..bcb4124 100644
> --- a/include/grub/normal.h
> +++ b/include/grub/normal.h
> @@ -145,7 +145,7 @@ grub_normal_add_menu_entry (int argc, const char **args, 
> char **classes,
>                           const char *id,
>                           const char *users, const char *hotkey,
>                           const char *prefix, const char *sourcecode,
> -                         int submenu);
> +                         int submenu, int hidden);
>  
>  grub_err_t
>  grub_normal_set_password (const char *user, const char *password);
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]