diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2014-03-13 17:19:14 +0000 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2014-03-13 17:19:14 +0000 |
commit | 4a9a1f49c58fb0cbdd17ad3de2cc682aad3230b8 (patch) | |
tree | 618cfa5f27f2ce9208f00eba7082af7d1ce43100 | |
parent | 57fac92c2d4487d5c45e1ca96df6790f96c9e64c (diff) | |
parent | ac1b84dd1e020648db82a99260891aa982d1142c (diff) | |
download | qemu-4a9a1f49c58fb0cbdd17ad3de2cc682aad3230b8.zip qemu-4a9a1f49c58fb0cbdd17ad3de2cc682aad3230b8.tar.gz qemu-4a9a1f49c58fb0cbdd17ad3de2cc682aad3230b8.tar.bz2 |
Merge remote-tracking branch 'remotes/kraxel/tags/pull-chardev-1' into staging
char: restore read callback on a reattached (hotplug) chardev
# gpg: Signature made Thu 13 Mar 2014 10:29:34 GMT using RSA key ID D3E87138
# gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>"
# gpg: aka "Gerd Hoffmann <gerd@kraxel.org>"
# gpg: aka "Gerd Hoffmann (private) <kraxel@gmail.com>"
* remotes/kraxel/tags/pull-chardev-1:
char: restore read callback on a reattached (hotplug) chardev
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
-rw-r--r-- | qemu-char.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/qemu-char.c b/qemu-char.c index 4d50838..54ed244 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -213,7 +213,7 @@ void qemu_chr_add_handlers(CharDriverState *s, s->chr_read = fd_read; s->chr_event = fd_event; s->handler_opaque = opaque; - if (s->chr_update_read_handler) + if (fe_open && s->chr_update_read_handler) s->chr_update_read_handler(s); if (!s->explicit_fe_open) { @@ -1136,13 +1136,14 @@ static void pty_chr_state(CharDriverState *chr, int connected) if (!s->connected) { s->connected = 1; qemu_chr_be_generic_open(chr); + } + if (!chr->fd_in_tag) { chr->fd_in_tag = io_add_watch_poll(s->fd, pty_chr_read_poll, pty_chr_read, chr); } } } - static void pty_chr_close(struct CharDriverState *chr) { PtyCharDriver *s = chr->opaque; @@ -2509,6 +2510,17 @@ static void tcp_chr_connect(void *opaque) qemu_chr_be_generic_open(chr); } +static void tcp_chr_update_read_handler(CharDriverState *chr) +{ + TCPCharDriver *s = chr->opaque; + + remove_fd_in_watch(chr); + if (s->chan) { + chr->fd_in_tag = io_add_watch_poll(s->chan, tcp_chr_read_poll, + tcp_chr_read, chr); + } +} + #define IACSET(x,a,b,c) x[0] = a; x[1] = b; x[2] = c; static void tcp_chr_telnet_init(int fd) { @@ -2664,6 +2676,7 @@ static CharDriverState *qemu_chr_open_socket_fd(int fd, bool do_nodelay, chr->get_msgfd = tcp_get_msgfd; chr->chr_add_client = tcp_chr_add_client; chr->chr_add_watch = tcp_chr_add_watch; + chr->chr_update_read_handler = tcp_chr_update_read_handler; /* be isn't opened until we get a connection */ chr->explicit_be_open = true; |