Parallel device don't register be->chr_can_read function, but remote disconnect 
event is handled in chr_read.
So connected parallel device can not detect remote disconnect event.

Signed-off-by: Peng Hao <peng.h...@zte.com.cn>
Reviewed-by: Wang Yechao <wang.yechao...@zte.com.cn>
---
 chardev/char-socket.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/chardev/char-socket.c b/chardev/char-socket.c
index ccc499c..59509d4 100644
--- a/chardev/char-socket.c
+++ b/chardev/char-socket.c
@@ -131,6 +131,14 @@ static int tcp_chr_write(Chardev *chr, const uint8_t *buf, 
int len)
     }
 }
 
+static gboolean is_parallel_device(Chardev *chr)
+{
+    if (chr && chr->label && strstr(chr->label, "charparallel")) {
+        return TRUE;
+    }
+    return FALSE;
+}
+
 static int tcp_chr_read_poll(void *opaque)
 {
     Chardev *chr = CHARDEV(opaque);
@@ -138,6 +146,8 @@ static int tcp_chr_read_poll(void *opaque)
     if (!s->connected) {
         return 0;
     }
+    if (is_parallel_device(chr)) {
+        return 1;
+    }
     s->max_size = qemu_chr_be_can_write(chr);
     return s->max_size;
 }
@@ -422,6 +432,15 @@ static gboolean tcp_chr_read(QIOChannel *chan, 
GIOCondition cond, void *opaque)
     uint8_t buf[CHR_READ_BUF_LEN];
     int len, size;
 
+    /* for parallel-device handle the socket close event here*/
+    if (!s->max_size && is_parallel_device(chr)) {
+        size = tcp_chr_recv(chr, (void *)buf, CHR_READ_BUF_LEN);
+        if (size == 0 || size == -1) {
+            tcp_chr_disconnect(chr);
+        }
+        return TRUE;
+    }
+
     if (!s->connected || s->max_size <= 0) {
         return TRUE;
     }
-- 
1.8.3.1



Reply via email to