mirror of https://github.com/ipxe/ipxe.git
				
				
				
			[readline] Add an optional timeout to readline_history()
Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/343/head
							parent
							
								
									56f7d44fde
								
							
						
					
					
						commit
						b2501dd122
					
				| 
						 | 
				
			
			@ -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:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 );
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue