[readline] Add an optional timeout to readline_history()

Signed-off-by: Michael Brown <mcb30@ipxe.org>
pull/343/head
Michael Brown 2021-04-23 12:27:57 +01:00
parent 56f7d44fde
commit b2501dd122
4 changed files with 18 additions and 6 deletions

View File

@ -241,7 +241,7 @@ static int read_value ( struct named_setting *setting, char **args __unused,
NULL, &setting->setting, &existing ); NULL, &setting->setting, &existing );
/* Read new value */ /* Read new value */
if ( ( rc = readline_history ( NULL, existing, NULL, value ) ) != 0 ) if ( ( rc = readline_history ( NULL, existing, NULL, 0, value ) ) != 0 )
goto err_readline; goto err_readline;
err_readline: err_readline:

View File

@ -248,6 +248,7 @@ void history_free ( struct readline_history *history ) {
* @v prompt Prompt string * @v prompt Prompt string
* @v prefill Prefill string, or NULL for no prefill * @v prefill Prefill string, or NULL for no prefill
* @v history History buffer, or NULL for no history * @v history History buffer, or NULL for no history
* @v timeout Timeout period, in ticks (0=indefinite)
* @ret line Line read from console (excluding terminating newline) * @ret line Line read from console (excluding terminating newline)
* @ret rc Return status code * @ret rc Return status code
* *
@ -255,7 +256,8 @@ void history_free ( struct readline_history *history ) {
* eventually call free() to release the storage. * eventually call free() to release the storage.
*/ */
int readline_history ( const char *prompt, const char *prefill, int readline_history ( const char *prompt, const char *prefill,
struct readline_history *history, char **line ) { struct readline_history *history, unsigned long timeout,
char **line ) {
char buf[READLINE_MAX]; char buf[READLINE_MAX];
struct edit_string string; struct edit_string string;
int key; int key;
@ -285,8 +287,17 @@ int readline_history ( const char *prompt, const char *prefill,
} }
while ( 1 ) { while ( 1 ) {
/* Get keypress */
key = getkey ( timeout );
if ( key < 0 ) {
rc = -ETIMEDOUT;
goto done;
}
timeout = 0;
/* Handle keypress */ /* Handle keypress */
key = edit_string ( &string, getkey ( 0 ) ); key = edit_string ( &string, key );
sync_console ( &string ); sync_console ( &string );
move_by = 0; move_by = 0;
switch ( key ) { switch ( key ) {
@ -342,6 +353,6 @@ int readline_history ( const char *prompt, const char *prefill,
char * readline ( const char *prompt ) { char * readline ( const char *prompt ) {
char *line; char *line;
readline_history ( prompt, NULL, NULL, &line ); readline_history ( prompt, NULL, NULL, 0, &line );
return line; return line;
} }

View File

@ -91,7 +91,7 @@ int shell ( void ) {
/* Read and execute commands */ /* Read and execute commands */
do { do {
readline_history ( shell_prompt, NULL, &history, &line ); readline_history ( shell_prompt, NULL, &history, 0, &line );
if ( line ) { if ( line ) {
rc = system ( line ); rc = system ( line );
free ( line ); free ( line );

View File

@ -51,7 +51,8 @@ struct readline_history {
extern void history_free ( struct readline_history *history ); extern void history_free ( struct readline_history *history );
extern int readline_history ( const char *prompt, const char *prefill, extern int readline_history ( const char *prompt, const char *prefill,
struct readline_history *history, char **line ); struct readline_history *history,
unsigned long timeout, char **line );
extern char * __malloc readline ( const char *prompt ); extern char * __malloc readline ( const char *prompt );
#endif /* _READLINE_H */ #endif /* _READLINE_H */