[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