--- grub_orig/grub2-1.98~experimental.20100111.1/commands/sleep.c 2010-01-11 20:01:15.000000000 +0100 +++ grub/grub2-1.98~experimental.20100111.1/commands/sleep.c 2010-01-18 20:37:56.107189595 +0100 @@ -44,19 +44,26 @@ grub_printf ("%d ", n); } +static int +do_check_key_press (void) +{ + return (grub_checkkey () >= 0 + && GRUB_TERM_ASCII_CHAR (grub_getkey ()) == GRUB_TERM_ESC); +} + /* Based on grub_millisleep() from kern/generic/millisleep.c. */ static int grub_interruptible_millisleep (grub_uint32_t ms) { grub_uint64_t start; - start = grub_get_time_ms (); - + while (grub_get_time_ms () - start < ms) - if (grub_checkkey () >= 0 && - GRUB_TERM_ASCII_CHAR (grub_getkey ()) == GRUB_TERM_ESC) + { + if (do_check_key_press ()) return 1; - + } + return 0; } @@ -64,18 +71,20 @@ grub_cmd_sleep (grub_extcmd_t cmd, int argc, char **args) { struct grub_arg_list *state = cmd->state; - int n; + unsigned long n; if (argc != 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, "missing operand"); n = grub_strtoul (args[0], 0, 10); + if (n == ~0UL) + return grub_error (GRUB_ERR_BAD_ARGUMENT, "incorrect value"); + if (n == 0) - { - /* Either `0' or broken input. */ - return 0; - } + { + return (state[1].set && do_check_key_press ()); + } pos = grub_term_save_pos ();