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;