diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index d9814dd8f6..8c12690753 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -3621,7 +3621,7 @@ qemu-kvm -net nic,model=? /dev/null
...
<devices>
<graphics type='sdl' display=':0.0'/>
- <graphics type='vnc' port='5904'>
+ <graphics type='vnc' port='5904' sharePolicy='allow-exclusive'>
<listen type='address' address='1.2.3.4'/>
</graphics>
<graphics type='rdp' autoport='yes' multiUser='yes' />
@@ -3664,7 +3664,16 @@ qemu-kvm -net nic,model=? /dev/null
allows control of connected client during password changes.
VNC accepts keep
value only.
since 0.9.3
- NB, this may not be supported by all hypervisors.
+ NB, this may not be supported by all hypervisors.
+ The optional sharePolicy
attribute specifies vnc server
+ display sharing policy. "allow-exclusive" allows clients to ask
+ for exclusive access by dropping other connections. Connecting
+ multiple clients in parallel requires all clients asking for a
+ shared session (vncviewer: -Shared switch). This is the default
+ value. "force-shared" disables exclusive client access, every
+ connection has to specify -Shared switch for vncviewer. "ignore"
+ welcomes every connection unconditionally
+ since 1.0.6.
Rather than using listen/port, QEMU supports a
socket
attribute for listening on a unix
domain socket path.Since 0.8.8
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index b53099b005..939654f4ea 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -2135,6 +2135,15 @@
+
+
+
+ allow-exclusive
+ force-shared
+ ignore
+
+
+
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 3a25acc4df..746f0d061c 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -515,6 +515,13 @@ VIR_ENUM_IMPL(virDomainGraphicsAuthConnected,
"disconnect",
"keep")
+VIR_ENUM_IMPL(virDomainGraphicsVNCSharePolicy,
+ VIR_DOMAIN_GRAPHICS_VNC_SHARE_LAST,
+ "default",
+ "allow-exclusive",
+ "force-shared",
+ "ignore")
+
VIR_ENUM_IMPL(virDomainGraphicsSpiceChannelName,
VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_LAST,
"main",
@@ -7727,6 +7734,7 @@ virDomainGraphicsDefParseXML(xmlNodePtr node,
if (def->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC) {
char *port = virXMLPropString(node, "port");
char *websocket = virXMLPropString(node, "websocket");
+ char *sharePolicy = virXMLPropString(node, "sharePolicy");
char *autoport;
if (port) {
@@ -7769,6 +7777,21 @@ virDomainGraphicsDefParseXML(xmlNodePtr node,
VIR_FREE(websocket);
}
+ if (sharePolicy) {
+ int policy =
+ virDomainGraphicsVNCSharePolicyTypeFromString(sharePolicy);
+
+ if (policy < 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("unknown vnc display sharing policy '%s'"), sharePolicy);
+ VIR_FREE(sharePolicy);
+ goto error;
+ } else {
+ def->data.vnc.sharePolicy = policy;
+ }
+ VIR_FREE(sharePolicy);
+ }
+
def->data.vnc.socket = virXMLPropString(node, "socket");
def->data.vnc.keymap = virXMLPropString(node, "keymap");
@@ -15304,6 +15327,11 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
virBufferEscapeString(buf, " keymap='%s'",
def->data.vnc.keymap);
+ if (def->data.vnc.sharePolicy)
+ virBufferAsprintf(buf, " sharePolicy='%s'",
+ virDomainGraphicsVNCSharePolicyTypeToString(
+ def->data.vnc.sharePolicy));
+
virDomainGraphicsAuthDefFormatAttr(buf, &def->data.vnc.auth, flags);
break;
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index a38bdbe21c..f9f3994fbc 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1288,6 +1288,15 @@ enum virDomainGraphicsType {
VIR_DOMAIN_GRAPHICS_TYPE_LAST
};
+enum virDomainGraphicsVNCSharePolicy {
+ VIR_DOMAIN_GRAPHICS_VNC_SHARE_DEFAULT = 0,
+ VIR_DOMAIN_GRAPHICS_VNC_SHARE_ALLOW_EXCLUSIVE,
+ VIR_DOMAIN_GRAPHICS_VNC_SHARE_FORCE_SHARED,
+ VIR_DOMAIN_GRAPHICS_VNC_SHARE_IGNORE,
+
+ VIR_DOMAIN_GRAPHICS_VNC_SHARE_LAST
+};
+
enum virDomainGraphicsAuthConnectedType {
VIR_DOMAIN_GRAPHICS_AUTH_CONNECTED_DEFAULT = 0,
VIR_DOMAIN_GRAPHICS_AUTH_CONNECTED_FAIL,
@@ -1427,6 +1436,7 @@ struct _virDomainGraphicsDef {
char *keymap;
char *socket;
virDomainGraphicsAuthDef auth;
+ int sharePolicy;
} vnc;
struct {
char *display;
@@ -2532,6 +2542,7 @@ VIR_ENUM_DECL(virDomainGraphicsSpicePlaybackCompression)
VIR_ENUM_DECL(virDomainGraphicsSpiceStreamingMode)
VIR_ENUM_DECL(virDomainGraphicsSpiceClipboardCopypaste)
VIR_ENUM_DECL(virDomainGraphicsSpiceMouseMode)
+VIR_ENUM_DECL(virDomainGraphicsVNCSharePolicy)
VIR_ENUM_DECL(virDomainHyperv)
VIR_ENUM_DECL(virDomainRNGModel)
VIR_ENUM_DECL(virDomainRNGBackend)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index a81a86532f..9d5f74b725 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -203,6 +203,8 @@ virDomainGraphicsSpiceZlibCompressionTypeFromString;
virDomainGraphicsSpiceZlibCompressionTypeToString;
virDomainGraphicsTypeFromString;
virDomainGraphicsTypeToString;
+virDomainGraphicsVNCSharePolicyTypeFromString;
+virDomainGraphicsVNCSharePolicyTypeToString;
virDomainHasDiskMirror;
virDomainHostdevCapsTypeToString;
virDomainHostdevDefAlloc;