[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 2/4] net/socket: Improve -net socket error re
From: |
Markus Armbruster |
Subject: |
Re: [Qemu-devel] [PATCH v2 2/4] net/socket: Improve -net socket error reporting |
Date: |
Thu, 27 Apr 2017 18:10:49 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/25.1 (gnu/linux) |
Mao Zhongyi <address@hidden> writes:
> 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=, listen=, connect=,
> mcast= or udp= is required
> qemu-system-x86_64: -net socket: Device 'socket' could not be initialized
>
> Convert net_init_socket() to Error to get rid of the unwanted second
> error message.
>
> CC: address@hidden, address@hidden, address@hidden, address@hidden,
> address@hidden
> Signed-off-by: Mao Zhongyi <address@hidden>
> ---
> After the repair, the effect is as follows:
>
> $ qemu-system-x86_64 -net socket,
> qemu-system-x86_64: -net socket: exactly one of fd=, listen=, connect=,
> mcast= or udp= is required
Please move this into the commit message proper.
>
> 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
> **errp);
> *
> * 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);
>
> /**
> * socket_address_crumple:
I'd make this a separate patch. Matter of taste.
> 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 *peer,
>
> saddr = socket_parse(host_str, &local_error);
> if (saddr == NULL) {
> - error_report_err(local_error);
> + error_propagate(errp, local_error);
> return -1;
> }
Simpler:
- saddr = socket_parse(host_str, &local_error);
+ saddr = socket_parse(host_str, errp);
if (saddr == NULL) {
- error_report_err(local_error);
return -1;
}
>
> ret = socket_listen(saddr, &local_error);
> if (ret < 0) {
> qapi_free_SocketAddress(saddr);
> - error_report_err(local_error);
> + error_propagate(errp, local_error);
> return -1;
> }
Likewise.
>
> @@ -545,11 +546,9 @@ static void net_socket_connected(QIOTask *task, void
> *opaque)
> socket_connect_data *c = opaque;
> NetSocketState *s;
> char *addr_str = NULL;
> - Error *local_error = NULL;
>
> - addr_str = socket_address_to_string(c->saddr, &local_error);
> + addr_str = socket_address_to_string(c->saddr);
> if (addr_str == NULL) {
> - error_report_err(local_error);
> closesocket(sioc->fd);
> goto end;
> }
On first glance, this looks like you're sweeping an error under the rug.
Not true, as socket_address_to_string() can't actually fail. Please
drop the dead error handling entirely.
> @@ -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 = g_new0(socket_connect_data, 1);
> QIOChannelSocket *sioc;
> @@ -594,7 +594,7 @@ static int net_socket_connect_init(NetClientState *peer,
Error *local_error = NULL;
c->peer = peer;
c->model = g_strdup(model);
c->name = g_strdup(name);
c->saddr = socket_parse(host_str, &local_error);
if (c->saddr == NULL) {
goto err;
}
sioc = qio_channel_socket_new();
qio_channel_socket_connect_async(sioc,
c->saddr,
net_socket_connected,
c,
NULL);
> return 0;
>
> err:
> - error_report_err(local_error);
> + error_propagate(errp, local_error);
> socket_connect_data_free(c);
> return -1;
> }
Since all we do with local_error is propagate it, we can eliminate it:
pass errp directly to socket_parse(), drop error_propagate().
> @@ -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,
struct sockaddr_in saddr;
struct in_addr localaddr, *param_localaddr;
if (parse_host_port(&saddr, host_str) < 0)
> return -1;
Fails without setting an error. Fixed in PATCH 4. Recommend to do
PATCH 4 before this one.
>
> if (localaddr_str != NULL) {
> - if (inet_aton(localaddr_str, &localaddr) == 0)
> + if (inet_aton(localaddr_str, &localaddr) == 0) {
> + error_setg(errp, "Convert the local address to network"
> + " byte order failed");
inet_aton() fails only when its first argument is not a valid IPv4
address. Suggest:
error_setg(errp, "localaddr '%s' is not a valid IPv4 address",
localaddr_str);
This error message includes both the exact parameter name "localaddr"
and the parameter value.
> return -1;
> + }
> param_localaddr = &localaddr;
> } else {
> param_localaddr = NULL;
}
fd = net_socket_mcast_create(&saddr, param_localaddr);
if (fd < 0)
return -1;
Fails without setting an error. Fixed in PATCH 3. Recommend to do
PATCH 3 before this one.
s = net_socket_fd_init(peer, model, name, fd, 0);
if (!s)
return -1;
Likewise.
> @@ -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,
struct sockaddr_in laddr, raddr;
if (parse_host_port(&laddr, lhost) < 0) {
return -1;
Fails without setting an error. Fixed in PATCH 4. Recommend to do
PATCH 4 before this one.
}
if (parse_host_port(&raddr, rhost) < 0) {
return -1;
Likewise.
}
>
> fd = 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)");
Bad error message, but no worse than before.
> return -1;
> }
>
> @@ -669,7 +674,7 @@ static int net_socket_udp_init(NetClientState *peer,
ret = socket_set_fast_reuse(fd);
if (ret < 0) {
closesocket(fd);
return -1;
Fails without setting an error.
> }
> ret = bind(fd, (struct sockaddr *)&laddr, sizeof(laddr));
> if (ret < 0) {
> - perror("bind");
> + error_setg_errno(errp, errno, "bind");
Bad error message, but no worse than before.
> 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 = NULL;
> const NetdevSocketOptions *sock;
>
> @@ -700,13 +704,13 @@ int net_init_socket(const Netdev *netdev, const char
> *name,
>
> if (sock->has_fd + sock->has_listen + sock->has_connect +
> sock->has_mcast +
> sock->has_udp != 1) {
> - error_report("exactly one of fd=, listen=, connect=, mcast= or udp="
> + error_setg(errp, "exactly one of fd=, listen=, connect=, mcast= or
> udp="
> " is required");
> return -1;
> }
>
> if (sock->has_localaddr && !sock->has_mcast && !sock->has_udp) {
> - error_report("localaddr= is only valid with mcast= or udp=");
> + error_setg(errp, "localaddr= is only valid with mcast= or udp=");
> return -1;
> }
>
> @@ -715,7 +719,7 @@ int net_init_socket(const Netdev *netdev, const char
> *name,
>
> fd = monitor_fd_param(cur_mon, sock->fd, &err);
> if (fd == -1) {
> - error_report_err(err);
> + error_propagate(errp, err);
> return -1;
> }
Again, pass errp instead of &err, and drop error_propagate().
> qemu_set_nonblock(fd);
if (!net_socket_fd_init(peer, "socket", name, fd, 1)) {
return -1;
Fails without setting an error. Fixed in PATCH 3. Recommend to do
PATCH 3 before this one.
}
return 0;
}
> @@ -726,15 +730,18 @@ int net_init_socket(const Netdev *netdev, const char
> *name,
> }
>
> if (sock->has_listen) {
> - if (net_socket_listen_init(peer, "socket", name, sock->listen) ==
> -1) {
> + if (net_socket_listen_init(peer, "socket", name, sock->listen,
> + &err) == -1) {
> + error_propagate(errp, err);
> return -1;
> }
> return 0;
> }
>
> if (sock->has_connect) {
> - if (net_socket_connect_init(peer, "socket", name, sock->connect) ==
> - -1) {
> + if (net_socket_connect_init(peer, "socket", name, sock->connect,
> + &err) == -1) {
> + error_propagate(errp, err);
> return -1;
> }
> return 0;
> @@ -744,7 +751,8 @@ int net_init_socket(const Netdev *netdev, const char
> *name,
> /* 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) == -1) {
> + sock->localaddr, &err) == -1) {
> + error_propagate(errp, err);
> return -1;
> }
> return 0;
> @@ -752,11 +760,12 @@ int net_init_socket(const Netdev *netdev, const char
> *name,
>
> assert(sock->has_udp);
> if (!sock->has_localaddr) {
> - error_report("localaddr= is mandatory with udp=");
> + error_setg(errp, "localaddr= is mandatory with udp=");
> return -1;
> }
> - if (net_socket_udp_init(peer, "socket", name, sock->udp,
> sock->localaddr) ==
> - -1) {
> + if (net_socket_udp_init(peer, "socket", name, sock->udp, sock->localaddr,
> + &err) == -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);
> }
>
> -char *socket_address_to_string(struct SocketAddress *addr, Error **errp)
> +char *socket_address_to_string(struct SocketAddress *addr)
> {
> char *buf;
> InetSocketAddress *inet;
Re: [Qemu-devel] [PATCH v2 0/4] Convert non-blocking connect and fix its error reporting, Markus Armbruster, 2017/04/27