[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 1/3] Refactor inet_connect_opts function
From: |
Markus Armbruster |
Subject: |
Re: [Qemu-devel] [PATCH v2 1/3] Refactor inet_connect_opts function |
Date: |
Thu, 13 Sep 2012 15:14:48 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux) |
One more...
Orit Wasserman <address@hidden> writes:
[...]
> +static int inet_connect_addr(struct addrinfo *addr, bool block,
> + bool *in_progress, Error **errp)
Parameter errp is unused.
> +{
> + char uaddr[INET6_ADDRSTRLEN + 1];
> + char uport[33];
> + int sock, rc;
> +
> + if (getnameinfo((struct sockaddr *)addr->ai_addr, addr->ai_addrlen,
> + uaddr, INET6_ADDRSTRLEN, uport, 32,
> + NI_NUMERICHOST | NI_NUMERICSERV)) {
> + fprintf(stderr, "%s: getnameinfo: oops\n", __func__);
> + return -1;
> + }
> + sock = qemu_socket(addr->ai_family, addr->ai_socktype,
> addr->ai_protocol);
> + if (sock < 0) {
> + fprintf(stderr, "%s: socket(%s): %s\n", __func__,
> + inet_strfamily(addr->ai_family), strerror(errno));
> + return -1;
> + }
> + setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
> + if (!block) {
> + socket_set_nonblock(sock);
> + }
> + /* connect to peer */
> + do {
> + rc = 0;
> + if (connect(sock, addr->ai_addr, addr->ai_addrlen) < 0) {
> + rc = -socket_error();
> }
> - setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(void*)&on,sizeof(on));
> - if (!block) {
> - socket_set_nonblock(sock);
> + } while (rc == -EINTR);
> +
> + if (!block && QEMU_SOCKET_RC_INPROGRESS(rc)) {
> + if (in_progress) {
> + *in_progress = true;
> }
> - /* connect to peer */
> - do {
> - rc = 0;
> - if (connect(sock, e->ai_addr, e->ai_addrlen) < 0) {
> - rc = -socket_error();
> - }
> - } while (rc == -EINTR);
> -
> - #ifdef _WIN32
> - if (!block && (rc == -EINPROGRESS || rc == -EWOULDBLOCK
> - || rc == -WSAEALREADY)) {
> - #else
> - if (!block && (rc == -EINPROGRESS)) {
> - #endif
> - if (in_progress) {
> - *in_progress = true;
> - }
> - } else if (rc < 0) {
> - if (NULL == e->ai_next)
> - fprintf(stderr, "%s: connect(%s,%s,%s,%s): %s\n",
> __FUNCTION__,
> - inet_strfamily(e->ai_family),
> - e->ai_canonname, uaddr, uport, strerror(errno));
> - closesocket(sock);
> - continue;
> + } else if (rc < 0) {
> + closesocket(sock);
> + return -1;
> + }
> + return sock;
> +}
> +
> +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;
> + }
> +
> + if (in_progress) {
> + *in_progress = false;
> + }
> +
> + for (e = res; e != NULL; e = e->ai_next) {
> + sock = inet_connect_addr(e, block, in_progress, errp);
> + if (in_progress && *in_progress) {
> + return sock;
> + } else if (sock >= 0) {
> + break;
> }
> - freeaddrinfo(res);
> - return sock;
> }
> - error_set(errp, QERR_SOCKET_CONNECT_FAILED);
> + if (sock < 0) {
> + error_set(errp, QERR_SOCKET_CONNECT_FAILED);
Necessary, because inet_connect_addr() doesn't do it.
Suggest to drop inet_connect_addr() parameter errp.
> + }
> freeaddrinfo(res);
> - return -1;
> + return sock;
> }
>
> int inet_dgram_opts(QemuOpts *opts)
[Qemu-devel] [PATCH v2 2/3] Separate inet_connect into inet_connect (blocking) and inet_nonblocking_connect, Orit Wasserman, 2012/09/12
Re: [Qemu-devel] [PATCH v2 0/3] nonblocking connect address handling cleanup, Amos Kong, 2012/09/12