qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [RFC 4/4] net/socket: change net_socket_connect_init to use


From: Zihan Yang
Subject: [Qemu-devel] [RFC 4/4] net/socket: change net_socket_connect_init to use functions in sockets.h
Date: Tue, 30 Jan 2018 03:13:44 +0800

net_socket_connect_init still uses parse_host_port() and connect()
directly. Convert it into functions in include/qemu/sockets.h

Signed-off-by: Zihan Yang <address@hidden>
---
 net/socket.c | 52 +++++++++++++++++++++++-----------------------------
 1 file changed, 23 insertions(+), 29 deletions(-)

diff --git a/net/socket.c b/net/socket.c
index 7b07223..312b638 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -543,48 +543,42 @@ static int net_socket_connect_init(NetClientState *peer,
                                    Error **errp)
 {
     NetSocketState *s;
-    int fd, connected, ret;
-    struct sockaddr_in saddr;
+    int fd, connected;
+    SocketAddress *saddr;
+    QemuSocketConfig *sconf;
+    Error *local_err = NULL;
 
-    if (parse_host_port(&saddr, host_str, errp) < 0) {
+    saddr = socket_parse(host_str, &local_err);
+    if(NULL != local_err) {
+        error_setg_errno(errp, errno, "socket_parse failed");
         return -1;
     }
 
-    fd = qemu_socket(PF_INET, SOCK_STREAM, 0);
-    if (fd < 0) {
-        error_setg_errno(errp, errno, "can't create stream socket");
-        return -1;
-    }
-    qemu_set_nonblock(fd);
+    sconf = g_new0(QemuSocketConfig, 1);
+    sconf->nonblocking = true;
+    sconf->options = NULL;
 
     connected = 0;
-    for(;;) {
-        ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr));
-        if (ret < 0) {
-            if (errno == EINTR || errno == EWOULDBLOCK) {
-                /* continue */
-            } else if (errno == EINPROGRESS ||
-                       errno == EALREADY ||
-                       errno == EINVAL) {
-                break;
-            } else {
-                error_setg_errno(errp, errno, "can't connect socket");
-                closesocket(fd);
-                return -1;
-            }
-        } else {
-            connected = 1;
-            break;
-        }
+    fd = socket_connect(saddr, errp, sconf);
+    if(fd < 0) {
+        error_setg_errno(errp, errno, "socket_connect failed");
+        g_free(sconf);
+        qapi_free_SocketAddress(saddr);
+        return -1;
+    } else if(errno != EINPROGRESS && errno != EALREADY && errno != EINVAL) {
+        connected = 1;
     }
+    g_free(sconf);
+
     s = net_socket_fd_init(peer, model, name, fd, connected, NULL, errp);
     if (!s) {
         return -1;
     }
 
     snprintf(s->nc.info_str, sizeof(s->nc.info_str),
-             "socket: connect to %s:%d",
-             inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
+             "socket: connect to %s:%s",
+             saddr->u.inet.host, saddr->u.inet.port);
+    qapi_free_SocketAddress(saddr);
     return 0;
 }
 
-- 
2.7.4




reply via email to

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