osdep: add qemu_set_tty_echo()
Using stdin with readline.c requires disabling echo and line buffering. Add a portable wrapper to set the terminal attributes under Linux and Windows. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
		
							parent
							
								
									0150cd81cf
								
							
						
					
					
						commit
						13401ba0b9
					
				| 
						 | 
				
			
			@ -240,4 +240,6 @@ static inline void qemu_init_auxval(char **envp) { }
 | 
			
		|||
void qemu_init_auxval(char **envp);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void qemu_set_tty_echo(int fd, bool echo);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -47,6 +47,9 @@ extern int daemon(int, int);
 | 
			
		|||
#  define QEMU_VMALLOC_ALIGN getpagesize()
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <termios.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
#include <glib/gprintf.h>
 | 
			
		||||
 | 
			
		||||
#include "config-host.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -251,3 +254,18 @@ qemu_get_local_state_pathname(const char *relative_pathname)
 | 
			
		|||
    return g_strdup_printf("%s/%s", CONFIG_QEMU_LOCALSTATEDIR,
 | 
			
		||||
                           relative_pathname);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void qemu_set_tty_echo(int fd, bool echo)
 | 
			
		||||
{
 | 
			
		||||
    struct termios tty;
 | 
			
		||||
 | 
			
		||||
    tcgetattr(fd, &tty);
 | 
			
		||||
 | 
			
		||||
    if (echo) {
 | 
			
		||||
        tty.c_lflag |= ECHO | ECHONL | ICANON | IEXTEN;
 | 
			
		||||
    } else {
 | 
			
		||||
        tty.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    tcsetattr(fd, TCSANOW, &tty);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -189,3 +189,22 @@ qemu_get_local_state_pathname(const char *relative_pathname)
 | 
			
		|||
    return g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", base_path,
 | 
			
		||||
                           relative_pathname);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void qemu_set_tty_echo(int fd, bool echo)
 | 
			
		||||
{
 | 
			
		||||
    HANDLE handle = (HANDLE)_get_osfhandle(fd);
 | 
			
		||||
    DWORD dwMode = 0;
 | 
			
		||||
 | 
			
		||||
    if (handle == INVALID_HANDLE_VALUE) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    GetConsoleMode(handle, &dwMode);
 | 
			
		||||
 | 
			
		||||
    if (echo) {
 | 
			
		||||
        SetConsoleMode(handle, dwMode | ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT);
 | 
			
		||||
    } else {
 | 
			
		||||
        SetConsoleMode(handle,
 | 
			
		||||
                       dwMode & ~(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue