[libvirt] [PATCH] spice: add disableCopyPaste property

From: Marc-André Lureau <marcandre.lureau@redhat.com>
From a security pov copy and paste between the guest and the client is not always desirable. So we need to be able to enable/disable this. The best place to do this from an administration pov is on the hypervisor, so the qemu cmdline is getting a spice disable-copy-paste option, see bug 693645. Example qemu invocation: qemu -spice port=5932,disable-ticketing,disable-copy-paste
https://bugzilla.redhat.com/show_bug.cgi?id=693661 --- docs/formatdomain.html.in | 8 +++++++- docs/schemas/domain.rng | 8 ++++++++ src/conf/domain_conf.c | 11 +++++++++++ src/conf/domain_conf.h | 1 + src/qemu/qemu_command.c | 2 ++ .../qemuxml2argv-graphics-spice-compression.xml | 2 +- .../qemuxml2argv-graphics-spice-qxl-vga.xml | 2 +- .../qemuxml2argv-graphics-spice-timeout.xml | 2 +- .../qemuxml2argv-graphics-spice.args | 2 +- .../qemuxml2argv-graphics-spice.xml | 2 +- 10 files changed, 34 insertions(+), 6 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 98fb2b4..61af08e 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -1833,7 +1833,7 @@ qemu-kvm -net nic,model=? /dev/null and <span class="since">since 0.8.8</span>: <code>smartcard</code>. </p> <pre> - <graphics type='spice' port='-1' tlsPort='-1' autoport='yes'> + <graphics type='spice' port='-1' tlsPort='-1' autoport='yes' disableCopyPaste='no'> <channel name='main' mode='secure'/> <channel name='record' mode='insecure'/> <image compression='auto_glz'/> @@ -1862,6 +1862,12 @@ qemu-kvm -net nic,model=? /dev/null of <code>filter</code>, <code>all</code> or <code>off</code>, <span class="since">since 0.9.2</span>. </p> + <p> + Copy & Paste from guest to client (via Spice agent) + can be disabled by setting + the <code>disableCopyPaste</code> property + to <code>yes</code>, <span class="since">since 0.9.2</span>. + </> </dd> <dt><code>"rdp"</code></dt> <dd> diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng index 0be0371..b2333d5 100644 --- a/docs/schemas/domain.rng +++ b/docs/schemas/domain.rng @@ -1293,6 +1293,14 @@ <data type="dateTime"/> </attribute> </optional> + <optional> + <attribute name="disableCopyPaste"> + <choice> + <value>yes</value> + <value>no</value> + </choice> + </attribute> + </optional> <interleave> <zeroOrMore> <element name="channel"> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 65d4f89..61377c3 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -4099,6 +4099,7 @@ virDomainGraphicsDefParseXML(xmlNodePtr node, int flags) { char *port = virXMLPropString(node, "port"); char *tlsPort; char *autoport; + char *disableCopyPaste; if (port) { if (virStrToLong_i(port, NULL, 10, &def->data.spice.port) < 0) { @@ -4143,6 +4144,13 @@ virDomainGraphicsDefParseXML(xmlNodePtr node, int flags) { !def->data.spice.listenAddr[0]) VIR_FREE(def->data.spice.listenAddr); + if ((disableCopyPaste = virXMLPropString(node, "disableCopyPaste")) != NULL) { + if (STREQ(disableCopyPaste, "yes")) { + def->data.spice.disableCopyPaste = true; + } + VIR_FREE(disableCopyPaste); + } + if (virDomainGraphicsAuthDefParseXML(node, &def->data.spice.auth) < 0) goto error; @@ -9190,6 +9198,9 @@ virDomainGraphicsDefFormat(virBufferPtr buf, virBufferEscapeString(buf, " keymap='%s'", def->data.spice.keymap); + virBufferAsprintf(buf, " disableCopyPaste='%s'", + def->data.spice.disableCopyPaste ? "yes" : "no"); + virDomainGraphicsAuthDefFormatAttr(buf, &def->data.spice.auth, flags); break; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 41c8136..9566d51 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -757,6 +757,7 @@ struct _virDomainGraphicsDef { int zlib; int playback; int streaming; + bool disableCopyPaste; } spice; } data; }; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index cb81354..8261088 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4161,6 +4161,8 @@ qemuBuildCommandLine(virConnectPtr conn, if (def->graphics[0]->data.spice.streaming) virBufferAsprintf(&opt, ",streaming-video=%s", virDomainGraphicsSpiceStreamingModeTypeToString(def->graphics[0]->data.spice.streaming)); + if (def->graphics[0]->data.spice.disableCopyPaste) + virBufferAddLit(&opt, ",disable-copy-paste"); virCommandAddArg(cmd, "-spice"); virCommandAddArgBuffer(cmd, &opt); diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-compression.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-compression.xml index 64a6890..e502216 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-compression.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-compression.xml @@ -21,7 +21,7 @@ </disk> <controller type='ide' index='0'/> <input type='mouse' bus='ps2'/> - <graphics type='spice' port='5903' tlsPort='5904' autoport='no' listen='127.0.0.1'> + <graphics type='spice' port='5903' tlsPort='5904' autoport='no' listen='127.0.0.1' disableCopyPaste='no'> <image compression='auto_glz'/> <jpeg compression='auto'/> <zlib compression='auto'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-qxl-vga.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-qxl-vga.xml index a38550c..0075d26 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-qxl-vga.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-qxl-vga.xml @@ -21,7 +21,7 @@ </disk> <controller type='ide' index='0'/> <input type='mouse' bus='ps2'/> - <graphics type='spice' port='5903' tlsPort='5904' autoport='no' listen='127.0.0.1'> + <graphics type='spice' port='5903' tlsPort='5904' autoport='no' listen='127.0.0.1' disableCopyPaste='no'> <channel name='main' mode='secure'/> <channel name='inputs' mode='insecure'/> </graphics> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-timeout.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-timeout.xml index 4c0c57e..6b13d6b 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-timeout.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-timeout.xml @@ -71,7 +71,7 @@ </console> <input type='tablet' bus='usb'/> <input type='mouse' bus='ps2'/> - <graphics type='spice' port='5900' autoport='no' passwd='sercet' passwdValidTo='2011-05-31T16:11:22'/> + <graphics type='spice' port='5900' autoport='no' disableCopyPaste='no' passwd='sercet' passwdValidTo='2011-05-31T16:11:22'/> <sound model='ac97'> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </sound> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args index 084a100..c9fdb99 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args @@ -4,6 +4,6 @@ unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -hda \ /dev/HostVG/QEMUGuest1 -usb -spice port=5903,tls-port=5904,addr=127.0.0.1,\ x509-dir=/etc/pki/libvirt-spice,tls-channel=main,plaintext-channel=inputs,\ image-compression=auto_glz,jpeg-wan-compression=auto,zlib-glz-wan-compression=auto,\ -playback-compression=on,streaming-video=filter -vga \ +playback-compression=on,streaming-video=filter,disable-copy-paste -vga \ qxl -global qxl.vram_size=18874368 -device qxl,id=video1,vram_size=33554432,bus=pci.0,addr=0x4 \ -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml index 0d3dd48..4b5840c 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml @@ -21,7 +21,7 @@ </disk> <controller type='ide' index='0'/> <input type='mouse' bus='ps2'/> - <graphics type='spice' port='5903' tlsPort='5904' autoport='no' listen='127.0.0.1'> + <graphics type='spice' port='5903' tlsPort='5904' autoport='no' listen='127.0.0.1' disableCopyPaste='yes'> <channel name='main' mode='secure'/> <channel name='inputs' mode='insecure'/> <image compression='auto_glz'/> -- 1.7.1

