diff options
author | Corey Minyard <cminyard@mvista.com> | 2014-10-08 07:11:55 -0500 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2014-10-09 15:36:15 +0200 |
commit | 5008e5b7b817b5ea2b788203122cd50e7c16e599 (patch) | |
tree | ffe23def7eef7e5140acf2c3a25e188964c74c15 | |
parent | 5179502918d0c230afb50d8b95247de440fccdd5 (diff) |
qemu-char: Fix reconnect socket error reporting
If reconnect was set, errors wouldn't always be reported.
Fix that and also only report a connect error once until a
connection has been made.
The primary purpose of this is to tell the user that a
connection failed so they can know they need to figure out
what went wrong. So we don't want to spew too much
out here, just enough so they know.
Signed-off-by: Corey Minyard <cminyard@mvista.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r-- | qemu-char.c | 52 |
1 files changed, 34 insertions, 18 deletions
diff --git a/qemu-char.c b/qemu-char.c index c71805ad8d..bd0709bab5 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -2509,6 +2509,7 @@ typedef struct { guint reconnect_timer; int64_t reconnect_time; + bool connect_err_reported; } TCPCharDriver; static gboolean socket_reconnect_timeout(gpointer opaque); @@ -2521,6 +2522,19 @@ static void qemu_chr_socket_restart_timer(CharDriverState *chr) socket_reconnect_timeout, chr); } +static void check_report_connect_error(CharDriverState *chr, + Error *err) +{ + TCPCharDriver *s = chr->opaque; + + if (!s->connect_err_reported) { + error_report("Unable to connect character device %s: %s", + chr->label, error_get_pretty(err)); + s->connect_err_reported = true; + } + qemu_chr_socket_restart_timer(chr); +} + static gboolean tcp_chr_accept(GIOChannel *chan, GIOCondition cond, void *opaque); #ifndef _WIN32 @@ -3045,14 +3059,14 @@ static void qemu_chr_finish_socket_connection(CharDriverState *chr, int fd) static void qemu_chr_socket_connected(int fd, Error *err, void *opaque) { CharDriverState *chr = opaque; + TCPCharDriver *s = chr->opaque; if (fd < 0) { - error_report("Unable to connect to char device %s: %s", - chr->label, error_get_pretty(err)); - qemu_chr_socket_restart_timer(chr); + check_report_connect_error(chr, err); return; } + s->connect_err_reported = false; qemu_chr_finish_socket_connection(chr, fd); } @@ -4068,11 +4082,19 @@ static CharDriverState *qmp_chardev_open_parallel(ChardevHostdev *parallel, #endif /* WIN32 */ +static void socket_try_connect(CharDriverState *chr) +{ + Error *err = NULL; + + if (!qemu_chr_open_socket_fd(chr, &err)) { + check_report_connect_error(chr, err); + } +} + static gboolean socket_reconnect_timeout(gpointer opaque) { CharDriverState *chr = opaque; TCPCharDriver *s = chr->opaque; - Error *err; s->reconnect_timer = 0; @@ -4080,11 +4102,7 @@ static gboolean socket_reconnect_timeout(gpointer opaque) return false; } - if (!qemu_chr_open_socket_fd(chr, &err)) { - error_report("Unable to connect to char device %s: %s\n", - chr->label, error_get_pretty(err)); - qemu_chr_socket_restart_timer(chr); - } + socket_try_connect(chr); return false; } @@ -4136,15 +4154,13 @@ static CharDriverState *qmp_chardev_open_socket(ChardevSocket *sock, s->reconnect_time = reconnect; } - if (!qemu_chr_open_socket_fd(chr, errp)) { - if (s->reconnect_time) { - qemu_chr_socket_restart_timer(chr); - } else { - g_free(s); - g_free(chr->filename); - g_free(chr); - return NULL; - } + if (s->reconnect_time) { + socket_try_connect(chr); + } else if (!qemu_chr_open_socket_fd(chr, errp)) { + g_free(s); + g_free(chr->filename); + g_free(chr); + return NULL; } if (is_listen && is_waitconnect) { |