From 5748e4c2be4f5c24c691f91328be02a9c4cb3063 Mon Sep 17 00:00:00 2001 From: Corey Minyard Date: Wed, 8 Oct 2014 07:11:54 -0500 Subject: qemu-error: Add error_vreport() Needed to nicely print socket error reports. Signed-off-by: Corey Minyard Signed-off-by: Paolo Bonzini --- util/qemu-error.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'util') diff --git a/util/qemu-error.c b/util/qemu-error.c index 7b167fd06b..9bba5f53d8 100644 --- a/util/qemu-error.c +++ b/util/qemu-error.c @@ -199,14 +199,13 @@ static void error_print_loc(void) bool enable_timestamp_msg; /* * Print an error message to current monitor if we have one, else to stderr. - * Format arguments like sprintf(). The result should not contain + * Format arguments like vsprintf(). The result should not contain * newlines. * Prepend the current location and append a newline. * It's wrong to call this in a QMP monitor. Use qerror_report() there. */ -void error_report(const char *fmt, ...) +void error_vreport(const char *fmt, va_list ap) { - va_list ap; GTimeVal tv; gchar *timestr; @@ -218,8 +217,22 @@ void error_report(const char *fmt, ...) } error_print_loc(); - va_start(ap, fmt); error_vprintf(fmt, ap); - va_end(ap); error_printf("\n"); } + +/* + * Print an error message to current monitor if we have one, else to stderr. + * Format arguments like sprintf(). The result should not contain + * newlines. + * Prepend the current location and append a newline. + * It's wrong to call this in a QMP monitor. Use qerror_report() there. + */ +void error_report(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + error_vreport(fmt, ap); + va_end(ap); +} -- cgit v1.2.1 From 5179502918d0c230afb50d8b95247de440fccdd5 Mon Sep 17 00:00:00 2001 From: Corey Minyard Date: Wed, 8 Oct 2014 07:11:56 -0500 Subject: 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 [Make sure SO_ERROR value is passed to error_setg_errno. - Paolo] Signed-off-by: Paolo Bonzini --- util/qemu-sockets.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'util') diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c index 1eef590af5..a76bb3c913 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; -- cgit v1.2.1