diff options
author | Corey Minyard <cminyard@mvista.com> | 2014-10-08 07:11:56 -0500 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2014-10-09 15:36:15 +0200 |
commit | 5179502918d0c230afb50d8b95247de440fccdd5 (patch) | |
tree | a13f4148a4400cdbe43e8ccfbd0808393aa74385 /util | |
parent | 5748e4c2be4f5c24c691f91328be02a9c4cb3063 (diff) | |
download | qemu-5179502918d0c230afb50d8b95247de440fccdd5.zip qemu-5179502918d0c230afb50d8b95247de440fccdd5.tar.gz qemu-5179502918d0c230afb50d8b95247de440fccdd5.tar.bz2 |
qemu-sockets: Add error to non-blocking connect handler
An error value here would be quite handy and more consistent
with the rest of the code.
Signed-off-by: Corey Minyard <cminyard@mvista.com>
[Make sure SO_ERROR value is passed to error_setg_errno. - Paolo]
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'util')
-rw-r--r-- | util/qemu-sockets.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c index 1eef590..a76bb3c 100644 --- a/util/qemu-sockets.c +++ b/util/qemu-sockets.c @@ -234,6 +234,7 @@ static void wait_for_connect(void *opaque) int val = 0, rc = 0; socklen_t valsize = sizeof(val); bool in_progress; + Error *err = NULL; qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL); @@ -244,10 +245,12 @@ static void wait_for_connect(void *opaque) /* update rc to contain error */ if (!rc && val) { rc = -1; + errno = val; } /* connect error */ if (rc < 0) { + error_setg_errno(&err, errno, "Error connecting to socket"); closesocket(s->fd); s->fd = rc; } @@ -257,9 +260,14 @@ static void wait_for_connect(void *opaque) while (s->current_addr->ai_next != NULL && s->fd < 0) { s->current_addr = s->current_addr->ai_next; s->fd = inet_connect_addr(s->current_addr, &in_progress, s, NULL); + if (s->fd < 0) { + error_free(err); + err = NULL; + error_setg_errno(&err, errno, "Unable to start socket connect"); + } /* connect in progress */ if (in_progress) { - return; + goto out; } } @@ -267,9 +275,11 @@ static void wait_for_connect(void *opaque) } if (s->callback) { - s->callback(s->fd, s->opaque); + s->callback(s->fd, err, s->opaque); } g_free(s); +out: + error_free(err); } static int inet_connect_addr(struct addrinfo *addr, bool *in_progress, @@ -401,7 +411,7 @@ int inet_connect_opts(QemuOpts *opts, Error **errp, return sock; } else { if (callback) { - callback(sock, opaque); + callback(sock, NULL, opaque); } } g_free(connect_state); @@ -769,7 +779,7 @@ int unix_connect_opts(QemuOpts *opts, Error **errp, } else if (rc >= 0) { /* non blocking socket immediate success, call callback */ if (callback != NULL) { - callback(sock, opaque); + callback(sock, NULL, opaque); } } @@ -919,7 +929,7 @@ int socket_connect(SocketAddress *addr, Error **errp, fd = monitor_get_fd(cur_mon, addr->fd->str, errp); if (fd >= 0 && callback) { qemu_set_nonblock(fd); - callback(fd, opaque); + callback(fd, NULL, opaque); } break; |