From nobody Thu May 2 11:44:24 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.zoho.com; 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 1493194043514463.95408931495103; Wed, 26 Apr 2017 01:07:23 -0700 (PDT) Received: from localhost ([::1]:53470 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3Hyr-0007xg-Vt for importer@patchew.org; Wed, 26 Apr 2017 04:07:22 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45443) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3HxI-0006e0-42 for qemu-devel@nongnu.org; Wed, 26 Apr 2017 04:05:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d3HxB-0002wk-Vl for qemu-devel@nongnu.org; Wed, 26 Apr 2017 04:05:44 -0400 Received: from [59.151.112.132] (port=16366 helo=heian.cn.fujitsu.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3HxB-0002ta-Iu for qemu-devel@nongnu.org; Wed, 26 Apr 2017 04:05:37 -0400 Received: from unknown (HELO cn.fujitsu.com) ([10.167.33.5]) by heian.cn.fujitsu.com with ESMTP; 26 Apr 2017 16:05:26 +0800 Received: from G08CNEXCHPEKD02.g08.fujitsu.local (unknown [10.167.33.83]) by cn.fujitsu.com (Postfix) with ESMTP id 3EB8547E6342; Wed, 26 Apr 2017 16:05:25 +0800 (CST) Received: from maozy.g08.fujitsu.local (10.167.225.76) by G08CNEXCHPEKD02.g08.fujitsu.local (10.167.33.89) with Microsoft SMTP Server (TLS) id 14.3.319.2; Wed, 26 Apr 2017 16:05:25 +0800 X-IronPort-AV: E=Sophos;i="5.22,518,1449504000"; d="scan'208";a="18175349" From: Mao Zhongyi To: Date: Wed, 26 Apr 2017 16:04:15 +0800 Message-ID: <6824abf3c4e5b865de1799c302f60e8055c8d3dc.1493191677.git.maozy.fnst@cn.fujitsu.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: References: MIME-Version: 1.0 X-Originating-IP: [10.167.225.76] X-yoursite-MailScanner-ID: 3EB8547E6342.A09CC X-yoursite-MailScanner: Found to be clean X-yoursite-MailScanner-From: maozy.fnst@cn.fujitsu.com X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 59.151.112.132 Subject: [Qemu-devel] [PATCH v2 1/4] net/socket: Convert the non-blocking connection mechanism to QIOchannel 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: pbonzini@redhat.com, jasowang@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Currently, socket connection in net is realized by an old mechanism which is non-blocking. That old mechanism may cause net blocks on DNS lookups and QEmu has already replaced it with QIOchannel in many features, such as migration. Convert it to QIOchannel for net as well. CC: berrange@redhat.com, pbonzini@redhat.com, jasowang@redhat.com Signed-off-by: Mao Zhongyi --- The test steps like this: $ qemu-system-x86_64 -net nic -net socket,listen=3D:1234 ~/img/test.img $ qemu-system-x86_64 -net nic -net socket,connect=3D127.0.0.1:1234 ~/im= g/test.img No exception. net/socket.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/net/socket.c b/net/socket.c index b8c931e..52f9dce 100644 --- a/net/socket.c +++ b/net/socket.c @@ -33,6 +33,7 @@ #include "qemu/sockets.h" #include "qemu/iov.h" #include "qemu/main-loop.h" +#include "io/channel-socket.h" =20 typedef struct NetSocketState { NetClientState nc; @@ -525,16 +526,22 @@ typedef struct { char *name; } socket_connect_data; =20 -static void socket_connect_data_free(socket_connect_data *c) +static void socket_connect_data_free(void *opaque) { + socket_connect_data *c =3D opaque; + if (!c) { + return; + } + qapi_free_SocketAddress(c->saddr); g_free(c->model); g_free(c->name); g_free(c); } =20 -static void net_socket_connected(int fd, Error *err, void *opaque) +static void net_socket_connected(QIOTask *task, void *opaque) { + QIOChannelSocket *sioc =3D QIO_CHANNEL_SOCKET(qio_task_get_source(task= )); socket_connect_data *c =3D opaque; NetSocketState *s; char *addr_str =3D NULL; @@ -543,13 +550,13 @@ static void net_socket_connected(int fd, Error *err, = void *opaque) addr_str =3D socket_address_to_string(c->saddr, &local_error); if (addr_str =3D=3D NULL) { error_report_err(local_error); - closesocket(fd); + closesocket(sioc->fd); goto end; } =20 - s =3D net_socket_fd_init(c->peer, c->model, c->name, fd, true); + s =3D net_socket_fd_init(c->peer, c->model, c->name, sioc->fd, true); if (!s) { - closesocket(fd); + closesocket(sioc->fd); goto end; } =20 @@ -567,7 +574,7 @@ static int net_socket_connect_init(NetClientState *peer, const char *host_str) { socket_connect_data *c =3D g_new0(socket_connect_data, 1); - int fd =3D -1; + QIOChannelSocket *sioc; Error *local_error =3D NULL; =20 c->peer =3D peer; @@ -578,11 +585,12 @@ static int net_socket_connect_init(NetClientState *pe= er, goto err; } =20 - fd =3D socket_connect(c->saddr, net_socket_connected, c, &local_error); - if (fd < 0) { - goto err; - } - + sioc =3D qio_channel_socket_new(); + qio_channel_socket_connect_async(sioc, + c->saddr, + net_socket_connected, + c, + NULL); return 0; =20 err: --=20 2.9.3 From nobody Thu May 2 11:44:24 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.zoho.com; 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 1493194131508471.5546674874083; Wed, 26 Apr 2017 01:08:51 -0700 (PDT) Received: from localhost ([::1]:53473 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3I0H-0000su-3b for importer@patchew.org; Wed, 26 Apr 2017 04:08:49 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45439) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3HxH-0006ds-UR for qemu-devel@nongnu.org; Wed, 26 Apr 2017 04:05:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d3HxD-0002xP-Cj for qemu-devel@nongnu.org; Wed, 26 Apr 2017 04:05:43 -0400 Received: from [59.151.112.132] (port=16366 helo=heian.cn.fujitsu.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3HxC-0002ta-NE for qemu-devel@nongnu.org; Wed, 26 Apr 2017 04:05:39 -0400 Received: from unknown (HELO cn.fujitsu.com) ([10.167.33.5]) by heian.cn.fujitsu.com with ESMTP; 26 Apr 2017 16:05:26 +0800 Received: from G08CNEXCHPEKD02.g08.fujitsu.local (unknown [10.167.33.83]) by cn.fujitsu.com (Postfix) with ESMTP id 77C1E47E6344; Wed, 26 Apr 2017 16:05:26 +0800 (CST) Received: from maozy.g08.fujitsu.local (10.167.225.76) by G08CNEXCHPEKD02.g08.fujitsu.local (10.167.33.89) with Microsoft SMTP Server (TLS) id 14.3.319.2; Wed, 26 Apr 2017 16:05:26 +0800 X-IronPort-AV: E=Sophos;i="5.22,518,1449504000"; d="scan'208";a="18175350" From: Mao Zhongyi To: Date: Wed, 26 Apr 2017 16:04:16 +0800 Message-ID: <6fcd733f02438a401c902e1a3b62564cb8c5c23a.1493191677.git.maozy.fnst@cn.fujitsu.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: References: MIME-Version: 1.0 X-Originating-IP: [10.167.225.76] X-yoursite-MailScanner-ID: 77C1E47E6344.A387A X-yoursite-MailScanner: Found to be clean X-yoursite-MailScanner-From: maozy.fnst@cn.fujitsu.com X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 59.151.112.132 Subject: [Qemu-devel] [PATCH v2 2/4] net/socket: Improve -net socket error reporting 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: pbonzini@redhat.com, jasowang@redhat.com, kraxel@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When -net socket fails, it first reports a specific error, then a generic one, like this: $ qemu-system-x86_64 -net socket, qemu-system-x86_64: -net socket: exactly one of fd=3D, listen=3D, conne= ct=3D, mcast=3D or udp=3D is required qemu-system-x86_64: -net socket: Device 'socket' could not be initializ= ed Convert net_init_socket() to Error to get rid of the unwanted second error message. CC: berrange@redhat.com, kraxel@redhat.com, pbonzini@redhat.com, jasowang@r= edhat.com, armbru@redhat.com Signed-off-by: Mao Zhongyi --- After the repair, the effect is as follows: $ qemu-system-x86_64 -net socket, qemu-system-x86_64: -net socket: exactly one of fd=3D, listen=3D, conne= ct=3D, mcast=3D or udp=3D is required include/qemu/sockets.h | 2 +- net/socket.c | 57 +++++++++++++++++++++++++++++-----------------= ---- util/qemu-sockets.c | 2 +- 3 files changed, 35 insertions(+), 26 deletions(-) diff --git a/include/qemu/sockets.h b/include/qemu/sockets.h index af28532..528b802 100644 --- a/include/qemu/sockets.h +++ b/include/qemu/sockets.h @@ -118,7 +118,7 @@ SocketAddress *socket_remote_address(int fd, Error **er= rp); * * Returns: the socket address in string format, or NULL on error */ -char *socket_address_to_string(struct SocketAddress *addr, Error **errp); +char *socket_address_to_string(struct SocketAddress *addr); =20 /** * socket_address_crumple: diff --git a/net/socket.c b/net/socket.c index 52f9dce..b0decbe 100644 --- a/net/socket.c +++ b/net/socket.c @@ -486,7 +486,8 @@ static void net_socket_accept(void *opaque) static int net_socket_listen_init(NetClientState *peer, const char *model, const char *name, - const char *host_str) + const char *host_str, + Error **errp) { NetClientState *nc; NetSocketState *s; @@ -496,14 +497,14 @@ static int net_socket_listen_init(NetClientState *pee= r, =20 saddr =3D socket_parse(host_str, &local_error); if (saddr =3D=3D NULL) { - error_report_err(local_error); + error_propagate(errp, local_error); return -1; } =20 ret =3D socket_listen(saddr, &local_error); if (ret < 0) { qapi_free_SocketAddress(saddr); - error_report_err(local_error); + error_propagate(errp, local_error); return -1; } =20 @@ -545,11 +546,9 @@ static void net_socket_connected(QIOTask *task, void *= opaque) socket_connect_data *c =3D opaque; NetSocketState *s; char *addr_str =3D NULL; - Error *local_error =3D NULL; =20 - addr_str =3D socket_address_to_string(c->saddr, &local_error); + addr_str =3D socket_address_to_string(c->saddr); if (addr_str =3D=3D NULL) { - error_report_err(local_error); closesocket(sioc->fd); goto end; } @@ -571,7 +570,8 @@ end: static int net_socket_connect_init(NetClientState *peer, const char *model, const char *name, - const char *host_str) + const char *host_str, + Error **errp) { socket_connect_data *c =3D g_new0(socket_connect_data, 1); QIOChannelSocket *sioc; @@ -594,7 +594,7 @@ static int net_socket_connect_init(NetClientState *peer, return 0; =20 err: - error_report_err(local_error); + error_propagate(errp, local_error); socket_connect_data_free(c); return -1; } @@ -603,7 +603,8 @@ static int net_socket_mcast_init(NetClientState *peer, const char *model, const char *name, const char *host_str, - const char *localaddr_str) + const char *localaddr_str, + Error **errp) { NetSocketState *s; int fd; @@ -614,8 +615,11 @@ static int net_socket_mcast_init(NetClientState *peer, return -1; =20 if (localaddr_str !=3D NULL) { - if (inet_aton(localaddr_str, &localaddr) =3D=3D 0) + if (inet_aton(localaddr_str, &localaddr) =3D=3D 0) { + error_setg(errp, "Convert the local address to network" + " byte order failed"); return -1; + } param_localaddr =3D &localaddr; } else { param_localaddr =3D NULL; @@ -642,7 +646,8 @@ static int net_socket_udp_init(NetClientState *peer, const char *model, const char *name, const char *rhost, - const char *lhost) + const char *lhost, + Error **errp) { NetSocketState *s; int fd, ret; @@ -658,7 +663,7 @@ static int net_socket_udp_init(NetClientState *peer, =20 fd =3D qemu_socket(PF_INET, SOCK_DGRAM, 0); if (fd < 0) { - perror("socket(PF_INET, SOCK_DGRAM)"); + error_setg_errno(errp, errno, "socket(PF_INET, SOCK_DGRAM)"); return -1; } =20 @@ -669,7 +674,7 @@ static int net_socket_udp_init(NetClientState *peer, } ret =3D bind(fd, (struct sockaddr *)&laddr, sizeof(laddr)); if (ret < 0) { - perror("bind"); + error_setg_errno(errp, errno, "bind"); closesocket(fd); return -1; } @@ -691,7 +696,6 @@ static int net_socket_udp_init(NetClientState *peer, int net_init_socket(const Netdev *netdev, const char *name, NetClientState *peer, Error **errp) { - /* FIXME error_setg(errp, ...) on failure */ Error *err =3D NULL; const NetdevSocketOptions *sock; =20 @@ -700,13 +704,13 @@ int net_init_socket(const Netdev *netdev, const char = *name, =20 if (sock->has_fd + sock->has_listen + sock->has_connect + sock->has_mc= ast + sock->has_udp !=3D 1) { - error_report("exactly one of fd=3D, listen=3D, connect=3D, mcast= =3D or udp=3D" + error_setg(errp, "exactly one of fd=3D, listen=3D, connect=3D, mca= st=3D or udp=3D" " is required"); return -1; } =20 if (sock->has_localaddr && !sock->has_mcast && !sock->has_udp) { - error_report("localaddr=3D is only valid with mcast=3D or udp=3D"); + error_setg(errp, "localaddr=3D is only valid with mcast=3D or udp= =3D"); return -1; } =20 @@ -715,7 +719,7 @@ int net_init_socket(const Netdev *netdev, const char *n= ame, =20 fd =3D monitor_fd_param(cur_mon, sock->fd, &err); if (fd =3D=3D -1) { - error_report_err(err); + error_propagate(errp, err); return -1; } qemu_set_nonblock(fd); @@ -726,15 +730,18 @@ int net_init_socket(const Netdev *netdev, const char = *name, } =20 if (sock->has_listen) { - if (net_socket_listen_init(peer, "socket", name, sock->listen) =3D= =3D -1) { + if (net_socket_listen_init(peer, "socket", name, sock->listen, + &err) =3D=3D -1) { + error_propagate(errp, err); return -1; } return 0; } =20 if (sock->has_connect) { - if (net_socket_connect_init(peer, "socket", name, sock->connect) = =3D=3D - -1) { + if (net_socket_connect_init(peer, "socket", name, sock->connect, + &err) =3D=3D -1) { + error_propagate(errp, err); return -1; } return 0; @@ -744,7 +751,8 @@ int net_init_socket(const Netdev *netdev, const char *n= ame, /* if sock->localaddr is missing, it has been initialized to "all = bits * zero" */ if (net_socket_mcast_init(peer, "socket", name, sock->mcast, - sock->localaddr) =3D=3D -1) { + sock->localaddr, &err) =3D=3D -1) { + error_propagate(errp, err); return -1; } return 0; @@ -752,11 +760,12 @@ int net_init_socket(const Netdev *netdev, const char = *name, =20 assert(sock->has_udp); if (!sock->has_localaddr) { - error_report("localaddr=3D is mandatory with udp=3D"); + error_setg(errp, "localaddr=3D is mandatory with udp=3D"); return -1; } - if (net_socket_udp_init(peer, "socket", name, sock->udp, sock->localad= dr) =3D=3D - -1) { + if (net_socket_udp_init(peer, "socket", name, sock->udp, sock->localad= dr, + &err) =3D=3D -1) { + error_propagate(errp, err); return -1; } return 0; diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c index 8188d9a..0da33d7 100644 --- a/util/qemu-sockets.c +++ b/util/qemu-sockets.c @@ -1312,7 +1312,7 @@ SocketAddress *socket_remote_address(int fd, Error **= errp) return socket_sockaddr_to_address(&ss, sslen, errp); } =20 -char *socket_address_to_string(struct SocketAddress *addr, Error **errp) +char *socket_address_to_string(struct SocketAddress *addr) { char *buf; InetSocketAddress *inet; --=20 2.9.3 From nobody Thu May 2 11:44:24 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.zoho.com; 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 1493194246442174.91806988728513; Wed, 26 Apr 2017 01:10:46 -0700 (PDT) Received: from localhost ([::1]:53483 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3I29-0002Gc-B4 for importer@patchew.org; Wed, 26 Apr 2017 04:10:45 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45440) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3HxH-0006du-Ur for qemu-devel@nongnu.org; Wed, 26 Apr 2017 04:05:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d3HxD-0002xJ-CE for qemu-devel@nongnu.org; Wed, 26 Apr 2017 04:05:43 -0400 Received: from [59.151.112.132] (port=36150 helo=heian.cn.fujitsu.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3HxC-0002wU-DV for qemu-devel@nongnu.org; Wed, 26 Apr 2017 04:05:39 -0400 Received: from unknown (HELO cn.fujitsu.com) ([10.167.33.5]) by heian.cn.fujitsu.com with ESMTP; 26 Apr 2017 16:05:26 +0800 Received: from G08CNEXCHPEKD02.g08.fujitsu.local (unknown [10.167.33.83]) by cn.fujitsu.com (Postfix) with ESMTP id 1115F47E6348; Wed, 26 Apr 2017 16:05:27 +0800 (CST) Received: from maozy.g08.fujitsu.local (10.167.225.76) by G08CNEXCHPEKD02.g08.fujitsu.local (10.167.33.89) with Microsoft SMTP Server (TLS) id 14.3.319.2; Wed, 26 Apr 2017 16:05:27 +0800 X-IronPort-AV: E=Sophos;i="5.22,518,1449504000"; d="scan'208";a="18175351" From: Mao Zhongyi To: Date: Wed, 26 Apr 2017 16:04:17 +0800 Message-ID: <2bc05de0edd61cdcdd3d2b894378a874d1e12327.1493191677.git.maozy.fnst@cn.fujitsu.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: References: MIME-Version: 1.0 X-Originating-IP: [10.167.225.76] X-yoursite-MailScanner-ID: 1115F47E6348.A2132 X-yoursite-MailScanner: Found to be clean X-yoursite-MailScanner-From: maozy.fnst@cn.fujitsu.com X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 59.151.112.132 Subject: [Qemu-devel] [PATCH v2 3/4] net/socket: Convert error report message to Error 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: jasowang@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Currently, net_socket_mcast_create(), net_socket_fd_init_dgram() and net_socket_fd_init() use the function such as fprintf(), perror() to report an error message. Now, convert these functions to Error. CC: jasowang@redhat.com, armbru@redhat.com Signed-off-by: Mao Zhongyi --- net/socket.c | 66 +++++++++++++++++++++++++++++++++++++-------------------= ---- 1 file changed, 41 insertions(+), 25 deletions(-) diff --git a/net/socket.c b/net/socket.c index b0decbe..559e09a 100644 --- a/net/socket.c +++ b/net/socket.c @@ -210,7 +210,9 @@ static void net_socket_send_dgram(void *opaque) } } =20 -static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct i= n_addr *localaddr) +static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, + struct in_addr *localaddr, + Error **errp) { struct ip_mreq imr; int fd; @@ -222,8 +224,8 @@ static int net_socket_mcast_create(struct sockaddr_in *= mcastaddr, struct in_addr #endif =20 if (!IN_MULTICAST(ntohl(mcastaddr->sin_addr.s_addr))) { - fprintf(stderr, "qemu: error: specified mcastaddr \"%s\" (0x%08x) " - "does not contain a multicast address\n", + error_setg(errp, "qemu: error: specified mcastaddr %s (0x%08x) " + "does not contain a multicast address", inet_ntoa(mcastaddr->sin_addr), (int)ntohl(mcastaddr->sin_addr.s_addr)); return -1; @@ -231,7 +233,7 @@ static int net_socket_mcast_create(struct sockaddr_in *= mcastaddr, struct in_addr } fd =3D qemu_socket(PF_INET, SOCK_DGRAM, 0); if (fd < 0) { - perror("socket(PF_INET, SOCK_DGRAM)"); + error_setg_errno(errp, errno, "socket(PF_INET, SOCK_DGRAM)"); return -1; } =20 @@ -243,13 +245,13 @@ static int net_socket_mcast_create(struct sockaddr_in= *mcastaddr, struct in_addr val =3D 1; ret =3D qemu_setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val= )); if (ret < 0) { - perror("setsockopt(SOL_SOCKET, SO_REUSEADDR)"); + error_setg_errno(errp, errno, "setsockopt(SOL_SOCKET, SO_REUSEADDR= )"); goto fail; } =20 ret =3D bind(fd, (struct sockaddr *)mcastaddr, sizeof(*mcastaddr)); if (ret < 0) { - perror("bind"); + error_setg_errno(errp, errno, "bind"); goto fail; } =20 @@ -264,7 +266,7 @@ static int net_socket_mcast_create(struct sockaddr_in *= mcastaddr, struct in_addr ret =3D qemu_setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &imr, sizeof(struct ip_mreq)); if (ret < 0) { - perror("setsockopt(IP_ADD_MEMBERSHIP)"); + error_setg_errno(errp, errno, "setsockopt(IP_ADD_MEMBERSHIP)"); goto fail; } =20 @@ -273,7 +275,7 @@ static int net_socket_mcast_create(struct sockaddr_in *= mcastaddr, struct in_addr ret =3D qemu_setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop)); if (ret < 0) { - perror("setsockopt(SOL_IP, IP_MULTICAST_LOOP)"); + error_setg_errno(errp, errno, "setsockopt(SOL_IP, IP_MULTICAST_LOO= P)"); goto fail; } =20 @@ -282,7 +284,7 @@ static int net_socket_mcast_create(struct sockaddr_in *= mcastaddr, struct in_addr ret =3D qemu_setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, localaddr, sizeof(*localaddr)); if (ret < 0) { - perror("setsockopt(IP_MULTICAST_IF)"); + error_setg_errno(errp, errno, "setsockopt(IP_MULTICAST_IF)"); goto fail; } } @@ -321,13 +323,15 @@ static NetClientInfo net_dgram_socket_info =3D { static NetSocketState *net_socket_fd_init_dgram(NetClientState *peer, const char *model, const char *name, - int fd, int is_connected) + int fd, int is_connected, + Error **errp) { struct sockaddr_in saddr; int newfd; socklen_t saddr_len =3D sizeof(saddr); NetClientState *nc; NetSocketState *s; + Error *local_error =3D NULL; =20 /* fd passed: multicast: "learn" dgram_dst address from bound address = and save it * Because this may be "shared" socket from a "master" process, datagr= ams would be recv() @@ -338,14 +342,14 @@ static NetSocketState *net_socket_fd_init_dgram(NetCl= ientState *peer, if (getsockname(fd, (struct sockaddr *) &saddr, &saddr_len) =3D=3D= 0) { /* must be bound */ if (saddr.sin_addr.s_addr =3D=3D 0) { - fprintf(stderr, "qemu: error: init_dgram: fd=3D%d unbound,= " - "cannot setup multicast dst addr\n", fd); + error_setg(errp, "qemu: error: init_dgram: fd=3D%d unbound= , " + "cannot setup multicast dst addr", fd); goto err; } /* clone dgram socket */ - newfd =3D net_socket_mcast_create(&saddr, NULL); + newfd =3D net_socket_mcast_create(&saddr, NULL, &local_error); if (newfd < 0) { - /* error already reported by net_socket_mcast_create() */ + error_propagate(errp, local_error); goto err; } /* clone newfd to fd, close newfd */ @@ -433,25 +437,27 @@ static NetSocketState *net_socket_fd_init_stream(NetC= lientState *peer, =20 static NetSocketState *net_socket_fd_init(NetClientState *peer, const char *model, const char *n= ame, - int fd, int is_connected) + int fd, int is_connected, + Error **errp) { int so_type =3D -1, optlen=3Dsizeof(so_type); =20 if(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&so_type, (socklen_t *)&optlen)< 0) { - fprintf(stderr, "qemu: error: getsockopt(SO_TYPE) for fd=3D%d fail= ed\n", + error_setg(errp, "qemu: error: getsockopt(SO_TYPE) for fd=3D%d fai= led", fd); closesocket(fd); return NULL; } switch(so_type) { case SOCK_DGRAM: - return net_socket_fd_init_dgram(peer, model, name, fd, is_connecte= d); + return net_socket_fd_init_dgram(peer, model, name, fd, is_connecte= d, errp); case SOCK_STREAM: return net_socket_fd_init_stream(peer, model, name, fd, is_connect= ed); default: /* who knows ... this could be a eg. a pty, do warn and continue a= s stream */ - fprintf(stderr, "qemu: warning: socket type=3D%d for fd=3D%d is no= t SOCK_DGRAM or SOCK_STREAM\n", so_type, fd); + error_setg(errp, "qemu: warning: socket type=3D%d for fd=3D%d is n= ot SOCK_DGRAM" + " or SOCK_STREAM", so_type, fd); return net_socket_fd_init_stream(peer, model, name, fd, is_connect= ed); } return NULL; @@ -546,6 +552,7 @@ static void net_socket_connected(QIOTask *task, void *o= paque) socket_connect_data *c =3D opaque; NetSocketState *s; char *addr_str =3D NULL; + Error *local_error =3D NULL; =20 addr_str =3D socket_address_to_string(c->saddr); if (addr_str =3D=3D NULL) { @@ -553,9 +560,10 @@ static void net_socket_connected(QIOTask *task, void *= opaque) goto end; } =20 - s =3D net_socket_fd_init(c->peer, c->model, c->name, sioc->fd, true); + s =3D net_socket_fd_init(c->peer, c->model, c->name, sioc->fd, true, &= local_error); if (!s) { closesocket(sioc->fd); + error_report_err(local_error); goto end; } =20 @@ -610,6 +618,7 @@ static int net_socket_mcast_init(NetClientState *peer, int fd; struct sockaddr_in saddr; struct in_addr localaddr, *param_localaddr; + Error *local_error =3D NULL; =20 if (parse_host_port(&saddr, host_str) < 0) return -1; @@ -625,13 +634,17 @@ static int net_socket_mcast_init(NetClientState *peer, param_localaddr =3D NULL; } =20 - fd =3D net_socket_mcast_create(&saddr, param_localaddr); - if (fd < 0) + fd =3D net_socket_mcast_create(&saddr, param_localaddr, &local_error); + if (fd < 0) { + error_propagate(errp, local_error); return -1; + } =20 - s =3D net_socket_fd_init(peer, model, name, fd, 0); - if (!s) + s =3D net_socket_fd_init(peer, model, name, fd, 0, &local_error); + if (!s) { + error_propagate(errp, local_error); return -1; + } =20 s->dgram_dst =3D saddr; =20 @@ -652,6 +665,7 @@ static int net_socket_udp_init(NetClientState *peer, NetSocketState *s; int fd, ret; struct sockaddr_in laddr, raddr; + Error *local_error =3D NULL; =20 if (parse_host_port(&laddr, lhost) < 0) { return -1; @@ -680,8 +694,9 @@ static int net_socket_udp_init(NetClientState *peer, } qemu_set_nonblock(fd); =20 - s =3D net_socket_fd_init(peer, model, name, fd, 0); + s =3D net_socket_fd_init(peer, model, name, fd, 0, &local_error); if (!s) { + error_propagate(errp, local_error); return -1; } =20 @@ -723,7 +738,8 @@ int net_init_socket(const Netdev *netdev, const char *n= ame, return -1; } qemu_set_nonblock(fd); - if (!net_socket_fd_init(peer, "socket", name, fd, 1)) { + if (!net_socket_fd_init(peer, "socket", name, fd, 1, &err)) { + error_propagate(errp, err); return -1; } return 0; --=20 2.9.3 From nobody Thu May 2 11:44:24 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.zoho.com; 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 1493194150730792.1007730855583; Wed, 26 Apr 2017 01:09:10 -0700 (PDT) Received: from localhost ([::1]:53474 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3I0a-00016M-HN for importer@patchew.org; Wed, 26 Apr 2017 04:09:08 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45409) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3HxF-0006ca-CH for qemu-devel@nongnu.org; Wed, 26 Apr 2017 04:05:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d3HxE-0002y0-Ck for qemu-devel@nongnu.org; Wed, 26 Apr 2017 04:05:41 -0400 Received: from [59.151.112.132] (port=34146 helo=heian.cn.fujitsu.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3HxD-0002ww-GY for qemu-devel@nongnu.org; Wed, 26 Apr 2017 04:05:40 -0400 Received: from unknown (HELO cn.fujitsu.com) ([10.167.33.5]) by heian.cn.fujitsu.com with ESMTP; 26 Apr 2017 16:05:30 +0800 Received: from G08CNEXCHPEKD02.g08.fujitsu.local (unknown [10.167.33.83]) by cn.fujitsu.com (Postfix) with ESMTP id BBE3247E6346; Wed, 26 Apr 2017 16:05:27 +0800 (CST) Received: from maozy.g08.fujitsu.local (10.167.225.76) by G08CNEXCHPEKD02.g08.fujitsu.local (10.167.33.89) with Microsoft SMTP Server (TLS) id 14.3.319.2; Wed, 26 Apr 2017 16:05:27 +0800 X-IronPort-AV: E=Sophos;i="5.22,518,1449504000"; d="scan'208";a="18175353" From: Mao Zhongyi To: Date: Wed, 26 Apr 2017 16:04:18 +0800 Message-ID: <56de19530e46799cd529e0c5805a40076581c68f.1493191677.git.maozy.fnst@cn.fujitsu.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: References: MIME-Version: 1.0 X-Originating-IP: [10.167.225.76] X-yoursite-MailScanner-ID: BBE3247E6346.A442C X-yoursite-MailScanner: Found to be clean X-yoursite-MailScanner-From: maozy.fnst@cn.fujitsu.com X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 59.151.112.132 Subject: [Qemu-devel] [PATCH v2 4/4] net/net: Convert parse_host_port() to Error 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: pbonzini@redhat.com, jasowang@redhat.com, kraxel@redhat.com, armbru@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" CC: berrange@redhat.com, kraxel@redhat.com, pbonzini@redhat.com, jasowang@r= edhat.com, armbru@redhat.com Signed-off-by: Mao Zhongyi --- include/qemu/sockets.h | 2 +- net/net.c | 21 ++++++++++++++++----- net/socket.c | 10 +++++++--- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/include/qemu/sockets.h b/include/qemu/sockets.h index 528b802..adb8d4f 100644 --- a/include/qemu/sockets.h +++ b/include/qemu/sockets.h @@ -53,7 +53,7 @@ void socket_listen_cleanup(int fd, Error **errp); int socket_dgram(SocketAddress *remote, SocketAddress *local, Error **errp= ); =20 /* Old, ipv4 only bits. Don't use for new code. */ -int parse_host_port(struct sockaddr_in *saddr, const char *str); +int parse_host_port(struct sockaddr_in *saddr, const char *str, Error **er= rp); int socket_init(void); =20 /** diff --git a/net/net.c b/net/net.c index 0ac3b9e..5054035 100644 --- a/net/net.c +++ b/net/net.c @@ -99,7 +99,7 @@ static int get_str_sep(char *buf, int buf_size, const cha= r **pp, int sep) return 0; } =20 -int parse_host_port(struct sockaddr_in *saddr, const char *str) +int parse_host_port(struct sockaddr_in *saddr, const char *str, Error **er= rp) { char buf[512]; struct hostent *he; @@ -107,24 +107,35 @@ int parse_host_port(struct sockaddr_in *saddr, const = char *str) int port; =20 p =3D str; - if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) + if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) { + error_setg(errp, "The mcast address should contain ':', for exampl= e: " + "mcast=3D230.0.0.1:1234"); return -1; + } saddr->sin_family =3D AF_INET; if (buf[0] =3D=3D '\0') { saddr->sin_addr.s_addr =3D 0; } else { if (qemu_isdigit(buf[0])) { - if (!inet_aton(buf, &saddr->sin_addr)) + if (!inet_aton(buf, &saddr->sin_addr)) { + error_setg(errp, "Convert the mcast address to network " + "byte order failed."); return -1; + } } else { - if ((he =3D gethostbyname(buf)) =3D=3D NULL) + he =3D gethostbyname(buf); + if (he =3D=3D NULL) { + error_setg(errp, "Specified hostname is error."); return - 1; + } saddr->sin_addr =3D *(struct in_addr *)he->h_addr; } } port =3D strtol(p, (char **)&r, 0); - if (r =3D=3D p) + if (r =3D=3D p) { + error_setg(errp, "The port number is illegal"); return -1; + } saddr->sin_port =3D htons(port); return 0; } diff --git a/net/socket.c b/net/socket.c index 559e09a..4373d9d 100644 --- a/net/socket.c +++ b/net/socket.c @@ -620,8 +620,10 @@ static int net_socket_mcast_init(NetClientState *peer, struct in_addr localaddr, *param_localaddr; Error *local_error =3D NULL; =20 - if (parse_host_port(&saddr, host_str) < 0) + if (parse_host_port(&saddr, host_str, &local_error) < 0) { + error_propagate(errp, local_error); return -1; + } =20 if (localaddr_str !=3D NULL) { if (inet_aton(localaddr_str, &localaddr) =3D=3D 0) { @@ -667,11 +669,13 @@ static int net_socket_udp_init(NetClientState *peer, struct sockaddr_in laddr, raddr; Error *local_error =3D NULL; =20 - if (parse_host_port(&laddr, lhost) < 0) { + if (parse_host_port(&laddr, lhost, &local_error) < 0) { + error_propagate(errp, local_error); return -1; } =20 - if (parse_host_port(&raddr, rhost) < 0) { + if (parse_host_port(&raddr, rhost, &local_error) < 0) { + error_propagate(errp, local_error); return -1; } =20 --=20 2.9.3