char: restore read callback on a reattached (hotplug) chardev

-----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2.0.22 (GNU/Linux)
 
 iQIcBAABAgAGBQJTIYiOAAoJEEy22O7T6HE4hIoQAIxdi4/eZYXUAPFzmY6OUXF0
 Nr0b2xKvwX9iUNr7UBwJT/gcAWwNQCFPVCkCrY9ksVlIEHeyYEWApbc9JfHnz8+z
 Ae/E8bpmFrROnpdb8dhrN7Vzp4o8N0x1U0Hx6tI1uxndSEP0fd0bEoHcjNK9JWGW
 hSfQOPGK/OKyKV6sSULtaE21s+W5zJopg3Zc/EZiz3HGIDXKdZfbnZsrFtjJ9fus
 KMsUJd0JgAozGIABB1o2+yiZWl+X0delj63RLoBuYNyEndwiheSDM5sneG+qJIUM
 x+/T98hGN8NvWdYx2JQTkDOIhYE2btnirkmdv5AENEyC5GgbEC+LE/a1cGLutt14
 yr69bHhQMt+slmqWYIJdzKaTjC4MrTgyJAsHT7/8QP/AgaRE6rJ0nyfS49ZL1qKu
 KUuvbuSk4qmvJBBcXktH0MPYgUkqLoAsTrO4n2ck3+Xfn3MIyJEHm6UKv/qTiPZV
 YR/fL9/LmCSCvk+W1YtoxOPtOtsTLZmcm1+E1pgJVYhp5gOIMXwZ49arXQvbKnQU
 veSwCSDyoQ3eh8daXRPcJM7J/7xl083P9BQDvmOMfNypO6dJD4xYJ+2Rsuu1f18m
 lINYEKQihSRPj78j30dFxDdGUVBy8EjvXzOmyaA6inYVonSvN/hveFqOp1ZDpx40
 cqbpKMqZq/cuEWiMpjBg
 =VVjJ
 -----END PGP SIGNATURE-----

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>
This commit is contained in:
Peter Maydell 2014-03-13 17:19:14 +00:00
commit 4a9a1f49c5

View file

@ -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;