Am 26. Dezember 2020 19:02:25 MEZ schrieb "Pali Rohár" <p...@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 <p...@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);

Reply via email to