This is used to detect that the remote end has disconnected. Just call tcp_char_disconnect on receiving this event.
Signed-off-by: Antonios Motakis <a.mota...@virtualopensystems.com> Signed-off-by: Nikolay Nikolaev <n.nikol...@virtualopensystems.com> --- qemu-char.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/qemu-char.c b/qemu-char.c index f9bd047..68a37d2 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -2673,6 +2673,21 @@ CharDriverState *qemu_chr_open_eventfd(int eventfd) } #endif +static gboolean tcp_chr_chan_close(GIOChannel *channel, GIOCondition cond, + void *opaque) +{ + CharDriverState *chr = opaque; + + if (cond != G_IO_HUP) { + return FALSE; + } + + /* connection closed */ + tcp_chr_disconnect(chr); + + return TRUE; +} + static void tcp_chr_connect(void *opaque) { CharDriverState *chr = opaque; @@ -2682,6 +2697,7 @@ static void tcp_chr_connect(void *opaque) if (s->chan) { chr->fd_in_tag = io_add_watch_poll(s->chan, tcp_chr_read_poll, tcp_chr_read, chr); + g_io_add_watch(s->chan, G_IO_HUP, tcp_chr_chan_close, chr); } qemu_chr_be_generic_open(chr); } -- 1.8.3.2