On Mon, Jun 13, 2011 at 11:05:10AM -0600, Eric Blake wrote:
From: Marc-André Lureau <marcandre.lureau@redhat.com>
From a security pov copy and paste between the guest and the client is not always desirable. So we need to be able to enable/disable this. The best place to do this from an administration pov is on the hypervisor, so the qemu cmdline is getting a spice disable-copy-paste option, see bug 693645. Example qemu invocation: qemu -spice port=5932,disable-ticketing,disable-copy-paste
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 98fb2b4..61af08e 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -1833,7 +1833,7 @@ qemu-kvm -net nic,model=? /dev/null and <span class="since">since 0.8.8</span>: <code>smartcard</code>. </p> <pre> - <graphics type='spice' port='-1' tlsPort='-1' autoport='yes'> + <graphics type='spice' port='-1' tlsPort='-1' autoport='yes' disableCopyPaste='no'> <channel name='main' mode='secure'/> <channel name='record' mode='insecure'/> <image compression='auto_glz'/> @@ -1862,6 +1862,12 @@ qemu-kvm -net nic,model=? /dev/null of <code>filter</code>, <code>all</code> or <code>off</code>, <span class="since">since 0.9.2</span>. </p> + <p> + Copy & Paste from guest to client (via Spice agent) + can be disabled by setting + the <code>disableCopyPaste</code> property + to <code>yes</code>, <span class="since">since 0.9.2</span>. + </> </dd> <dt><code>"rdp"</code></dt> <dd>
Other tunable parameters like this are being done as child elements inside <graphics>, eg the image compression parameters. I think that would be more desirable than adding this as an attribute. It is also nice to avoid double negatives like disableCopyPaste=no So how about <graphics> <clipboard copypaste='yes|no'> </graphics> defaulting to 'yes' if omitted if back compat of course. Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

