diff --git a/commands/timeout.c b/commands/timeout.c index ef1a037..d197ced 100644 --- a/commands/timeout.c +++ b/commands/timeout.c @@ -32,7 +32,7 @@ char str[2] = { }; const char *varname = NULL; - while((opt = getopt(argc, argv, "crsav:")) > 0) { + while ((opt = getopt(argc, argv, "crsav:e")) > 0) { switch(opt) { case 'r': flags |= CONSOLE_COUNTDOWN_RETURN; @@ -46,6 +46,9 @@ case 's': flags |= CONSOLE_COUNTDOWN_SILENT; break; + case 'e': + flags |= CONSOLE_COUNTDOWN_EXTERN; + break; case 'v': varname = optarg; break; @@ -73,6 +76,7 @@ BAREBOX_CMD_HELP_OPT("-a", "interrupt on any key") BAREBOX_CMD_HELP_OPT("-c", "interrupt on Ctrl-C") BAREBOX_CMD_HELP_OPT("-r", "interrupt on RETURN") +BAREBOX_CMD_HELP_OPT("-e", "interrupt on external commands (i.e. fastboot") BAREBOX_CMD_HELP_OPT("-s", "silent mode") BAREBOX_CMD_HELP_OPT("-v ", "export pressed key to environment") BAREBOX_CMD_HELP_END @@ -80,7 +84,7 @@ BAREBOX_CMD_START(timeout) .cmd = do_timeout, BAREBOX_CMD_DESC("wait for a specified timeout") - BAREBOX_CMD_OPTS("[-acrsv] SECONDS") + BAREBOX_CMD_OPTS("[-acrsev] SECONDS") BAREBOX_CMD_GROUP(CMD_GRP_CONSOLE) BAREBOX_CMD_HELP(cmd_timeout_help) BAREBOX_CMD_END diff --git a/common/console_countdown.c b/common/console_countdown.c index b2eec72..03b9b33 100644 --- a/common/console_countdown.c +++ b/common/console_countdown.c @@ -23,6 +23,13 @@ #include #include +static bool console_countdown_timeout_abort; + +void console_countdown_abort(void) +{ + console_countdown_timeout_abort = true; +} + int console_countdown(int timeout_s, unsigned flags, char *out_key) { uint64_t start, second; @@ -48,6 +55,9 @@ goto out; key = 0; } + if ((flags & CONSOLE_COUNTDOWN_EXTERN) && + console_countdown_timeout_abort) + goto out; if (!(flags & CONSOLE_COUNTDOWN_SILENT) && is_timeout(second, SECOND)) { printf("\b\b\b\b%4d", countdown--); @@ -55,6 +65,10 @@ } } while (!is_timeout(start, timeout_s * SECOND)); + if ((flags & CONSOLE_COUNTDOWN_EXTERN) && + console_countdown_timeout_abort) + goto out; + ret = 0; out: @@ -62,6 +76,7 @@ printf("\n"); if (key && out_key) *out_key = key; + console_countdown_timeout_abort = false; return ret; } diff --git a/include/console_countdown.h b/include/console_countdown.h index cb46964..c6c2d5c 100644 --- a/include/console_countdown.h +++ b/include/console_countdown.h @@ -5,7 +5,9 @@ #define CONSOLE_COUNTDOWN_ANYKEY (1 << 1) #define CONSOLE_COUNTDOWN_RETURN (1 << 3) #define CONSOLE_COUNTDOWN_CTRLC (1 << 4) +#define CONSOLE_COUNTDOWN_EXTERN (1 << 5) int console_countdown(int timeout_s, unsigned flags, char *out_key); +void console_countdown_abort(void); #endif /* __CONSOLE_COUNTDOWN_H */