|
From: | Amos Kong |
Subject: | Re: [Qemu-devel] [PATCH v3 1/3] Refactor inet_connect_opts function |
Date: | Thu, 20 Sep 2012 10:33:35 +0800 |
User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:14.0) Gecko/20120717 Thunderbird/14.0 |
On 19/09/12 16:33, Amos Kong wrote:
On 14/09/12 02:58, Orit Wasserman wrote:From: "Michael S. Tsirkin" <address@hidden> refactor address resolution code to fix nonblocking connect remove getnameinfo call Signed-off-by: Michael S. Tsirkin <address@hidden> Signed-off-by: Amos Kong <address@hidden> Signed-off-by: Orit Wasserman <address@hidden>Hi Orit, Happy new year!--- qemu-sockets.c | 144 +++++++++++++++++++++++++++++++------------------------ 1 files changed, 81 insertions(+), 63 deletions(-) diff --git a/qemu-sockets.c b/qemu-sockets.c index 361d890..939a453 100644 --- a/qemu-sockets.c +++ b/qemu-sockets.c @@ -209,95 +209,113 @@ listen: return slisten; } -int inet_connect_opts(QemuOpts *opts, bool *in_progress, Error **errp) +#ifdef _WIN32 +#define QEMU_SOCKET_RC_INPROGRESS(rc) \ + ((rc) == -EINPROGRESS || rc == -EWOULDBLOCK || rc == -WSAEALREADY)
^^ Brackets are only be used for first 'rc'
+#else +#define QEMU_SOCKET_RC_INPROGRESS(rc) \ + ((rc) == -EINPROGRESS) +#endif
+ +int inet_connect_opts(QemuOpts *opts, bool *in_progress, Error **errp) +{ + struct addrinfo *res, *e; + int sock = -1; + bool block = qemu_opt_get_bool(opts, "block", 0); + + res = inet_parse_connect_opts(opts, errp); + if (!res) { + return -1;
In this error path, in_progress is not assigned, but it's used in tcp_start_outgoing_migration() Let also set the default value of in_progress to 'false' in tcp_start_outgoing_migration()
+ } ++ if (in_progress) { + *in_progress = false; }trivial comment: You moved this block to head of inet_connect_addr() in [patch 3/3], why not do this in this patch? I know if *in_progress becomes "true", sock is always >= 0, for loop will exits. But moving this block to inet_connect_addr() is clearer.for (e = res; e != NULL; e = e->ai_next) { - if (getnameinfo((struct sockaddr*)e->ai_addr,e->ai_addrlen, - uaddr,INET6_ADDRSTRLEN,uport,32, - NI_NUMERICHOST | NI_NUMERICSERV) != 0) { - fprintf(stderr,"%s: getnameinfo: oops\n", __FUNCTION__); - continue; - } - sock = qemu_socket(e->ai_family, e->ai_socktype, e->ai_protocol); - if (sock < 0) { - fprintf(stderr,"%s: socket(%s): %s\n", __FUNCTION__, - inet_strfamily(e->ai_family), strerror(errno)); - continue; - } - setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(void*)&on,sizeof(on)); - if (!block) { - socket_set_nonblock(sock); + sock = inet_connect_addr(e, block, in_progress); + if (sock >= 0) { + break; }
... -- Amos.
[Prev in Thread] | Current Thread | [Next in Thread] |