From a security pov copy and paste between the guest and the client is not always desirable. So we need to be able to enable/disable this. The best place to do this from an administration pov is on the hypervisor, so the qemu cmdline is getting a spice disable-copy-paste option, see bug 693645. Example qemu invocation: qemu -spice port=5932,disable-ticketing,disable-copy-paste
https://bugzilla.redhat.com/show_bug.cgi?id=693661 --- docs/formatdomain.html.in | 9 ++++++ docs/schemas/domain.rng | 11 +++++++ src/conf/domain_conf.c | 31 +++++++++++++++++++- src/conf/domain_conf.h | 10 ++++++ src/qemu/qemu_command.c | 2 + .../qemuxml2argv-graphics-spice.args | 2 +- .../qemuxml2argv-graphics-spice.xml | 1 + 7 files changed, 64 insertions(+), 2 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 225e0c8..e1f4168 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -1838,6 +1838,7 @@ qemu-kvm -net nic,model=? /dev/null <channel name='record' mode='insecure'/> <image compression='auto_glz'/> <streaming mode='filter'/> + <clipboard copypaste='no'/> </graphics></pre> <p> Spice supports variable compression settings for audio, @@ -1862,6 +1863,14 @@ qemu-kvm -net nic,model=? /dev/null of <code>filter</code>, <code>all</code> or <code>off</code>, <span class="since">since 0.9.2</span>. </p> + <p> + Copy & Paste functionality (via Spice agent) is set + by the <code>clipboard</code> element. It is enabled by + default, and can be disabled by setting + the <code>copypaste</code> property + to <code>no</code>, <span class="since">since + 0.9.2</span>. + </> </dd> <dt><code>"rdp"</code></dt> <dd> diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng index 0be0371..b71778b 100644 --- a/docs/schemas/domain.rng +++ b/docs/schemas/domain.rng @@ -1379,6 +1379,17 @@ <empty/> </element> </optional> + <optional> + <element name="clipboard"> + <attribute name="copypaste"> + <choice> + <value>yes</value> + <value>no</value> + </choice> + </attribute> + <empty/> + </element> + </optional> </interleave> </group> <group> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 0d9fef4..3a0de99 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -364,6 +364,12 @@ VIR_ENUM_IMPL(virDomainGraphicsSpiceStreamingMode, "all", "off"); +VIR_ENUM_IMPL(virDomainGraphicsSpiceClipboardCopypaste, + VIR_DOMAIN_GRAPHICS_SPICE_CLIPBOARD_COPYPASTE_LAST, + "default", + "yes", + "no"); + VIR_ENUM_IMPL(virDomainHostdevMode, VIR_DOMAIN_HOSTDEV_MODE_LAST, "subsystem", "capabilities") @@ -4284,6 +4290,26 @@ virDomainGraphicsDefParseXML(xmlNodePtr node, int flags) { VIR_FREE(mode); def->data.spice.streaming = modeVal; + } else if (xmlStrEqual(cur->name, BAD_CAST "clipboard")) { + const char *copypaste = virXMLPropString(cur, "copypaste"); + int copypasteVal; + + if (!copypaste) { + virDomainReportError(VIR_ERR_XML_ERROR, "%s", + _("spice clipboard missing copypaste")); + goto error; + } + + if ((copypasteVal = + virDomainGraphicsSpiceClipboardCopypasteTypeFromString(copypaste)) <= 0) { + virDomainReportError(VIR_ERR_INTERNAL_ERROR, + _("unknown copypaste value '%s'"), copypaste); + VIR_FREE(copypaste); + goto error; + } + VIR_FREE(copypaste); + + def->data.spice.copypaste = copypasteVal; } } cur = cur->next; @@ -9209,7 +9235,7 @@ virDomainGraphicsDefFormat(virBufferPtr buf, } if (!children && (def->data.spice.image || def->data.spice.jpeg || def->data.spice.zlib || def->data.spice.playback || - def->data.spice.streaming)) { + def->data.spice.streaming || def->data.spice.copypaste)) { virBufferAddLit(buf, ">\n"); children = 1; } @@ -9228,6 +9254,9 @@ virDomainGraphicsDefFormat(virBufferPtr buf, if (def->data.spice.streaming) virBufferAsprintf(buf, " <streaming mode='%s'/>\n", virDomainGraphicsSpiceStreamingModeTypeToString(def->data.spice.streaming)); + if (def->data.spice.copypaste) + virBufferAsprintf(buf, " <clipboard copypaste='%s'/>\n", + virDomainGraphicsSpiceClipboardCopypasteTypeToString(def->data.spice.copypaste)); } if (children) { diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 41c8136..3ef48d1 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -715,6 +715,14 @@ enum virDomainGraphicsSpiceStreamingMode { VIR_DOMAIN_GRAPHICS_SPICE_STREAMING_MODE_LAST }; +enum virDomainGraphicsSpiceClipboardCopypaste { + VIR_DOMAIN_GRAPHICS_SPICE_CLIPBOARD_COPYPASTE_DEFAULT = 0, + VIR_DOMAIN_GRAPHICS_SPICE_CLIPBOARD_COPYPASTE_YES, + VIR_DOMAIN_GRAPHICS_SPICE_CLIPBOARD_COPYPASTE_NO, + + VIR_DOMAIN_GRAPHICS_SPICE_CLIPBOARD_COPYPASTE_LAST +}; + typedef struct _virDomainGraphicsDef virDomainGraphicsDef; typedef virDomainGraphicsDef *virDomainGraphicsDefPtr; struct _virDomainGraphicsDef { @@ -757,6 +765,7 @@ struct _virDomainGraphicsDef { int zlib; int playback; int streaming; + int copypaste; } spice; } data; }; @@ -1553,6 +1562,7 @@ VIR_ENUM_DECL(virDomainGraphicsSpiceJpegCompression) VIR_ENUM_DECL(virDomainGraphicsSpiceZlibCompression) VIR_ENUM_DECL(virDomainGraphicsSpicePlaybackCompression) VIR_ENUM_DECL(virDomainGraphicsSpiceStreamingMode) +VIR_ENUM_DECL(virDomainGraphicsSpiceClipboardCopypaste) /* from libvirt.h */ VIR_ENUM_DECL(virDomainState) VIR_ENUM_DECL(virDomainNostateReason) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index ef2d002..f669dda 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4043,6 +4043,8 @@ qemuBuildCommandLine(virConnectPtr conn, if (def->graphics[0]->data.spice.streaming) virBufferAsprintf(&opt, ",streaming-video=%s", virDomainGraphicsSpiceStreamingModeTypeToString(def->graphics[0]->data.spice.streaming)); + if (def->graphics[0]->data.spice.copypaste == VIR_DOMAIN_GRAPHICS_SPICE_CLIPBOARD_COPYPASTE_NO) + virBufferAddLit(&opt, ",disable-copy-paste"); virCommandAddArg(cmd, "-spice"); virCommandAddArgBuffer(cmd, &opt); diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args index 084a100..c9fdb99 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.args @@ -4,6 +4,6 @@ unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -hda \ /dev/HostVG/QEMUGuest1 -usb -spice port=5903,tls-port=5904,addr=127.0.0.1,\ x509-dir=/etc/pki/libvirt-spice,tls-channel=main,plaintext-channel=inputs,\ image-compression=auto_glz,jpeg-wan-compression=auto,zlib-glz-wan-compression=auto,\ -playback-compression=on,streaming-video=filter -vga \ +playback-compression=on,streaming-video=filter,disable-copy-paste -vga \ qxl -global qxl.vram_size=18874368 -device qxl,id=video1,vram_size=33554432,bus=pci.0,addr=0x4 \ -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml index 0d3dd48..79780c6 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice.xml @@ -29,6 +29,7 @@ <zlib compression='auto'/> <playback compression='on'/> <streaming mode='filter'/> + <clipboard copypaste='no'/> </graphics> <video> <model type='qxl' vram='18432' heads='1'/> -- 1.7.5.2

