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: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
Markus Armbruster 2014-05-19 18:57:37 +02:00 committed by Gerd Hoffmann
parent c5fa6c86d0
commit 3f9286b721
1 changed files with 16 additions and 12 deletions

View File

@ -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,24 +373,27 @@ 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) {
return sock;
} else if (sock >= 0) {
/* non blocking socket immediate success, call callback */
if (callback != NULL) {
callback(sock, opaque);
}
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 (callback) {
callback(sock, opaque);
}
}
g_free(connect_state);
freeaddrinfo(res);
return sock;