[PATCH] bootmenu: Allow to quit it via CTRL+C
Heinrich Schuchardt
xypron.glpk at gmx.de
Sat Dec 26 19:44:23 CET 2020
Am 26. Dezember 2020 19:02:25 MEZ schrieb "Pali Rohár" <pali at kernel.org>:
>When CTRL+C is pressed interrupt bootmenu and jump into U-Boot console.
>As the last entry in bootmenu is always U-Boot console just choose the
>last
>entry when CTRL+C is pressed.
>
>It is useful when bootmenu is part of boot process and you want to
>interrupt boot process by scripts which control U-Boot (serial)
>console.
Wouldn't the escape key be a better choice?
On the sandbox CTRL-C makes you quit U-Boot.
When hitting CTRL-C late on other systems it might interrupt a follow-up command.
--
The following is not directly related to your patch:
Is it really a good design that a user cannot be stopped from reaching the console?
I could think of use cases in the context of secure booting where you want to show a menu but you do not want to give access to the command line.
Best regards
Heinrich
>
>Signed-off-by: Pali Rohár <pali at kernel.org>
>---
> cmd/bootmenu.c | 16 +++++++++++++++-
> 1 file changed, 15 insertions(+), 1 deletion(-)
>
>diff --git a/cmd/bootmenu.c b/cmd/bootmenu.c
>index 1ba7b622e5..9b56bfaa9a 100644
>--- a/cmd/bootmenu.c
>+++ b/cmd/bootmenu.c
>@@ -45,6 +45,7 @@ enum bootmenu_key {
> KEY_UP,
> KEY_DOWN,
> KEY_SELECT,
>+ KEY_QUIT,
> };
>
> static char *bootmenu_getoption(unsigned short int n)
>@@ -109,6 +110,9 @@ static void bootmenu_autoboot_loop(struct
>bootmenu_data *menu,
> case '\r':
> *key = KEY_SELECT;
> break;
>+ case 0x3: /* ^C */
>+ *key = KEY_QUIT;
>+ break;
> default:
> *key = KEY_NONE;
> break;
>@@ -187,6 +191,10 @@ static void bootmenu_loop(struct bootmenu_data
>*menu,
> /* enter key was pressed */
> if (c == '\r')
> *key = KEY_SELECT;
>+
>+ /* ^C was pressed */
>+ if (c == 0x3)
>+ *key = KEY_QUIT;
> }
>
> static char *bootmenu_choice_entry(void *data)
>@@ -222,6 +230,12 @@ static char *bootmenu_choice_entry(void *data)
> for (i = 0; i < menu->active; ++i)
> iter = iter->next;
> return iter->key;
>+ case KEY_QUIT:
>+ /* Quit by choosing the last entry - U-Boot console */
>+ iter = menu->first;
>+ while (iter->next)
>+ iter = iter->next;
>+ return iter->key;
> default:
> break;
> }
>@@ -389,7 +403,7 @@ static void menu_display_statusline(struct menu *m)
> printf(ANSI_CURSOR_POSITION, menu->count + 5, 1);
> puts(ANSI_CLEAR_LINE);
> printf(ANSI_CURSOR_POSITION, menu->count + 6, 1);
>- puts(" Press UP/DOWN to move, ENTER to select");
>+ puts(" Press UP/DOWN to move, ENTER to select, CTRL+C to quit");
> puts(ANSI_CLEAR_LINE_TO_END);
> printf(ANSI_CURSOR_POSITION, menu->count + 7, 1);
> puts(ANSI_CLEAR_LINE);
More information about the U-Boot
mailing list