137 lines
5.5 KiB
Diff
137 lines
5.5 KiB
Diff
From 57f08fb47b0938a9e8969b857380926fa6966ca8 Mon Sep 17 00:00:00 2001
|
|
From: Laine Stump <laine@laine.org>
|
|
Date: Wed, 14 Mar 2012 01:41:35 -0400
|
|
Subject: [PATCH] Emit graphics events when a SPICE client
|
|
connects/disconnects
|
|
|
|
Wire up the domain graphics event notifications for SPICE. Adapted
|
|
from a RHEL-only patch written by Dan Berrange that used custom
|
|
__com.redhat_SPICE events - equivalent events are now available in
|
|
upstream QEMU (including a SPICE_CONNECTED event, which was missing in
|
|
the __COM.redhat_SPICE version).
|
|
|
|
* src/qemu/qemu_monitor_json.c: Wire up SPICE graphics events
|
|
(cherry picked from commit 89ae6a5a30bd91cfb2365544f9dd2e6c2a36ecca)
|
|
|
|
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
|
---
|
|
src/qemu/qemu_monitor_json.c | 56 +++++++++++++++++++++++++++++++++++++++---
|
|
1 files changed, 52 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
|
|
index e38c2ed..d4a3b7b 100644
|
|
--- a/src/qemu/qemu_monitor_json.c
|
|
+++ b/src/qemu/qemu_monitor_json.c
|
|
@@ -57,6 +57,9 @@ static void qemuMonitorJSONHandleVNCConnect(qemuMonitorPtr mon, virJSONValuePtr
|
|
static void qemuMonitorJSONHandleVNCInitialize(qemuMonitorPtr mon, virJSONValuePtr data);
|
|
static void qemuMonitorJSONHandleVNCDisconnect(qemuMonitorPtr mon, virJSONValuePtr data);
|
|
static void qemuMonitorJSONHandleBlockJob(qemuMonitorPtr mon, virJSONValuePtr data);
|
|
+static void qemuMonitorJSONHandleSPICEConnect(qemuMonitorPtr mon, virJSONValuePtr data);
|
|
+static void qemuMonitorJSONHandleSPICEInitialize(qemuMonitorPtr mon, virJSONValuePtr data);
|
|
+static void qemuMonitorJSONHandleSPICEDisconnect(qemuMonitorPtr mon, virJSONValuePtr data);
|
|
|
|
struct {
|
|
const char *type;
|
|
@@ -73,6 +76,9 @@ struct {
|
|
{ "VNC_INITIALIZED", qemuMonitorJSONHandleVNCInitialize, },
|
|
{ "VNC_DISCONNECTED", qemuMonitorJSONHandleVNCDisconnect, },
|
|
{ "BLOCK_JOB_COMPLETED", qemuMonitorJSONHandleBlockJob, },
|
|
+ { "SPICE_CONNECTED", qemuMonitorJSONHandleSPICEConnect, },
|
|
+ { "SPICE_INITIALIZED", qemuMonitorJSONHandleSPICEInitialize, },
|
|
+ { "SPICE_DISCONNECTED", qemuMonitorJSONHandleSPICEDisconnect, },
|
|
};
|
|
|
|
|
|
@@ -617,7 +623,7 @@ VIR_ENUM_DECL(qemuMonitorGraphicsAddressFamily)
|
|
VIR_ENUM_IMPL(qemuMonitorGraphicsAddressFamily, VIR_DOMAIN_EVENT_GRAPHICS_ADDRESS_IPV6 + 1,
|
|
"ipv4", "ipv6");
|
|
|
|
-static void qemuMonitorJSONHandleVNC(qemuMonitorPtr mon, virJSONValuePtr data, int phase)
|
|
+static void qemuMonitorJSONHandleGraphics(qemuMonitorPtr mon, virJSONValuePtr data, int phase)
|
|
{
|
|
const char *localNode, *localService, *localFamily;
|
|
const char *remoteNode, *remoteService, *remoteFamily;
|
|
@@ -636,14 +642,38 @@ static void qemuMonitorJSONHandleVNC(qemuMonitorPtr mon, virJSONValuePtr data, i
|
|
}
|
|
|
|
authScheme = virJSONValueObjectGetString(server, "auth");
|
|
+ if (!authScheme) {
|
|
+ VIR_WARN("missing auth scheme in graphics event");
|
|
+ return;
|
|
+ }
|
|
|
|
localFamily = virJSONValueObjectGetString(server, "family");
|
|
+ if (!localFamily) {
|
|
+ VIR_WARN("missing local address family in graphics event");
|
|
+ return;
|
|
+ }
|
|
localNode = virJSONValueObjectGetString(server, "host");
|
|
+ if (!localNode) {
|
|
+ VIR_WARN("missing local hostname in graphics event");
|
|
+ return;
|
|
+ }
|
|
localService = virJSONValueObjectGetString(server, "service");
|
|
+ if (!localService)
|
|
+ localService = ""; /* Spice has multiple ports, so this isn't provided */
|
|
|
|
remoteFamily = virJSONValueObjectGetString(client, "family");
|
|
+ if (!remoteFamily) {
|
|
+ VIR_WARN("missing remote address family in graphics event");
|
|
+ return;
|
|
+ }
|
|
remoteNode = virJSONValueObjectGetString(client, "host");
|
|
+ if (!remoteNode) {
|
|
+ VIR_WARN("missing remote hostname in graphics event");
|
|
+ return;
|
|
+ }
|
|
remoteService = virJSONValueObjectGetString(client, "service");
|
|
+ if (!remoteService)
|
|
+ remoteService = ""; /* Spice has multiple ports, so this isn't provided */
|
|
|
|
saslUsername = virJSONValueObjectGetString(client, "sasl_username");
|
|
x509dname = virJSONValueObjectGetString(client, "x509_dname");
|
|
@@ -665,19 +695,37 @@ static void qemuMonitorJSONHandleVNC(qemuMonitorPtr mon, virJSONValuePtr data, i
|
|
|
|
static void qemuMonitorJSONHandleVNCConnect(qemuMonitorPtr mon, virJSONValuePtr data)
|
|
{
|
|
- qemuMonitorJSONHandleVNC(mon, data, VIR_DOMAIN_EVENT_GRAPHICS_CONNECT);
|
|
+ qemuMonitorJSONHandleGraphics(mon, data, VIR_DOMAIN_EVENT_GRAPHICS_CONNECT);
|
|
}
|
|
|
|
|
|
static void qemuMonitorJSONHandleVNCInitialize(qemuMonitorPtr mon, virJSONValuePtr data)
|
|
{
|
|
- qemuMonitorJSONHandleVNC(mon, data, VIR_DOMAIN_EVENT_GRAPHICS_INITIALIZE);
|
|
+ qemuMonitorJSONHandleGraphics(mon, data, VIR_DOMAIN_EVENT_GRAPHICS_INITIALIZE);
|
|
}
|
|
|
|
|
|
static void qemuMonitorJSONHandleVNCDisconnect(qemuMonitorPtr mon, virJSONValuePtr data)
|
|
{
|
|
- qemuMonitorJSONHandleVNC(mon, data, VIR_DOMAIN_EVENT_GRAPHICS_DISCONNECT);
|
|
+ qemuMonitorJSONHandleGraphics(mon, data, VIR_DOMAIN_EVENT_GRAPHICS_DISCONNECT);
|
|
+}
|
|
+
|
|
+
|
|
+static void qemuMonitorJSONHandleSPICEConnect(qemuMonitorPtr mon, virJSONValuePtr data)
|
|
+{
|
|
+ qemuMonitorJSONHandleGraphics(mon, data, VIR_DOMAIN_EVENT_GRAPHICS_CONNECT);
|
|
+}
|
|
+
|
|
+
|
|
+static void qemuMonitorJSONHandleSPICEInitialize(qemuMonitorPtr mon, virJSONValuePtr data)
|
|
+{
|
|
+ qemuMonitorJSONHandleGraphics(mon, data, VIR_DOMAIN_EVENT_GRAPHICS_INITIALIZE);
|
|
+}
|
|
+
|
|
+
|
|
+static void qemuMonitorJSONHandleSPICEDisconnect(qemuMonitorPtr mon, virJSONValuePtr data)
|
|
+{
|
|
+ qemuMonitorJSONHandleGraphics(mon, data, VIR_DOMAIN_EVENT_GRAPHICS_DISCONNECT);
|
|
}
|
|
|
|
static void qemuMonitorJSONHandleBlockJob(qemuMonitorPtr mon, virJSONValuePtr data)
|
|
--
|
|
1.7.7.6
|
|
|