mirror of https://gitee.com/openkylin/qemu.git
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,
|
||||
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;
|
||||
|
|
Loading…
Reference in New Issue