qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH] report a error message if -net socket can not conne


From: Li Zhijian
Subject: [Qemu-devel] [PATCH] report a error message if -net socket can not connect to server
Date: Fri, 4 Dec 2015 14:01:00 +0800

From: Li Zhijian <address@hidden>

-netdev socket,connect=xx:xx now is asynchronous to connect
listening server, if we don't start listening server before
connecting, no error is detected but we can connect to listening
server forever.

Just report a error message in this case?

Signed-off-by: Li Zhijian <address@hidden>
---
 net/socket.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/net/socket.c b/net/socket.c
index e8605d4..a82da36 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -46,6 +46,7 @@ typedef struct NetSocketState {
     IOHandler *send_fn;           /* differs between SOCK_STREAM/SOCK_DGRAM */
     bool read_poll;               /* waiting to receive data? */
     bool write_poll;              /* waiting to transmit data? */
+    bool connected;               /* connect socket is connected */
 } NetSocketState;
 
 static void net_socket_accept(void *opaque);
@@ -424,6 +425,21 @@ err:
 static void net_socket_connect(void *opaque)
 {
     NetSocketState *s = opaque;
+    int err = -1;
+    socklen_t len = sizeof(err);
+
+    if (s->listen_fd == -1 && !s->connected) {
+        if (getsockopt(s->fd, SOL_SOCKET, SO_ERROR, &err, &len)) {
+            error_report("get socket opt error %s", strerror(errno));
+            /* FIXME: cleanup and exit ? */
+        } else if (err) {
+            errno = err;
+            error_report("net socket is not connected %s\n", strerror(errno));
+            /* FIXME: cleanup and exit ? */
+        } else {
+            s->connected = true;
+        }
+    }
     s->send_fn = net_socket_send;
     net_socket_read_poll(s, true);
 }
@@ -451,6 +467,7 @@ static NetSocketState 
*net_socket_fd_init_stream(NetClientState *peer,
 
     s->fd = fd;
     s->listen_fd = -1;
+    s->connected = is_connected;
 
     /* Disable Nagle algorithm on TCP sockets to reduce latency */
     socket_set_nodelay(fd);
-- 
1.7.12.4






reply via email to

[Prev in Thread] Current Thread [Next in Thread]