[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: |
Orit Wasserman |
Subject: |
Re: [Qemu-devel] [PATCH v2 1/3] Refactor inet_connect_opts function |
Date: |
Thu, 13 Sep 2012 19:44:34 +0300 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120827 Thunderbird/15.0 |
On 09/13/2012 04:14 PM, Markus Armbruster wrote:
> 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.
>
no objections here
>> + }
>> freeaddrinfo(res);
>> - return -1;
>> + return sock;
>> }
>>
>> int inet_dgram_opts(QemuOpts *opts)