david/ipxe
Archived
1
0

[hci] Continue processing while prompting for shell banner

Continue calling step() while displaying the shell banner.  This
potentially allows TCP connections to close gracefully after a failed
boot attempt.

Inspired-by: Guo-Fu Tseng <cooldavid@cooldavid.org>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown 2010-07-14 12:37:29 +01:00
parent 24403fba6e
commit 3338a03982
3 changed files with 5 additions and 14 deletions

View File

@ -38,7 +38,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
* @v timeout Timeout period, in ticks * @v timeout Timeout period, in ticks
* @ret character Character read from console * @ret character Character read from console
*/ */
static int getchar_timeout ( unsigned long timeout ) { int getchar_timeout ( unsigned long timeout ) {
unsigned long expiry = ( currticks() + timeout ); unsigned long expiry = ( currticks() + timeout );
while ( currticks() < expiry ) { while ( currticks() < expiry ) {

View File

@ -20,9 +20,9 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <stdio.h> #include <stdio.h>
#include <console.h> #include <console.h>
#include <unistd.h>
#include <config/general.h> #include <config/general.h>
#include <ipxe/keys.h> #include <ipxe/keys.h>
#include <ipxe/timer.h>
#include <ipxe/shell_banner.h> #include <ipxe/shell_banner.h>
/** @file /** @file
@ -37,8 +37,6 @@ FILE_LICENCE ( GPL2_OR_LATER );
* @ret enter_shell User wants to enter shell * @ret enter_shell User wants to enter shell
*/ */
int shell_banner ( void ) { int shell_banner ( void ) {
int enter_shell = 0;
int wait_count;
int key; int key;
/* Skip prompt if timeout is zero */ /* Skip prompt if timeout is zero */
@ -49,18 +47,10 @@ int shell_banner ( void ) {
printf ( "\nPress Ctrl-B for the iPXE command line..." ); printf ( "\nPress Ctrl-B for the iPXE command line..." );
/* Wait for key */ /* Wait for key */
for ( wait_count = 0 ; wait_count < BANNER_TIMEOUT ; wait_count++ ) { key = getchar_timeout ( ( BANNER_TIMEOUT * TICKS_PER_SEC ) / 10 );
if ( iskey() ) {
key = getchar();
if ( key == CTRL_B )
enter_shell = 1;
break;
}
mdelay(100);
}
/* Clear the "Press Ctrl-B" line */ /* Clear the "Press Ctrl-B" line */
printf ( "\r \r" ); printf ( "\r \r" );
return enter_shell; return ( key == CTRL_B );
} }

View File

@ -102,6 +102,7 @@ struct console_driver {
extern void putchar ( int character ); extern void putchar ( int character );
extern int getchar ( void ); extern int getchar ( void );
extern int getchar_timeout ( unsigned long timeout );
extern int iskey ( void ); extern int iskey ( void );
extern int getkey ( void ); extern int getkey ( void );