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:
parent
c5fa6c86d0
commit
3f9286b721
|
@ -354,6 +354,7 @@ static struct addrinfo *inet_parse_connect_opts(QemuOpts *opts, Error **errp)
|
||||||
int inet_connect_opts(QemuOpts *opts, Error **errp,
|
int inet_connect_opts(QemuOpts *opts, Error **errp,
|
||||||
NonBlockingConnectHandler *callback, void *opaque)
|
NonBlockingConnectHandler *callback, void *opaque)
|
||||||
{
|
{
|
||||||
|
Error *local_err = NULL;
|
||||||
struct addrinfo *res, *e;
|
struct addrinfo *res, *e;
|
||||||
int sock = -1;
|
int sock = -1;
|
||||||
bool in_progress;
|
bool in_progress;
|
||||||
|
@ -372,24 +373,27 @@ int inet_connect_opts(QemuOpts *opts, Error **errp,
|
||||||
}
|
}
|
||||||
|
|
||||||
for (e = res; e != NULL; e = e->ai_next) {
|
for (e = res; e != NULL; e = e->ai_next) {
|
||||||
if (error_is_set(errp)) {
|
error_free(local_err);
|
||||||
error_free(*errp);
|
local_err = NULL;
|
||||||
*errp = NULL;
|
|
||||||
}
|
|
||||||
if (connect_state != NULL) {
|
if (connect_state != NULL) {
|
||||||
connect_state->current_addr = e;
|
connect_state->current_addr = e;
|
||||||
}
|
}
|
||||||
sock = inet_connect_addr(e, &in_progress, connect_state, errp);
|
sock = inet_connect_addr(e, &in_progress, connect_state, &local_err);
|
||||||
if (in_progress) {
|
if (sock >= 0) {
|
||||||
return sock;
|
|
||||||
} else if (sock >= 0) {
|
|
||||||
/* non blocking socket immediate success, call callback */
|
|
||||||
if (callback != NULL) {
|
|
||||||
callback(sock, opaque);
|
|
||||||
}
|
|
||||||
break;
|
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);
|
g_free(connect_state);
|
||||||
freeaddrinfo(res);
|
freeaddrinfo(res);
|
||||||
return sock;
|
return sock;
|
||||||
|
|
Loading…
Reference in New Issue