aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2021-04-23 12:27:57 +0100
committerMichael Brown <mcb30@ipxe.org>2021-04-23 12:27:57 +0100
commitb2501dd1221d7910e7aa896ae8b927bb63b77d3a (patch)
treecefdf056fabb0bb4c7a2fd7a007096b65ce10c04
parent56f7d44fde1d6ac196d115cc7dddd58e7ec098fa (diff)
downloadipxe-b2501dd1221d7910e7aa896ae8b927bb63b77d3a.zip
ipxe-b2501dd1221d7910e7aa896ae8b927bb63b77d3a.tar.gz
ipxe-b2501dd1221d7910e7aa896ae8b927bb63b77d3a.tar.bz2
[readline] Add an optional timeout to readline_history()
Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/hci/commands/nvo_cmd.c2
-rw-r--r--src/hci/readline.c17
-rw-r--r--src/hci/shell.c2
-rw-r--r--src/include/readline/readline.h3
4 files changed, 18 insertions, 6 deletions
diff --git a/src/hci/commands/nvo_cmd.c b/src/hci/commands/nvo_cmd.c
index ac0d606..88e9d47 100644
--- a/src/hci/commands/nvo_cmd.c
+++ b/src/hci/commands/nvo_cmd.c
@@ -241,7 +241,7 @@ static int read_value ( struct named_setting *setting, char **args __unused,
NULL, &setting->setting, &existing );
/* 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;
err_readline:
diff --git a/src/hci/readline.c b/src/hci/readline.c
index 83a2e0b..852c450 100644
--- a/src/hci/readline.c
+++ b/src/hci/readline.c
@@ -248,6 +248,7 @@ void history_free ( struct readline_history *history ) {
* @v prompt Prompt string
* @v prefill Prefill string, or NULL for no prefill
* @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 rc Return status code
*
@@ -255,7 +256,8 @@ void history_free ( struct readline_history *history ) {
* eventually call free() to release the storage.
*/
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];
struct edit_string string;
int key;
@@ -285,8 +287,17 @@ int readline_history ( const char *prompt, const char *prefill,
}
while ( 1 ) {
+
+ /* Get keypress */
+ key = getkey ( timeout );
+ if ( key < 0 ) {
+ rc = -ETIMEDOUT;
+ goto done;
+ }
+ timeout = 0;
+
/* Handle keypress */
- key = edit_string ( &string, getkey ( 0 ) );
+ key = edit_string ( &string, key );
sync_console ( &string );
move_by = 0;
switch ( key ) {
@@ -342,6 +353,6 @@ int readline_history ( const char *prompt, const char *prefill,
char * readline ( const char *prompt ) {
char *line;
- readline_history ( prompt, NULL, NULL, &line );
+ readline_history ( prompt, NULL, NULL, 0, &line );
return line;
}
diff --git a/src/hci/shell.c b/src/hci/shell.c
index 276eb35..8ecf73a 100644
--- a/src/hci/shell.c
+++ b/src/hci/shell.c
@@ -91,7 +91,7 @@ int shell ( void ) {
/* Read and execute commands */
do {
- readline_history ( shell_prompt, NULL, &history, &line );
+ readline_history ( shell_prompt, NULL, &history, 0, &line );
if ( line ) {
rc = system ( line );
free ( line );
diff --git a/src/include/readline/readline.h b/src/include/readline/readline.h
index afafbbd..3caf28b 100644
--- a/src/include/readline/readline.h
+++ b/src/include/readline/readline.h
@@ -51,7 +51,8 @@ struct readline_history {
extern void history_free ( struct readline_history *history );
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 );
#endif /* _READLINE_H */