From 78c115fb2bbd9a543cb61477e219552038e9d8f3 Mon Sep 17 00:00:00 2001 From: Luiz Capitulino Date: Tue, 26 Jan 2010 18:53:43 -0200 Subject: [PATCH 5/9] VNC: Cache client info at connection time RH-Author: Luiz Capitulino Message-id: <1264532026-7620-6-git-send-email-lcapitulino@redhat.com> Patchwork-id: 6631 O-Subject: [PATCH RHEL6 qemu-kvm 5/8] VNC: Cache client info at connection time Bugzilla: 549759 RH-Acked-by: Markus Armbruster RH-Acked-by: Daniel P. Berrange RH-Acked-by: Juan Quintela When a disconnection happens the client's socket on QEMU side may become invalid, this way it won't be possible to query it to get client information, which is going to be needed by the future QMP VNC_DISCONNECTED event. To always have this information available we query the socket at connection time and cache the client info in struct VncState. Two function are introduced to perform this job. vnc_client_cache_addr() is called right when the connection is made, however the authentication information is not available at that moment so vnc_client_cache_auth() is called from protocol_client_init() to get auth info. Signed-off-by: Luiz Capitulino Signed-off-by: Anthony Liguori (cherry picked from commit 4a80dba3920cf8e0829b9ce4769842ce94748bf4) --- vnc.c | 40 ++++++++++++++++++++++++++++++---------- vnc.h | 2 ++ 2 files changed, 32 insertions(+), 10 deletions(-) Signed-off-by: Eduardo Habkost --- vnc.c | 40 ++++++++++++++++++++++++++++++---------- vnc.h | 2 ++ 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/vnc.c b/vnc.c index 5fbde89..8680fee 100644 --- a/vnc.c +++ b/vnc.c @@ -230,16 +230,16 @@ static int vnc_server_info_put(QDict *qdict) return 0; } -static QDict *do_info_vnc_client(Monitor *mon, VncState *client) +static void vnc_client_cache_auth(VncState *client) { QDict *qdict; - qdict = qdict_new(); - if (vnc_qdict_remote_addr(qdict, client->csock) < 0) { - QDECREF(qdict); - return NULL; + if (!client->info) { + return; } + qdict = qobject_to_qdict(client->info); + #ifdef CONFIG_VNC_TLS if (client->tls.session && client->tls.dname) { @@ -253,8 +253,20 @@ static QDict *do_info_vnc_client(Monitor *mon, VncState *client) qstring_from_str(client->sasl.username)); } #endif +} - return qdict; +static void vnc_client_cache_addr(VncState *client) +{ + QDict *qdict; + + qdict = qdict_new(); + if (vnc_qdict_remote_addr(qdict, client->csock) < 0) { + QDECREF(qdict); + /* XXX: how to report the error? */ + return; + } + + client->info = QOBJECT(qdict); } static void info_vnc_iter(QObject *obj, void *opaque) @@ -339,16 +351,17 @@ void do_info_vnc(Monitor *mon, QObject **ret_data) if (vnc_display == NULL || vnc_display->display == NULL) { *ret_data = qobject_from_jsonf("{ 'enabled': false }"); } else { - QDict *qdict; QList *clist; clist = qlist_new(); if (vnc_display->clients) { VncState *client = vnc_display->clients; while (client) { - qdict = do_info_vnc_client(mon, client); - if (qdict) - qlist_append(clist, qdict); + if (client->info) { + /* incref so that it's not freed by upper layers */ + qobject_incref(client->info); + qlist_append_obj(clist, client->info); + } client = client->next; } } @@ -1079,6 +1092,9 @@ static void vnc_disconnect_finish(VncState *vs) qemu_free(vs->output.buffer); vs->output.buffer = NULL; } + + qobject_decref(vs->info); + #ifdef CONFIG_VNC_TLS vnc_tls_client_cleanup(vs); #endif /* CONFIG_VNC_TLS */ @@ -2069,6 +2085,8 @@ static int protocol_client_init(VncState *vs, uint8_t *data, size_t len) vnc_write(vs, buf, size); vnc_flush(vs); + vnc_client_cache_auth(vs); + vnc_read_when(vs, protocol_client_msg, 1); return 0; @@ -2379,6 +2397,8 @@ static void vnc_connect(VncDisplay *vd, int csock) socket_set_nonblock(vs->csock); qemu_set_fd_handler2(vs->csock, NULL, vnc_client_read, NULL, vs); + vnc_client_cache_addr(vs); + vs->vd = vd; vs->ds = vd->ds; vs->last_x = -1; diff --git a/vnc.h b/vnc.h index fcc6824..1210824 100644 --- a/vnc.h +++ b/vnc.h @@ -144,6 +144,8 @@ struct VncState VncStateSASL sasl; #endif + QObject *info; + Buffer output; Buffer input; /* current output mode information */ -- 1.6.3.rc4.29.g8146