menu: fix timeout duration
authorMasahiro Yamada <yamada.masahiro@socionext.com>
Thu, 24 May 2018 08:04:57 +0000 (17:04 +0900)
committerTom Rini <trini@konsulko.com>
Wed, 6 Jun 2018 00:19:08 +0000 (20:19 -0400)
For distro-boot, the TIMEOUT directive in the boot script specifies
how long to pause in units of 1/10 sec. [1]

Commit 8594753ba0a7 ("menu: only timeout when menu is displayed")
corrected this by simply dividing the timeout value by 10 in
menu_interactive_choice().

I see two problems:

 - For example, "TIMEOUT 5" should wait for 0.5 sec, but the current
   implementation cannot handle the granularity of 1/10 sec.
   In fact, it never breaks because "m->timeout / 10" is zero,
   which means no timeout.

 - The menu API is used not only by cmd/pxe.c but also by
   common/autoboot.c .  For the latter case, the unit of the
   timeout value is _second_ because its default is associated
   with CONFIG_BOOTDELAY.

To fix the first issue, use DIV_ROUND_UP() so that the timeout value
is rounded up to the closest integer.

For the second issue, move the division to the boundary between
cmd/pxe.c and common/menu.c .  This is a more desirable place because
the comment of struct pxe_menu says:

 * timeout - time in tenths of a second to wait for a user key-press before
 *           booting the default label.

Then, the comment of menu_create() says:

 * timeout - A delay in seconds to wait for user input. If 0, timeout is
 * disabled, and the default choice will be returned unless prompt is 1.

[1] https://www.syslinux.org/wiki/index.php?title=SYSLINUX#TIMEOUT_timeout

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
cmd/pxe.c
common/menu.c

index 7649d92b6bdaa07aa4380f50d5c62f228e20685d..5609545de575d090b27f48fd0d2d2ee61b8bdc73 100644 (file)
--- a/cmd/pxe.c
+++ b/cmd/pxe.c
@@ -1453,8 +1453,8 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg)
        /*
         * Create a menu and add items for all the labels.
         */
-       m = menu_create(cfg->title, cfg->timeout, cfg->prompt, label_print,
-                       NULL, NULL);
+       m = menu_create(cfg->title, DIV_ROUND_UP(cfg->timeout, 10),
+                       cfg->prompt, label_print, NULL, NULL);
 
        if (!m)
                return NULL;
index bf2b471ff8767cd6f58ceee2961d594c60ac9623..0f0a29ac2ee3b44172622ca29e597516e165c432 100644 (file)
@@ -194,8 +194,7 @@ static inline int menu_interactive_choice(struct menu *m, void **choice)
 
                if (!m->item_choice) {
                        readret = cli_readline_into_buffer("Enter choice: ",
-                                                          cbuf,
-                                                          m->timeout / 10);
+                                                          cbuf, m->timeout);
 
                        if (readret >= 0) {
                                choice_item = menu_item_by_key(m, cbuf);