On 08/11/2010 04:56 PM, Paolo Bonzini wrote:
Currently -qmp stdio (or the equivalent -mon/-chardev combination) sets up the terminal attributes even though it does not go through readline to actually do I/O. As a result, echo is disabled and you cannot see anything you type. This patch fixes it by adding a "cooked" option to the stdio chardev backend, that when set will disable switching the tty to raw mode.
cooked doesn't make a whole lot of sense to me (and it's not documented anywhere).
Maybe raw=on|off or even echo=on|off would make more sense? Regards, Anthony Liguori
Cc: Kevin Wolf<kw...@redhat.com> Signed-off-by: Paolo Bonzini<pbonz...@redhat.com> --- qemu-char.c | 26 ++++++++++++++------------ qemu-config.c | 3 +++ vl.c | 3 +++ 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/qemu-char.c b/qemu-char.c index 6a3952c..15e1891 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -735,19 +735,21 @@ static void term_init(QemuOpts *opts) oldtty = tty; old_fd0_flags = fcntl(0, F_GETFL); - tty.c_iflag&= ~(IGNBRK|BRKINT|PARMRK|ISTRIP + if (!qemu_opt_get_bool(opts, "cooked", 0)) { + tty.c_iflag&= ~(IGNBRK|BRKINT|PARMRK|ISTRIP |INLCR|IGNCR|ICRNL|IXON); - tty.c_oflag |= OPOST; - tty.c_lflag&= ~(ECHO|ECHONL|ICANON|IEXTEN); - /* if graphical mode, we allow Ctrl-C handling */ - if (!qemu_opt_get_bool(opts, "signal", display_type != DT_NOGRAPHIC)) - tty.c_lflag&= ~ISIG; - tty.c_cflag&= ~(CSIZE|PARENB); - tty.c_cflag |= CS8; - tty.c_cc[VMIN] = 1; - tty.c_cc[VTIME] = 0; - - tcsetattr (0, TCSANOW,&tty); + tty.c_oflag |= OPOST; + tty.c_lflag&= ~(ECHO|ECHONL|ICANON|IEXTEN); + /* if graphical mode, we allow Ctrl-C handling */ + if (!qemu_opt_get_bool(opts, "signal", display_type != DT_NOGRAPHIC)) + tty.c_lflag&= ~ISIG; + tty.c_cflag&= ~(CSIZE|PARENB); + tty.c_cflag |= CS8; + tty.c_cc[VMIN] = 1; + tty.c_cc[VTIME] = 0; + + tcsetattr (0, TCSANOW,&tty); + } if (!term_atexit_done++) atexit(term_exit); diff --git a/qemu-config.c b/qemu-config.c index 95abe61..8c525b0 100644 --- a/qemu-config.c +++ b/qemu-config.c @@ -146,6 +146,9 @@ QemuOptsList qemu_chardev_opts = { },{ .name = "signal", .type = QEMU_OPT_BOOL, + },{ + .name = "cooked", + .type = QEMU_OPT_BOOL, }, { /* end if list */ } }, diff --git a/vl.c b/vl.c index b3e3676..be122e7 100644 --- a/vl.c +++ b/vl.c @@ -1596,6 +1596,9 @@ static void monitor_parse(const char *optarg, const char *mode) fprintf(stderr, "parse error: %s\n", optarg); exit(1); } + if (!strcmp(mode, "control")) { + qemu_opt_set(opts, "cooked", "on"); + } } opts = qemu_opts_create(&qemu_mon_opts, label, 1);