
Am 26. Dezember 2020 19:02:25 MEZ schrieb "Pali Rohár" pali@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@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;
default: break; }return iter->key;
@@ -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);