One more... Orit Wasserman <owass...@redhat.com> 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)