VNC graphics already supports sockets but only via 'socket' attribute.
This patch coverts that attribute into listen type 'socket'.
For backward compatibility we need to handle listen type 'socket' and
'socket'
attribute properly to support old XMLs and new XMLs. If both are provided they
have to match, if only one of them is provided we need to be able to parse that
configuration too.
To not break migration back to old libvirt if the socket is provided by user we
need to generate migratable XML without the listen element and use only 'socket'
attribute.
Signed-off-by: Pavel Hrdina <phrdina(a)redhat.com>
---
docs/formatdomain.html.in | 8 ++
src/conf/domain_conf.c | 103 +++++++++++++++++----
src/conf/domain_conf.h | 2 -
src/qemu/qemu_command.c | 22 ++++-
src/qemu/qemu_domain.c | 28 ++++--
src/qemu/qemu_parse_command.c | 2 +-
src/qemu/qemu_process.c | 10 +-
...ric-graphics-vnc-socket-attr-listen-address.xml | 30 ++++++
...hics-vnc-socket-attr-listen-socket-mismatch.xml | 30 ++++++
...eric-graphics-vnc-socket-attr-listen-socket.xml | 30 ++++++
...ric-graphics-vnc-socket-attr-listen-address.xml | 30 ++++++
...eric-graphics-vnc-socket-attr-listen-socket.xml | 30 ++++++
.../generic-graphics-vnc-socket-listen.xml | 4 +-
.../generic-graphics-vnc-socket.xml | 4 +-
tests/genericxml2xmltest.c | 4 +
.../qemuargv2xml-graphics-vnc-socket.xml | 4 +-
.../qemuxml2argv-graphics-vnc-auto-socket.args | 20 ++++
.../qemuxml2argv-graphics-vnc-auto-socket.xml | 30 ++++++
.../qemuxml2argv-graphics-vnc-socket.args | 4 +-
.../qemuxml2argv-graphics-vnc-socket.xml | 10 +-
tests/qemuxml2argvtest.c | 2 +
.../qemuxml2xmlout-graphics-vnc-auto-socket.xml | 35 +++++++
...graphics-vnc-remove-generated-socket-active.xml | 4 +-
.../qemuxml2xmlout-graphics-vnc-socket.xml | 35 +++++++
tests/qemuxml2xmltest.c | 2 +
25 files changed, 426 insertions(+), 57 deletions(-)
create mode 100644
tests/genericxml2xmlindata/generic-graphics-vnc-socket-attr-listen-address.xml
create mode 100644
tests/genericxml2xmlindata/generic-graphics-vnc-socket-attr-listen-socket-mismatch.xml
create mode 100644
tests/genericxml2xmlindata/generic-graphics-vnc-socket-attr-listen-socket.xml
create mode 100644
tests/genericxml2xmloutdata/generic-graphics-vnc-socket-attr-listen-address.xml
create mode 100644
tests/genericxml2xmloutdata/generic-graphics-vnc-socket-attr-listen-socket.xml
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-auto-socket.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-auto-socket.xml
create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-vnc-auto-socket.xml
create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-vnc-socket.xml
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 5dd0e78..bce3808 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -5366,6 +5366,14 @@ qemu-kvm -net nic,model=? /dev/null
This listen type tells a graphics server to listen on unix socket.
Attribute <code>socket</code> contains a path to unix socket. If
this
attribute is omitted libvirt will generate this path for you.
+ Supported by graphics type <code>vnc</code>.
+ </p>
+ <p>
+ For <code>vnc</code> graphics be backward compatible
+ the <code>socket</code> attribute of first
<code>listen</code> element
+ is duplicated as <code>socket</code> attribute in
<code>graphics</code>
+ element. If <code>graphics</code> element contains a
<code>socket</code>
+ attribute all <code>listen</code> elements are ignored.
</p>
</dd>
</dl>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 0adf885..96d939e 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1244,7 +1244,6 @@ void virDomainGraphicsDefFree(virDomainGraphicsDefPtr def)
switch (def->type) {
case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
- VIR_FREE(def->data.vnc.socket);
VIR_FREE(def->data.vnc.keymap);
virDomainGraphicsAuthDefClear(&def->data.vnc.auth);
break;
@@ -10921,11 +10920,14 @@ virDomainGraphicsListenDefParseXML(virDomainGraphicsListenDefPtr
def,
char *socket = virXMLPropString(node, "socket");
char *fromConfig = virXMLPropString(node, "fromConfig");
char *addressCompat = NULL;
+ char *socketCompat = NULL;
const char *graphicsType = virDomainGraphicsTypeToString(graphics->type);
int tmp, typeVal;
- if (parent)
+ if (parent) {
addressCompat = virXMLPropString(parent, "listen");
+ socketCompat = virXMLPropString(parent, "socket");
+ }
if (!type) {
virReportError(VIR_ERR_XML_ERROR, "%s",
@@ -10940,7 +10942,8 @@ virDomainGraphicsListenDefParseXML(virDomainGraphicsListenDefPtr
def,
}
def->type = typeVal;
- if (def->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET) {
+ if (def->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET &&
+ graphics->type != VIR_DOMAIN_GRAPHICS_TYPE_VNC) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("listen type 'socket' is not available for "
"graphics type '%s'"), graphicsType);
@@ -10962,6 +10965,21 @@ virDomainGraphicsListenDefParseXML(virDomainGraphicsListenDefPtr
def,
}
}
+ if (def->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET) {
+ if (socket && socketCompat && STRNEQ(socket, socketCompat)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("graphics 'socket' attribute '%s' must
match "
+ "'socket' attribute of first listen element
"
+ "(found '%s')"), socketCompat, socket);
+ goto error;
+ }
+
+ if (!socket) {
+ socket = socketCompat;
+ socketCompat = NULL;
+ }
+ }
+
if (address && address[0] &&
(def->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS ||
(def->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK &&
@@ -11013,6 +11031,7 @@ virDomainGraphicsListenDefParseXML(virDomainGraphicsListenDefPtr
def,
VIR_FREE(socket);
VIR_FREE(fromConfig);
VIR_FREE(addressCompat);
+ VIR_FREE(socketCompat);
return ret;
}
@@ -11032,12 +11051,6 @@ virDomainGraphicsListensParseXML(virDomainGraphicsDefPtr def,
ctxt->node = node;
- if (def->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
- (socketPath = virXMLPropString(node, "socket"))) {
- ret = 0;
- goto error;
- }
-
/* parse the <listen> subelements for graphics types that support it */
nListens = virXPathNodeSet("./listen", ctxt, &listenNodes);
if (nListens < 0)
@@ -11059,16 +11072,43 @@ virDomainGraphicsListensParseXML(virDomainGraphicsDefPtr def,
def->nListens++;
}
VIR_FREE(listenNodes);
+ }
+
+ /* If no <listen/> element was found in XML for backward compatibility
+ * we should try to parse 'listen' or 'socket' attribute from
<graphics/>
+ * element. */
+ if (def->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC)
+ socketPath = virXMLPropString(node, "socket");
+
+ if (socketPath) {
+ newListen.type = VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET;
+ newListen.socket = socketPath;
+ socketPath = NULL;
} else {
- /* If no <listen/> element was found in XML for backward compatibility
- * we should try to parse 'listen' attribute from <graphics/>
element. */
newListen.type = VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS;
newListen.address = virXMLPropString(node, "listen");
if (STREQ_NULLABLE(newListen.address, ""))
VIR_FREE(newListen.address);
+ }
+ /* If no <listen/> element was found add a new one created by parsing
+ * <graphics/> element. */
+ if (def->nListens == 0) {
if (VIR_APPEND_ELEMENT(def->listens, def->nListens, newListen) < 0)
goto error;
+ } else {
+ virDomainGraphicsListenDefPtr glisten = &def->listens[0];
+
+ /* If the first <listen/> element is 'address' or 'network'
and we found
+ * 'socket' attribute inside <graphics/> element for backward
+ * compatibility we need to replace the first listen by
+ * <listen type='socket' .../> element based on the
'socket' attribite. */
+ if ((glisten->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS ||
+ glisten->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK) &&
+ newListen.type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET) {
+ virDomainGraphicsListenDefClear(glisten);
+ *glisten = newListen;
+ }
}
ret = 0;
@@ -11146,7 +11186,6 @@ virDomainGraphicsDefParseXMLVNC(virDomainGraphicsDefPtr def,
}
}
- def->data.vnc.socket = virXMLPropString(node, "socket");
def->data.vnc.keymap = virXMLPropString(node, "keymap");
if (virDomainGraphicsAuthDefParseXML(node, &def->data.vnc.auth,
@@ -21796,11 +21835,21 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
switch (def->type) {
case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
- if (def->data.vnc.socket) {
- if (!def->data.vnc.socketFromConfig ||
- !(flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE)) {
- virBufferEscapeString(buf, " socket='%s'",
- def->data.vnc.socket);
+ if (!glisten) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("missing listen element for graphics"));
+ return -1;
+ }
+
+ if (glisten->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET) {
+ /* To not break migration we shouldn't print the 'socket'
attribute
+ * if it's auto-generated or if it's based on config option from
+ * qemu.conf. If the socket is provided by user we need to print it
+ * into migratable XML. */
+ if (glisten->socket &&
+ !((glisten->autoGenerated || glisten->fromConfig) &&
+ (flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE))) {
+ virBufferEscapeString(buf, " socket='%s'",
glisten->socket);
}
} else {
if (def->data.vnc.port &&
@@ -21906,9 +21955,23 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
for (i = 0; i < def->nListens; i++) {
if (def->listens[i].type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE)
continue;
- if (flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE &&
- def->listens[i].fromConfig)
- continue;
+ if (flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE) {
+ /* If the listen is based on config options from qemu.conf we need
+ * to skip it. It's up to user to properly configure both host for
+ * migration. */
+ if (def->listens[i].fromConfig)
+ continue;
+
+ /* If the socket is provided by user in the XML we need to skip this
+ * listen type to support migration back to old libvirt since old
+ * libvirt supports specifying socket path inside graphics element
+ * as 'socket' attribute. Auto-generated socket is a new feature
+ * thus we can generate it in the migrateble XML. */
+ if (def->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
+ def->listens[i].type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET
&&
+ !def->listens[i].autoGenerated)
+ continue;
+ }
if (!children) {
virBufferAddLit(buf, ">\n");
virBufferAdjustIndent(buf, 2);
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 05dbfc2..3792562 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1454,8 +1454,6 @@ struct _virDomainGraphicsDef {
int websocket;
bool autoport;
char *keymap;
- char *socket;
- bool socketFromConfig;
virDomainGraphicsAuthDef auth;
int sharePolicy;
} vnc;
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 6a086eb..1d25655 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -7224,13 +7224,20 @@ qemuBuildGraphicsVNCCommandLine(virQEMUDriverConfigPtr cfg,
goto error;
}
- glisten = virDomainGraphicsGetListen(graphics, 0);
+ if (!(glisten = virDomainGraphicsGetListen(graphics, 0))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("missing listen element"));
+ goto error;
+ }
- if (graphics->data.vnc.socket) {
+ switch (glisten->type) {
+ case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET:
virBufferAddLit(&opt, "unix:");
- qemuBufferEscapeComma(&opt, graphics->data.vnc.socket);
+ qemuBufferEscapeComma(&opt, glisten->socket);
+ break;
- } else {
+ case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS:
+ case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK:
if (!graphics->data.vnc.autoport &&
(graphics->data.vnc.port < 5900 ||
graphics->data.vnc.port > 65535)) {
@@ -7239,7 +7246,7 @@ qemuBuildGraphicsVNCCommandLine(virQEMUDriverConfigPtr cfg,
goto error;
}
- if (glisten && glisten->address) {
+ if (glisten->address) {
escapeAddr = strchr(glisten->address, ':') != NULL;
if (escapeAddr)
virBufferAsprintf(&opt, "[%s]", glisten->address);
@@ -7258,6 +7265,11 @@ qemuBuildGraphicsVNCCommandLine(virQEMUDriverConfigPtr cfg,
}
virBufferAsprintf(&opt, ",websocket=%d",
graphics->data.vnc.websocket);
}
+ break;
+
+ case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE:
+ case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST:
+ break;
}
if (graphics->data.vnc.sharePolicy) {
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index f8ac008..c244dd9 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -2085,20 +2085,30 @@ qemuDomainRecheckInternalPaths(virDomainDefPtr def,
unsigned int flags)
{
size_t i = 0;
+ size_t j = 0;
for (i = 0; i < def->ngraphics; ++i) {
virDomainGraphicsDefPtr graphics = def->graphics[i];
- if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
- graphics->data.vnc.socket &&
- STRPREFIX(graphics->data.vnc.socket, cfg->libDir)) {
- if (flags & VIR_DOMAIN_DEF_PARSE_INACTIVE) {
- VIR_FREE(graphics->data.vnc.socket);
- if (virDomainGraphicsListenAppendAddress(graphics, NULL) < 0)
- return -1;
+ for (j = 0; j < graphics->nListens; ++j) {
+ virDomainGraphicsListenDefPtr glisten = &graphics->listens[j];
+
+ /* This will happen only if we parse XML from old libvirts where
+ * unix socket was available only for VNC graphics. In this
+ * particular case we should follow the behavior and if we remove
+ * the auto-generated socket base on config option from qemu.conf
+ * we need to change the listen type to address. */
+ if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
+ glisten->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET &&
+ glisten->socket &&
+ STRPREFIX(glisten->socket, cfg->libDir)) {
+ if (flags & VIR_DOMAIN_DEF_PARSE_INACTIVE) {
+ VIR_FREE(glisten->socket);
+ glisten->type = VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS;
+ } else {
+ glisten->fromConfig = true;
+ }
}
- else
- graphics->data.vnc.socketFromConfig = true;
}
}
diff --git a/src/qemu/qemu_parse_command.c b/src/qemu/qemu_parse_command.c
index 4fafdf2..927bd79 100644
--- a/src/qemu/qemu_parse_command.c
+++ b/src/qemu/qemu_parse_command.c
@@ -509,7 +509,7 @@ qemuParseCommandLineVnc(virDomainDefPtr def,
if (STRPREFIX(val, "unix:")) {
/* -vnc unix:/some/big/path */
- if (VIR_STRDUP(vnc->data.vnc.socket, val + 5) < 0)
+ if (virDomainGraphicsListenAppendSocket(vnc, val + 5) < 0)
goto cleanup;
} else {
/*
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 5e66c31..3eb1403 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -3469,9 +3469,6 @@ qemuProcessVNCAllocatePorts(virQEMUDriverPtr driver,
{
unsigned short port;
- if (graphics->data.vnc.socket)
- return 0;
-
if (!allocate) {
if (graphics->data.vnc.autoport)
graphics->data.vnc.port = 5900;
@@ -4058,11 +4055,12 @@ qemuProcessGraphicsSetupListen(virQEMUDriverConfigPtr cfg,
* *_auto_unix_socket set we should use unix socket as
* default instead of tcp listen. */
if (useSocket) {
- VIR_DELETE_ELEMENT(graphics->listens, i, graphics->nListens);
- if (virAsprintf(&graphics->data.vnc.socket,
"%s/%s.sock",
+ memset(glisten, 0, sizeof(virDomainGraphicsListenDef));
+ if (virAsprintf(&glisten->socket, "%s/%s.sock",
priv->libDir, type) < 0)
return -1;
- graphics->data.vnc.socketFromConfig = true;
+ glisten->fromConfig = true;
+ glisten->type = VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET;
} else if (listenAddr) {
if (VIR_STRDUP(glisten->address, listenAddr) < 0)
return -1;
diff --git
a/tests/genericxml2xmlindata/generic-graphics-vnc-socket-attr-listen-address.xml
b/tests/genericxml2xmlindata/generic-graphics-vnc-socket-attr-listen-address.xml
new file mode 100644
index 0000000..a32c20b
--- /dev/null
+++ b/tests/genericxml2xmlindata/generic-graphics-vnc-socket-attr-listen-address.xml
@@ -0,0 +1,30 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='i686' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu</emulator>
+ <controller type='usb' index='0'/>
+ <controller type='ide' index='0'/>
+ <controller type='pci' index='0' model='pci-root'/>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <graphics type='vnc' socket='/tmp/vnc.sock'>
+ <listen type='address' address='0.0.0.0'/>
+ </graphics>
+ <video>
+ <model type='cirrus' vram='16384' heads='1'/>
+ </video>
+ <memballoon model='none'/>
+ </devices>
+</domain>
diff --git
a/tests/genericxml2xmlindata/generic-graphics-vnc-socket-attr-listen-socket-mismatch.xml
b/tests/genericxml2xmlindata/generic-graphics-vnc-socket-attr-listen-socket-mismatch.xml
new file mode 100644
index 0000000..980b64c
--- /dev/null
+++
b/tests/genericxml2xmlindata/generic-graphics-vnc-socket-attr-listen-socket-mismatch.xml
@@ -0,0 +1,30 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='i686' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu</emulator>
+ <controller type='usb' index='0'/>
+ <controller type='ide' index='0'/>
+ <controller type='pci' index='0' model='pci-root'/>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <graphics type='vnc' socket='/tmp/vnc.sock'>
+ <listen type='socket' socket='/tmp/mismatch.sock'/>
+ </graphics>
+ <video>
+ <model type='cirrus' vram='16384' heads='1'/>
+ </video>
+ <memballoon model='none'/>
+ </devices>
+</domain>
diff --git a/tests/genericxml2xmlindata/generic-graphics-vnc-socket-attr-listen-socket.xml
b/tests/genericxml2xmlindata/generic-graphics-vnc-socket-attr-listen-socket.xml
new file mode 100644
index 0000000..ea3efca
--- /dev/null
+++ b/tests/genericxml2xmlindata/generic-graphics-vnc-socket-attr-listen-socket.xml
@@ -0,0 +1,30 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='i686' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu</emulator>
+ <controller type='usb' index='0'/>
+ <controller type='ide' index='0'/>
+ <controller type='pci' index='0' model='pci-root'/>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <graphics type='vnc' socket='/tmp/vnc.sock'>
+ <listen type='socket' socket='/tmp/vnc.sock'/>
+ </graphics>
+ <video>
+ <model type='cirrus' vram='16384' heads='1'/>
+ </video>
+ <memballoon model='none'/>
+ </devices>
+</domain>
diff --git
a/tests/genericxml2xmloutdata/generic-graphics-vnc-socket-attr-listen-address.xml
b/tests/genericxml2xmloutdata/generic-graphics-vnc-socket-attr-listen-address.xml
new file mode 100644
index 0000000..f205e13
--- /dev/null
+++ b/tests/genericxml2xmloutdata/generic-graphics-vnc-socket-attr-listen-address.xml
@@ -0,0 +1,30 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='i686' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu</emulator>
+ <controller type='usb' index='0'/>
+ <controller type='ide' index='0'/>
+ <controller type='pci' index='0' model='pci-root'/>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <graphics type='vnc' socket='/tmp/vnc.sock'>
+ <listen type='socket' socket='/tmp/vnc.sock'/>
+ </graphics>
+ <video>
+ <model type='cirrus' vram='16384' heads='1'
primary='yes'/>
+ </video>
+ <memballoon model='none'/>
+ </devices>
+</domain>
diff --git
a/tests/genericxml2xmloutdata/generic-graphics-vnc-socket-attr-listen-socket.xml
b/tests/genericxml2xmloutdata/generic-graphics-vnc-socket-attr-listen-socket.xml
new file mode 100644
index 0000000..f205e13
--- /dev/null
+++ b/tests/genericxml2xmloutdata/generic-graphics-vnc-socket-attr-listen-socket.xml
@@ -0,0 +1,30 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='i686' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu</emulator>
+ <controller type='usb' index='0'/>
+ <controller type='ide' index='0'/>
+ <controller type='pci' index='0' model='pci-root'/>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <graphics type='vnc' socket='/tmp/vnc.sock'>
+ <listen type='socket' socket='/tmp/vnc.sock'/>
+ </graphics>
+ <video>
+ <model type='cirrus' vram='16384' heads='1'
primary='yes'/>
+ </video>
+ <memballoon model='none'/>
+ </devices>
+</domain>
diff --git a/tests/genericxml2xmloutdata/generic-graphics-vnc-socket-listen.xml
b/tests/genericxml2xmloutdata/generic-graphics-vnc-socket-listen.xml
index d8742c6..cb4e5ac 100644
--- a/tests/genericxml2xmloutdata/generic-graphics-vnc-socket-listen.xml
+++ b/tests/genericxml2xmloutdata/generic-graphics-vnc-socket-listen.xml
@@ -19,7 +19,9 @@
<controller type='pci' index='0' model='pci-root'/>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
- <graphics type='vnc' socket='/tmp/QEMUGuest1-vnc.sock'/>
+ <graphics type='vnc' socket='/tmp/QEMUGuest1-vnc.sock'>
+ <listen type='socket' socket='/tmp/QEMUGuest1-vnc.sock'/>
+ </graphics>
<video>
<model type='cirrus' vram='16384' heads='1'
primary='yes'/>
</video>
diff --git a/tests/genericxml2xmloutdata/generic-graphics-vnc-socket.xml
b/tests/genericxml2xmloutdata/generic-graphics-vnc-socket.xml
index d8742c6..cb4e5ac 100644
--- a/tests/genericxml2xmloutdata/generic-graphics-vnc-socket.xml
+++ b/tests/genericxml2xmloutdata/generic-graphics-vnc-socket.xml
@@ -19,7 +19,9 @@
<controller type='pci' index='0' model='pci-root'/>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
- <graphics type='vnc' socket='/tmp/QEMUGuest1-vnc.sock'/>
+ <graphics type='vnc' socket='/tmp/QEMUGuest1-vnc.sock'>
+ <listen type='socket' socket='/tmp/QEMUGuest1-vnc.sock'/>
+ </graphics>
<video>
<model type='cirrus' vram='16384' heads='1'
primary='yes'/>
</video>
diff --git a/tests/genericxml2xmltest.c b/tests/genericxml2xmltest.c
index 70ecd2d..a193a33 100644
--- a/tests/genericxml2xmltest.c
+++ b/tests/genericxml2xmltest.c
@@ -87,6 +87,10 @@ mymain(void)
DO_TEST_DIFFERENT("graphics-vnc-listen-attr-only");
DO_TEST_DIFFERENT("graphics-vnc-listen-element-minimal");
DO_TEST_DIFFERENT("graphics-vnc-listen-element-with-address");
+ DO_TEST_DIFFERENT("graphics-vnc-socket-attr-listen-address");
+ DO_TEST_DIFFERENT("graphics-vnc-socket-attr-listen-socket");
+ DO_TEST_FULL("graphics-vnc-socket-attr-listen-socket-mismatch", 0, false,
+ TEST_COMPARE_DOM_XML2XML_RESULT_FAIL_PARSE);
DO_TEST_FULL("name-slash-parse", 0, false,
TEST_COMPARE_DOM_XML2XML_RESULT_FAIL_PARSE);
diff --git a/tests/qemuargv2xmldata/qemuargv2xml-graphics-vnc-socket.xml
b/tests/qemuargv2xmldata/qemuargv2xml-graphics-vnc-socket.xml
index edbaab3..efd2601 100644
--- a/tests/qemuargv2xmldata/qemuargv2xml-graphics-vnc-socket.xml
+++ b/tests/qemuargv2xmldata/qemuargv2xml-graphics-vnc-socket.xml
@@ -29,7 +29,9 @@
</controller>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
- <graphics type='vnc' socket='/tmp/foo.socket'/>
+ <graphics type='vnc' socket='/tmp/foo.socket'>
+ <listen type='socket' socket='/tmp/foo.socket'/>
+ </graphics>
<video>
<model type='cirrus' vram='16384' heads='1'
primary='yes'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x02' function='0x0'/>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-auto-socket.args
b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-auto-socket.args
new file mode 100644
index 0000000..84ce727
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-auto-socket.args
@@ -0,0 +1,20 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/home/test \
+USER=test \
+LOGNAME=test \
+QEMU_AUDIO_DRV=none \
+/usr/bin/qemu \
+-name QEMUGuest1 \
+-S \
+-M pc \
+-m 214 \
+-smp 1 \
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
+-nodefaults \
+-monitor unix:/tmp/lib/domain--1-QEMUGuest1/monitor.sock,server,nowait \
+-no-acpi \
+-boot c \
+-usb \
+-vnc unix:/tmp/lib/domain--1-QEMUGuest1/vnc.sock \
+-vga cirrus
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-auto-socket.xml
b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-auto-socket.xml
new file mode 100644
index 0000000..3e455df
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-auto-socket.xml
@@ -0,0 +1,30 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='i686' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu</emulator>
+ <controller type='usb' index='0'/>
+ <controller type='ide' index='0'/>
+ <controller type='pci' index='0' model='pci-root'/>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <graphics type='vnc'>
+ <listen type='socket'/>
+ </graphics>
+ <video>
+ <model type='cirrus' vram='16384' heads='1'/>
+ </video>
+ <memballoon model='none'/>
+ </devices>
+</domain>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-socket.args
b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-socket.args
index 2464867..abf724c 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-socket.args
+++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-socket.args
@@ -16,7 +16,5 @@ QEMU_AUDIO_DRV=none \
-no-acpi \
-boot c \
-usb \
--drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \
--device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
--vnc unix:/tmp/foo.socket \
+-vnc unix:/tmp/vnc.sock \
-vga cirrus
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-socket.xml
b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-socket.xml
index de70bc4..522c3af 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-socket.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-socket.xml
@@ -14,18 +14,14 @@
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/qemu</emulator>
- <disk type='block' device='disk'>
- <driver name='qemu' type='raw'/>
- <source dev='/dev/HostVG/QEMUGuest1'/>
- <target dev='hda' bus='ide'/>
- <address type='drive' controller='0' bus='0'
target='0' unit='0'/>
- </disk>
<controller type='usb' index='0'/>
<controller type='ide' index='0'/>
<controller type='pci' index='0' model='pci-root'/>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
- <graphics type='vnc' socket='/tmp/foo.socket'/>
+ <graphics type='vnc'>
+ <listen type='socket' socket='/tmp/vnc.sock'/>
+ </graphics>
<video>
<model type='cirrus' vram='16384' heads='1'/>
</video>
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index f009d09..d47886c 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -901,6 +901,8 @@ mymain(void)
driver.config->vncAutoUnixSocket = true;
DO_TEST("graphics-vnc-auto-socket-cfg", QEMU_CAPS_VNC);
driver.config->vncAutoUnixSocket = false;
+ DO_TEST("graphics-vnc-socket", QEMU_CAPS_VNC);
+ DO_TEST("graphics-vnc-auto-socket", QEMU_CAPS_VNC);
driver.config->vncSASL = 1;
VIR_FREE(driver.config->vncSASLdir);
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-vnc-auto-socket.xml
b/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-vnc-auto-socket.xml
new file mode 100644
index 0000000..e14bbd1
--- /dev/null
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-vnc-auto-socket.xml
@@ -0,0 +1,35 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='i686' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu</emulator>
+ <controller type='usb' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x2'/>
+ </controller>
+ <controller type='ide' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x1'/>
+ </controller>
+ <controller type='pci' index='0' model='pci-root'/>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <graphics type='vnc'>
+ <listen type='socket'/>
+ </graphics>
+ <video>
+ <model type='cirrus' vram='16384' heads='1'
primary='yes'/>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x02' function='0x0'/>
+ </video>
+ <memballoon model='none'/>
+ </devices>
+</domain>
diff --git
a/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-vnc-remove-generated-socket-active.xml
b/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-vnc-remove-generated-socket-active.xml
index f3ccfdf..1aeffe8 100644
---
a/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-vnc-remove-generated-socket-active.xml
+++
b/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-vnc-remove-generated-socket-active.xml
@@ -29,7 +29,9 @@
<controller type='pci' index='0' model='pci-root'/>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
- <graphics type='vnc'
socket='/tmp/lib/domain-99-QEMUGuest1/delete.this.socket'/>
+ <graphics type='vnc'
socket='/tmp/lib/domain-99-QEMUGuest1/delete.this.socket'>
+ <listen type='socket'
socket='/tmp/lib/domain-99-QEMUGuest1/delete.this.socket'/>
+ </graphics>
<video>
<model type='cirrus' vram='16384' heads='1'
primary='yes'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x02' function='0x0'/>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-vnc-socket.xml
b/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-vnc-socket.xml
new file mode 100644
index 0000000..9a83328
--- /dev/null
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-vnc-socket.xml
@@ -0,0 +1,35 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='i686' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu</emulator>
+ <controller type='usb' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x2'/>
+ </controller>
+ <controller type='ide' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x1'/>
+ </controller>
+ <controller type='pci' index='0' model='pci-root'/>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <graphics type='vnc' socket='/tmp/vnc.sock'>
+ <listen type='socket' socket='/tmp/vnc.sock'/>
+ </graphics>
+ <video>
+ <model type='cirrus' vram='16384' heads='1'
primary='yes'/>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x02' function='0x0'/>
+ </video>
+ <memballoon model='none'/>
+ </devices>
+</domain>
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index eca8e78..0fb38ef 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -434,6 +434,8 @@ mymain(void)
cfg->vncAutoUnixSocket = true;
DO_TEST("graphics-vnc-auto-socket-cfg");
cfg->vncAutoUnixSocket = false;
+ DO_TEST("graphics-vnc-socket");
+ DO_TEST("graphics-vnc-auto-socket");
DO_TEST("graphics-sdl");
DO_TEST("graphics-sdl-fullscreen");
--
2.8.3