From 91ea3dcf35e4e3fdfe360069819517436c3ae3c7 Mon Sep 17 00:00:00 2001 From: Michael Ferrari Date: Mon, 16 Sep 2024 19:54:53 +0200 Subject: [PATCH] homed: wait for user input during firstboot This mirrors the behavior of `systemd-firstboot` and allows bootup messages to settle down before user input is actually processed. See: https://github.com/systemd/systemd/issues/34448 --- src/basic/terminal-util.c | 19 +++++++++++++++++++ src/basic/terminal-util.h | 1 + src/firstboot/firstboot.c | 18 ++---------------- src/home/homectl.c | 2 ++ 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/basic/terminal-util.c b/src/basic/terminal-util.c index 94720c9adf2..cff1d50e42a 100644 --- a/src/basic/terminal-util.c +++ b/src/basic/terminal-util.c @@ -255,6 +255,25 @@ int ask_string(char **ret, const char *text, ...) { return 0; } +bool any_key_to_proceed(void) { + char key = 0; + bool need_nl = true; + + /* + * Insert a new line here as well as to when the user inputs, as this is also used during the + * boot up sequence when status messages may be interleaved with the current program output. + * This ensures that the status messages aren't appended on the same line as this message. + */ + puts("-- Press any key to proceed --"); + + (void) read_one_char(stdin, &key, USEC_INFINITY, &need_nl); + + if (need_nl) + putchar('\n'); + + return key != 'q'; +} + int open_terminal(const char *name, int mode) { _cleanup_close_ int fd = -EBADF; unsigned c = 0; diff --git a/src/basic/terminal-util.h b/src/basic/terminal-util.h index f8a30bbb646..180ca24ef40 100644 --- a/src/basic/terminal-util.h +++ b/src/basic/terminal-util.h @@ -78,6 +78,7 @@ int chvt(int vt); int read_one_char(FILE *f, char *ret, usec_t timeout, bool *need_nl); int ask_char(char *ret, const char *replies, const char *text, ...) _printf_(3, 4); int ask_string(char **ret, const char *text, ...) _printf_(2, 3); +bool any_key_to_proceed(void); int vt_disallocate(const char *name); diff --git a/src/firstboot/firstboot.c b/src/firstboot/firstboot.c index 85ceffa13b8..f4601c02101 100644 --- a/src/firstboot/firstboot.c +++ b/src/firstboot/firstboot.c @@ -93,20 +93,6 @@ STATIC_DESTRUCTOR_REGISTER(arg_root_shell, freep); STATIC_DESTRUCTOR_REGISTER(arg_kernel_cmdline, freep); STATIC_DESTRUCTOR_REGISTER(arg_image_policy, image_policy_freep); -static bool press_any_key(void) { - char k = 0; - bool need_nl = true; - - puts("-- Press any key to proceed --"); - - (void) read_one_char(stdin, &k, USEC_INFINITY, &need_nl); - - if (need_nl) - putchar('\n'); - - return k != 'q'; -} - static void print_welcome(int rfd) { _cleanup_free_ char *pretty_name = NULL, *os_name = NULL, *ansi_color = NULL; static bool done = false; @@ -141,7 +127,7 @@ static void print_welcome(int rfd) { printf("\nPlease configure your system!\n\n"); - press_any_key(); + any_key_to_proceed(); done = true; } @@ -184,7 +170,7 @@ static int show_menu(char **x, unsigned n_columns, unsigned width, unsigned perc /* on the first screen we reserve 2 extra lines for the title */ if (i % break_lines == break_modulo) { - if (!press_any_key()) + if (!any_key_to_proceed()) return 0; } } diff --git a/src/home/homectl.c b/src/home/homectl.c index 83deeac1238..a52bc6d4648 100644 --- a/src/home/homectl.c +++ b/src/home/homectl.c @@ -2434,6 +2434,8 @@ static int create_interactively(void) { return 0; } + any_key_to_proceed(); + r = acquire_bus(&bus); if (r < 0) return r; -- 2.47.3