Commit 5008e5b7 authored by Corey Minyard's avatar Corey Minyard Committed by Paolo Bonzini
Browse files

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: default avatarCorey Minyard <cminyard@mvista.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 51795029
Loading
Loading
Loading
Loading
+34 −18
Original line number Diff line number Diff line
@@ -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,16 +4154,14 @@ 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 {
        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) {
        fprintf(stderr, "QEMU waiting for connection on: %s\n",