Commit 3f9286b7 authored by Markus Armbruster's avatar Markus Armbruster Committed by Gerd Hoffmann
Browse files

qemu-socket: Clean up inet_connect_opts()



Separate the search for a working addrinfo from the code that does
something with it.  Makes for a clearer search loop.

Use a local Error * to simplify resetting the error in the search
loop.

Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
Reviewed-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: default avatarGerd Hoffmann <kraxel@redhat.com>
parent c5fa6c86
Loading
Loading
Loading
Loading
+16 −12
Original line number Diff line number Diff line
@@ -354,6 +354,7 @@ static struct addrinfo *inet_parse_connect_opts(QemuOpts *opts, Error **errp)
int inet_connect_opts(QemuOpts *opts, Error **errp,
                      NonBlockingConnectHandler *callback, void *opaque)
{
    Error *local_err = NULL;
    struct addrinfo *res, *e;
    int sock = -1;
    bool in_progress;
@@ -372,23 +373,26 @@ int inet_connect_opts(QemuOpts *opts, Error **errp,
    }

    for (e = res; e != NULL; e = e->ai_next) {
        if (error_is_set(errp)) {
            error_free(*errp);
            *errp = NULL;
        }
        error_free(local_err);
        local_err = NULL;
        if (connect_state != NULL) {
            connect_state->current_addr = e;
        }
        sock = inet_connect_addr(e, &in_progress, connect_state, errp);
        if (in_progress) {
        sock = inet_connect_addr(e, &in_progress, connect_state, &local_err);
        if (sock >= 0) {
            break;
        }
    }

    if (sock < 0) {
        error_propagate(errp, local_err);
    } else if (in_progress) {
        /* wait_for_connect() will do the rest */
        return sock;
        } else if (sock >= 0) {
            /* non blocking socket immediate success, call callback */
            if (callback != NULL) {
    } else {
        if (callback) {
            callback(sock, opaque);
        }
            break;
        }
    }
    g_free(connect_state);
    freeaddrinfo(res);