summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuiz Capitulino <lcapitulino@redhat.com>2010-01-14 14:50:57 -0200
committerAnthony Liguori <aliguori@us.ibm.com>2010-01-19 16:31:03 -0600
commitd93180e3af9d136ac7ea7a3ab8ba98bbd5f532de (patch)
tree5d4c31fc0bd80abde6b177e09fe993966a8794f2
parent90a9cdebead9cee6d66340d0015f7b49be1403cf (diff)
downloadqemu-d93180e3af9d136ac7ea7a3ab8ba98bbd5f532de.tar.gz
qemu-d93180e3af9d136ac7ea7a3ab8ba98bbd5f532de.tar.bz2
qemu-d93180e3af9d136ac7ea7a3ab8ba98bbd5f532de.zip
QMP: Introduce VNC_CONNECTED event
It's emitted when a VNC client connects to QEMU, client's information such as port and IP address are provided. Note that this event is emitted right when the connection is established. This means that it happens before authentication procedure and session initialization. Event example: { "event": "VNC_CONNECTED", "timestamp": { "seconds": 1262976601, "microseconds": 975795 }, "data": { "server": { "auth": "sasl", "family": "ipv4", "service": "5901", "host": "0.0.0.0" }, "client": { "family": "ipv4", "service": "58425", "host": "127.0.0.1" } } } Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
-rw-r--r--QMP/qmp-events.txt7
-rw-r--r--monitor.c3
-rw-r--r--monitor.h1
-rw-r--r--vnc.c25
4 files changed, 36 insertions, 0 deletions
diff --git a/QMP/qmp-events.txt b/QMP/qmp-events.txt
index 682a5e53ac..d36da468ad 100644
--- a/QMP/qmp-events.txt
+++ b/QMP/qmp-events.txt
@@ -24,3 +24,10 @@ Data: None.
Description: Issued when the Virtual Machine enters debug mode.
Data: None.
+
+4 VNC_CONNECTED
+---------------
+
+Description: Issued when a VNC client establishes a connection.
+Data: 'server' and 'client' keys with the same keys as 'query-vnc',
+except that authentication ID is not provided.
diff --git a/monitor.c b/monitor.c
index b824e7c7cd..c92668045a 100644
--- a/monitor.c
+++ b/monitor.c
@@ -357,6 +357,9 @@ void monitor_protocol_event(MonitorEvent event, QObject *data)
case QEVENT_STOP:
event_name = "STOP";
break;
+ case QEVENT_VNC_CONNECTED:
+ event_name = "VNC_CONNECTED";
+ break;
default:
abort();
break;
diff --git a/monitor.h b/monitor.h
index 6ed117a920..4d57679000 100644
--- a/monitor.h
+++ b/monitor.h
@@ -20,6 +20,7 @@ typedef enum MonitorEvent {
QEVENT_RESET,
QEVENT_POWERDOWN,
QEVENT_STOP,
+ QEVENT_VNC_CONNECTED,
QEVENT_MAX,
} MonitorEvent;
diff --git a/vnc.c b/vnc.c
index d37fa6021f..6d488e52ce 100644
--- a/vnc.c
+++ b/vnc.c
@@ -269,6 +269,30 @@ static void vnc_client_cache_addr(VncState *client)
client->info = QOBJECT(qdict);
}
+static void vnc_qmp_event(VncState *vs, MonitorEvent event)
+{
+ QDict *server;
+ QObject *data;
+
+ if (!vs->info) {
+ return;
+ }
+
+ server = qdict_new();
+ if (vnc_server_info_put(server) < 0) {
+ QDECREF(server);
+ return;
+ }
+
+ data = qobject_from_jsonf("{ 'client': %p, 'server': %p }",
+ vs->info, QOBJECT(server));
+
+ monitor_protocol_event(event, data);
+
+ qobject_incref(vs->info);
+ qobject_decref(data);
+}
+
static void info_vnc_iter(QObject *obj, void *opaque)
{
QDict *client;
@@ -2396,6 +2420,7 @@ static void vnc_connect(VncDisplay *vd, int csock)
qemu_set_fd_handler2(vs->csock, NULL, vnc_client_read, NULL, vs);
vnc_client_cache_addr(vs);
+ vnc_qmp_event(vs, QEVENT_VNC_CONNECTED);
vs->vd = vd;
vs->ds = vd->ds;