[libvirt] [PATCH 2/2] spice: expose the QEMU disable file transfer option
Christophe Fergeau
cfergeau at redhat.com
Thu Jan 9 10:00:29 UTC 2014
On Tue, Jan 07, 2014 at 08:04:33PM +0100, Francesco Romani wrote:
> spice-server offers an API to disable file transfer messages
> on the agent channel between the client and the guest.
> This is supported in qemu through the disable-agent-file-xfer option.
>
> This patch exposes this option to libvirt.
> Adds a new element 'filetransfer', with one property,
> 'filetransfer', which accepts a boolean setting.
> Default is enabled.
>
> Depends on the capability exported in the first patch of the series.
> ---
> docs/formatdomain.html.in | 8 +++++
> docs/schemas/domaincommon.rng | 11 ++++++
> src/conf/domain_conf.c | 31 ++++++++++++++++-
> src/conf/domain_conf.h | 10 ++++++
> src/libvirt_private.syms | 2 ++
> src/qemu/qemu_command.c | 9 +++++
> ...emuxml2argv-graphics-spice-agent-file-xfer.args | 9 +++++
> ...qemuxml2argv-graphics-spice-agent-file-xfer.xml | 40 ++++++++++++++++++++++
> tests/qemuxml2argvtest.c | 6 ++++
> 9 files changed, 125 insertions(+), 1 deletion(-)
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-agent-file-xfer.args
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-agent-file-xfer.xml
>
> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> index 68860ef..f3186e8 100644
> --- a/docs/formatdomain.html.in
> +++ b/docs/formatdomain.html.in
> @@ -4042,6 +4042,7 @@ qemu-kvm -net nic,model=? /dev/null
> <streaming mode='filter'/>
> <clipboard copypaste='no'/>
> <mouse mode='client'/>
> + <filetransfer enable='no'/>
> </graphics></pre>
> <p>
> Spice supports variable compression settings for audio,
> @@ -4081,6 +4082,13 @@ qemu-kvm -net nic,model=? /dev/null
> <span class="since">since 0.9.11</span>. If no mode is
> specified, the qemu default will be used (client mode).
> </p>
> + <p>
> + File transfer on the agent channel between the client and
> + the guest is supported through spice-server and enabled
> + by default. It can be disabled by setting the <code>enable</code>
> + property to <code>no</code> in the <code>filetransfer</code>
> + element, <span class="since">since 1.2.1</span>.
I'd use a wording similar to what is used for copy&paste:
"File transfer functionality (via Spice agent) is set using the
<code>filetransfer</code> element. It is enabled by default, and can be disabled by setting the
<code>copypaste</code> property to <code>no</code>", or at least I'd reword
the first sentence which is a bit confusing imo, and is mostly implementation
details.
At this point, I think it will be "since 1.2.2"
> + </p>
> </dd>
> <dt><code>"rdp"</code></dt>
> <dd>
> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index 86a60c9..cd2c499 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -2468,6 +2468,17 @@
> <empty/>
> </element>
> </optional>
> + <optional>
> + <element name="filetransfer">
> + <attribute name="enable">
> + <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 e65f3e3..18b7759 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -604,6 +604,12 @@ VIR_ENUM_IMPL(virDomainGraphicsSpiceClipboardCopypaste,
> "yes",
> "no");
>
> +VIR_ENUM_IMPL(virDomainGraphicsSpiceAgentFileTransfer,
> + VIR_DOMAIN_GRAPHICS_SPICE_AGENT_FILE_TRANSFER_LAST,
> + "default",
> + "yes",
> + "no");
> +
> VIR_ENUM_IMPL(virDomainHostdevMode, VIR_DOMAIN_HOSTDEV_MODE_LAST,
> "subsystem",
> "capabilities")
> @@ -8519,6 +8525,26 @@ virDomainGraphicsDefParseXML(xmlNodePtr node,
> VIR_FREE(copypaste);
>
> def->data.spice.copypaste = copypasteVal;
> + } else if (xmlStrEqual(cur->name, BAD_CAST "filetransfer")) {
> + char *enable = virXMLPropString(cur, "enable");
> + int enableVal;
> +
> + if (!enable) {
> + virReportError(VIR_ERR_XML_ERROR, "%s",
> + _("spice filetransfer missing enable"));
> + goto error;
> + }
> +
> + if ((enableVal =
> + virDomainGraphicsSpiceAgentFileTransferTypeFromString(enable)) <= 0) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("unknown enable value '%s'"), enable);
the code to disable copy&paste uses VIR_ERR_INTERNAL_ERROR when it's not
able to parse the enum value, but the compression code uses
VIR_ERR_CONFIG_UNSUPPORTED, and the mouse code uses VIR_ERR_XML_ERROR :(
The rest of domain_conf.c is not very consistent in what error is reported
on unknown enum values :( I'd personnally go with either
VIR_ERR_CONFIG_UNSUPPORTED or VIR_ERR_XML_ERROR as they are more specific
than VIR_ERR_INTERNAL_ERROR. However, given that the rest of the code is
inconsistent, this can stay this way for now, and be fixed up at a later
time.
> + VIR_FREE(enable);
> + goto error;
> + }
> + VIR_FREE(enable);
> +
> + def->data.spice.filetransfer = enableVal;
> } else if (xmlStrEqual(cur->name, BAD_CAST "mouse")) {
> char *mode = virXMLPropString(cur, "mode");
> int modeVal;
> @@ -16423,7 +16449,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.copypaste ||
> - def->data.spice.mousemode)) {
> + def->data.spice.mousemode || def->data.spice.filetransfer)) {
> virBufferAddLit(buf, ">\n");
> children = true;
> }
> @@ -16448,6 +16474,9 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
> if (def->data.spice.copypaste)
> virBufferAsprintf(buf, " <clipboard copypaste='%s'/>\n",
> virDomainGraphicsSpiceClipboardCopypasteTypeToString(def->data.spice.copypaste));
> + if (def->data.spice.filetransfer)
> + virBufferAsprintf(buf, " <filetransfer enable='%s'/>\n",
> + virDomainGraphicsSpiceAgentFileTransferTypeToString(def->data.spice.copypaste));
s/copypaste/filetransfer/
> }
>
> if (children) {
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 647d115..ce877fc 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -1461,6 +1461,14 @@ enum virDomainGraphicsSpiceClipboardCopypaste {
> VIR_DOMAIN_GRAPHICS_SPICE_CLIPBOARD_COPYPASTE_LAST
> };
>
> +enum virDomainGraphicsSpiceAgentFileTransfer {
> + VIR_DOMAIN_GRAPHICS_SPICE_AGENT_FILE_TRANSFER_DEFAULT = 0,
> + VIR_DOMAIN_GRAPHICS_SPICE_AGENT_FILE_TRANSFER_YES,
> + VIR_DOMAIN_GRAPHICS_SPICE_AGENT_FILE_TRANSFER_NO,
> +
> + VIR_DOMAIN_GRAPHICS_SPICE_AGENT_FILE_TRANSFER_LAST
> +};
> +
> enum virDomainGraphicsListenType {
> VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE = 0,
> VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS,
> @@ -1531,6 +1539,7 @@ struct _virDomainGraphicsDef {
> int playback;
> int streaming;
> int copypaste;
> + int filetransfer;
> } spice;
> } data;
> /* nListens, listens, and *port are only useful if type is vnc,
> @@ -2693,6 +2702,7 @@ VIR_ENUM_DECL(virDomainInputBus)
> VIR_ENUM_DECL(virDomainGraphics)
> VIR_ENUM_DECL(virDomainGraphicsListen)
> VIR_ENUM_DECL(virDomainGraphicsAuthConnected)
> +VIR_ENUM_DECL(virDomainGraphicsSpiceAgentFileTransfer)
> VIR_ENUM_DECL(virDomainGraphicsSpiceChannelName)
> VIR_ENUM_DECL(virDomainGraphicsSpiceChannelMode)
> VIR_ENUM_DECL(virDomainGraphicsSpiceImageCompression)
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 3b3de15..2a9b0b1 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -235,6 +235,8 @@ virDomainGraphicsListenGetType;
> virDomainGraphicsListenSetAddress;
> virDomainGraphicsListenSetNetwork;
> virDomainGraphicsListenSetType;
> +virDomainGraphicsSpiceAgentFileTransferTypeFromString;
> +virDomainGraphicsSpiceAgentFileTransferTypeToString;
> virDomainGraphicsSpiceChannelModeTypeFromString;
> virDomainGraphicsSpiceChannelModeTypeToString;
> virDomainGraphicsSpiceChannelNameTypeFromString;
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 35b7c67..0398675 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -7390,6 +7390,15 @@ qemuBuildGraphicsSPICECommandLine(virQEMUDriverConfigPtr cfg,
> virDomainGraphicsSpiceStreamingModeTypeToString(graphics->data.spice.streaming));
> if (graphics->data.spice.copypaste == VIR_DOMAIN_GRAPHICS_SPICE_CLIPBOARD_COPYPASTE_NO)
> virBufferAddLit(&opt, ",disable-copy-paste");
> + if (graphics->data.spice.filetransfer == VIR_DOMAIN_GRAPHICS_SPICE_AGENT_FILE_TRANSFER_NO) {
> + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE_FILE_XFER_DISABLE)) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> + _("This QEMU can't disable the spice file transfer"));
I'd say "spice file transfers" or "file transfers through spice" rather
than "the spice file transfer"
Christophe
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140109/899826da/attachment-0001.sig>
More information about the libvir-list
mailing list