[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 5/8] VNC: Cache client info at connection time
From: |
Luiz Capitulino |
Subject: |
[Qemu-devel] [PATCH 5/8] VNC: Cache client info at connection time |
Date: |
Thu, 14 Jan 2010 14:50:56 -0200 |
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 <address@hidden>
---
vnc.c | 40 ++++++++++++++++++++++++++++++----------
vnc.h | 2 ++
2 files changed, 32 insertions(+), 10 deletions(-)
diff --git a/vnc.c b/vnc.c
index e023824..d37fa60 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;
@@ -2377,6 +2395,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.6
- [Qemu-devel] [PATCH v0 0/8]: VNC events and cleanup, Luiz Capitulino, 2010/01/14
- [Qemu-devel] [PATCH 1/8] VNC: Use 'enabled' key instead of 'status', Luiz Capitulino, 2010/01/14
- [Qemu-devel] [PATCH 2/8] VNC: Make 'auth' key mandatory, Luiz Capitulino, 2010/01/14
- [Qemu-devel] [PATCH 3/8] VNC: Rename client's 'username' key, Luiz Capitulino, 2010/01/14
- [Qemu-devel] [PATCH 4/8] VNC: Add 'family' key, Luiz Capitulino, 2010/01/14
- [Qemu-devel] [PATCH 5/8] VNC: Cache client info at connection time,
Luiz Capitulino <=
- [Qemu-devel] [PATCH 6/8] QMP: Introduce VNC_CONNECTED event, Luiz Capitulino, 2010/01/14
- [Qemu-devel] [PATCH 8/8] QMP: Introduce VNC_INITIALIZED event, Luiz Capitulino, 2010/01/14
- [Qemu-devel] [PATCH 7/8] QMP: Introduce VNC_DISCONNECTED event, Luiz Capitulino, 2010/01/14
- [Qemu-devel] Re: [PATCH v0 0/8]: VNC events and cleanup, Daniel P. Berrange, 2010/01/14