From nobody Mon Apr 29 19:37:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1517253394449370.74563548060974; Mon, 29 Jan 2018 11:16:34 -0800 (PST) Received: from localhost ([::1]:59848 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1egEuv-0007DY-KR for importer@patchew.org; Mon, 29 Jan 2018 14:16:33 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46273) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1egEsu-0005qR-SF for qemu-devel@nongnu.org; Mon, 29 Jan 2018 14:14:30 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1egEst-0008UN-EQ for qemu-devel@nongnu.org; Mon, 29 Jan 2018 14:14:28 -0500 Received: from mail-pf0-x241.google.com ([2607:f8b0:400e:c00::241]:38107) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1egEst-0008Tu-6X for qemu-devel@nongnu.org; Mon, 29 Jan 2018 14:14:27 -0500 Received: by mail-pf0-x241.google.com with SMTP id k19so6231192pfj.5 for ; Mon, 29 Jan 2018 11:14:27 -0800 (PST) Received: from fma-X550VB.lan ([218.193.183.120]) by smtp.gmail.com with ESMTPSA id d8sm1135316pfh.93.2018.01.29.11.14.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 29 Jan 2018 11:14:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=R8ilajGOd1tCZ88oMi+CbQMuKyffI4OXy9YrnZozHzs=; b=dC267Sz8OteU8/AEcEqLw7C5HoH8JyyW6HO4hQGp92CAuxgiaKwZW+yshJwkwt0XqU S+3kV6TAU7iX8OFKzb4tM0D/Zh2P16cq8dWqzCCiPtJBugJe4OayqKcXGGTrcNvJA9b/ Arcgji5dLAcEBD96wUjWktLQ5/AKSezG7d3cePVo1C+ZbTTF+xjlF48WKRKDROQvv7v4 xIn3h+rqvOdShYoiMxEXpFF2CqgTV7s6G58z2abDhj831j34gghHjDCzYoYUVKpYwU3L eD/73p+zHHJMNc3yWw6O7e0xWp1D0PhOPBgJxZbw1MGk/1xzmXNoDqe9WnZFsyMP5Ock BSeg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=R8ilajGOd1tCZ88oMi+CbQMuKyffI4OXy9YrnZozHzs=; b=Z7xmVp4kSCHmyfY0r46I/gN36lTcl91kZBptfMcl8n0M+zi5tgbQCdfg3cSos100Yu y+ckCk5jsyXcVF4kY25jd6GjOtesxzr0F6m7ko35IlspcCxUnRmCdlXBqJo1mss4LfyJ QSyy4/TAmvt9bj/owxwiOTPm0S+gcXgjqTSaJgXZW9hTCUMMDsRpV6d8rGJ5xreqdUtA T8Ohm1jeB8RtdK+eGaXDXIYoXRcYOBMDRnnXMUN/DNVi+F21fPS4fE0GRVRL2dO3xsLI YywkVvRlll+GUGP2XF+Q597D76Twu0VeCHB7mJ0SRTDmucc4M4Y/tnUDFibo9y/35jAa a+Ag== X-Gm-Message-State: AKwxyte9I5yD5Cj0RBLz6C+8hOtB10p4mBv38GC2hZPM3TO8XUBJnHOe QNc8GmvsR03/ajtRaClY8oOaG6BvJu8= X-Google-Smtp-Source: AH8x226wJmz9TnQbSA6PsTvR0+dmfIdvV5q+uKOROJ9OzOA+iPfnxzzpYzNJ/k3b9U5rbTMlKCWV5A== X-Received: by 10.99.129.199 with SMTP id t190mr13641508pgd.120.1517253266114; Mon, 29 Jan 2018 11:14:26 -0800 (PST) From: Zihan Yang To: qemu-devel@nongnu.org Date: Tue, 30 Jan 2018 03:13:41 +0800 Message-Id: <1517253224-14361-2-git-send-email-whois.zihan.yang@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1517253224-14361-1-git-send-email-whois.zihan.yang@gmail.com> References: <1517253224-14361-1-git-send-email-whois.zihan.yang@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c00::241 Subject: [Qemu-devel] [RFC 1/4] qemu-socket: Allow custom socket option in socket_listen X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Paolo Bonzini , Gerd Hoffmann , Zihan Yang , Michael Roth Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Currently, socket_listen does not allow caller to set custom socket options, which is inconvenient when the caller wants a non-blocking socket or wants to set TCP_NODELAY. Therefore, two new structs are added and an extra parameter is provided to socket_listen. Existing functions are unaffected by providing a NULL pointer. Signed-off-by: Zihan Yang --- include/qemu/sockets.h | 17 +++++++++++- io/channel-socket.c | 2 +- qga/channel-posix.c | 2 +- util/qemu-sockets.c | 74 ++++++++++++++++++++++++++++++++++++++++++----= ---- 4 files changed, 81 insertions(+), 14 deletions(-) diff --git a/include/qemu/sockets.h b/include/qemu/sockets.h index 8889bcb..ab06943 100644 --- a/include/qemu/sockets.h +++ b/include/qemu/sockets.h @@ -11,6 +11,21 @@ int inet_aton(const char *cp, struct in_addr *ia); =20 #include "qapi-types.h" =20 +struct QemuSocketOption { + int level; + int optname; + void *optval; + socklen_t optlen; + struct QemuSocketOption *next; +}; +typedef struct QemuSocketOption QemuSocketOption; + +struct QemuSocketConfig { + bool nonblocking; + QemuSocketOption *options; +}; +typedef struct QemuSocketConfig QemuSocketConfig; + /* misc helpers */ int qemu_socket(int domain, int type, int protocol); int qemu_accept(int s, struct sockaddr *addr, socklen_t *addrlen); @@ -40,7 +55,7 @@ int unix_connect(const char *path, Error **errp); =20 SocketAddress *socket_parse(const char *str, Error **errp); int socket_connect(SocketAddress *addr, Error **errp); -int socket_listen(SocketAddress *addr, Error **errp); +int socket_listen(SocketAddress *addr, Error **errp, QemuSocketConfig *sco= nf); void socket_listen_cleanup(int fd, Error **errp); int socket_dgram(SocketAddress *remote, SocketAddress *local, Error **errp= ); =20 diff --git a/io/channel-socket.c b/io/channel-socket.c index 563e297..9942cf0 100644 --- a/io/channel-socket.c +++ b/io/channel-socket.c @@ -198,7 +198,7 @@ int qio_channel_socket_listen_sync(QIOChannelSocket *io= c, int fd; =20 trace_qio_channel_socket_listen_sync(ioc, addr); - fd =3D socket_listen(addr, errp); + fd =3D socket_listen(addr, errp, NULL); if (fd < 0) { trace_qio_channel_socket_listen_fail(ioc); return -1; diff --git a/qga/channel-posix.c b/qga/channel-posix.c index b812bf4..16c8524 100644 --- a/qga/channel-posix.c +++ b/qga/channel-posix.c @@ -215,7 +215,7 @@ static gboolean ga_channel_open(GAChannel *c, const gch= ar *path, return false; } =20 - fd =3D socket_listen(addr, &local_err); + fd =3D socket_listen(addr, &local_err, NULL); qapi_free_SocketAddress(addr); if (local_err !=3D NULL) { g_critical("%s", error_get_pretty(local_err)); diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c index d6a1e17..b171f23 100644 --- a/util/qemu-sockets.c +++ b/util/qemu-sockets.c @@ -43,7 +43,6 @@ # define AI_NUMERICSERV 0 #endif =20 - static int inet_getport(struct addrinfo *e) { struct sockaddr_in *i4; @@ -196,9 +195,40 @@ static int try_bind(int socket, InetSocketAddress *sad= dr, struct addrinfo *e) #endif } =20 +static int parse_socket_options(int fd, + Error **errp, + QemuSocketConfig *sconf) +{ + QemuSocketOption *sopt; + + if(!sconf) { + /* No extra socket options are defined */ + return fd; + } + + if(sconf->nonblocking) { + qemu_set_nonblock(fd); + }=20 + + for(sopt =3D sconf->options; sopt; sopt =3D sopt->next) { + if(sopt->level < IPPROTO_IP || sopt->optname < SO_DEBUG ||=20 + !sopt->optval || sopt->optlen <=3D 0) { + error_setg(errp, "Invalid socket option:\n" + "level=3D%d, optname=3D%d, optval=3D%p, optle= n=3D%d\n", + sopt->level, sopt->optname, sopt->optval, sopt->optlen= ); + return -1; + } + qemu_setsockopt(fd, sopt->level, sopt->optname,=20 + sopt->optval, sopt->optlen); + } + + return fd; +} + static int inet_listen_saddr(InetSocketAddress *saddr, int port_offset, - Error **errp) + Error **errp, + QemuSocketConfig *sconf) { struct addrinfo ai,*res,*e; char port[33]; @@ -287,6 +317,11 @@ static int inet_listen_saddr(InetSocketAddress *saddr, } socket_created =3D true; =20 + if(parse_socket_options(slisten, errp, sconf) < 0) { + error_setg_errno(errp, errno, "Failed to set socket option= s"); + goto listen_failed; + } + rc =3D try_bind(slisten, saddr, e); if (rc < 0) { if (errno !=3D EADDRINUSE) { @@ -701,7 +736,8 @@ static int vsock_connect_saddr(VsockSocketAddress *vadd= r, Error **errp) } =20 static int vsock_listen_saddr(VsockSocketAddress *vaddr, - Error **errp) + Error **errp, + QemuSocketConfig *sconf) { struct sockaddr_vm svm; int slisten; @@ -716,6 +752,12 @@ static int vsock_listen_saddr(VsockSocketAddress *vadd= r, return -1; } =20 + if(parse_socket_options(slisten, errp, sconf) < 0) { + error_setg_errno(errp, errno, "Failed to set socket options"); + closesocket(slisten); + return -1; + } + if (bind(slisten, (const struct sockaddr *)&svm, sizeof(svm)) !=3D 0) { error_setg_errno(errp, errno, "Failed to bind socket"); closesocket(slisten); @@ -763,7 +805,8 @@ static int vsock_connect_saddr(VsockSocketAddress *vadd= r, Error **errp) } =20 static int vsock_listen_saddr(VsockSocketAddress *vaddr, - Error **errp) + Error **errp, + QemuSocketConfig *sconf) { vsock_unsupported(errp); return -1; @@ -780,7 +823,8 @@ static int vsock_parse(VsockSocketAddress *addr, const = char *str, #ifndef _WIN32 =20 static int unix_listen_saddr(UnixSocketAddress *saddr, - Error **errp) + Error **errp, + QemuSocketConfig *sconf) { struct sockaddr_un un; int sock, fd; @@ -793,6 +837,12 @@ static int unix_listen_saddr(UnixSocketAddress *saddr, return -1; } =20 + if(parse_socket_options(sock, errp, sconf) < 0) { + error_setg_errno(errp, errno, "Failed to set socket option"); + closesocket(sock); + return -1; + } + if (saddr->path && saddr->path[0]) { path =3D saddr->path; } else { @@ -904,7 +954,8 @@ static int unix_connect_saddr(UnixSocketAddress *saddr,= Error **errp) #else =20 static int unix_listen_saddr(UnixSocketAddress *saddr, - Error **errp) + Error **errp, + QemuSocketConfig *sconf) { error_setg(errp, "unix sockets are not available on windows"); errno =3D ENOTSUP; @@ -940,7 +991,7 @@ int unix_listen(const char *str, Error **errp) saddr->path =3D g_strdup(str); } =20 - sock =3D unix_listen_saddr(saddr, errp); + sock =3D unix_listen_saddr(saddr, errp, NULL); =20 qapi_free_UnixSocketAddress(saddr); return sock; @@ -1025,17 +1076,18 @@ int socket_connect(SocketAddress *addr, Error **err= p) return fd; } =20 -int socket_listen(SocketAddress *addr, Error **errp) +int socket_listen(SocketAddress *addr, Error **errp, + QemuSocketConfig *sconf) { int fd; =20 switch (addr->type) { case SOCKET_ADDRESS_TYPE_INET: - fd =3D inet_listen_saddr(&addr->u.inet, 0, errp); + fd =3D inet_listen_saddr(&addr->u.inet, 0, errp, sconf); break; =20 case SOCKET_ADDRESS_TYPE_UNIX: - fd =3D unix_listen_saddr(&addr->u.q_unix, errp); + fd =3D unix_listen_saddr(&addr->u.q_unix, errp, sconf); break; =20 case SOCKET_ADDRESS_TYPE_FD: @@ -1043,7 +1095,7 @@ int socket_listen(SocketAddress *addr, Error **errp) break; =20 case SOCKET_ADDRESS_TYPE_VSOCK: - fd =3D vsock_listen_saddr(&addr->u.vsock, errp); + fd =3D vsock_listen_saddr(&addr->u.vsock, errp, sconf); break; =20 default: --=20 2.7.4 From nobody Mon Apr 29 19:37:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1517253609591643.3552591751463; Mon, 29 Jan 2018 11:20:09 -0800 (PST) Received: from localhost ([::1]:60091 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1egEyO-0001Mm-Og for importer@patchew.org; Mon, 29 Jan 2018 14:20:08 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46393) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1egEt5-0005zS-Ck for qemu-devel@nongnu.org; Mon, 29 Jan 2018 14:14:46 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1egEt0-000075-Cr for qemu-devel@nongnu.org; Mon, 29 Jan 2018 14:14:39 -0500 Received: from mail-pf0-x243.google.com ([2607:f8b0:400e:c00::243]:45192) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1egEt0-00006N-43; Mon, 29 Jan 2018 14:14:34 -0500 Received: by mail-pf0-x243.google.com with SMTP id a88so6229743pfe.12; Mon, 29 Jan 2018 11:14:34 -0800 (PST) Received: from fma-X550VB.lan ([218.193.183.120]) by smtp.gmail.com with ESMTPSA id d8sm1135316pfh.93.2018.01.29.11.14.26 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 29 Jan 2018 11:14:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=f8cohletBYW/slUcY63lh85rKmWToHIiI3f2U+FMyaI=; b=RHSwJw0knXwM8q/ZrW5sgqKL/wkVHVBUgqHOIGRp6NdD6MGSTcuq9d25JqcNZkLIuy 9z3Q/gnm3srSAbfXPm8pKlLBpQGVJxzl78DgP9KYpTQYgxbDVb1r1iV+GHMXoPYnBmLg 9VA/Lwi+uhMUPUwVMWxwjWKuGe1qPNq1mnF2NTSk8t+uqtaynGwXfRd4Ua4d+MM9RXQW l3SFo2eO3LZPCsiyjop9JLxCq7tuL1+w7hwcUmmE7ba8xYO0Fiml5kttR9U2R0wyZRDX UwllXNmaZ9TyfRbEEULZWlbSQRtI+HdeiKfpCYGJYARddknkCHGCiAeaoFoA513RbuYD TctQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=f8cohletBYW/slUcY63lh85rKmWToHIiI3f2U+FMyaI=; b=pVRQp/j+OmRUEK2E4k4By4dLfSjuonyT07fCcx6q8O04neYXpuvrSeD9J2w0aQUztn kdPCr5oJhjRHEFV4TrnbKbqfwSaPewuvCyg4QhOmwDoKhousx2kEcid6rXmVBeIOiOq+ dE12NXGCS2Fi3zOFwTlfwon+CVL4CeGRBiYw3xPL7MpkIYndX9ONUGVdpaAl9nY2hBvT t/NN2+Mv2hRh2NR8Mz31Kc+Hncqd/9F83PJPEoioBdikHP32I1AwpLqE/YoVAaOfHw5+ J1F8WGycMF0o/VJAz1Z302NJHaq1NCgP2CBEo8wQ92+7WbtISYqTO2u5NHRgnqequ8wH WG8w== X-Gm-Message-State: AKwxytfBNYK4wair1jTg92GiSpWsUgm5O9+AGxDy0BYSaZ74SKl4AMZB wvdVBCKjsDU7KOn/0hrVK9auBfS2RuE= X-Google-Smtp-Source: AH8x225+mGiifK1tDexjUXn+KFJCChFkEJtrP+sC3udy6rK5pvIwg5aQGJLBfp4f33NPau7+elAzlg== X-Received: by 10.99.116.22 with SMTP id p22mr13953749pgc.4.1517253272911; Mon, 29 Jan 2018 11:14:32 -0800 (PST) From: Zihan Yang To: qemu-devel@nongnu.org Date: Tue, 30 Jan 2018 03:13:42 +0800 Message-Id: <1517253224-14361-3-git-send-email-whois.zihan.yang@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1517253224-14361-1-git-send-email-whois.zihan.yang@gmail.com> References: <1517253224-14361-1-git-send-email-whois.zihan.yang@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c00::243 Subject: [Qemu-devel] [RFC 2/4] qemu-socket: Allow custom socket options in socket_connect X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , "open list:Sheepdog" , Zihan Yang , Hitoshi Mitake , Jeff Cody , "Richard W.M. Jones" , Max Reitz , "open list:Sheepdog" , Gerd Hoffmann , Paolo Bonzini , Liu Yuan Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Currently, socket_connect doesn't allow custom socket options, which is inconvenient when the caller wants a different kind of socket from that the socket_connect provides. This patch allows custom config in socket_connect by providing an extra parameter. Existing functions can just pass a NULL pointer. Note the caller who wants a non-blocking socket should always check the errno after socket_connect returns to see if the connection is really established or still inprogress. Signed-off-by: Zihan Yang --- block/sheepdog.c | 2 +- block/ssh.c | 2 +- include/qemu/sockets.h | 5 +-- io/channel-socket.c | 2 +- util/qemu-sockets.c | 82 ++++++++++++++++++++++++++++++++++++++++------= ---- 5 files changed, 72 insertions(+), 21 deletions(-) diff --git a/block/sheepdog.c b/block/sheepdog.c index f684477..f96e091 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -591,7 +591,7 @@ static int connect_to_sdog(BDRVSheepdogState *s, Error = **errp) { int fd; =20 - fd =3D socket_connect(s->addr, errp); + fd =3D socket_connect(s->addr, errp, NULL); =20 if (s->addr->type =3D=3D SOCKET_ADDRESS_TYPE_INET && fd >=3D 0) { int ret =3D socket_set_nodelay(fd); diff --git a/block/ssh.c b/block/ssh.c index b049a16..c9d00c8 100644 --- a/block/ssh.c +++ b/block/ssh.c @@ -678,7 +678,7 @@ static int connect_to_ssh(BDRVSSHState *s, QDict *optio= ns, } =20 /* Open the socket and connect. */ - s->sock =3D inet_connect_saddr(s->inet, errp); + s->sock =3D inet_connect_saddr(s->inet, errp, NULL); if (s->sock < 0) { ret =3D -EIO; goto err; diff --git a/include/qemu/sockets.h b/include/qemu/sockets.h index ab06943..13d6716 100644 --- a/include/qemu/sockets.h +++ b/include/qemu/sockets.h @@ -46,7 +46,8 @@ int inet_ai_family_from_address(InetSocketAddress *addr, Error **errp); int inet_parse(InetSocketAddress *addr, const char *str, Error **errp); int inet_connect(const char *str, Error **errp); -int inet_connect_saddr(InetSocketAddress *saddr, Error **errp); +int inet_connect_saddr(InetSocketAddress *saddr, Error **errp, + QemuSocketConfig *sconf); =20 NetworkAddressFamily inet_netfamily(int family); =20 @@ -54,7 +55,7 @@ int unix_listen(const char *path, Error **errp); int unix_connect(const char *path, Error **errp); =20 SocketAddress *socket_parse(const char *str, Error **errp); -int socket_connect(SocketAddress *addr, Error **errp); +int socket_connect(SocketAddress *addr, Error **errp, QemuSocketConfig *sc= onf); int socket_listen(SocketAddress *addr, Error **errp, QemuSocketConfig *sco= nf); void socket_listen_cleanup(int fd, Error **errp); int socket_dgram(SocketAddress *remote, SocketAddress *local, Error **errp= ); diff --git a/io/channel-socket.c b/io/channel-socket.c index 9942cf0..f010a8e 100644 --- a/io/channel-socket.c +++ b/io/channel-socket.c @@ -140,7 +140,7 @@ int qio_channel_socket_connect_sync(QIOChannelSocket *i= oc, int fd; =20 trace_qio_channel_socket_connect_sync(ioc, addr); - fd =3D socket_connect(addr, errp); + fd =3D socket_connect(addr, errp, NULL); if (fd < 0) { trace_qio_channel_socket_connect_fail(ioc); return -1; diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c index b171f23..3a10206 100644 --- a/util/qemu-sockets.c +++ b/util/qemu-sockets.c @@ -372,9 +372,11 @@ listen_ok: ((rc) =3D=3D -EINPROGRESS) #endif =20 -static int inet_connect_addr(struct addrinfo *addr, Error **errp); +static int inet_connect_addr(struct addrinfo *addr, Error **errp, + QemuSocketConfig *sconf); =20 -static int inet_connect_addr(struct addrinfo *addr, Error **errp) +static int inet_connect_addr(struct addrinfo *addr, Error **errp, + QemuSocketConfig *sconf) { int sock, rc; =20 @@ -385,12 +387,26 @@ static int inet_connect_addr(struct addrinfo *addr, E= rror **errp) } socket_set_fast_reuse(sock); =20 + if(parse_socket_options(sock, errp, sconf) < 0) { + error_setg_errno(errp, errno, "Failed to set socket options"); + return -1; + } + /* connect to peer */ do { rc =3D 0; if (connect(sock, addr->ai_addr, addr->ai_addrlen) < 0) { rc =3D -errno; } + /* More judge for nonblocking socket, borrowed from net_socket_con= nect_init */ + if(sconf->nonblocking) { + if(rc =3D=3D -EWOULDBLOCK) + continue; + else if(rc =3D=3D -EINPROGRESS || + rc =3D=3D -EALREADY || + rc =3D=3D -EINVAL) + return sock; /* caller needs tp judge errno */ + } } while (rc =3D=3D -EINTR); =20 if (rc < 0) { @@ -459,7 +475,8 @@ static struct addrinfo *inet_parse_connect_saddr(InetSo= cketAddress *saddr, * * Returns: -1 on error, file descriptor on success. */ -int inet_connect_saddr(InetSocketAddress *saddr, Error **errp) +int inet_connect_saddr(InetSocketAddress *saddr, Error **errp, + QemuSocketConfig *sconf) { Error *local_err =3D NULL; struct addrinfo *res, *e; @@ -473,7 +490,7 @@ int inet_connect_saddr(InetSocketAddress *saddr, Error = **errp) for (e =3D res; e !=3D NULL; e =3D e->ai_next) { error_free(local_err); local_err =3D NULL; - sock =3D inet_connect_addr(e, &local_err); + sock =3D inet_connect_addr(e, &local_err, sconf); if (sock >=3D 0) { break; } @@ -661,7 +678,7 @@ int inet_connect(const char *str, Error **errp) InetSocketAddress *addr =3D g_new(InetSocketAddress, 1); =20 if (!inet_parse(addr, str, errp)) { - sock =3D inet_connect_saddr(addr, errp); + sock =3D inet_connect_saddr(addr, errp, NULL); } qapi_free_InetSocketAddress(addr); return sock; @@ -694,7 +711,8 @@ static bool vsock_parse_vaddr_to_sockaddr(const VsockSo= cketAddress *vaddr, return true; } =20 -static int vsock_connect_addr(const struct sockaddr_vm *svm, Error **errp) +static int vsock_connect_addr(const struct sockaddr_vm *svm, Error **errp, + QemuSocketConfig *sconf) { int sock, rc; =20 @@ -704,12 +722,25 @@ static int vsock_connect_addr(const struct sockaddr_v= m *svm, Error **errp) return -1; } =20 + if(parse_socket_options(sock, errp, sconf) < 0) { + error_setg_errno(errp, errno, "Failed to set socket option"); + return -1; + } + /* connect to peer */ do { rc =3D 0; if (connect(sock, (const struct sockaddr *)svm, sizeof(*svm)) < 0)= { rc =3D -errno; } + if(sconf->nonblocking) { + if(rc =3D=3D -EWOULDBLOCK) + continue; + else if(rc =3D=3D -EINPROGRESS || + rc =3D=3D -EALREADY || + rc =3D=3D -EINVAL) + return sock; + } } while (rc =3D=3D -EINTR); =20 if (rc < 0) { @@ -721,7 +752,8 @@ static int vsock_connect_addr(const struct sockaddr_vm = *svm, Error **errp) return sock; } =20 -static int vsock_connect_saddr(VsockSocketAddress *vaddr, Error **errp) +static int vsock_connect_saddr(VsockSocketAddress *vaddr, Error **errp,\ + QemuSocketConfig *sconf) { struct sockaddr_vm svm; int sock =3D -1; @@ -730,7 +762,7 @@ static int vsock_connect_saddr(VsockSocketAddress *vadd= r, Error **errp) return -1; } =20 - sock =3D vsock_connect_addr(&svm, errp); + sock =3D vsock_connect_addr(&svm, errp, sconf); =20 return sock; } @@ -798,7 +830,8 @@ static void vsock_unsupported(Error **errp) error_setg(errp, "socket family AF_VSOCK unsupported"); } =20 -static int vsock_connect_saddr(VsockSocketAddress *vaddr, Error **errp) +static int vsock_connect_saddr(VsockSocketAddress *vaddr, Error **errp, + QemuSocketConfig *sconf) { vsock_unsupported(errp); return -1; @@ -903,7 +936,8 @@ err: return -1; } =20 -static int unix_connect_saddr(UnixSocketAddress *saddr, Error **errp) +static int unix_connect_saddr(UnixSocketAddress *saddr, Error **errp, + QemuSocketConfig *sconf) { struct sockaddr_un un; int sock, rc; @@ -919,6 +953,11 @@ static int unix_connect_saddr(UnixSocketAddress *saddr= , Error **errp) return -1; } =20 + if(parse_socket_options(sock, errp, sconf) < 0) { + error_setg_errno(errp, errno, "Failed to set socket options"); + return -1; + } + if (strlen(saddr->path) > sizeof(un.sun_path)) { error_setg(errp, "UNIX socket path '%s' is too long", saddr->path); error_append_hint(errp, "Path must be less than %zu bytes\n", @@ -936,6 +975,15 @@ static int unix_connect_saddr(UnixSocketAddress *saddr= , Error **errp) if (connect(sock, (struct sockaddr *) &un, sizeof(un)) < 0) { rc =3D -errno; } + /* More judge for nonblocking socket, borrowed from net_socket_con= nect_init */ + if(sconf->nonblocking) { + if(rc =3D=3D -EWOULDBLOCK) + continue; + else if(rc =3D=3D -EINPROGRESS || + rc =3D=3D -EALREADY || + rc =3D=3D -EINVAL) + break; + } } while (rc =3D=3D -EINTR); =20 if (rc < 0) { @@ -962,7 +1010,8 @@ static int unix_listen_saddr(UnixSocketAddress *saddr, return -1; } =20 -static int unix_connect_saddr(UnixSocketAddress *saddr, Error **errp) +static int unix_connect_saddr(UnixSocketAddress *saddr, Error **errp, + QemuSocketConfig *sconf) { error_setg(errp, "unix sockets are not available on windows"); errno =3D ENOTSUP; @@ -1004,7 +1053,7 @@ int unix_connect(const char *path, Error **errp) =20 saddr =3D g_new0(UnixSocketAddress, 1); saddr->path =3D g_strdup(path); - sock =3D unix_connect_saddr(saddr, errp); + sock =3D unix_connect_saddr(saddr, errp, NULL); qapi_free_UnixSocketAddress(saddr); return sock; } @@ -1049,17 +1098,18 @@ fail: return NULL; } =20 -int socket_connect(SocketAddress *addr, Error **errp) +int socket_connect(SocketAddress *addr, Error **errp, + QemuSocketConfig *sconf) { int fd; =20 switch (addr->type) { case SOCKET_ADDRESS_TYPE_INET: - fd =3D inet_connect_saddr(&addr->u.inet, errp); + fd =3D inet_connect_saddr(&addr->u.inet, errp, sconf); break; =20 case SOCKET_ADDRESS_TYPE_UNIX: - fd =3D unix_connect_saddr(&addr->u.q_unix, errp); + fd =3D unix_connect_saddr(&addr->u.q_unix, errp, sconf); break; =20 case SOCKET_ADDRESS_TYPE_FD: @@ -1067,7 +1117,7 @@ int socket_connect(SocketAddress *addr, Error **errp) break; =20 case SOCKET_ADDRESS_TYPE_VSOCK: - fd =3D vsock_connect_saddr(&addr->u.vsock, errp); + fd =3D vsock_connect_saddr(&addr->u.vsock, errp, sconf); break; =20 default: --=20 2.7.4 From nobody Mon Apr 29 19:37:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1517253524104401.98724944767775; Mon, 29 Jan 2018 11:18:44 -0800 (PST) Received: from localhost ([::1]:60031 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1egEx1-0000cu-Cf for importer@patchew.org; Mon, 29 Jan 2018 14:18:43 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46394) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1egEt5-0005zV-DK for qemu-devel@nongnu.org; Mon, 29 Jan 2018 14:14:40 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1egEt3-000090-DH for qemu-devel@nongnu.org; Mon, 29 Jan 2018 14:14:39 -0500 Received: from mail-pf0-x242.google.com ([2607:f8b0:400e:c00::242]:40342) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1egEt3-00008c-7c for qemu-devel@nongnu.org; Mon, 29 Jan 2018 14:14:37 -0500 Received: by mail-pf0-x242.google.com with SMTP id i66so6229677pfd.7 for ; Mon, 29 Jan 2018 11:14:37 -0800 (PST) Received: from fma-X550VB.lan ([218.193.183.120]) by smtp.gmail.com with ESMTPSA id d8sm1135316pfh.93.2018.01.29.11.14.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 29 Jan 2018 11:14:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=uQ6XrePX60GcKVmhzruydcCWLfoN6v0hkCGxzST3HFA=; b=jDBmV0JNvUhJxbvioL/JgtU/Upls1U7GSrpTbbTgBCjJiTCXZxjLIZoM0iV/62RZYl iMTC1u7+s2V/MBwE3OdUQBeISRIexSQXl8SxTExjLm8TotgdyOl5EQltEI8E6cNLoEx3 ar8ekHVntCDZfS2qlCFsRZE89tYt/l00uIX7j38N1qWh5VpwGeAcBkiZCo6WGbrEvC2r y23U8SOiFX7Il6hFcIxS3veFSo2OrnuIu9U8yB5sAcDUgZfVTmEoNyc0zBFJFMnluQ9b PRi4CCoK/EK469hLa6OwNaS3KKBTzHMJNDf6Stiz0IhBzR7Qw7ljwKMGBBlbwYKS3/39 cr7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=uQ6XrePX60GcKVmhzruydcCWLfoN6v0hkCGxzST3HFA=; b=AOR0UwJhBuLESgb0HKQlHGXdjEroQ156K5jr830vBuNy3nDSHX87V8INtDibyT0EyP lvszpxcYzXbOd3PHiOxcbIr+qi+J7FCymDRfE11AbrrMIE+sA7+BeJWaEE9LkClnhPuH 2pvm3xak9tq05bX5yB8J2ZLWOjeH5NIEeIFD+qilZbwWGlnkaOCRYu0778hLvaab08vf GUl0QRTD1Of/OpDo53zSo+7suvJiTCbgYXD4M0D1eOS7zL7AUr+QqEcaSkAaJkaSsTct ALp05y7YUeVRIHZNtYgcHoiQatGMXWsyXOF8B18PWzJvmG1LLiQgNDV+iMzn9vr9Df8l At2g== X-Gm-Message-State: AKwxyte1oApbFm9FA1aLJwZJS5kKIy0N3kK2ZeJRegzrbjiAIciSVxr6 4HqCZgWQvQYnX/bef+YPGm8tJOB8 X-Google-Smtp-Source: AH8x225b6xvR1fcO4ICoaHqvzjNAxfStkG4f9PtVlWRX2kZvqJMMHt3J7DIvU03MwMALeZaWEkNepg== X-Received: by 10.98.220.195 with SMTP id c64mr27499897pfl.47.1517253276189; Mon, 29 Jan 2018 11:14:36 -0800 (PST) From: Zihan Yang To: qemu-devel@nongnu.org Date: Tue, 30 Jan 2018 03:13:43 +0800 Message-Id: <1517253224-14361-4-git-send-email-whois.zihan.yang@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1517253224-14361-1-git-send-email-whois.zihan.yang@gmail.com> References: <1517253224-14361-1-git-send-email-whois.zihan.yang@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c00::242 Subject: [Qemu-devel] [RFC 3/4] net/socket: change net_socket_listen_init to use functions in include/qemu/sockets.h X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jason Wang , Zihan Yang Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Some functions in net/socket.c still uses bind/connect/listen directly. Change it to use functions in include/qemu/sockets.h Signed-off-by: Zihan Yang --- net/socket.c | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/net/socket.c b/net/socket.c index 6917fbc..7b07223 100644 --- a/net/socket.c +++ b/net/socket.c @@ -494,35 +494,35 @@ static int net_socket_listen_init(NetClientState *pee= r, { NetClientState *nc; NetSocketState *s; - struct sockaddr_in saddr; - int fd, ret; + SocketAddress *saddr; + QemuSocketConfig *sconf; + Error *local_err =3D NULL; + int fd; =20 - if (parse_host_port(&saddr, host_str, errp) < 0) { + saddr =3D socket_parse(host_str, &local_err); + if(NULL !=3D local_err) { + error_setg_errno(errp, errno, "socket_parse failed"); return -1; } =20 - fd =3D qemu_socket(PF_INET, SOCK_STREAM, 0); - if (fd < 0) { - error_setg_errno(errp, errno, "can't create stream socket"); + /* Manually prepare config because socket_listen ++ * will not set O_NONBLOCKING */ + sconf =3D g_new0(QemuSocketConfig, 1); + if(NULL =3D=3D sconf) { + qapi_free_SocketAddress(saddr); + error_setg_errno(errp, errno, "out of memory"); return -1; } - qemu_set_nonblock(fd); + sconf->nonblocking =3D true; + sconf->options =3D NULL; =20 - socket_set_fast_reuse(fd); - - ret =3D bind(fd, (struct sockaddr *)&saddr, sizeof(saddr)); - if (ret < 0) { - error_setg_errno(errp, errno, "can't bind ip=3D%s to socket", - inet_ntoa(saddr.sin_addr)); - closesocket(fd); - return -1; - } - ret =3D listen(fd, 0); - if (ret < 0) { - error_setg_errno(errp, errno, "can't listen on socket"); - closesocket(fd); + fd =3D socket_listen(saddr, errp, sconf); + if(fd < 0) { + error_setg_errno(errp, errno, "can't listen on address"); + qapi_free_SocketAddress(saddr); return -1; } + g_free(sconf); =20 nc =3D qemu_new_net_client(&net_socket_info, peer, model, name); s =3D DO_UPCAST(NetSocketState, nc, nc); @@ -532,6 +532,7 @@ static int net_socket_listen_init(NetClientState *peer, net_socket_rs_init(&s->rs, net_socket_rs_finalize, false); =20 qemu_set_fd_handler(s->listen_fd, net_socket_accept, NULL, s); + qapi_free_SocketAddress(saddr); return 0; } =20 --=20 2.7.4 From nobody Mon Apr 29 19:37:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 151725341255457.56642369527481; Mon, 29 Jan 2018 11:16:52 -0800 (PST) Received: from localhost ([::1]:59849 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1egEvD-0007PM-N8 for importer@patchew.org; Mon, 29 Jan 2018 14:16:51 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46428) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1egEt7-000623-N9 for qemu-devel@nongnu.org; Mon, 29 Jan 2018 14:14:42 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1egEt6-0000B6-Ky for qemu-devel@nongnu.org; Mon, 29 Jan 2018 14:14:41 -0500 Received: from mail-pf0-x244.google.com ([2607:f8b0:400e:c00::244]:44585) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1egEt6-0000Ap-F4 for qemu-devel@nongnu.org; Mon, 29 Jan 2018 14:14:40 -0500 Received: by mail-pf0-x244.google.com with SMTP id 17so4786063pfw.11 for ; Mon, 29 Jan 2018 11:14:40 -0800 (PST) Received: from fma-X550VB.lan ([218.193.183.120]) by smtp.gmail.com with ESMTPSA id d8sm1135316pfh.93.2018.01.29.11.14.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 29 Jan 2018 11:14:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ktXFzzwzqqLUeihOSIOZsbvgHmy7Uu1QG6hv8+5wKY4=; b=MrGTYDZ4nVtMN1MmADwRbS/Jevt6LkLbjFQ7FuQwIiOSf0F3/z8S/N27JnpDJleIGH jGs9o80138/8SDEIR9TJmVqtm+4G63mWT5NJdiHCg8yV2LT1J6HvulPZjyIUhkV4G5WP 2wSLPsc8GcJ89g97c9yGGI9JW8jH3bAOriwqIrzY+hvd/NSqx+/NRM/sTfJngkmd3wKx vu1w5GYnJfba3LI2EQSdTWfQC7r2QWIhUSzNCvDTNxP8KQZQVICoLRe09X0ynDyW2SW6 6F7JmlRWzuUjlPa0tyOIAznoFoV7KsG+bG4862oKPQ4RBhT35qGFVoLh/VGb0qcivqSs M7Ag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ktXFzzwzqqLUeihOSIOZsbvgHmy7Uu1QG6hv8+5wKY4=; b=Zm5uQt/JIqx8iuDEQwMDSFvAAtXE27MaTiTm9Pu+016CtGIClqne0c8bce+b3JRS7d UjChgB5TaGJNIdXhGvm40J1s6VKnxWCggvT1u6b/6kKzSy4ZyxUuUL2n9OA1cj0Jt5aS B+oMTJR+W7fx5pa0JR92c6XVUkpNUtjgcXWsrldReoTbqGeDx/9pK9OlhpXI/S/EC2GQ iVb4U1mYyc2+9OaAENObXrtla+hBab+9wrZpO5ltxZ8t00eKeddiId7+mniWKIHLaVhP F5D6Ztp/LxbfK4AfwDeLliX/3YT6QnYUHKLR/Vca+s9BQjJiJvMP8SskKVNjTHyetzLZ ryAA== X-Gm-Message-State: AKwxytcQorEeXOxEtAEwapfCgo6is7HeKi+4k2ifmJKHNfFMNd/7Qkxn a+qkL8NhHLI2vczoUgMFKw2dqA8L X-Google-Smtp-Source: AH8x227z+DU6ariSIsA3VIYwxbbLxmMeccM6sJsLKeqhvHOdOpAAXkw0IsOz0ixtVrwgBhPaSU2PIg== X-Received: by 10.98.86.19 with SMTP id k19mr27638621pfb.71.1517253279291; Mon, 29 Jan 2018 11:14:39 -0800 (PST) From: Zihan Yang To: qemu-devel@nongnu.org Date: Tue, 30 Jan 2018 03:13:44 +0800 Message-Id: <1517253224-14361-5-git-send-email-whois.zihan.yang@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1517253224-14361-1-git-send-email-whois.zihan.yang@gmail.com> References: <1517253224-14361-1-git-send-email-whois.zihan.yang@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c00::244 Subject: [Qemu-devel] [RFC 4/4] net/socket: change net_socket_connect_init to use functions in sockets.h X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jason Wang , Zihan Yang Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 --- 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 *pe= er, Error **errp) { NetSocketState *s; - int fd, connected, ret; - struct sockaddr_in saddr; + int fd, connected; + SocketAddress *saddr; + QemuSocketConfig *sconf; + Error *local_err =3D NULL; =20 - if (parse_host_port(&saddr, host_str, errp) < 0) { + saddr =3D socket_parse(host_str, &local_err); + if(NULL !=3D local_err) { + error_setg_errno(errp, errno, "socket_parse failed"); return -1; } =20 - fd =3D 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 =3D g_new0(QemuSocketConfig, 1); + sconf->nonblocking =3D true; + sconf->options =3D NULL; =20 connected =3D 0; - for(;;) { - ret =3D connect(fd, (struct sockaddr *)&saddr, sizeof(saddr)); - if (ret < 0) { - if (errno =3D=3D EINTR || errno =3D=3D EWOULDBLOCK) { - /* continue */ - } else if (errno =3D=3D EINPROGRESS || - errno =3D=3D EALREADY || - errno =3D=3D EINVAL) { - break; - } else { - error_setg_errno(errp, errno, "can't connect socket"); - closesocket(fd); - return -1; - } - } else { - connected =3D 1; - break; - } + fd =3D 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 !=3D EINPROGRESS && errno !=3D EALREADY && errno !=3D = EINVAL) { + connected =3D 1; } + g_free(sconf); + s =3D net_socket_fd_init(peer, model, name, fd, connected, NULL, errp); if (!s) { return -1; } =20 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; } =20 --=20 2.7.4