]> xenbits.xensource.com Git - libvirt.git/commitdiff
conf: add 'sharePolicy' attribute to graphics element for vnc
authorGuannan Ren <gren@redhat.com>
Tue, 21 May 2013 14:31:48 +0000 (22:31 +0800)
committerGuannan Ren <gren@redhat.com>
Wed, 22 May 2013 11:18:43 +0000 (19:18 +0800)
 -vnc :5900,share=allow-exclusive
allows clients to ask for exclusive access which is
implemented by dropping other connections Connecting
multiple clients in parallel requires all clients asking
for a shared session (vncviewer: -shared switch)

 -vnc :5900,share=force-shared
disables exclusive client access.  Useful for shared
desktop sessions, where you don't want someone forgetting
specify -shared disconnect everybody else.

 -vnc :5900,share=ignore
completely ignores the shared flag and allows everybody
connect unconditionally

docs/formatdomain.html.in
docs/schemas/domaincommon.rng
src/conf/domain_conf.c
src/conf/domain_conf.h
src/libvirt_private.syms

index d9814dd8f6738c562405970fb7b0571164b804e6..8c12690753664db2e3a7d06bff97b1a99c3c46ee 100644 (file)
@@ -3621,7 +3621,7 @@ qemu-kvm -net nic,model=? /dev/null
   ...
   &lt;devices&gt;
     &lt;graphics type='sdl' display=':0.0'/&gt;
-    &lt;graphics type='vnc' port='5904'&gt;
+    &lt;graphics type='vnc' port='5904' sharePolicy='allow-exclusive'&gt;
       &lt;listen type='address' address='1.2.3.4'/&gt;
     &lt;/graphics&gt;
     &lt;graphics type='rdp' autoport='yes' multiUser='yes' /&gt;
@@ -3664,7 +3664,16 @@ qemu-kvm -net nic,model=? /dev/null
             allows control of connected client during password changes.
             VNC accepts <code>keep</code> value only.
             <span class="since">since 0.9.3</span>
-            NB, this may not be supported by all hypervisors.<br/>  <br/>
+            NB, this may not be supported by all hypervisors.<br/>
+            The optional <code>sharePolicy</code> 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
+            <span class="since">since 1.0.6</span>. <br/> <br/>
             Rather than using listen/port, QEMU supports a
             <code>socket</code> attribute for listening on a unix
             domain socket path.<span class="since">Since 0.8.8</span>
index b53099b005ed4dfbbc134633bbcae73cffbdc914..939654f4eac8badf7cfc0c5ba58dfaabf25b9cc0 100644 (file)
                   <ref name="addrIPorName"/>
                 </attribute>
               </optional>
+              <optional>
+                <attribute name='sharePolicy'>
+                  <choice>
+                    <value>allow-exclusive</value>
+                    <value>force-shared</value>
+                    <value>ignore</value>
+                  </choice>
+                </attribute>
+              </optional>
             </group>
             <group>
               <optional>
index 3a25acc4df46dc8af12a556fb1ac01c58b37ef7f..746f0d061cd9b078d1f00afd1c386927c21cb1f8 100644 (file)
@@ -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;
 
index a38bdbe21c9225870532fcf5d59cc1c0883c28da..f9f3994fbc61a55f31b0ae32dc30bec7160ee9d9 100644 (file)
@@ -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)
index a81a86532ffc29a04d170e25fed9e5bfc88df144..9d5f74b7254d079edacff6c0a67f08dfd8906fe5 100644 (file)
@@ -203,6 +203,8 @@ virDomainGraphicsSpiceZlibCompressionTypeFromString;
 virDomainGraphicsSpiceZlibCompressionTypeToString;
 virDomainGraphicsTypeFromString;
 virDomainGraphicsTypeToString;
+virDomainGraphicsVNCSharePolicyTypeFromString;
+virDomainGraphicsVNCSharePolicyTypeToString;
 virDomainHasDiskMirror;
 virDomainHostdevCapsTypeToString;
 virDomainHostdevDefAlloc;