[libvirt] [PATCH 2/2] esx: Implement virDomainScreenshot using libcurl stream driver
Matthias Bolte
matthias.bolte at googlemail.com
Tue Oct 7 20:36:11 UTC 2014
2014-03-31 15:46 GMT+02:00 Michal Privoznik <mprivozn at redhat.com>:
> On 30.03.2014 21:03, Matthias Bolte wrote:
>>
>> This implementation uses the https://esx-server/screen?id=<id> way to get
>> a screenshot of a running domain. Compared to the CreateScreenshot_Task
>> way this works since ESX 2.5 while CreateScreenshot_Task was added in
>> version 4.0.
>>
>> The newly added libcurl stream driver is used to directly provide the
>> downloaded data without saving it to a temporary file first.
>> ---
>> src/esx/esx_driver.c | 120
>> +++++++++++++++++++++++++++++++++++++++++++++++++-
>> src/esx/esx_private.h | 1 +
>> 2 files changed, 120 insertions(+), 1 deletion(-)
>>
>> +static char *
>> +esxDomainScreenshot(virDomainPtr domain, virStreamPtr stream,
>> + unsigned int screen, unsigned int flags)
>> +{
>> + char *mimeType = NULL;
>> + esxPrivate *priv = domain->conn->privateData;
>> + esxVI_Boolean supportsScreenshot = esxVI_Boolean_Undefined;
>> + esxVI_String *propertyNameList = NULL;
>> + esxVI_ObjectContent *virtualMachine = NULL;
>> + esxVI_VirtualMachinePowerState powerState;
>> + virBuffer buffer = VIR_BUFFER_INITIALIZER;
>> + char *url = NULL;
>> +
>> + virCheckFlags(0, NULL);
>> +
>> + if (screen != 0) {
>> + virReportError(VIR_ERR_INVALID_ARG, "%s",
>> + _("Screen cannot be selected"));
>> + return NULL;
>> + }
>> +
>> + supportsScreenshot = esxSupportsScreenshot(priv);
>> +
>> + if (supportsScreenshot == esxVI_Boolean_Undefined)
>> + return NULL;
>> +
>> + if (supportsScreenshot != esxVI_Boolean_True) {
>> + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
>> + _("Screenshot feature is unsupported"));
>> + return NULL;
>> + }
>> +
>> + if (esxVI_EnsureSession(priv->primary) < 0)
>> + return NULL;
>> +
>> + if (esxVI_String_AppendValueToList(&propertyNameList,
>> + "runtime.powerState") < 0 ||
>> + esxVI_LookupVirtualMachineByUuid(priv->primary, domain->uuid,
>> + propertyNameList,
>> &virtualMachine,
>> + esxVI_Occurrence_RequiredItem) <
>> 0 ||
>> + esxVI_GetVirtualMachinePowerState(virtualMachine, &powerState) <
>> 0)
>> + goto cleanup;
>> +
>> + if (powerState != esxVI_VirtualMachinePowerState_PoweredOn) {
>> + virReportError(VIR_ERR_OPERATION_INVALID, "%s",
>> + _("Domain is not powered on"));
>> + goto cleanup;
>> + }
>> +
>> + /* Build URL */
>> + virBufferAsprintf(&buffer, "%s://%s:%d/screen?id=",
>> priv->parsedUri->transport,
>> + domain->conn->uri->server,
>> domain->conn->uri->port);
>> + virBufferURIEncodeString(&buffer, virtualMachine->obj->value);
>> +
>> + if (virBufferError(&buffer)) {
>> + virReportOOMError();
>> + goto cleanup;
>> + }
>> +
>> + url = virBufferContentAndReset(&buffer);
>> +
>> + if (VIR_STRDUP(mimeType, "image/png") < 0)
>> + goto cleanup;
>> +
>> + if (esxStreamOpenDownload(stream, priv, url, 0, 0) < 0) {
>> + VIR_FREE(mimeType);
>> + goto cleanup;
>> + }
>> +
>> + cleanup:
>> + if (!url)
>> + virBufferFreeAndReset(&buffer);
>
>
> The 'if' is redundant. Ether we get here with partially allocated buffer, or
> buffer is already reset.
>
True, I removed the if.
>
> ACK
>
> Michal
Thanks, pushed... finally :)
--
Matthias Bolte
http://photron.blogspot.com
More information about the libvir-list
mailing list