On 06/14/2011 05:35 AM, Marc-André Lureau wrote:
From a security pov copy and paste between the guest and the client is not
Stupid 'git am' ate that line, I had to amend the commit to add it back in without the leading '>'.
always desirable. So we need to be able to enable/disable this. The best place to do this from an administration pov is on the hypervisor, so the qemu cmdline is getting a spice disable-copy-paste option, see bug 693645. Example qemu invocation: qemu -spice port=5932,disable-ticketing,disable-copy-paste
https://bugzilla.redhat.com/show_bug.cgi?id=693661 --- docs/formatdomain.html.in | 9 ++++++ docs/schemas/domain.rng | 11 +++++++ src/conf/domain_conf.c | 31 +++++++++++++++++++- src/conf/domain_conf.h | 10 ++++++ src/qemu/qemu_command.c | 2 + .../qemuxml2argv-graphics-spice.args | 2 +- .../qemuxml2argv-graphics-spice.xml | 1 + 7 files changed, 64 insertions(+), 2 deletions(-)
You've now posted from a redhat.com and a gmail.com address; let me know if I should update AUTHORS and .mailmap to highlight your preferred address.
@@ -1862,6 +1863,14 @@ qemu-kvm -net nic,model=? /dev/null of <code>filter</code>, <code>all</code> or <code>off</code>, <span class="since">since 0.9.2</span>. </p> + <p> + Copy & Paste functionality (via Spice agent) is set + by the <code>clipboard</code> element. It is enabled by + default, and can be disabled by setting + the <code>copypaste</code> property + to <code>no</code>, <span class="since">since + 0.9.2</span>.
0.9.3. ACK with one more change, so I pushed with this squashed in: diff --git i/docs/formatdomain.html.in w/docs/formatdomain.html.in index 91d5ade..267839b 100644 --- i/docs/formatdomain.html.in +++ w/docs/formatdomain.html.in @@ -1869,7 +1869,7 @@ qemu-kvm -net nic,model=? /dev/null default, and can be disabled by setting the <code>copypaste</code> property to <code>no</code>, <span class="since">since - 0.9.2</span>. + 0.9.3</span>. </> </dd> <dt><code>"rdp"</code></dt> diff --git i/src/libvirt_private.syms w/src/libvirt_private.syms index 7a05539..6351938 100644 --- i/src/libvirt_private.syms +++ w/src/libvirt_private.syms @@ -274,8 +274,10 @@ virDomainGraphicsSpiceChannelModeTypeFromString; virDomainGraphicsSpiceChannelModeTypeToString; virDomainGraphicsSpiceChannelNameTypeFromString; virDomainGraphicsSpiceChannelNameTypeToString; -virDomainGraphicsSpiceImageCompressionTypeToString; +virDomainGraphicsSpiceClipboardCopypasteFromString; +virDomainGraphicsSpiceClipboardCopypasteToString; virDomainGraphicsSpiceImageCompressionTypeFromString; +virDomainGraphicsSpiceImageCompressionTypeToString; virDomainGraphicsSpiceJpegCompressionTypeFromString; virDomainGraphicsSpiceJpegCompressionTypeToString; virDomainGraphicsSpicePlaybackCompressionTypeFromString; -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org
participants (3)
-
Daniel P. Berrange
-
Eric Blake
-
Marc-André Lureau