2014-03-31 15:46 GMT+02:00 Michal Privoznik <mprivozn@xxxxxxxxxx>: > 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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list