From 041aac864833ba37405f39746a35cf25d9ae68b2 Mon Sep 17 00:00:00 2001 From: Matthias Bolte Date: Wed, 19 May 2010 22:59:32 +0200 Subject: [PATCH] esx: Simplify goto usage Eliminate almost all backward jumps by replacing this common pattern: int some_random_function(void) { int result = 0; ... cleanup: return result; failure: result = -1; goto cleanup } with this simpler pattern: int some_random_function(void) { int result = -1; ... result = 0; cleanup: if (result < 0) { } return result; } Add a bool success variable in functions that don't have a int result that can be used for the new pattern. Also remove some unnecessary memsets in error paths. --- src/esx/esx_driver.c | 840 +++++++++++++++-------------------- src/esx/esx_storage_driver.c | 4 - src/esx/esx_util.c | 74 ++- src/esx/esx_vi.c | 488 +++++++++----------- src/esx/esx_vi_methods.c | 44 +- src/esx/esx_vi_types.c | 23 +- src/esx/esx_vmx.c | 318 +++++++------ 7 files changed, 813 insertions(+), 978 deletions(-) diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c index b89de7222e..7257d6a7a1 100644 --- a/src/esx/esx_driver.c +++ b/src/esx/esx_driver.c @@ -68,7 +68,7 @@ esxSupportsLongMode(esxPrivate *priv) } if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return esxVI_Boolean_Undefined; } if (esxVI_String_AppendValueToList(&propertyNameList, @@ -76,13 +76,13 @@ esxSupportsLongMode(esxPrivate *priv) esxVI_LookupObjectContentByType(priv->host, priv->host->hostFolder, "HostSystem", propertyNameList, esxVI_Boolean_True, &hostSystem) < 0) { - goto failure; + goto cleanup; } if (hostSystem == NULL) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not retrieve the HostSystem object")); - goto failure; + goto cleanup; } for (dynamicProperty = hostSystem->propSet; dynamicProperty != NULL; @@ -90,7 +90,7 @@ esxSupportsLongMode(esxPrivate *priv) if (STREQ(dynamicProperty->name, "hardware.cpuFeature")) { if (esxVI_HostCpuIdInfo_CastListFromAnyType (dynamicProperty->val, &hostCpuIdInfoList) < 0) { - goto failure; + goto cleanup; } for (hostCpuIdInfo = hostCpuIdInfoList; hostCpuIdInfo != NULL; @@ -98,7 +98,7 @@ esxSupportsLongMode(esxPrivate *priv) if (hostCpuIdInfo->level->value == -2147483647) { /* 0x80000001 */ if (esxVI_ParseHostCpuIdInfo(&parsedHostCpuIdInfo, hostCpuIdInfo) < 0) { - goto failure; + goto cleanup; } edxLongModeBit = parsedHostCpuIdInfo.edx[29]; @@ -113,7 +113,7 @@ esxSupportsLongMode(esxPrivate *priv) "'hardware.cpuFeature[].edx' with value '%s' " "has unexpected value '%c', expecting '0' " "or '1'"), hostCpuIdInfo->edx, edxLongModeBit); - goto failure; + goto cleanup; } break; @@ -127,16 +127,15 @@ esxSupportsLongMode(esxPrivate *priv) } cleanup: + /* + * If we goto cleanup in case of an error then priv->supportsLongMode + * is still esxVI_Boolean_Undefined, therefore we don't need to set it. + */ esxVI_String_Free(&propertyNameList); esxVI_ObjectContent_Free(&hostSystem); esxVI_HostCpuIdInfo_Free(&hostCpuIdInfoList); return priv->supportsLongMode; - - failure: - priv->supportsLongMode = esxVI_Boolean_Undefined; - - goto cleanup; } @@ -313,7 +312,7 @@ esxCapsInit(esxPrivate *priv) static virDrvOpenStatus esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags ATTRIBUTE_UNUSED) { - virDrvOpenStatus result = VIR_DRV_OPEN_SUCCESS; + virDrvOpenStatus result = VIR_DRV_OPEN_ERROR; esxPrivate *priv = NULL; char hostIpAddress[NI_MAXHOST] = ""; char vCenterIpAddress[NI_MAXHOST] = ""; @@ -347,7 +346,7 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags ATTRIBUTE_UNUSED) /* Allocate per-connection private data */ if (VIR_ALLOC(priv) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } priv->maxVcpus = -1; @@ -358,7 +357,7 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags ATTRIBUTE_UNUSED) if (esxUtil_ParseQuery(conn->uri, &priv->transport, &vCenter, &noVerify, &autoAnswer) < 0) { - goto failure; + goto cleanup; } if (autoAnswer) { @@ -390,13 +389,13 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags ATTRIBUTE_UNUSED) /* Login to host */ if (esxUtil_ResolveHostname(conn->uri->server, hostIpAddress, NI_MAXHOST) < 0) { - goto failure; + goto cleanup; } if (virAsprintf(&url, "%s://%s:%d/sdk", priv->transport, conn->uri->server, conn->uri->port) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } if (conn->uri->user != NULL) { @@ -404,31 +403,31 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags ATTRIBUTE_UNUSED) if (username == NULL) { virReportOOMError(); - goto failure; + goto cleanup; } } else { username = virRequestUsername(auth, "root", conn->uri->server); if (username == NULL) { ESX_ERROR(VIR_ERR_AUTH_FAILED, "%s", _("Username request failed")); - goto failure; + goto cleanup; } } if (esxVI_Context_Alloc(&priv->host) < 0) { - goto failure; + goto cleanup; } password = virRequestPassword(auth, username, conn->uri->server); if (password == NULL) { ESX_ERROR(VIR_ERR_AUTH_FAILED, "%s", _("Password request failed")); - goto failure; + goto cleanup; } if (esxVI_Context_Connect(priv->host, url, hostIpAddress, username, password, noVerify) < 0) { - goto failure; + goto cleanup; } if (STRCASEEQ(conn->uri->scheme, "esx")) { @@ -437,13 +436,13 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags ATTRIBUTE_UNUSED) ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("%s is neither an ESX 3.5 host nor an ESX 4.0 host"), conn->uri->server); - goto failure; + goto cleanup; } } else { /* GSX */ if (priv->host->productVersion != esxVI_ProductVersion_GSX20) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("%s isn't a GSX 2.0 host"), conn->uri->server); - goto failure; + goto cleanup; } } @@ -453,7 +452,7 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags ATTRIBUTE_UNUSED) "summary.managementServerIp\0") < 0 || esxVI_LookupHostSystemByIp(priv->host, hostIpAddress, propertyNameList, &hostSystem) < 0) { - goto failure; + goto cleanup; } /* Warn if host is in maintenance mode */ @@ -462,7 +461,7 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags ATTRIBUTE_UNUSED) if (STREQ(dynamicProperty->name, "runtime.inMaintenanceMode")) { if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_Boolean) < 0) { - goto failure; + goto cleanup; } if (dynamicProperty->val->boolean == esxVI_Boolean_True) { @@ -483,7 +482,7 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags ATTRIBUTE_UNUSED) if (STRNEQ(vCenter, "*") && esxUtil_ResolveHostname(vCenter, vCenterIpAddress, NI_MAXHOST) < 0) { - goto failure; + goto cleanup; } /* Lookup the vCenter from the ESX host */ @@ -492,7 +491,7 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags ATTRIBUTE_UNUSED) if (STREQ(dynamicProperty->name, "summary.managementServerIp")) { if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_String) < 0) { - goto failure; + goto cleanup; } /* Get the vCenter IP address or verify the specified one */ @@ -503,7 +502,7 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags ATTRIBUTE_UNUSED) if (vCenter == NULL) { virReportOOMError(); - goto failure; + goto cleanup; } if (virStrcpyStatic(vCenterIpAddress, @@ -512,7 +511,7 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags ATTRIBUTE_UNUSED) _("vCenter IP address %s too big for " "destination"), dynamicProperty->val->string); - goto failure; + goto cleanup; } } else if (STRNEQ(vCenterIpAddress, dynamicProperty->val->string)) { @@ -522,7 +521,7 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags ATTRIBUTE_UNUSED) "(%s) has been specified"), dynamicProperty->val->string, vCenter, vCenterIpAddress); - goto failure; + goto cleanup; } break; @@ -532,36 +531,36 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags ATTRIBUTE_UNUSED) if (STREQ(vCenter, "*")) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("This host is not managed by a vCenter")); - goto failure; + goto cleanup; } if (virAsprintf(&url, "%s://%s/sdk", priv->transport, vCenter) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } if (esxVI_Context_Alloc(&priv->vCenter) < 0) { - goto failure; + goto cleanup; } username = virRequestUsername(auth, "administrator", vCenter); if (username == NULL) { ESX_ERROR(VIR_ERR_AUTH_FAILED, "%s", _("Username request failed")); - goto failure; + goto cleanup; } password = virRequestPassword(auth, username, vCenter); if (password == NULL) { ESX_ERROR(VIR_ERR_AUTH_FAILED, "%s", _("Password request failed")); - goto failure; + goto cleanup; } if (esxVI_Context_Connect(priv->vCenter, url, vCenterIpAddress, username, password, noVerify) < 0) { - goto failure; + goto cleanup; } if (priv->vCenter->productVersion != esxVI_ProductVersion_VPX25 && @@ -569,7 +568,7 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags ATTRIBUTE_UNUSED) ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("%s is neither a vCenter 2.5 server nor a vCenter " "4.0 server"), conn->uri->server); - goto failure; + goto cleanup; } } @@ -579,21 +578,13 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags ATTRIBUTE_UNUSED) priv->caps = esxCapsInit(priv); if (priv->caps == NULL) { - goto failure; + goto cleanup; } - cleanup: - VIR_FREE(url); - VIR_FREE(vCenter); - VIR_FREE(password); - VIR_FREE(username); - esxVI_String_Free(&propertyNameList); - esxVI_ObjectContent_Free(&hostSystem); - - return result; + result = VIR_DRV_OPEN_SUCCESS; - failure: - if (priv != NULL) { + cleanup: + if (result == VIR_DRV_OPEN_ERROR && priv != NULL) { esxVI_Context_Free(&priv->host); esxVI_Context_Free(&priv->vCenter); @@ -603,9 +594,14 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags ATTRIBUTE_UNUSED) VIR_FREE(priv); } - result = VIR_DRV_OPEN_ERROR; + VIR_FREE(url); + VIR_FREE(vCenter); + VIR_FREE(password); + VIR_FREE(username); + esxVI_String_Free(&propertyNameList); + esxVI_ObjectContent_Free(&hostSystem); - goto cleanup; + return result; } @@ -656,7 +652,7 @@ esxSupportsVMotion(esxPrivate *priv) } if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return esxVI_Boolean_Undefined; } if (esxVI_String_AppendValueToList(&propertyNameList, @@ -664,13 +660,13 @@ esxSupportsVMotion(esxPrivate *priv) esxVI_LookupObjectContentByType(priv->host, priv->host->hostFolder, "HostSystem", propertyNameList, esxVI_Boolean_True, &hostSystem) < 0) { - goto failure; + goto cleanup; } if (hostSystem == NULL) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not retrieve the HostSystem object")); - goto failure; + goto cleanup; } for (dynamicProperty = hostSystem->propSet; dynamicProperty != NULL; @@ -678,7 +674,7 @@ esxSupportsVMotion(esxPrivate *priv) if (STREQ(dynamicProperty->name, "capability.vmotionSupported")) { if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_Boolean) < 0) { - goto failure; + goto cleanup; } priv->supportsVMotion = dynamicProperty->val->boolean; @@ -689,15 +685,14 @@ esxSupportsVMotion(esxPrivate *priv) } cleanup: + /* + * If we goto cleanup in case of an error then priv->supportsVMotion is + * still esxVI_Boolean_Undefined, therefore we don't need to set it. + */ esxVI_String_Free(&propertyNameList); esxVI_ObjectContent_Free(&hostSystem); return priv->supportsVMotion; - - failure: - priv->supportsVMotion = esxVI_Boolean_Undefined; - - goto cleanup; } @@ -766,7 +761,7 @@ esxGetHostname(virConnectPtr conn) char *complete = NULL; if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return NULL; } if (esxVI_String_AppendValueListToList @@ -776,13 +771,13 @@ esxGetHostname(virConnectPtr conn) esxVI_LookupObjectContentByType(priv->host, priv->host->hostFolder, "HostSystem", propertyNameList, esxVI_Boolean_True, &hostSystem) < 0) { - goto failure; + goto cleanup; } if (hostSystem == NULL) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not retrieve the HostSystem object")); - goto failure; + goto cleanup; } for (dynamicProperty = hostSystem->propSet; dynamicProperty != NULL; @@ -791,7 +786,7 @@ esxGetHostname(virConnectPtr conn) "config.network.dnsConfig.hostName")) { if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_String) < 0) { - goto failure; + goto cleanup; } hostName = dynamicProperty->val->string; @@ -799,7 +794,7 @@ esxGetHostname(virConnectPtr conn) "config.network.dnsConfig.domainName")) { if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_String) < 0) { - goto failure; + goto cleanup; } domainName = dynamicProperty->val->string; @@ -811,7 +806,7 @@ esxGetHostname(virConnectPtr conn) if (hostName == NULL || strlen(hostName) < 1) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Missing or empty 'hostName' property")); - goto failure; + goto cleanup; } if (domainName == NULL || strlen(domainName) < 1) { @@ -819,25 +814,25 @@ esxGetHostname(virConnectPtr conn) if (complete == NULL) { virReportOOMError(); - goto failure; + goto cleanup; } } else { if (virAsprintf(&complete, "%s.%s", hostName, domainName) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } } cleanup: + /* + * If we goto cleanup in case of an error then complete is still NULL, + * either strdup returned NULL or virAsprintf failed. When virAsprintf + * fails it guarantees setting complete to NULL + */ esxVI_String_Free(&propertyNameList); esxVI_ObjectContent_Free(&hostSystem); return complete; - - failure: - VIR_FREE(complete); - - goto cleanup; } @@ -845,7 +840,7 @@ esxGetHostname(virConnectPtr conn) static int esxNodeGetInfo(virConnectPtr conn, virNodeInfoPtr nodeinfo) { - int result = 0; + int result = -1; esxPrivate *priv = conn->privateData; esxVI_String *propertyNameList = NULL; esxVI_ObjectContent *hostSystem = NULL; @@ -858,10 +853,10 @@ esxNodeGetInfo(virConnectPtr conn, virNodeInfoPtr nodeinfo) int32_t numaInfo_numNodes = 0; char *ptr = NULL; - memset(nodeinfo, 0, sizeof(virNodeInfo)); + memset(nodeinfo, 0, sizeof (*nodeinfo)); if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return -1; } if (esxVI_String_AppendValueListToList(&propertyNameList, @@ -875,13 +870,13 @@ esxNodeGetInfo(virConnectPtr conn, virNodeInfoPtr nodeinfo) esxVI_LookupObjectContentByType(priv->host, priv->host->hostFolder, "HostSystem", propertyNameList, esxVI_Boolean_True, &hostSystem) < 0) { - goto failure; + goto cleanup; } if (hostSystem == NULL) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not retrieve the HostSystem object")); - goto failure; + goto cleanup; } for (dynamicProperty = hostSystem->propSet; dynamicProperty != NULL; @@ -889,7 +884,7 @@ esxNodeGetInfo(virConnectPtr conn, virNodeInfoPtr nodeinfo) if (STREQ(dynamicProperty->name, "hardware.cpuInfo.hz")) { if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_Long) < 0) { - goto failure; + goto cleanup; } cpuInfo_hz = dynamicProperty->val->int64; @@ -897,7 +892,7 @@ esxNodeGetInfo(virConnectPtr conn, virNodeInfoPtr nodeinfo) "hardware.cpuInfo.numCpuCores")) { if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_Short) < 0) { - goto failure; + goto cleanup; } cpuInfo_numCpuCores = dynamicProperty->val->int16; @@ -905,7 +900,7 @@ esxNodeGetInfo(virConnectPtr conn, virNodeInfoPtr nodeinfo) "hardware.cpuInfo.numCpuPackages")) { if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_Short) < 0) { - goto failure; + goto cleanup; } cpuInfo_numCpuPackages = dynamicProperty->val->int16; @@ -913,14 +908,14 @@ esxNodeGetInfo(virConnectPtr conn, virNodeInfoPtr nodeinfo) "hardware.cpuInfo.numCpuThreads")) { if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_Short) < 0) { - goto failure; + goto cleanup; } cpuInfo_numCpuThreads = dynamicProperty->val->int16; } else if (STREQ(dynamicProperty->name, "hardware.memorySize")) { if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_Long) < 0) { - goto failure; + goto cleanup; } memorySize = dynamicProperty->val->int64; @@ -928,7 +923,7 @@ esxNodeGetInfo(virConnectPtr conn, virNodeInfoPtr nodeinfo) "hardware.numaInfo.numNodes")) { if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_Int) < 0) { - goto failure; + goto cleanup; } numaInfo_numNodes = dynamicProperty->val->int32; @@ -936,7 +931,7 @@ esxNodeGetInfo(virConnectPtr conn, virNodeInfoPtr nodeinfo) "summary.hardware.cpuModel")) { if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_String) < 0) { - goto failure; + goto cleanup; } ptr = dynamicProperty->val->string; @@ -963,7 +958,7 @@ esxNodeGetInfo(virConnectPtr conn, virNodeInfoPtr nodeinfo) ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("CPU Model %s too long for destination"), dynamicProperty->val->string); - goto failure; + goto cleanup; } } else { VIR_WARN("Unexpected '%s' property", dynamicProperty->name); @@ -982,16 +977,13 @@ esxNodeGetInfo(virConnectPtr conn, virNodeInfoPtr nodeinfo) ? cpuInfo_numCpuThreads / cpuInfo_numCpuCores : 0; + result = 0; + cleanup: esxVI_String_Free(&propertyNameList); esxVI_ObjectContent_Free(&hostSystem); return result; - - failure: - result = -1; - - goto cleanup; } @@ -1015,6 +1007,7 @@ esxGetCapabilities(virConnectPtr conn) static int esxListDomains(virConnectPtr conn, int *ids, int maxids) { + bool success = false; esxPrivate *priv = conn->privateData; esxVI_ObjectContent *virtualMachineList = NULL; esxVI_ObjectContent *virtualMachine = NULL; @@ -1032,7 +1025,7 @@ esxListDomains(virConnectPtr conn, int *ids, int maxids) } if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return -1; } if (esxVI_String_AppendValueToList(&propertyNameList, @@ -1041,14 +1034,14 @@ esxListDomains(virConnectPtr conn, int *ids, int maxids) "VirtualMachine", propertyNameList, esxVI_Boolean_True, &virtualMachineList) < 0) { - goto failure; + goto cleanup; } for (virtualMachine = virtualMachineList; virtualMachine != NULL; virtualMachine = virtualMachine->_next) { if (esxVI_GetVirtualMachinePowerState(virtualMachine, &powerState) < 0) { - goto failure; + goto cleanup; } if (powerState != esxVI_VirtualMachinePowerState_PoweredOn) { @@ -1061,7 +1054,7 @@ esxListDomains(virConnectPtr conn, int *ids, int maxids) ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Failed to parse positive integer from '%s'"), virtualMachine->obj->value); - goto failure; + goto cleanup; } count++; @@ -1071,16 +1064,13 @@ esxListDomains(virConnectPtr conn, int *ids, int maxids) } } + success = true; + cleanup: esxVI_String_Free(&propertyNameList); esxVI_ObjectContent_Free(&virtualMachineList); - return count; - - failure: - count = -1; - - goto cleanup; + return success ? count : -1; } @@ -1115,7 +1105,7 @@ esxDomainLookupByID(virConnectPtr conn, int id) virDomainPtr domain = NULL; if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return NULL; } if (esxVI_String_AppendValueListToList(&propertyNameList, @@ -1127,14 +1117,14 @@ esxDomainLookupByID(virConnectPtr conn, int id) "VirtualMachine", propertyNameList, esxVI_Boolean_True, &virtualMachineList) < 0) { - goto failure; + goto cleanup; } for (virtualMachine = virtualMachineList; virtualMachine != NULL; virtualMachine = virtualMachine->_next) { if (esxVI_GetVirtualMachinePowerState(virtualMachine, &powerState) < 0) { - goto failure; + goto cleanup; } /* Only running/suspended domains have an ID != -1 */ @@ -1147,7 +1137,7 @@ esxDomainLookupByID(virConnectPtr conn, int id) if (esxVI_GetVirtualMachineIdentity(virtualMachine, &id_candidate, &name_candidate, uuid_candidate) < 0) { - goto failure; + goto cleanup; } if (id != id_candidate) { @@ -1157,7 +1147,7 @@ esxDomainLookupByID(virConnectPtr conn, int id) domain = virGetDomain(conn, name_candidate, uuid_candidate); if (domain == NULL) { - goto failure; + goto cleanup; } domain->id = id; @@ -1175,11 +1165,6 @@ esxDomainLookupByID(virConnectPtr conn, int id) VIR_FREE(name_candidate); return domain; - - failure: - domain = NULL; - - goto cleanup; } @@ -1196,7 +1181,7 @@ esxDomainLookupByUUID(virConnectPtr conn, const unsigned char *uuid) virDomainPtr domain = NULL; if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return NULL; } if (esxVI_String_AppendValueListToList(&propertyNameList, @@ -1207,13 +1192,13 @@ esxDomainLookupByUUID(virConnectPtr conn, const unsigned char *uuid) esxVI_Occurrence_RequiredItem) < 0 || esxVI_GetVirtualMachineIdentity(virtualMachine, &id, &name, NULL) < 0 || esxVI_GetVirtualMachinePowerState(virtualMachine, &powerState) < 0) { - goto failure; + goto cleanup; } domain = virGetDomain(conn, name, uuid); if (domain == NULL) { - goto failure; + goto cleanup; } /* Only running/suspended virtual machines have an ID != -1 */ @@ -1229,11 +1214,6 @@ esxDomainLookupByUUID(virConnectPtr conn, const unsigned char *uuid) VIR_FREE(name); return domain; - - failure: - domain = NULL; - - goto cleanup; } @@ -1250,7 +1230,7 @@ esxDomainLookupByName(virConnectPtr conn, const char *name) virDomainPtr domain = NULL; if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return NULL; } if (esxVI_String_AppendValueListToList(&propertyNameList, @@ -1260,28 +1240,24 @@ esxDomainLookupByName(virConnectPtr conn, const char *name) esxVI_LookupVirtualMachineByName(priv->host, name, propertyNameList, &virtualMachine, esxVI_Occurrence_OptionalItem) < 0) { - goto failure; + goto cleanup; } if (virtualMachine == NULL) { ESX_ERROR(VIR_ERR_NO_DOMAIN, _("No domain with name '%s'"), name); - goto failure; + goto cleanup; } - if (esxVI_GetVirtualMachineIdentity(virtualMachine, &id, NULL, uuid) < 0) { - goto failure; - } - - if (esxVI_GetVirtualMachinePowerState(virtualMachine, - &powerState) < 0) { - goto failure; + if (esxVI_GetVirtualMachineIdentity(virtualMachine, &id, NULL, uuid) < 0 || + esxVI_GetVirtualMachinePowerState(virtualMachine, &powerState) < 0) { + goto cleanup; } domain = virGetDomain(conn, name, uuid); if (domain == NULL) { - goto failure; + goto cleanup; } /* Only running/suspended virtual machines have an ID != -1 */ @@ -1296,11 +1272,6 @@ esxDomainLookupByName(virConnectPtr conn, const char *name) esxVI_ObjectContent_Free(&virtualMachine); return domain; - - failure: - domain = NULL; - - goto cleanup; } @@ -1308,7 +1279,7 @@ esxDomainLookupByName(virConnectPtr conn, const char *name) static int esxDomainSuspend(virDomainPtr domain) { - int result = 0; + int result = -1; esxPrivate *priv = domain->conn->privateData; esxVI_ObjectContent *virtualMachine = NULL; esxVI_String *propertyNameList = NULL; @@ -1317,7 +1288,7 @@ esxDomainSuspend(virDomainPtr domain) esxVI_TaskInfoState taskInfoState; if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return -1; } if (esxVI_String_AppendValueToList(&propertyNameList, @@ -1326,37 +1297,34 @@ esxDomainSuspend(virDomainPtr domain) (priv->host, domain->uuid, propertyNameList, &virtualMachine, priv->autoAnswer) < 0 || esxVI_GetVirtualMachinePowerState(virtualMachine, &powerState) < 0) { - goto failure; + goto cleanup; } if (powerState != esxVI_VirtualMachinePowerState_PoweredOn) { ESX_ERROR(VIR_ERR_OPERATION_INVALID, "%s", _("Domain is not powered on")); - goto failure; + goto cleanup; } if (esxVI_SuspendVM_Task(priv->host, virtualMachine->obj, &task) < 0 || esxVI_WaitForTaskCompletion(priv->host, task, domain->uuid, priv->autoAnswer, &taskInfoState) < 0) { - goto failure; + goto cleanup; } if (taskInfoState != esxVI_TaskInfoState_Success) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not suspend domain")); - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_ObjectContent_Free(&virtualMachine); esxVI_String_Free(&propertyNameList); esxVI_ManagedObjectReference_Free(&task); return result; - - failure: - result = -1; - - goto cleanup; } @@ -1364,7 +1332,7 @@ esxDomainSuspend(virDomainPtr domain) static int esxDomainResume(virDomainPtr domain) { - int result = 0; + int result = -1; esxPrivate *priv = domain->conn->privateData; esxVI_ObjectContent *virtualMachine = NULL; esxVI_String *propertyNameList = NULL; @@ -1373,7 +1341,7 @@ esxDomainResume(virDomainPtr domain) esxVI_TaskInfoState taskInfoState; if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return -1; } if (esxVI_String_AppendValueToList(&propertyNameList, @@ -1382,37 +1350,34 @@ esxDomainResume(virDomainPtr domain) (priv->host, domain->uuid, propertyNameList, &virtualMachine, priv->autoAnswer) < 0 || esxVI_GetVirtualMachinePowerState(virtualMachine, &powerState) < 0) { - goto failure; + goto cleanup; } if (powerState != esxVI_VirtualMachinePowerState_Suspended) { ESX_ERROR(VIR_ERR_OPERATION_INVALID, "%s", _("Domain is not suspended")); - goto failure; + goto cleanup; } if (esxVI_PowerOnVM_Task(priv->host, virtualMachine->obj, NULL, &task) < 0 || esxVI_WaitForTaskCompletion(priv->host, task, domain->uuid, priv->autoAnswer, &taskInfoState) < 0) { - goto failure; + goto cleanup; } if (taskInfoState != esxVI_TaskInfoState_Success) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not resume domain")); - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_ObjectContent_Free(&virtualMachine); esxVI_String_Free(&propertyNameList); esxVI_ManagedObjectReference_Free(&task); return result; - - failure: - result = -1; - - goto cleanup; } @@ -1420,14 +1385,14 @@ esxDomainResume(virDomainPtr domain) static int esxDomainShutdown(virDomainPtr domain) { - int result = 0; + int result = -1; esxPrivate *priv = domain->conn->privateData; esxVI_ObjectContent *virtualMachine = NULL; esxVI_String *propertyNameList = NULL; esxVI_VirtualMachinePowerState powerState; if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return -1; } if (esxVI_String_AppendValueToList(&propertyNameList, @@ -1436,29 +1401,26 @@ esxDomainShutdown(virDomainPtr domain) propertyNameList, &virtualMachine, esxVI_Occurrence_RequiredItem) < 0 || esxVI_GetVirtualMachinePowerState(virtualMachine, &powerState) < 0) { - goto failure; + goto cleanup; } if (powerState != esxVI_VirtualMachinePowerState_PoweredOn) { ESX_ERROR(VIR_ERR_OPERATION_INVALID, "%s", _("Domain is not powered on")); - goto failure; + goto cleanup; } if (esxVI_ShutdownGuest(priv->host, virtualMachine->obj) < 0) { - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_ObjectContent_Free(&virtualMachine); esxVI_String_Free(&propertyNameList); return result; - - failure: - result = -1; - - goto cleanup; } @@ -1466,14 +1428,14 @@ esxDomainShutdown(virDomainPtr domain) static int esxDomainReboot(virDomainPtr domain, unsigned int flags ATTRIBUTE_UNUSED) { - int result = 0; + int result = -1; esxPrivate *priv = domain->conn->privateData; esxVI_ObjectContent *virtualMachine = NULL; esxVI_String *propertyNameList = NULL; esxVI_VirtualMachinePowerState powerState; if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return -1; } if (esxVI_String_AppendValueToList(&propertyNameList, @@ -1482,29 +1444,26 @@ esxDomainReboot(virDomainPtr domain, unsigned int flags ATTRIBUTE_UNUSED) propertyNameList, &virtualMachine, esxVI_Occurrence_RequiredItem) < 0 || esxVI_GetVirtualMachinePowerState(virtualMachine, &powerState) < 0) { - goto failure; + goto cleanup; } if (powerState != esxVI_VirtualMachinePowerState_PoweredOn) { ESX_ERROR(VIR_ERR_OPERATION_INVALID, "%s", _("Domain is not powered on")); - goto failure; + goto cleanup; } if (esxVI_RebootGuest(priv->host, virtualMachine->obj) < 0) { - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_ObjectContent_Free(&virtualMachine); esxVI_String_Free(&propertyNameList); return result; - - failure: - result = -1; - - goto cleanup; } @@ -1512,7 +1471,7 @@ esxDomainReboot(virDomainPtr domain, unsigned int flags ATTRIBUTE_UNUSED) static int esxDomainDestroy(virDomainPtr domain) { - int result = 0; + int result = -1; esxPrivate *priv = domain->conn->privateData; esxVI_Context *ctx = NULL; esxVI_ObjectContent *virtualMachine = NULL; @@ -1528,7 +1487,7 @@ esxDomainDestroy(virDomainPtr domain) } if (esxVI_EnsureSession(ctx) < 0) { - goto failure; + return -1; } if (esxVI_String_AppendValueToList(&propertyNameList, @@ -1537,37 +1496,34 @@ esxDomainDestroy(virDomainPtr domain) (ctx, domain->uuid, propertyNameList, &virtualMachine, priv->autoAnswer) < 0 || esxVI_GetVirtualMachinePowerState(virtualMachine, &powerState) < 0) { - goto failure; + goto cleanup; } if (powerState != esxVI_VirtualMachinePowerState_PoweredOn) { ESX_ERROR(VIR_ERR_OPERATION_INVALID, "%s", _("Domain is not powered on")); - goto failure; + goto cleanup; } if (esxVI_PowerOffVM_Task(ctx, virtualMachine->obj, &task) < 0 || esxVI_WaitForTaskCompletion(ctx, task, domain->uuid, priv->autoAnswer, &taskInfoState) < 0) { - goto failure; + goto cleanup; } if (taskInfoState != esxVI_TaskInfoState_Success) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not destroy domain")); - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_ObjectContent_Free(&virtualMachine); esxVI_String_Free(&propertyNameList); esxVI_ManagedObjectReference_Free(&task); return result; - - failure: - result = -1; - - goto cleanup; } @@ -1597,7 +1553,7 @@ esxDomainGetMaxMemory(virDomainPtr domain) unsigned long memoryMB = 0; if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return 0; } if (esxVI_String_AppendValueToList(&propertyNameList, @@ -1605,7 +1561,7 @@ esxDomainGetMaxMemory(virDomainPtr domain) esxVI_LookupVirtualMachineByUuid(priv->host, domain->uuid, propertyNameList, &virtualMachine, esxVI_Occurrence_RequiredItem) < 0) { - goto failure; + goto cleanup; } for (dynamicProperty = virtualMachine->propSet; dynamicProperty != NULL; @@ -1613,7 +1569,7 @@ esxDomainGetMaxMemory(virDomainPtr domain) if (STREQ(dynamicProperty->name, "config.hardware.memoryMB")) { if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_Int) < 0) { - goto failure; + goto cleanup; } if (dynamicProperty->val->int32 < 0) { @@ -1635,11 +1591,6 @@ esxDomainGetMaxMemory(virDomainPtr domain) esxVI_ObjectContent_Free(&virtualMachine); return memoryMB * 1024; /* Scale from megabyte to kilobyte */ - - failure: - memoryMB = 0; - - goto cleanup; } @@ -1647,7 +1598,7 @@ esxDomainGetMaxMemory(virDomainPtr domain) static int esxDomainSetMaxMemory(virDomainPtr domain, unsigned long memory) { - int result = 0; + int result = -1; esxPrivate *priv = domain->conn->privateData; esxVI_ObjectContent *virtualMachine = NULL; esxVI_VirtualMachineConfigSpec *spec = NULL; @@ -1655,7 +1606,7 @@ esxDomainSetMaxMemory(virDomainPtr domain, unsigned long memory) esxVI_TaskInfoState taskInfoState; if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return -1; } if (esxVI_LookupVirtualMachineByUuidAndPrepareForTask @@ -1663,7 +1614,7 @@ esxDomainSetMaxMemory(virDomainPtr domain, unsigned long memory) priv->autoAnswer) < 0 || esxVI_VirtualMachineConfigSpec_Alloc(&spec) < 0 || esxVI_Long_Alloc(&spec->memoryMB) < 0) { - goto failure; + goto cleanup; } spec->memoryMB->value = @@ -1673,26 +1624,23 @@ esxDomainSetMaxMemory(virDomainPtr domain, unsigned long memory) &task) < 0 || esxVI_WaitForTaskCompletion(priv->host, task, domain->uuid, priv->autoAnswer, &taskInfoState) < 0) { - goto failure; + goto cleanup; } if (taskInfoState != esxVI_TaskInfoState_Success) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Could not set max-memory to %lu kilobytes"), memory); - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_ObjectContent_Free(&virtualMachine); esxVI_VirtualMachineConfigSpec_Free(&spec); esxVI_ManagedObjectReference_Free(&task); return result; - - failure: - result = -1; - - goto cleanup; } @@ -1700,7 +1648,7 @@ esxDomainSetMaxMemory(virDomainPtr domain, unsigned long memory) static int esxDomainSetMemory(virDomainPtr domain, unsigned long memory) { - int result = 0; + int result = -1; esxPrivate *priv = domain->conn->privateData; esxVI_ObjectContent *virtualMachine = NULL; esxVI_VirtualMachineConfigSpec *spec = NULL; @@ -1708,7 +1656,7 @@ esxDomainSetMemory(virDomainPtr domain, unsigned long memory) esxVI_TaskInfoState taskInfoState; if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return -1; } if (esxVI_LookupVirtualMachineByUuidAndPrepareForTask @@ -1717,7 +1665,7 @@ esxDomainSetMemory(virDomainPtr domain, unsigned long memory) esxVI_VirtualMachineConfigSpec_Alloc(&spec) < 0 || esxVI_ResourceAllocationInfo_Alloc(&spec->memoryAllocation) < 0 || esxVI_Long_Alloc(&spec->memoryAllocation->limit) < 0) { - goto failure; + goto cleanup; } spec->memoryAllocation->limit->value = @@ -1727,26 +1675,23 @@ esxDomainSetMemory(virDomainPtr domain, unsigned long memory) &task) < 0 || esxVI_WaitForTaskCompletion(priv->host, task, domain->uuid, priv->autoAnswer, &taskInfoState) < 0) { - goto failure; + goto cleanup; } if (taskInfoState != esxVI_TaskInfoState_Success) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Could not set memory to %lu kilobytes"), memory); - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_ObjectContent_Free(&virtualMachine); esxVI_VirtualMachineConfigSpec_Free(&spec); esxVI_ManagedObjectReference_Free(&task); return result; - - failure: - result = -1; - - goto cleanup; } @@ -1754,7 +1699,7 @@ esxDomainSetMemory(virDomainPtr domain, unsigned long memory) static int esxDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) { - int result = 0; + int result = -1; esxPrivate *priv = domain->conn->privateData; esxVI_String *propertyNameList = NULL; esxVI_ObjectContent *virtualMachine = NULL; @@ -1774,8 +1719,10 @@ esxDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) esxVI_PerfMetricIntSeries *perfMetricIntSeries = NULL; esxVI_Long *value = NULL; + memset(info, 0, sizeof (*info)); + if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return -1; } if (esxVI_String_AppendValueListToList(&propertyNameList, @@ -1786,21 +1733,17 @@ esxDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) esxVI_LookupVirtualMachineByUuid(priv->host, domain->uuid, propertyNameList, &virtualMachine, esxVI_Occurrence_RequiredItem) < 0) { - goto failure; + goto cleanup; } info->state = VIR_DOMAIN_NOSTATE; - info->maxMem = 0; - info->memory = 0; - info->nrVirtCpu = 0; - info->cpuTime = 0; /* FIXME */ for (dynamicProperty = virtualMachine->propSet; dynamicProperty != NULL; dynamicProperty = dynamicProperty->_next) { if (STREQ(dynamicProperty->name, "runtime.powerState")) { if (esxVI_VirtualMachinePowerState_CastFromAnyType (dynamicProperty->val, &powerState) < 0) { - goto failure; + goto cleanup; } info->state = esxVI_VirtualMachinePowerState_ConvertToLibvirt @@ -1808,14 +1751,14 @@ esxDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) } else if (STREQ(dynamicProperty->name, "config.hardware.memoryMB")) { if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_Int) < 0) { - goto failure; + goto cleanup; } info->maxMem = dynamicProperty->val->int32 * 1024; /* Scale from megabyte to kilobyte */ } else if (STREQ(dynamicProperty->name, "config.hardware.numCPU")) { if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_Int) < 0) { - goto failure; + goto cleanup; } info->nrVirtCpu = dynamicProperty->val->int32; @@ -1823,7 +1766,7 @@ esxDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) "config.memoryAllocation.limit")) { if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_Long) < 0) { - goto failure; + goto cleanup; } memory_limit = dynamicProperty->val->int64; @@ -1842,18 +1785,18 @@ esxDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) /* Verify the cached 'used CPU time' performance counter ID */ if (info->state == VIR_DOMAIN_RUNNING && priv->usedCpuTimeCounterId >= 0) { if (esxVI_Int_Alloc(&counterId) < 0) { - goto failure; + goto cleanup; } counterId->value = priv->usedCpuTimeCounterId; if (esxVI_Int_AppendToList(&counterIdList, counterId) < 0) { - goto failure; + goto cleanup; } if (esxVI_QueryPerfCounter(priv->host, counterIdList, &perfCounterInfo) < 0) { - goto failure; + goto cleanup; } if (STRNEQ(perfCounterInfo->groupInfo->key, "cpu") || @@ -1877,7 +1820,7 @@ esxDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) if (esxVI_QueryAvailablePerfMetric(priv->host, virtualMachine->obj, NULL, NULL, NULL, &perfMetricIdList) < 0) { - goto failure; + goto cleanup; } for (perfMetricId = perfMetricIdList; perfMetricId != NULL; @@ -1889,13 +1832,13 @@ esxDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) if (esxVI_Int_DeepCopy(&counterId, perfMetricId->counterId) < 0 || esxVI_Int_AppendToList(&counterIdList, counterId) < 0) { - goto failure; + goto cleanup; } } if (esxVI_QueryPerfCounter(priv->host, counterIdList, &perfCounterInfoList) < 0) { - goto failure; + goto cleanup; } for (perfCounterInfo = perfCounterInfoList; perfCounterInfo != NULL; @@ -1933,7 +1876,7 @@ esxDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) esxVI_Int_Alloc(&querySpec->maxSample) < 0 || esxVI_PerfMetricId_Alloc(&querySpec->metricId) < 0 || esxVI_Int_Alloc(&querySpec->metricId->counterId) < 0) { - goto failure; + goto cleanup; } querySpec->entity = virtualMachine->obj; @@ -1947,7 +1890,7 @@ esxDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) querySpec->entity = NULL; querySpec->metricId->instance = NULL; querySpec->format = NULL; - goto failure; + goto cleanup; } for (perfEntityMetricBase = perfEntityMetricBaseList; @@ -1986,8 +1929,15 @@ esxDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) querySpec->format = NULL; VIR_DEBUG("usedCpuTimeCounterId %d END", priv->usedCpuTimeCounterId); + + /* + * FIXME: Cannot map between realtive used-cpu-time and absolute + * info->cpuTime + */ } + result = 0; + cleanup: esxVI_String_Free(&propertyNameList); esxVI_ObjectContent_Free(&virtualMachine); @@ -1998,11 +1948,6 @@ esxDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) esxVI_PerfEntityMetricBase_Free(&perfEntityMetricBaseList); return result; - - failure: - result = -1; - - goto cleanup; } @@ -2010,7 +1955,7 @@ esxDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) static int esxDomainSetVcpus(virDomainPtr domain, unsigned int nvcpus) { - int result = 0; + int result = -1; esxPrivate *priv = domain->conn->privateData; int maxVcpus; esxVI_ObjectContent *virtualMachine = NULL; @@ -2021,17 +1966,17 @@ esxDomainSetVcpus(virDomainPtr domain, unsigned int nvcpus) if (nvcpus < 1) { ESX_ERROR(VIR_ERR_INVALID_ARG, "%s", _("Requested number of virtual CPUs must at least be 1")); - goto failure; + return -1; } if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return -1; } maxVcpus = esxDomainGetMaxVcpus(domain); if (maxVcpus < 0) { - goto failure; + return -1; } if (nvcpus > maxVcpus) { @@ -2039,7 +1984,7 @@ esxDomainSetVcpus(virDomainPtr domain, unsigned int nvcpus) _("Requested number of virtual CPUs is greater than max " "allowable number of virtual CPUs for the domain: %d > %d"), nvcpus, maxVcpus); - goto failure; + return -1; } if (esxVI_LookupVirtualMachineByUuidAndPrepareForTask @@ -2047,7 +1992,7 @@ esxDomainSetVcpus(virDomainPtr domain, unsigned int nvcpus) priv->autoAnswer) < 0 || esxVI_VirtualMachineConfigSpec_Alloc(&spec) < 0 || esxVI_Int_Alloc(&spec->numCPUs) < 0) { - goto failure; + goto cleanup; } spec->numCPUs->value = nvcpus; @@ -2056,26 +2001,23 @@ esxDomainSetVcpus(virDomainPtr domain, unsigned int nvcpus) &task) < 0 || esxVI_WaitForTaskCompletion(priv->host, task, domain->uuid, priv->autoAnswer, &taskInfoState) < 0) { - goto failure; + goto cleanup; } if (taskInfoState != esxVI_TaskInfoState_Success) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Could not set number of virtual CPUs to %d"), nvcpus); - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_ObjectContent_Free(&virtualMachine); esxVI_VirtualMachineConfigSpec_Free(&spec); esxVI_ManagedObjectReference_Free(&task); return result; - - failure: - result = -1; - - goto cleanup; } @@ -2092,8 +2034,10 @@ esxDomainGetMaxVcpus(virDomainPtr domain) return priv->maxVcpus; } + priv->maxVcpus = -1; + if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return -1; } if (esxVI_String_AppendValueToList(&propertyNameList, @@ -2101,13 +2045,13 @@ esxDomainGetMaxVcpus(virDomainPtr domain) esxVI_LookupObjectContentByType(priv->host, priv->host->hostFolder, "HostSystem", propertyNameList, esxVI_Boolean_True, &hostSystem) < 0) { - goto failure; + goto cleanup; } if (hostSystem == NULL) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not retrieve the HostSystem object")); - goto failure; + goto cleanup; } for (dynamicProperty = hostSystem->propSet; dynamicProperty != NULL; @@ -2115,7 +2059,7 @@ esxDomainGetMaxVcpus(virDomainPtr domain) if (STREQ(dynamicProperty->name, "capability.maxSupportedVcpus")) { if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_Int) < 0) { - goto failure; + goto cleanup; } priv->maxVcpus = dynamicProperty->val->int32; @@ -2130,11 +2074,6 @@ esxDomainGetMaxVcpus(virDomainPtr domain) esxVI_ObjectContent_Free(&hostSystem); return priv->maxVcpus; - - failure: - priv->maxVcpus = -1; - - goto cleanup; } @@ -2157,7 +2096,7 @@ esxDomainDumpXML(virDomainPtr domain, int flags) char *xml = NULL; if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return NULL; } if (esxVI_String_AppendValueToList(&propertyNameList, @@ -2165,7 +2104,7 @@ esxDomainDumpXML(virDomainPtr domain, int flags) esxVI_LookupVirtualMachineByUuid(priv->host, domain->uuid, propertyNameList, &virtualMachine, esxVI_Occurrence_RequiredItem) < 0) { - goto failure; + goto cleanup; } for (dynamicProperty = virtualMachine->propSet; dynamicProperty != NULL; @@ -2173,7 +2112,7 @@ esxDomainDumpXML(virDomainPtr domain, int flags) if (STREQ(dynamicProperty->name, "config.files.vmPathName")) { if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_String) < 0) { - goto failure; + goto cleanup; } vmPathName = dynamicProperty->val->string; @@ -2183,7 +2122,7 @@ esxDomainDumpXML(virDomainPtr domain, int flags) if (esxUtil_ParseDatastoreRelatedPath(vmPathName, &datastoreName, &directoryName, &fileName) < 0) { - goto failure; + goto cleanup; } virBufferVSprintf(&buffer, "%s://%s:%d/folder/", priv->transport, @@ -2202,13 +2141,13 @@ esxDomainDumpXML(virDomainPtr domain, int flags) if (virBufferError(&buffer)) { virReportOOMError(); - goto failure; + goto cleanup; } url = virBufferContentAndReset(&buffer); if (esxVI_Context_DownloadFile(priv->host, url, &vmx) < 0) { - goto failure; + goto cleanup; } def = esxVMX_ParseConfig(priv->host, vmx, datastoreName, directoryName, @@ -2219,6 +2158,10 @@ esxDomainDumpXML(virDomainPtr domain, int flags) } cleanup: + if (url == NULL) { + virBufferFreeAndReset(&buffer); + } + esxVI_String_Free(&propertyNameList); esxVI_ObjectContent_Free(&virtualMachine); VIR_FREE(datastoreName); @@ -2229,12 +2172,6 @@ esxDomainDumpXML(virDomainPtr domain, int flags) virDomainDefFree(def); return xml; - - failure: - virBufferFreeAndReset(&buffer); - VIR_FREE(xml); - - goto cleanup; } @@ -2301,6 +2238,7 @@ esxDomainXMLToNative(virConnectPtr conn, const char *nativeFormat, static int esxListDefinedDomains(virConnectPtr conn, char **const names, int maxnames) { + bool success = false; esxPrivate *priv = conn->privateData; esxVI_String *propertyNameList = NULL; esxVI_ObjectContent *virtualMachineList = NULL; @@ -2320,7 +2258,7 @@ esxListDefinedDomains(virConnectPtr conn, char **const names, int maxnames) } if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return -1; } if (esxVI_String_AppendValueListToList(&propertyNameList, @@ -2330,14 +2268,14 @@ esxListDefinedDomains(virConnectPtr conn, char **const names, int maxnames) "VirtualMachine", propertyNameList, esxVI_Boolean_True, &virtualMachineList) < 0) { - goto failure; + goto cleanup; } for (virtualMachine = virtualMachineList; virtualMachine != NULL; virtualMachine = virtualMachine->_next) { if (esxVI_GetVirtualMachinePowerState(virtualMachine, &powerState) < 0) { - goto failure; + goto cleanup; } if (powerState == esxVI_VirtualMachinePowerState_PoweredOn) { @@ -2350,14 +2288,14 @@ esxListDefinedDomains(virConnectPtr conn, char **const names, int maxnames) if (STREQ(dynamicProperty->name, "name")) { if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_String) < 0) { - goto failure; + goto cleanup; } names[count] = strdup(dynamicProperty->val->string); if (names[count] == NULL) { virReportOOMError(); - goto failure; + goto cleanup; } count++; @@ -2370,20 +2308,21 @@ esxListDefinedDomains(virConnectPtr conn, char **const names, int maxnames) } } - cleanup: - esxVI_String_Free(&propertyNameList); - esxVI_ObjectContent_Free(&virtualMachineList); + success = true; - return count; + cleanup: + if (! success) { + for (i = 0; i < count; ++i) { + VIR_FREE(names[i]); + } - failure: - for (i = 0; i < count; ++i) { - VIR_FREE(names[i]); + count = -1; } - count = -1; + esxVI_String_Free(&propertyNameList); + esxVI_ObjectContent_Free(&virtualMachineList); - goto cleanup; + return count; } @@ -2407,7 +2346,7 @@ esxNumberOfDefinedDomains(virConnectPtr conn) static int esxDomainCreate(virDomainPtr domain) { - int result = 0; + int result = -1; esxPrivate *priv = domain->conn->privateData; esxVI_ObjectContent *virtualMachine = NULL; esxVI_String *propertyNameList = NULL; @@ -2416,7 +2355,7 @@ esxDomainCreate(virDomainPtr domain) esxVI_TaskInfoState taskInfoState; if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return -1; } if (esxVI_String_AppendValueToList(&propertyNameList, @@ -2426,38 +2365,35 @@ esxDomainCreate(virDomainPtr domain) priv->autoAnswer) < 0 || esxVI_GetVirtualMachinePowerState(virtualMachine, &powerState) < 0) { - goto failure; + goto cleanup; } if (powerState != esxVI_VirtualMachinePowerState_PoweredOff) { ESX_ERROR(VIR_ERR_OPERATION_INVALID, "%s", _("Domain is not powered off")); - goto failure; + goto cleanup; } if (esxVI_PowerOnVM_Task(priv->host, virtualMachine->obj, NULL, &task) < 0 || esxVI_WaitForTaskCompletion(priv->host, task, domain->uuid, priv->autoAnswer, &taskInfoState) < 0) { - goto failure; + goto cleanup; } if (taskInfoState != esxVI_TaskInfoState_Success) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not start domain")); - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_ObjectContent_Free(&virtualMachine); esxVI_String_Free(&propertyNameList); esxVI_ManagedObjectReference_Free(&task); return result; - - failure: - result = -1; - - goto cleanup; } @@ -2485,7 +2421,7 @@ esxDomainDefineXML(virConnectPtr conn, const char *xml ATTRIBUTE_UNUSED) virDomainPtr domain = NULL; if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return NULL; } /* Parse domain XML */ @@ -2493,14 +2429,14 @@ esxDomainDefineXML(virConnectPtr conn, const char *xml ATTRIBUTE_UNUSED) VIR_DOMAIN_XML_INACTIVE); if (def == NULL) { - goto failure; + return NULL; } /* Check if an existing domain should be edited */ if (esxVI_LookupVirtualMachineByUuid(priv->host, def->uuid, NULL, &virtualMachine, esxVI_Occurrence_OptionalItem) < 0) { - goto failure; + goto cleanup; } if (virtualMachine != NULL) { @@ -2508,14 +2444,14 @@ esxDomainDefineXML(virConnectPtr conn, const char *xml ATTRIBUTE_UNUSED) ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Domain already exists, editing existing domains is not " "supported yet")); - goto failure; + goto cleanup; } /* Build VMX from domain XML */ vmx = esxVMX_FormatConfig(priv->host, def, priv->host->productVersion); if (vmx == NULL) { - goto failure; + goto cleanup; } /* @@ -2529,7 +2465,7 @@ esxDomainDefineXML(virConnectPtr conn, const char *xml ATTRIBUTE_UNUSED) ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Domain XML doesn't contain any disks, cannot deduce " "datastore and path for VMX file")); - goto failure; + goto cleanup; } for (i = 0; i < def->ndisks; ++i) { @@ -2544,26 +2480,26 @@ esxDomainDefineXML(virConnectPtr conn, const char *xml ATTRIBUTE_UNUSED) ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Domain XML doesn't contain any file-based harddisks, " "cannot deduce datastore and path for VMX file")); - goto failure; + goto cleanup; } if (disk->src == NULL) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("First file-based harddisk has no source, cannot deduce " "datastore and path for VMX file")); - goto failure; + goto cleanup; } if (esxUtil_ParseDatastoreRelatedPath(disk->src, &datastoreName, &directoryName, &fileName) < 0) { - goto failure; + goto cleanup; } if (! virFileHasSuffix(fileName, ".vmdk")) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting source '%s' of first file-based harddisk to " "be a VMDK image"), disk->src); - goto failure; + goto cleanup; } virBufferVSprintf(&buffer, "%s://%s:%d/folder/", priv->transport, @@ -2582,7 +2518,7 @@ esxDomainDefineXML(virConnectPtr conn, const char *xml ATTRIBUTE_UNUSED) if (virBufferError(&buffer)) { virReportOOMError(); - goto failure; + goto cleanup; } url = virBufferContentAndReset(&buffer); @@ -2591,13 +2527,13 @@ esxDomainDefineXML(virConnectPtr conn, const char *xml ATTRIBUTE_UNUSED) if (virAsprintf(&datastoreRelatedPath, "[%s] %s/%s.vmx", datastoreName, directoryName, def->name) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } } else { if (virAsprintf(&datastoreRelatedPath, "[%s] %s.vmx", datastoreName, def->name) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } } @@ -2605,12 +2541,12 @@ esxDomainDefineXML(virConnectPtr conn, const char *xml ATTRIBUTE_UNUSED) if (esxVI_String_AppendValueToList(&propertyNameList, "parent") < 0 || esxVI_LookupHostSystemByIp(priv->host, priv->host->ipAddress, propertyNameList, &hostSystem) < 0) { - goto failure; + goto cleanup; } if (esxVI_LookupResourcePoolByHostSystem(priv->host, hostSystem, &resourcePool) < 0) { - goto failure; + goto cleanup; } /* Check, if VMX file already exists */ @@ -2618,7 +2554,7 @@ esxDomainDefineXML(virConnectPtr conn, const char *xml ATTRIBUTE_UNUSED) /* Upload VMX file */ if (esxVI_Context_UploadFile(priv->host, url, vmx) < 0) { - goto failure; + goto cleanup; } /* Register the domain */ @@ -2627,12 +2563,12 @@ esxDomainDefineXML(virConnectPtr conn, const char *xml ATTRIBUTE_UNUSED) resourcePool, hostSystem->obj, &task) < 0 || esxVI_WaitForTaskCompletion(priv->host, task, def->uuid, priv->autoAnswer, &taskInfoState) < 0) { - goto failure; + goto cleanup; } if (taskInfoState != esxVI_TaskInfoState_Success) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not define domain")); - goto failure; + goto cleanup; } domain = virGetDomain(conn, def->name, def->uuid); @@ -2644,6 +2580,10 @@ esxDomainDefineXML(virConnectPtr conn, const char *xml ATTRIBUTE_UNUSED) /* FIXME: Add proper rollback in case of an error */ cleanup: + if (url == NULL) { + virBufferFreeAndReset(&buffer); + } + virDomainDefFree(def); VIR_FREE(vmx); VIR_FREE(datastoreName); @@ -2658,13 +2598,6 @@ esxDomainDefineXML(virConnectPtr conn, const char *xml ATTRIBUTE_UNUSED) esxVI_ManagedObjectReference_Free(&task); return domain; - - failure: - virBufferFreeAndReset(&buffer); - - domain = NULL; - - goto cleanup; } @@ -2672,7 +2605,7 @@ esxDomainDefineXML(virConnectPtr conn, const char *xml ATTRIBUTE_UNUSED) static int esxDomainUndefine(virDomainPtr domain) { - int result = 0; + int result = -1; esxPrivate *priv = domain->conn->privateData; esxVI_Context *ctx = NULL; esxVI_ObjectContent *virtualMachine = NULL; @@ -2686,7 +2619,7 @@ esxDomainUndefine(virDomainPtr domain) } if (esxVI_EnsureSession(ctx) < 0) { - goto failure; + return -1; } if (esxVI_String_AppendValueToList(&propertyNameList, @@ -2695,30 +2628,27 @@ esxDomainUndefine(virDomainPtr domain) &virtualMachine, esxVI_Occurrence_RequiredItem) < 0 || esxVI_GetVirtualMachinePowerState(virtualMachine, &powerState) < 0) { - goto failure; + goto cleanup; } if (powerState != esxVI_VirtualMachinePowerState_Suspended && powerState != esxVI_VirtualMachinePowerState_PoweredOff) { ESX_ERROR(VIR_ERR_OPERATION_INVALID, "%s", _("Domain is not suspended or powered off")); - goto failure; + goto cleanup; } if (esxVI_UnregisterVM(ctx, virtualMachine->obj) < 0) { - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_ObjectContent_Free(&virtualMachine); esxVI_String_Free(&propertyNameList); return result; - - failure: - result = -1; - - goto cleanup; } @@ -2774,7 +2704,7 @@ static int esxDomainGetSchedulerParameters(virDomainPtr domain, virSchedParameterPtr params, int *nparams) { - int result = 0; + int result = -1; esxPrivate *priv = domain->conn->privateData; esxVI_String *propertyNameList = NULL; esxVI_ObjectContent *virtualMachine = NULL; @@ -2786,11 +2716,11 @@ esxDomainGetSchedulerParameters(virDomainPtr domain, if (*nparams < 3) { ESX_ERROR(VIR_ERR_INVALID_ARG, "%s", _("Parameter array must have space for 3 items")); - goto failure; + return -1; } if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return -1; } if (esxVI_String_AppendValueListToList(&propertyNameList, @@ -2800,7 +2730,7 @@ esxDomainGetSchedulerParameters(virDomainPtr domain, esxVI_LookupVirtualMachineByUuid(priv->host, domain->uuid, propertyNameList, &virtualMachine, esxVI_Occurrence_RequiredItem) < 0) { - goto failure; + goto cleanup; } for (dynamicProperty = virtualMachine->propSet; @@ -2815,7 +2745,7 @@ esxDomainGetSchedulerParameters(virDomainPtr domain, if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_Long) < 0) { - goto failure; + goto cleanup; } params[i].value.l = dynamicProperty->val->int64; @@ -2831,7 +2761,7 @@ esxDomainGetSchedulerParameters(virDomainPtr domain, if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_Long) < 0) { - goto failure; + goto cleanup; } params[i].value.l = dynamicProperty->val->int64; @@ -2847,7 +2777,7 @@ esxDomainGetSchedulerParameters(virDomainPtr domain, if (esxVI_SharesInfo_CastFromAnyType(dynamicProperty->val, &sharesInfo) < 0) { - goto failure; + goto cleanup; } switch (sharesInfo->level) { @@ -2871,7 +2801,7 @@ esxDomainGetSchedulerParameters(virDomainPtr domain, ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Shares level has unknown value %d"), (int)sharesInfo->level); - goto failure; + goto cleanup; } esxVI_SharesInfo_Free(&sharesInfo); @@ -2884,17 +2814,13 @@ esxDomainGetSchedulerParameters(virDomainPtr domain, } *nparams = i; + result = 0; cleanup: esxVI_String_Free(&propertyNameList); esxVI_ObjectContent_Free(&virtualMachine); return result; - - failure: - result = -1; - - goto cleanup; } @@ -2903,7 +2829,7 @@ static int esxDomainSetSchedulerParameters(virDomainPtr domain, virSchedParameterPtr params, int nparams) { - int result = 0; + int result = -1; esxPrivate *priv = domain->conn->privateData; esxVI_ObjectContent *virtualMachine = NULL; esxVI_VirtualMachineConfigSpec *spec = NULL; @@ -2913,7 +2839,7 @@ esxDomainSetSchedulerParameters(virDomainPtr domain, int i; if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return -1; } if (esxVI_LookupVirtualMachineByUuidAndPrepareForTask @@ -2921,28 +2847,28 @@ esxDomainSetSchedulerParameters(virDomainPtr domain, priv->autoAnswer) < 0 || esxVI_VirtualMachineConfigSpec_Alloc(&spec) < 0 || esxVI_ResourceAllocationInfo_Alloc(&spec->cpuAllocation) < 0) { - goto failure; + goto cleanup; } for (i = 0; i < nparams; ++i) { if (STREQ (params[i].field, "reservation") && params[i].type == VIR_DOMAIN_SCHED_FIELD_LLONG) { if (esxVI_Long_Alloc(&spec->cpuAllocation->reservation) < 0) { - goto failure; + goto cleanup; } if (params[i].value.l < 0) { ESX_ERROR(VIR_ERR_INVALID_ARG, _("Could not set reservation to %lld MHz, expecting " "positive value"), params[i].value.l); - goto failure; + goto cleanup; } spec->cpuAllocation->reservation->value = params[i].value.l; } else if (STREQ (params[i].field, "limit") && params[i].type == VIR_DOMAIN_SCHED_FIELD_LLONG) { if (esxVI_Long_Alloc(&spec->cpuAllocation->limit) < 0) { - goto failure; + goto cleanup; } if (params[i].value.l < -1) { @@ -2950,7 +2876,7 @@ esxDomainSetSchedulerParameters(virDomainPtr domain, _("Could not set limit to %lld MHz, expecting " "positive value or -1 (unlimited)"), params[i].value.l); - goto failure; + goto cleanup; } spec->cpuAllocation->limit->value = params[i].value.l; @@ -2958,7 +2884,7 @@ esxDomainSetSchedulerParameters(virDomainPtr domain, params[i].type == VIR_DOMAIN_SCHED_FIELD_INT) { if (esxVI_SharesInfo_Alloc(&sharesInfo) < 0 || esxVI_Int_Alloc(&sharesInfo->shares) < 0) { - goto failure; + goto cleanup; } spec->cpuAllocation->shares = sharesInfo; @@ -2990,13 +2916,13 @@ esxDomainSetSchedulerParameters(virDomainPtr domain, _("Could not set shares to %d, expecting positive " "value or -1 (low), -2 (normal) or -3 (high)"), params[i].value.i); - goto failure; + goto cleanup; } } } else { ESX_ERROR(VIR_ERR_INVALID_ARG, _("Unknown field '%s'"), params[i].field); - goto failure; + goto cleanup; } } @@ -3004,26 +2930,23 @@ esxDomainSetSchedulerParameters(virDomainPtr domain, &task) < 0 || esxVI_WaitForTaskCompletion(priv->host, task, domain->uuid, priv->autoAnswer, &taskInfoState) < 0) { - goto failure; + goto cleanup; } if (taskInfoState != esxVI_TaskInfoState_Success) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not change scheduler parameters")); - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_ObjectContent_Free(&virtualMachine); esxVI_VirtualMachineConfigSpec_Free(&spec); esxVI_ManagedObjectReference_Free(&task); return result; - - failure: - result = -1; - - goto cleanup; } @@ -3037,7 +2960,7 @@ esxDomainMigratePrepare(virConnectPtr dconn, const char *dname ATTRIBUTE_UNUSED, unsigned long resource ATTRIBUTE_UNUSED) { - int result = 0; + int result = -1; char *transport = NULL; if (uri_in == NULL) { @@ -3048,19 +2971,16 @@ esxDomainMigratePrepare(virConnectPtr dconn, if (virAsprintf(uri_out, "%s://%s:%d/sdk", transport, dconn->uri->server, dconn->uri->port) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } } + result = 0; + cleanup: VIR_FREE(transport); return result; - - failure: - result = -1; - - goto cleanup; } @@ -3074,7 +2994,7 @@ esxDomainMigratePerform(virDomainPtr domain, const char *dname, unsigned long bandwidth ATTRIBUTE_UNUSED) { - int result = 0; + int result = -1; esxPrivate *priv = domain->conn->privateData; xmlURIPtr xmlUri = NULL; char hostIpAddress[NI_MAXHOST] = ""; @@ -3089,17 +3009,17 @@ esxDomainMigratePerform(virDomainPtr domain, if (priv->vCenter == NULL) { ESX_ERROR(VIR_ERR_INVALID_ARG, "%s", _("Migration not possible without a vCenter")); - goto failure; + return -1; } if (dname != NULL) { ESX_ERROR(VIR_ERR_INVALID_ARG, "%s", _("Renaming domains on migration not supported")); - goto failure; + return -1; } if (esxVI_EnsureSession(priv->vCenter) < 0) { - goto failure; + return -1; } /* Parse the destination URI and resolve the hostname */ @@ -3107,12 +3027,12 @@ esxDomainMigratePerform(virDomainPtr domain, if (xmlUri == NULL) { virReportOOMError(); - goto failure; + return -1; } if (esxUtil_ResolveHostname(xmlUri->server, hostIpAddress, NI_MAXHOST) < 0) { - goto failure; + goto cleanup; } /* Lookup VirtualMachine, HostSystem and ResourcePool */ @@ -3122,12 +3042,12 @@ esxDomainMigratePerform(virDomainPtr domain, esxVI_String_AppendValueToList(&propertyNameList, "parent") < 0 || esxVI_LookupHostSystemByIp(priv->vCenter, hostIpAddress, propertyNameList, &hostSystem) < 0) { - goto failure; + goto cleanup; } if (esxVI_LookupResourcePoolByHostSystem(priv->vCenter, hostSystem, &resourcePool) < 0) { - goto failure; + goto cleanup; } /* Validate the purposed migration */ @@ -3135,7 +3055,7 @@ esxDomainMigratePerform(virDomainPtr domain, esxVI_VirtualMachinePowerState_Undefined, NULL, resourcePool, hostSystem->obj, &eventList) < 0) { - goto failure; + goto cleanup; } if (eventList != NULL) { @@ -3153,7 +3073,7 @@ esxDomainMigratePerform(virDomainPtr domain, "problem")); } - goto failure; + goto cleanup; } /* Perform the purposed migration */ @@ -3164,16 +3084,18 @@ esxDomainMigratePerform(virDomainPtr domain, &task) < 0 || esxVI_WaitForTaskCompletion(priv->vCenter, task, domain->uuid, priv->autoAnswer, &taskInfoState) < 0) { - goto failure; + goto cleanup; } if (taskInfoState != esxVI_TaskInfoState_Success) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not migrate domain, migration task finished with " "an error")); - goto failure; + goto cleanup; } + result = 0; + cleanup: xmlFreeURI(xmlUri); esxVI_ObjectContent_Free(&virtualMachine); @@ -3184,11 +3106,6 @@ esxDomainMigratePerform(virDomainPtr domain, esxVI_ManagedObjectReference_Free(&task); return result; - - failure: - result = -1; - - goto cleanup; } @@ -3218,19 +3135,19 @@ esxNodeGetFreeMemory(virConnectPtr conn) esxVI_ResourcePoolResourceUsage *resourcePoolResourceUsage = NULL; if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return 0; } /* Lookup host system with its resource pool */ if (esxVI_String_AppendValueToList(&propertyNameList, "parent") < 0 || esxVI_LookupHostSystemByIp(priv->host, priv->host->ipAddress, propertyNameList, &hostSystem) < 0) { - goto failure; + goto cleanup; } if (esxVI_LookupResourcePoolByHostSystem(priv->host, hostSystem, &managedObjectReference) < 0) { - goto failure; + goto cleanup; } esxVI_String_Free(&propertyNameList); @@ -3242,7 +3159,7 @@ esxNodeGetFreeMemory(virConnectPtr conn) "ResourcePool", propertyNameList, esxVI_Boolean_False, &resourcePool) < 0) { - goto failure; + goto cleanup; } for (dynamicProperty = resourcePool->propSet; dynamicProperty != NULL; @@ -3250,7 +3167,7 @@ esxNodeGetFreeMemory(virConnectPtr conn) if (STREQ(dynamicProperty->name, "runtime.memory")) { if (esxVI_ResourcePoolResourceUsage_CastFromAnyType (dynamicProperty->val, &resourcePoolResourceUsage) < 0) { - goto failure; + goto cleanup; } break; @@ -3262,7 +3179,7 @@ esxNodeGetFreeMemory(virConnectPtr conn) if (resourcePoolResourceUsage == NULL) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not retrieve memory usage of resource pool")); - goto failure; + goto cleanup; } result = resourcePoolResourceUsage->unreservedForVm->value; @@ -3275,11 +3192,6 @@ esxNodeGetFreeMemory(virConnectPtr conn) esxVI_ResourcePoolResourceUsage_Free(&resourcePoolResourceUsage); return result; - - failure: - result = 0; - - goto cleanup; } @@ -3315,14 +3227,14 @@ esxIsSecure(virConnectPtr conn) static int esxDomainIsActive(virDomainPtr domain) { - int result = 0; + int result = -1; esxPrivate *priv = domain->conn->privateData; esxVI_ObjectContent *virtualMachine = NULL; esxVI_String *propertyNameList = NULL; esxVI_VirtualMachinePowerState powerState; if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return -1; } if (esxVI_String_AppendValueToList(&propertyNameList, @@ -3331,7 +3243,7 @@ esxDomainIsActive(virDomainPtr domain) propertyNameList, &virtualMachine, esxVI_Occurrence_RequiredItem) < 0 || esxVI_GetVirtualMachinePowerState(virtualMachine, &powerState) < 0) { - goto failure; + goto cleanup; } if (powerState != esxVI_VirtualMachinePowerState_PoweredOff) { @@ -3345,11 +3257,6 @@ esxDomainIsActive(virDomainPtr domain) esxVI_String_Free(&propertyNameList); return result; - - failure: - result = -1; - - goto cleanup; } @@ -3380,13 +3287,13 @@ esxDomainSnapshotCreateXML(virDomainPtr domain, const char *xmlDesc, virCheckFlags(0, NULL); if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return NULL; } def = virDomainSnapshotDefParseString(xmlDesc, 1); if (def == NULL) { - goto failure; + return NULL; } if (esxVI_LookupVirtualMachineByUuidAndPrepareForTask @@ -3397,13 +3304,13 @@ esxDomainSnapshotCreateXML(virDomainPtr domain, const char *xmlDesc, esxVI_GetSnapshotTreeByName(rootSnapshotList, def->name, &snapshotTree, &snapshotTreeParent, esxVI_Occurrence_OptionalItem) < 0) { - goto failure; + goto cleanup; } if (snapshotTree != NULL) { ESX_ERROR(VIR_ERR_OPERATION_INVALID, _("Snapshot '%s' already exists"), def->name); - goto failure; + goto cleanup; } if (esxVI_CreateSnapshot_Task(priv->host, virtualMachine->obj, @@ -3412,12 +3319,12 @@ esxDomainSnapshotCreateXML(virDomainPtr domain, const char *xmlDesc, esxVI_Boolean_False, &task) < 0 || esxVI_WaitForTaskCompletion(priv->host, task, domain->uuid, priv->autoAnswer, &taskInfoState) < 0) { - goto failure; + goto cleanup; } if (taskInfoState != esxVI_TaskInfoState_Success) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not create snapshot")); - goto failure; + goto cleanup; } snapshot = virGetDomainSnapshot(domain, def->name); @@ -3429,11 +3336,6 @@ esxDomainSnapshotCreateXML(virDomainPtr domain, const char *xmlDesc, esxVI_ManagedObjectReference_Free(&task); return snapshot; - - failure: - domain = NULL; - - goto cleanup; } @@ -3452,10 +3354,10 @@ esxDomainSnapshotDumpXML(virDomainSnapshotPtr snapshot, virCheckFlags(0, NULL); - memset(&def, 0, sizeof (virDomainSnapshotDef)); + memset(&def, 0, sizeof (def)); if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return NULL; } if (esxVI_LookupRootSnapshotTreeList(priv->host, snapshot->domain->uuid, @@ -3463,7 +3365,7 @@ esxDomainSnapshotDumpXML(virDomainSnapshotPtr snapshot, esxVI_GetSnapshotTreeByName(rootSnapshotList, snapshot->name, &snapshotTree, &snapshotTreeParent, esxVI_Occurrence_RequiredItem) < 0) { - goto failure; + goto cleanup; } def.name = snapshot->name; @@ -3472,7 +3374,7 @@ esxDomainSnapshotDumpXML(virDomainSnapshotPtr snapshot, if (esxVI_DateTime_ConvertToCalendarTime(snapshotTree->createTime, &def.creationTime) < 0) { - goto failure; + goto cleanup; } def.state = esxVI_VirtualMachinePowerState_ConvertToLibvirt @@ -3486,11 +3388,6 @@ esxDomainSnapshotDumpXML(virDomainSnapshotPtr snapshot, esxVI_VirtualMachineSnapshotTree_Free(&rootSnapshotList); return xml; - - failure: - VIR_FREE(xml); - - goto cleanup; } @@ -3498,32 +3395,26 @@ esxDomainSnapshotDumpXML(virDomainSnapshotPtr snapshot, static int esxDomainSnapshotNum(virDomainPtr domain, unsigned int flags) { - int result = 0; + int count; esxPrivate *priv = domain->conn->privateData; esxVI_VirtualMachineSnapshotTree *rootSnapshotTreeList = NULL; virCheckFlags(0, -1); if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return -1; } if (esxVI_LookupRootSnapshotTreeList(priv->host, domain->uuid, &rootSnapshotTreeList) < 0) { - goto failure; + return -1; } - result = esxVI_GetNumberOfSnapshotTrees(rootSnapshotTreeList); + count = esxVI_GetNumberOfSnapshotTrees(rootSnapshotTreeList); - cleanup: esxVI_VirtualMachineSnapshotTree_Free(&rootSnapshotTreeList); - return result; - - failure: - result = -1; - - goto cleanup; + return count; } @@ -3532,7 +3423,7 @@ static int esxDomainSnapshotListNames(virDomainPtr domain, char **names, int nameslen, unsigned int flags) { - int result = 0; + int result; esxPrivate *priv = domain->conn->privateData; esxVI_VirtualMachineSnapshotTree *rootSnapshotTreeList = NULL; @@ -3548,25 +3439,19 @@ esxDomainSnapshotListNames(virDomainPtr domain, char **names, int nameslen, } if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return -1; } if (esxVI_LookupRootSnapshotTreeList(priv->host, domain->uuid, &rootSnapshotTreeList) < 0) { - goto failure; + return -1; } result = esxVI_GetSnapshotTreeNames(rootSnapshotTreeList, names, nameslen); - cleanup: esxVI_VirtualMachineSnapshotTree_Free(&rootSnapshotTreeList); return result; - - failure: - result = -1; - - goto cleanup; } @@ -3584,7 +3469,7 @@ esxDomainSnapshotLookupByName(virDomainPtr domain, const char *name, virCheckFlags(0, NULL); if (esxVI_EnsureSession(priv->host) < 0) { - goto cleanup; + return NULL; } if (esxVI_LookupRootSnapshotTreeList(priv->host, domain->uuid, @@ -3608,35 +3493,27 @@ esxDomainSnapshotLookupByName(virDomainPtr domain, const char *name, static int esxDomainHasCurrentSnapshot(virDomainPtr domain, unsigned int flags) { - int result = 0; esxPrivate *priv = domain->conn->privateData; esxVI_VirtualMachineSnapshotTree *currentSnapshotTree = NULL; virCheckFlags(0, -1); if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return -1; } if (esxVI_LookupCurrentSnapshotTree(priv->host, domain->uuid, ¤tSnapshotTree, esxVI_Occurrence_OptionalItem) < 0) { - goto failure; + return -1; } if (currentSnapshotTree != NULL) { - result = 1; + esxVI_VirtualMachineSnapshotTree_Free(¤tSnapshotTree); + return 1; } - cleanup: - esxVI_VirtualMachineSnapshotTree_Free(¤tSnapshotTree); - - return result; - - failure: - result = -1; - - goto cleanup; + return 0; } @@ -3644,25 +3521,24 @@ esxDomainHasCurrentSnapshot(virDomainPtr domain, unsigned int flags) static virDomainSnapshotPtr esxDomainSnapshotCurrent(virDomainPtr domain, unsigned int flags) { - virDomainSnapshotPtr snapshot = NULL; esxPrivate *priv = domain->conn->privateData; esxVI_VirtualMachineSnapshotTree *currentSnapshotTree = NULL; + virDomainSnapshotPtr snapshot = NULL; virCheckFlags(0, NULL); if (esxVI_EnsureSession(priv->host) < 0) { - goto cleanup; + return NULL; } if (esxVI_LookupCurrentSnapshotTree(priv->host, domain->uuid, ¤tSnapshotTree, esxVI_Occurrence_RequiredItem) < 0) { - goto cleanup; + return NULL; } snapshot = virGetDomainSnapshot(domain, currentSnapshotTree->name); - cleanup: esxVI_VirtualMachineSnapshotTree_Free(¤tSnapshotTree); return snapshot; @@ -3673,7 +3549,7 @@ esxDomainSnapshotCurrent(virDomainPtr domain, unsigned int flags) static int esxDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, unsigned int flags) { - int result = 0; + int result = -1; esxPrivate *priv = snapshot->domain->conn->privateData; esxVI_VirtualMachineSnapshotTree *rootSnapshotList = NULL; esxVI_VirtualMachineSnapshotTree *snapshotTree = NULL; @@ -3684,7 +3560,7 @@ esxDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, unsigned int flags) virCheckFlags(0, -1); if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return -1; } if (esxVI_LookupRootSnapshotTreeList(priv->host, snapshot->domain->uuid, @@ -3692,32 +3568,29 @@ esxDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, unsigned int flags) esxVI_GetSnapshotTreeByName(rootSnapshotList, snapshot->name, &snapshotTree, &snapshotTreeParent, esxVI_Occurrence_RequiredItem) < 0) { - goto failure; + goto cleanup; } if (esxVI_RevertToSnapshot_Task(priv->host, snapshotTree->snapshot, NULL, &task) < 0 || esxVI_WaitForTaskCompletion(priv->host, task, snapshot->domain->uuid, priv->autoAnswer, &taskInfoState) < 0) { - goto failure; + goto cleanup; } if (taskInfoState != esxVI_TaskInfoState_Success) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Could not revert to snapshot '%s'"), snapshot->name); - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_VirtualMachineSnapshotTree_Free(&rootSnapshotList); esxVI_ManagedObjectReference_Free(&task); return result; - - failure: - result = -1; - - goto cleanup; } @@ -3725,7 +3598,7 @@ esxDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, unsigned int flags) static int esxDomainSnapshotDelete(virDomainSnapshotPtr snapshot, unsigned int flags) { - int result = 0; + int result = -1; esxPrivate *priv = snapshot->domain->conn->privateData; esxVI_VirtualMachineSnapshotTree *rootSnapshotList = NULL; esxVI_VirtualMachineSnapshotTree *snapshotTree = NULL; @@ -3737,7 +3610,7 @@ esxDomainSnapshotDelete(virDomainSnapshotPtr snapshot, unsigned int flags) virCheckFlags(VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN, -1); if (esxVI_EnsureSession(priv->host) < 0) { - goto failure; + return -1; } if (flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN) { @@ -3749,32 +3622,29 @@ esxDomainSnapshotDelete(virDomainSnapshotPtr snapshot, unsigned int flags) esxVI_GetSnapshotTreeByName(rootSnapshotList, snapshot->name, &snapshotTree, &snapshotTreeParent, esxVI_Occurrence_RequiredItem) < 0) { - goto failure; + goto cleanup; } if (esxVI_RemoveSnapshot_Task(priv->host, snapshotTree->snapshot, removeChildren, &task) < 0 || esxVI_WaitForTaskCompletion(priv->host, task, snapshot->domain->uuid, priv->autoAnswer, &taskInfoState) < 0) { - goto failure; + goto cleanup; } if (taskInfoState != esxVI_TaskInfoState_Success) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Could not delete snapshot '%s'"), snapshot->name); - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_VirtualMachineSnapshotTree_Free(&rootSnapshotList); esxVI_ManagedObjectReference_Free(&task); return result; - - failure: - result = -1; - - goto cleanup; } diff --git a/src/esx/esx_storage_driver.c b/src/esx/esx_storage_driver.c index 0e2e1a3436..98e713778e 100644 --- a/src/esx/esx_storage_driver.c +++ b/src/esx/esx_storage_driver.c @@ -467,10 +467,6 @@ esxStoragePoolGetInfo(virStoragePoolPtr pool, virStoragePoolInfoPtr info) result = 0; cleanup: - if (result < 0) { - memset(info, 0, sizeof (*info)); - } - esxVI_String_Free(&propertyNameList); esxVI_ObjectContent_Free(&datastore); diff --git a/src/esx/esx_util.c b/src/esx/esx_util.c index 51c9afc3a8..1ffcc223f7 100644 --- a/src/esx/esx_util.c +++ b/src/esx/esx_util.c @@ -43,7 +43,7 @@ int esxUtil_ParseQuery(xmlURIPtr uri, char **transport, char **vCenter, int *noVerify, int *autoAnswer) { - int result = 0; + int result = -1; int i; struct qparam_set *queryParamSet = NULL; struct qparam *queryParam = NULL; @@ -71,7 +71,7 @@ esxUtil_ParseQuery(xmlURIPtr uri, char **transport, char **vCenter, #endif if (queryParamSet == NULL) { - goto failure; + return -1; } for (i = 0; i < queryParamSet->n; i++) { @@ -86,14 +86,14 @@ esxUtil_ParseQuery(xmlURIPtr uri, char **transport, char **vCenter, if (*transport == NULL) { virReportOOMError(); - goto failure; + goto cleanup; } if (STRNEQ(*transport, "http") && STRNEQ(*transport, "https")) { ESX_ERROR(VIR_ERR_INVALID_ARG, _("Query parameter 'transport' has unexpected value " "'%s' (should be http|https)"), *transport); - goto failure; + goto cleanup; } } else if (STRCASEEQ(queryParam->name, "vcenter")) { if (vCenter == NULL) { @@ -104,7 +104,7 @@ esxUtil_ParseQuery(xmlURIPtr uri, char **transport, char **vCenter, if (*vCenter == NULL) { virReportOOMError(); - goto failure; + goto cleanup; } } else if (STRCASEEQ(queryParam->name, "no_verify")) { if (noVerify == NULL) { @@ -116,7 +116,7 @@ esxUtil_ParseQuery(xmlURIPtr uri, char **transport, char **vCenter, ESX_ERROR(VIR_ERR_INVALID_ARG, _("Query parameter 'no_verify' has unexpected value " "'%s' (should be 0 or 1)"), queryParam->value); - goto failure; + goto cleanup; } } else if (STRCASEEQ(queryParam->name, "auto_answer")) { if (autoAnswer == NULL) { @@ -128,7 +128,7 @@ esxUtil_ParseQuery(xmlURIPtr uri, char **transport, char **vCenter, ESX_ERROR(VIR_ERR_INVALID_ARG, _("Query parameter 'auto_answer' has unexpected " "value '%s' (should be 0 or 1)"), queryParam->value); - goto failure; + goto cleanup; } } else { VIR_WARN("Ignoring unexpected query parameter '%s'", @@ -141,29 +141,28 @@ esxUtil_ParseQuery(xmlURIPtr uri, char **transport, char **vCenter, if (*transport == NULL) { virReportOOMError(); - goto failure; + goto cleanup; } } - cleanup: - if (queryParamSet != NULL) { - free_qparam_set(queryParamSet); - } + result = 0; - return result; + cleanup: + if (result < 0) { + if (transport != NULL) { + VIR_FREE(*transport); + } - failure: - if (transport != NULL) { - VIR_FREE(*transport); + if (vCenter != NULL) { + VIR_FREE(*vCenter); + } } - if (vCenter != NULL) { - VIR_FREE(*vCenter); + if (queryParamSet != NULL) { + free_qparam_set(queryParamSet); } - result = -1; - - goto cleanup; + return result; } @@ -196,7 +195,7 @@ esxUtil_ParseDatastoreRelatedPath(const char *datastoreRelatedPath, char **datastoreName, char **directoryName, char **fileName) { - int result = 0; + int result = -1; char *copyOfDatastoreRelatedPath = NULL; char *tmp = NULL; char *saveptr = NULL; @@ -213,7 +212,7 @@ esxUtil_ParseDatastoreRelatedPath(const char *datastoreRelatedPath, if (esxVI_String_DeepCopyValue(©OfDatastoreRelatedPath, datastoreRelatedPath) < 0) { - goto failure; + goto cleanup; } /* Expected format: '[] ' */ @@ -223,12 +222,12 @@ esxUtil_ParseDatastoreRelatedPath(const char *datastoreRelatedPath, ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Datastore related path '%s' doesn't have expected format " "'[] '"), datastoreRelatedPath); - goto failure; + goto cleanup; } if (esxVI_String_DeepCopyValue(datastoreName, preliminaryDatastoreName) < 0) { - goto failure; + goto cleanup; } directoryAndFileName += strspn(directoryAndFileName, " "); @@ -243,33 +242,32 @@ esxUtil_ParseDatastoreRelatedPath(const char *datastoreRelatedPath, ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Datastore related path '%s' doesn't reference a file"), datastoreRelatedPath); - goto failure; + goto cleanup; } if (esxVI_String_DeepCopyValue(directoryName, directoryAndFileName) < 0 || esxVI_String_DeepCopyValue(fileName, separator) < 0) { - goto failure; + goto cleanup; } } else { if (esxVI_String_DeepCopyValue(fileName, directoryAndFileName) < 0) { - goto failure; + goto cleanup; } } + result = 0; + cleanup: + if (result < 0) { + VIR_FREE(*datastoreName); + VIR_FREE(*directoryName); + VIR_FREE(*fileName); + } + VIR_FREE(copyOfDatastoreRelatedPath); return result; - - failure: - VIR_FREE(*datastoreName); - VIR_FREE(*directoryName); - VIR_FREE(*fileName); - - result = -1; - - goto cleanup; } @@ -282,7 +280,7 @@ esxUtil_ResolveHostname(const char *hostname, struct addrinfo *result = NULL; int errcode; - memset(&hints, 0, sizeof(struct addrinfo)); + memset(&hints, 0, sizeof (hints)); hints.ai_flags = AI_ADDRCONFIG; hints.ai_family = AF_INET; diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c index 1483f05159..c535dbbd06 100644 --- a/src/esx/esx_vi.c +++ b/src/esx/esx_vi.c @@ -279,7 +279,7 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, const char *ipAddress, const char *username, const char *password, int noVerify) { - int result = 0; + int result = -1; esxVI_String *propertyNameList = NULL; esxVI_ObjectContent *datacenterList = NULL; esxVI_DynamicProperty *dynamicProperty = NULL; @@ -288,12 +288,12 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, password == NULL || ctx->url != NULL || ctx->service != NULL || ctx->curl_handle != NULL || ctx->curl_headers != NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid argument")); - goto failure; + return -1; } if (esxVI_String_DeepCopyValue(&ctx->url, url) < 0 || esxVI_String_DeepCopyValue(&ctx->ipAddress, ipAddress) < 0) { - goto failure; + goto cleanup; } ctx->curl_handle = curl_easy_init(); @@ -301,7 +301,7 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, if (ctx->curl_handle == NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not initialize CURL")); - goto failure; + goto cleanup; } ctx->curl_headers = curl_slist_append(ctx->curl_headers, "Content-Type: " @@ -321,7 +321,7 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, if (ctx->curl_headers == NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not build CURL header list")); - goto failure; + goto cleanup; } curl_easy_setopt(ctx->curl_handle, CURLOPT_URL, ctx->url); @@ -346,7 +346,7 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, if (virMutexInit(&ctx->curl_lock) < 0) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not initialize CURL mutex")); - goto failure; + goto cleanup; } ctx->username = strdup(username); @@ -354,11 +354,11 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, if (ctx->username == NULL || ctx->password == NULL) { virReportOOMError(); - goto failure; + goto cleanup; } if (esxVI_RetrieveServiceContent(ctx, &ctx->service) < 0) { - goto failure; + goto cleanup; } if (STREQ(ctx->service->about->apiType, "HostAgent") || @@ -371,7 +371,7 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VI API major/minor version '2.5' or '4.0' " "but found '%s'"), ctx->service->about->apiVersion); - goto failure; + goto cleanup; } if (STREQ(ctx->service->about->productLineId, "gsx")) { @@ -381,7 +381,7 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting GSX major/minor version '2.0' but " "found '%s'"), ctx->service->about->version); - goto failure; + goto cleanup; } } else if (STREQ(ctx->service->about->productLineId, "esx") || STREQ(ctx->service->about->productLineId, "embeddedEsx")) { @@ -394,7 +394,7 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, _("Expecting ESX major/minor version '3.5' or " "'4.0' but found '%s'"), ctx->service->about->version); - goto failure; + goto cleanup; } } else if (STREQ(ctx->service->about->productLineId, "vpx")) { if (STRPREFIX(ctx->service->about->version, "2.5")) { @@ -405,24 +405,24 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VPX major/minor version '2.5' or '4.0' " "but found '%s'"), ctx->service->about->version); - goto failure; + goto cleanup; } } else { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting product 'gsx' or 'esx' or 'embeddedEsx' " "or 'vpx' but found '%s'"), ctx->service->about->productLineId); - goto failure; + goto cleanup; } } else { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VI API type 'HostAgent' or 'VirtualCenter' " "but found '%s'"), ctx->service->about->apiType); - goto failure; + goto cleanup; } if (esxVI_Login(ctx, username, password, NULL, &ctx->session) < 0) { - goto failure; + goto cleanup; } esxVI_BuildFullTraversalSpecList(&ctx->fullTraversalSpecList); @@ -430,7 +430,7 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, if (esxVI_String_AppendValueListToList(&propertyNameList, "vmFolder\0" "hostFolder\0") < 0) { - goto failure; + goto cleanup; } /* Get pointer to Datacenter for later use */ @@ -438,14 +438,14 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, "Datacenter", propertyNameList, esxVI_Boolean_True, &datacenterList) < 0) { - goto failure; + goto cleanup; } if (datacenterList == NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not retrieve the 'datacenter' object from the " "VI host/center")); - goto failure; + goto cleanup; } ctx->datacenter = datacenterList->obj; @@ -457,12 +457,12 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, if (STREQ(dynamicProperty->name, "vmFolder")) { if (esxVI_ManagedObjectReference_CastFromAnyType (dynamicProperty->val, &ctx->vmFolder)) { - goto failure; + goto cleanup; } } else if (STREQ(dynamicProperty->name, "hostFolder")) { if (esxVI_ManagedObjectReference_CastFromAnyType (dynamicProperty->val, &ctx->hostFolder)) { - goto failure; + goto cleanup; } } else { VIR_WARN("Unexpected '%s' property", dynamicProperty->name); @@ -473,19 +473,16 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("The 'datacenter' object is missing the " "'vmFolder'/'hostFolder' property")); - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_String_Free(&propertyNameList); esxVI_ObjectContent_Free(&datacenterList); return result; - - failure: - result = -1; - - goto cleanup; } int @@ -496,7 +493,7 @@ esxVI_Context_DownloadFile(esxVI_Context *ctx, const char *url, char **content) if (content == NULL || *content != NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid argument")); - goto failure; + return -1; } virMutexLock(&ctx->curl_lock); @@ -511,27 +508,28 @@ esxVI_Context_DownloadFile(esxVI_Context *ctx, const char *url, char **content) virMutexUnlock(&ctx->curl_lock); if (responseCode < 0) { - goto failure; + goto cleanup; } else if (responseCode != 200) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("HTTP response code %d for download from '%s'"), responseCode, url); - goto failure; + goto cleanup; } if (virBufferError(&buffer)) { virReportOOMError(); - goto failure; + goto cleanup; } *content = virBufferContentAndReset(&buffer); - return 0; - - failure: - virBufferFreeAndReset(&buffer); + cleanup: + if (*content == NULL) { + virBufferFreeAndReset(&buffer); + return -1; + } - return -1; + return 0; } int @@ -573,7 +571,7 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, const char *request, esxVI_Response **response, esxVI_Occurrence occurrence) { - int result = 0; + int result = -1; virBuffer buffer = VIR_BUFFER_INITIALIZER; esxVI_Fault *fault = NULL; char *xpathExpression = NULL; @@ -582,11 +580,11 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, if (request == NULL || response == NULL || *response != NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid argument")); - goto failure; + return -1; } if (esxVI_Response_Alloc(response) < 0) { - goto failure; + return -1; } virMutexLock(&ctx->curl_lock); @@ -602,12 +600,12 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, virMutexUnlock(&ctx->curl_lock); if ((*response)->responseCode < 0) { - goto failure; + goto cleanup; } if (virBufferError(&buffer)) { virReportOOMError(); - goto failure; + goto cleanup; } (*response)->content = virBufferContentAndReset(&buffer); @@ -620,14 +618,14 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Response for call to '%s' could not be parsed"), methodName); - goto failure; + goto cleanup; } if (xmlDocGetRootElement((*response)->document) == NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Response for call to '%s' is an empty XML document"), methodName); - goto failure; + goto cleanup; } xpathContext = xmlXPathNewContext((*response)->document); @@ -635,7 +633,7 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, if (xpathContext == NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not create XPath context")); - goto failure; + goto cleanup; } xmlXPathRegisterNs(xpathContext, BAD_CAST "soapenv", @@ -652,7 +650,7 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, _("HTTP response code %d for call to '%s'. " "Fault is unknown, XPath evaluation failed"), (*response)->responseCode, methodName); - goto failure; + goto cleanup; } if (esxVI_Fault_Deserialize((*response)->node, &fault) < 0) { @@ -660,7 +658,7 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, _("HTTP response code %d for call to '%s'. " "Fault is unknown, deserialization failed"), (*response)->responseCode, methodName); - goto failure; + goto cleanup; } ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, @@ -673,13 +671,13 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, (*response)->responseCode, methodName, (*response)->content); - goto failure; + goto cleanup; } else { if (virAsprintf(&xpathExpression, "/soapenv:Envelope/soapenv:Body/vim:%sResponse", methodName) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } responseNode = virXPathNode(xpathExpression, xpathContext); @@ -688,7 +686,7 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("XPath evaluation of response for call to '%s' " "failed"), methodName); - goto failure; + goto cleanup; } xpathContext->node = responseNode; @@ -700,12 +698,12 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Call to '%s' returned an empty result, " "expecting a non-empty result"), methodName); - goto failure; + goto cleanup; } else if ((*response)->node->next != NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Call to '%s' returned a list, expecting " "exactly one item"), methodName); - goto failure; + goto cleanup; } break; @@ -715,7 +713,7 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Call to '%s' returned an empty result, " "expecting a non-empty result"), methodName); - goto failure; + goto cleanup; } break; @@ -726,7 +724,7 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Call to '%s' returned a list, expecting " "exactly one item"), methodName); - goto failure; + goto cleanup; } break; @@ -740,7 +738,7 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Call to '%s' returned something, expecting " "an empty result"), methodName); - goto failure; + goto cleanup; } break; @@ -748,30 +746,29 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, default: ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid argument (occurrence)")); - goto failure; + goto cleanup; } } } else { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("HTTP response code %d for call to '%s'"), (*response)->responseCode, methodName); - goto failure; + goto cleanup; } + result = 0; + cleanup: + if (result < 0) { + virBufferFreeAndReset(&buffer); + esxVI_Response_Free(response); + esxVI_Fault_Free(&fault); + } + VIR_FREE(xpathExpression); xmlXPathFreeContext(xpathContext); return result; - - failure: - virBufferFreeAndReset(&buffer); - esxVI_Response_Free(response); - esxVI_Fault_Free(&fault); - - result = -1; - - goto cleanup; } @@ -877,39 +874,36 @@ esxVI_Enumeration_Deserialize(const esxVI_Enumeration *enumeration, xmlNodePtr node, int *value) { int i; - int result = 0; + int result = -1; char *name = NULL; if (value == NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid argument")); - goto failure; + return -1; } *value = 0; /* undefined */ if (esxVI_String_DeserializeValue(node, &name) < 0) { - goto failure; + return -1; } for (i = 0; enumeration->values[i].name != NULL; ++i) { if (STREQ(name, enumeration->values[i].name)) { *value = enumeration->values[i].value; - goto cleanup; + result = 0; + break; } } - ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Unknown value '%s' for %s"), - name, esxVI_Type_ToString(enumeration->type)); + if (result < 0) { + ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Unknown value '%s' for %s"), + name, esxVI_Type_ToString(enumeration->type)); + } - cleanup: VIR_FREE(name); return result; - - failure: - result = -1; - - goto cleanup; } @@ -954,7 +948,7 @@ esxVI_List_DeepCopy(esxVI_List **destList, esxVI_List *srcList, if (destList == NULL || *destList != NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid argument")); - goto failure; + return -1; } for (src = srcList; src != NULL; src = src->_next) { @@ -980,7 +974,7 @@ esxVI_List_CastFromAnyType(esxVI_AnyType *anyType, esxVI_List **list, esxVI_List_CastFromAnyTypeFunc castFromAnyTypeFunc, esxVI_List_FreeFunc freeFunc) { - int result = 0; + int result = -1; xmlNodePtr childNode = NULL; esxVI_AnyType *childAnyType = NULL; esxVI_List *item = NULL; @@ -1007,7 +1001,7 @@ esxVI_List_CastFromAnyType(esxVI_AnyType *anyType, esxVI_List **list, if (childNode->type != XML_ELEMENT_NODE) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Wrong XML element type %d"), childNode->type); - goto failure; + goto cleanup; } esxVI_AnyType_Free(&childAnyType); @@ -1015,24 +1009,23 @@ esxVI_List_CastFromAnyType(esxVI_AnyType *anyType, esxVI_List **list, if (esxVI_AnyType_Deserialize(childNode, &childAnyType) < 0 || castFromAnyTypeFunc(childAnyType, &item) < 0 || esxVI_List_Append(list, item) < 0) { - goto failure; + goto cleanup; } item = NULL; } + result = 0; + cleanup: + if (result < 0) { + freeFunc(&item); + freeFunc(list); + } + esxVI_AnyType_Free(&childAnyType); return result; - - failure: - freeFunc(&item); - freeFunc(list); - - result = -1; - - goto cleanup; } int @@ -1300,7 +1293,7 @@ esxVI_EnsureSession(esxVI_Context *ctx) #if ESX_VI_USE_SESSION_IS_ACTIVE esxVI_Boolean active = esxVI_Boolean_Undefined; #else - int result = 0; + int result = -1; esxVI_String *propertyNameList = NULL; esxVI_ObjectContent *sessionManager = NULL; esxVI_DynamicProperty *dynamicProperty = NULL; @@ -1335,7 +1328,7 @@ esxVI_EnsureSession(esxVI_Context *ctx) "SessionManager", propertyNameList, esxVI_Boolean_False, &sessionManager) < 0) { - goto failure; + goto cleanup; } for (dynamicProperty = sessionManager->propSet; dynamicProperty != NULL; @@ -1343,7 +1336,7 @@ esxVI_EnsureSession(esxVI_Context *ctx) if (STREQ(dynamicProperty->name, "currentSession")) { if (esxVI_UserSession_CastFromAnyType(dynamicProperty->val, ¤tSession) < 0) { - goto failure; + goto cleanup; } break; @@ -1357,26 +1350,23 @@ esxVI_EnsureSession(esxVI_Context *ctx) if (esxVI_Login(ctx, ctx->username, ctx->password, NULL, &ctx->session) < 0) { - goto failure; + goto cleanup; } } else if (STRNEQ(ctx->session->key, currentSession->key)) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Key of the current session differs from the key at " "last login")); - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_String_Free(&propertyNameList); esxVI_ObjectContent_Free(&sessionManager); esxVI_UserSession_Free(¤tSession); return result; - - failure: - result = -1; - - goto cleanup; #endif } @@ -1390,7 +1380,7 @@ esxVI_LookupObjectContentByType(esxVI_Context *ctx, esxVI_Boolean recurse, esxVI_ObjectContent **objectContentList) { - int result = 0; + int result = -1; esxVI_ObjectSpec *objectSpec = NULL; esxVI_PropertySpec *propertySpec = NULL; esxVI_PropertyFilterSpec *propertyFilterSpec = NULL; @@ -1401,7 +1391,7 @@ esxVI_LookupObjectContentByType(esxVI_Context *ctx, } if (esxVI_ObjectSpec_Alloc(&objectSpec) < 0) { - goto failure; + return -1; } objectSpec->obj = root; @@ -1412,7 +1402,7 @@ esxVI_LookupObjectContentByType(esxVI_Context *ctx, } if (esxVI_PropertySpec_Alloc(&propertySpec) < 0) { - goto failure; + goto cleanup; } propertySpec->type = (char *)type; @@ -1423,7 +1413,7 @@ esxVI_LookupObjectContentByType(esxVI_Context *ctx, propertySpec) < 0 || esxVI_ObjectSpec_AppendToList(&propertyFilterSpec->objectSet, objectSpec) < 0) { - goto failure; + goto cleanup; } result = esxVI_RetrieveProperties(ctx, propertyFilterSpec, @@ -1447,11 +1437,6 @@ esxVI_LookupObjectContentByType(esxVI_Context *ctx, esxVI_PropertyFilterSpec_Free(&propertyFilterSpec); return result; - - failure: - result = -1; - - goto cleanup; } @@ -1642,19 +1627,20 @@ esxVI_LookupNumberOfDomainsByPowerState(esxVI_Context *ctx, esxVI_VirtualMachinePowerState powerState, esxVI_Boolean inverse) { + bool success = false; esxVI_String *propertyNameList = NULL; esxVI_ObjectContent *virtualMachineList = NULL; esxVI_ObjectContent *virtualMachine = NULL; esxVI_DynamicProperty *dynamicProperty = NULL; esxVI_VirtualMachinePowerState powerState_; - int numberOfDomains = 0; + int count = 0; if (esxVI_String_AppendValueToList(&propertyNameList, "runtime.powerState") < 0 || esxVI_LookupObjectContentByType(ctx, ctx->vmFolder, "VirtualMachine", propertyNameList, esxVI_Boolean_True, &virtualMachineList) < 0) { - goto failure; + goto cleanup; } for (virtualMachine = virtualMachineList; virtualMachine != NULL; @@ -1665,14 +1651,14 @@ esxVI_LookupNumberOfDomainsByPowerState(esxVI_Context *ctx, if (STREQ(dynamicProperty->name, "runtime.powerState")) { if (esxVI_VirtualMachinePowerState_CastFromAnyType (dynamicProperty->val, &powerState_) < 0) { - goto failure; + goto cleanup; } if ((inverse != esxVI_Boolean_True && powerState_ == powerState) || (inverse == esxVI_Boolean_True && powerState_ != powerState)) { - numberOfDomains++; + count++; } } else { VIR_WARN("Unexpected '%s' property", dynamicProperty->name); @@ -1680,16 +1666,13 @@ esxVI_LookupNumberOfDomainsByPowerState(esxVI_Context *ctx, } } + success = true; + cleanup: esxVI_String_Free(&propertyNameList); esxVI_ObjectContent_Free(&virtualMachineList); - return numberOfDomains; - - failure: - numberOfDomains = -1; - - goto cleanup; + return success ? count : -1; } @@ -1955,7 +1938,7 @@ esxVI_LookupResourcePoolByHostSystem (esxVI_Context *ctx, esxVI_ObjectContent *hostSystem, esxVI_ManagedObjectReference **resourcePool) { - int result = 0; + int result = -1; esxVI_String *propertyNameList = NULL; esxVI_DynamicProperty *dynamicProperty = NULL; esxVI_ManagedObjectReference *managedObjectReference = NULL; @@ -1971,7 +1954,7 @@ esxVI_LookupResourcePoolByHostSystem if (STREQ(dynamicProperty->name, "parent")) { if (esxVI_ManagedObjectReference_CastFromAnyType (dynamicProperty->val, &managedObjectReference) < 0) { - goto failure; + goto cleanup; } break; @@ -1983,7 +1966,7 @@ esxVI_LookupResourcePoolByHostSystem if (managedObjectReference == NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not retrieve compute resource of host system")); - goto failure; + goto cleanup; } if (esxVI_String_AppendValueToList(&propertyNameList, "resourcePool") < 0 || @@ -1991,13 +1974,13 @@ esxVI_LookupResourcePoolByHostSystem "ComputeResource", propertyNameList, esxVI_Boolean_False, &computeResource) < 0) { - goto failure; + goto cleanup; } if (computeResource == NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not retrieve compute resource of host system")); - goto failure; + goto cleanup; } for (dynamicProperty = computeResource->propSet; dynamicProperty != NULL; @@ -2005,7 +1988,7 @@ esxVI_LookupResourcePoolByHostSystem if (STREQ(dynamicProperty->name, "resourcePool")) { if (esxVI_ManagedObjectReference_CastFromAnyType (dynamicProperty->val, resourcePool) < 0) { - goto failure; + goto cleanup; } break; @@ -2017,20 +2000,17 @@ esxVI_LookupResourcePoolByHostSystem if ((*resourcePool) == NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not retrieve resource pool of compute resource")); - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_String_Free(&propertyNameList); esxVI_ManagedObjectReference_Free(&managedObjectReference); esxVI_ObjectContent_Free(&computeResource); return result; - - failure: - result = -1; - - goto cleanup; } @@ -2040,7 +2020,7 @@ esxVI_LookupHostSystemByIp(esxVI_Context *ctx, const char *ipAddress, esxVI_String *propertyNameList, esxVI_ObjectContent **hostSystem) { - int result = 0; + int result = -1; esxVI_ManagedObjectReference *managedObjectReference = NULL; if (hostSystem == NULL || *hostSystem != NULL) { @@ -2050,31 +2030,28 @@ esxVI_LookupHostSystemByIp(esxVI_Context *ctx, const char *ipAddress, if (esxVI_FindByIp(ctx, ctx->datacenter, ipAddress, esxVI_Boolean_False, &managedObjectReference) < 0) { - goto failure; + return -1; } if (managedObjectReference == NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Could not find host system with IP address '%s'"), ipAddress); - goto failure; + goto cleanup; } if (esxVI_LookupObjectContentByType(ctx, managedObjectReference, "HostSystem", propertyNameList, esxVI_Boolean_False, hostSystem) < 0) { - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_ManagedObjectReference_Free(&managedObjectReference); return result; - - failure: - result = -1; - - goto cleanup; } @@ -2085,7 +2062,7 @@ esxVI_LookupVirtualMachineByUuid(esxVI_Context *ctx, const unsigned char *uuid, esxVI_ObjectContent **virtualMachine, esxVI_Occurrence occurrence) { - int result = 0; + int result = -1; esxVI_ManagedObjectReference *managedObjectReference = NULL; char uuid_string[VIR_UUID_STRING_BUFLEN] = ""; @@ -2098,7 +2075,7 @@ esxVI_LookupVirtualMachineByUuid(esxVI_Context *ctx, const unsigned char *uuid, if (esxVI_FindByUuid(ctx, ctx->datacenter, uuid_string, esxVI_Boolean_True, &managedObjectReference) < 0) { - goto failure; + return -1; } if (managedObjectReference == NULL) { @@ -2108,7 +2085,7 @@ esxVI_LookupVirtualMachineByUuid(esxVI_Context *ctx, const unsigned char *uuid, ESX_VI_ERROR(VIR_ERR_NO_DOMAIN, _("Could not find domain with UUID '%s'"), uuid_string); - goto failure; + goto cleanup; } } @@ -2116,18 +2093,15 @@ esxVI_LookupVirtualMachineByUuid(esxVI_Context *ctx, const unsigned char *uuid, "VirtualMachine", propertyNameList, esxVI_Boolean_False, virtualMachine) < 0) { - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_ManagedObjectReference_Free(&managedObjectReference); return result; - - failure: - result = -1; - - goto cleanup; } @@ -2138,7 +2112,7 @@ esxVI_LookupVirtualMachineByName(esxVI_Context *ctx, const char *name, esxVI_ObjectContent **virtualMachine, esxVI_Occurrence occurrence) { - int result = 0; + int result = -1; esxVI_String *completePropertyNameList = NULL; esxVI_ObjectContent *virtualMachineList = NULL; esxVI_ObjectContent *candidate = NULL; @@ -2156,7 +2130,7 @@ esxVI_LookupVirtualMachineByName(esxVI_Context *ctx, const char *name, completePropertyNameList, esxVI_Boolean_True, &virtualMachineList) < 0) { - goto failure; + goto cleanup; } for (candidate = virtualMachineList; candidate != NULL; @@ -2165,7 +2139,7 @@ esxVI_LookupVirtualMachineByName(esxVI_Context *ctx, const char *name, if (esxVI_GetVirtualMachineIdentity(candidate, NULL, &name_candidate, NULL) < 0) { - goto failure; + goto cleanup; } if (STRNEQ(name, name_candidate)) { @@ -2173,7 +2147,7 @@ esxVI_LookupVirtualMachineByName(esxVI_Context *ctx, const char *name, } if (esxVI_ObjectContent_DeepCopy(virtualMachine, candidate) < 0) { - goto failure; + goto cleanup; } break; @@ -2185,21 +2159,18 @@ esxVI_LookupVirtualMachineByName(esxVI_Context *ctx, const char *name, } else { ESX_VI_ERROR(VIR_ERR_NO_DOMAIN, _("Could not find domain with name '%s'"), name); - goto failure; + goto cleanup; } } + result = 0; + cleanup: esxVI_String_Free(&completePropertyNameList); esxVI_ObjectContent_Free(&virtualMachineList); VIR_FREE(name_candidate); return result; - - failure: - result = -1; - - goto cleanup; } @@ -2210,7 +2181,7 @@ esxVI_LookupVirtualMachineByUuidAndPrepareForTask esxVI_String *propertyNameList, esxVI_ObjectContent **virtualMachine, esxVI_Boolean autoAnswer) { - int result = 0; + int result = -1; esxVI_String *completePropertyNameList = NULL; esxVI_VirtualMachineQuestionInfo *questionInfo = NULL; esxVI_TaskInfo *pendingTaskInfoList = NULL; @@ -2227,32 +2198,29 @@ esxVI_LookupVirtualMachineByUuidAndPrepareForTask &questionInfo) < 0 || esxVI_LookupPendingTaskInfoListByVirtualMachine (ctx, *virtualMachine, &pendingTaskInfoList) < 0) { - goto failure; + goto cleanup; } if (questionInfo != NULL && esxVI_HandleVirtualMachineQuestion(ctx, (*virtualMachine)->obj, questionInfo, autoAnswer) < 0) { - goto failure; + goto cleanup; } if (pendingTaskInfoList != NULL) { ESX_VI_ERROR(VIR_ERR_OPERATION_INVALID, "%s", _("Other tasks are pending for this domain")); - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_String_Free(&completePropertyNameList); esxVI_VirtualMachineQuestionInfo_Free(&questionInfo); esxVI_TaskInfo_Free(&pendingTaskInfoList); return result; - - failure: - result = -1; - - goto cleanup; } @@ -2263,7 +2231,7 @@ esxVI_LookupDatastoreByName(esxVI_Context *ctx, const char *name, esxVI_ObjectContent **datastore, esxVI_Occurrence occurrence) { - int result = 0; + int result = -1; esxVI_String *completePropertyNameList = NULL; esxVI_ObjectContent *datastoreList = NULL; esxVI_ObjectContent *candidate = NULL; @@ -2284,23 +2252,23 @@ esxVI_LookupDatastoreByName(esxVI_Context *ctx, const char *name, "summary.accessible\0" "summary.name\0" "summary.url\0") < 0) { - goto failure; + goto cleanup; } if (esxVI_LookupObjectContentByType(ctx, ctx->datacenter, "Datastore", completePropertyNameList, esxVI_Boolean_True, &datastoreList) < 0) { - goto failure; + goto cleanup; } if (datastoreList == NULL) { if (occurrence == esxVI_Occurrence_OptionalItem) { - goto cleanup; + goto success; } else { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("No datastores available")); - goto failure; + goto cleanup; } } @@ -2314,7 +2282,7 @@ esxVI_LookupDatastoreByName(esxVI_Context *ctx, const char *name, if (STREQ(dynamicProperty->name, "summary.accessible")) { if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_Boolean) < 0) { - goto failure; + goto cleanup; } accessible = dynamicProperty->val->boolean; @@ -2326,7 +2294,7 @@ esxVI_LookupDatastoreByName(esxVI_Context *ctx, const char *name, ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Got incomplete response while querying for the " "datastore 'summary.accessible' property")); - goto failure; + goto cleanup; } if (accessible == esxVI_Boolean_False) { @@ -2338,17 +2306,17 @@ esxVI_LookupDatastoreByName(esxVI_Context *ctx, const char *name, if (STREQ(dynamicProperty->name, "summary.name")) { if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_String) < 0) { - goto failure; + goto cleanup; } if (STREQ(dynamicProperty->val->string, name)) { if (esxVI_ObjectContent_DeepCopy(datastore, candidate) < 0) { - goto failure; + goto cleanup; } /* Found datastore with matching name */ - goto cleanup; + goto success; } } else if (STREQ(dynamicProperty->name, "summary.url") && ctx->productVersion & esxVI_ProductVersion_ESX) { @@ -2362,7 +2330,7 @@ esxVI_LookupDatastoreByName(esxVI_Context *ctx, const char *name, if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_String) < 0) { - goto failure; + goto cleanup; } if (! STRPREFIX(dynamicProperty->val->string, @@ -2371,17 +2339,17 @@ esxVI_LookupDatastoreByName(esxVI_Context *ctx, const char *name, _("Datastore URL '%s' has unexpected prefix, " "expecting '/vmfs/volumes/' prefix"), dynamicProperty->val->string); - goto failure; + goto cleanup; } if (STREQ(dynamicProperty->val->string + offset, name)) { if (esxVI_ObjectContent_DeepCopy(datastore, candidate) < 0) { - goto failure; + goto cleanup; } /* Found datastore with matching URL suffix */ - goto cleanup; + goto success; } } } @@ -2397,19 +2365,17 @@ esxVI_LookupDatastoreByName(esxVI_Context *ctx, const char *name, _("Could not find datastore '%s'"), name); } - goto failure; + goto cleanup; } + success: + result = 0; + cleanup: esxVI_String_Free(&completePropertyNameList); esxVI_ObjectContent_Free(&datastoreList); return result; - - failure: - result = -1; - - goto cleanup; } @@ -2419,7 +2385,7 @@ esxVI_LookupTaskInfoByTask(esxVI_Context *ctx, esxVI_ManagedObjectReference *task, esxVI_TaskInfo **taskInfo) { - int result = 0; + int result = -1; esxVI_String *propertyNameList = NULL; esxVI_ObjectContent *objectContent = NULL; esxVI_DynamicProperty *dynamicProperty = NULL; @@ -2433,7 +2399,7 @@ esxVI_LookupTaskInfoByTask(esxVI_Context *ctx, esxVI_LookupObjectContentByType(ctx, task, "Task", propertyNameList, esxVI_Boolean_False, &objectContent) < 0) { - goto failure; + goto cleanup; } for (dynamicProperty = objectContent->propSet; dynamicProperty != NULL; @@ -2441,7 +2407,7 @@ esxVI_LookupTaskInfoByTask(esxVI_Context *ctx, if (STREQ(dynamicProperty->name, "info")) { if (esxVI_TaskInfo_CastFromAnyType(dynamicProperty->val, taskInfo) < 0) { - goto failure; + goto cleanup; } break; @@ -2450,16 +2416,13 @@ esxVI_LookupTaskInfoByTask(esxVI_Context *ctx, } } + result = 0; + cleanup: esxVI_String_Free(&propertyNameList); esxVI_ObjectContent_Free(&objectContent); return result; - - failure: - result = -1; - - goto cleanup; } @@ -2469,7 +2432,7 @@ esxVI_LookupPendingTaskInfoListByVirtualMachine (esxVI_Context *ctx, esxVI_ObjectContent *virtualMachine, esxVI_TaskInfo **pendingTaskInfoList) { - int result = 0; + int result = -1; esxVI_String *propertyNameList = NULL; esxVI_ManagedObjectReference *recentTaskList = NULL; esxVI_ManagedObjectReference *recentTask = NULL; @@ -2487,7 +2450,7 @@ esxVI_LookupPendingTaskInfoListByVirtualMachine if (STREQ(dynamicProperty->name, "recentTask")) { if (esxVI_ManagedObjectReference_CastListFromAnyType (dynamicProperty->val, &recentTaskList) < 0) { - goto failure; + goto cleanup; } break; @@ -2498,14 +2461,14 @@ esxVI_LookupPendingTaskInfoListByVirtualMachine for (recentTask = recentTaskList; recentTask != NULL; recentTask = recentTask->_next) { if (esxVI_LookupTaskInfoByTask(ctx, recentTask, &taskInfo) < 0) { - goto failure; + goto cleanup; } if (taskInfo->state == esxVI_TaskInfoState_Queued || taskInfo->state == esxVI_TaskInfoState_Running) { if (esxVI_TaskInfo_AppendToList(pendingTaskInfoList, taskInfo) < 0) { - goto failure; + goto cleanup; } taskInfo = NULL; @@ -2514,19 +2477,18 @@ esxVI_LookupPendingTaskInfoListByVirtualMachine } } + result = 0; + cleanup: + if (result < 0) { + esxVI_TaskInfo_Free(pendingTaskInfoList); + } + esxVI_String_Free(&propertyNameList); esxVI_ManagedObjectReference_Free(&recentTaskList); esxVI_TaskInfo_Free(&taskInfo); return result; - - failure: - esxVI_TaskInfo_Free(pendingTaskInfoList); - - result = -1; - - goto cleanup; } @@ -2536,7 +2498,7 @@ esxVI_LookupAndHandleVirtualMachineQuestion(esxVI_Context *ctx, const unsigned char *uuid, esxVI_Boolean autoAnswer) { - int result = 0; + int result = -1; esxVI_ObjectContent *virtualMachine = NULL; esxVI_String *propertyNameList = NULL; esxVI_VirtualMachineQuestionInfo *questionInfo = NULL; @@ -2548,26 +2510,23 @@ esxVI_LookupAndHandleVirtualMachineQuestion(esxVI_Context *ctx, esxVI_Occurrence_RequiredItem) < 0 || esxVI_GetVirtualMachineQuestionInfo(virtualMachine, &questionInfo) < 0) { - goto failure; + goto cleanup; } if (questionInfo != NULL && esxVI_HandleVirtualMachineQuestion(ctx, virtualMachine->obj, questionInfo, autoAnswer) < 0) { - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_ObjectContent_Free(&virtualMachine); esxVI_String_Free(&propertyNameList); esxVI_VirtualMachineQuestionInfo_Free(&questionInfo); return result; - - failure: - result = -1; - - goto cleanup; } @@ -2577,7 +2536,7 @@ esxVI_LookupRootSnapshotTreeList (esxVI_Context *ctx, const unsigned char *virtualMachineUuid, esxVI_VirtualMachineSnapshotTree **rootSnapshotTreeList) { - int result = 0; + int result = -1; esxVI_String *propertyNameList = NULL; esxVI_ObjectContent *virtualMachine = NULL; esxVI_DynamicProperty *dynamicProperty = NULL; @@ -2592,7 +2551,7 @@ esxVI_LookupRootSnapshotTreeList esxVI_LookupVirtualMachineByUuid(ctx, virtualMachineUuid, propertyNameList, &virtualMachine, esxVI_Occurrence_RequiredItem) < 0) { - goto failure; + goto cleanup; } for (dynamicProperty = virtualMachine->propSet; dynamicProperty != NULL; @@ -2600,7 +2559,7 @@ esxVI_LookupRootSnapshotTreeList if (STREQ(dynamicProperty->name, "snapshot.rootSnapshotList")) { if (esxVI_VirtualMachineSnapshotTree_CastListFromAnyType (dynamicProperty->val, rootSnapshotTreeList) < 0) { - goto failure; + goto cleanup; } break; @@ -2609,18 +2568,17 @@ esxVI_LookupRootSnapshotTreeList } } + result = 0; + cleanup: + if (result < 0) { + esxVI_VirtualMachineSnapshotTree_Free(rootSnapshotTreeList); + } + esxVI_String_Free(&propertyNameList); esxVI_ObjectContent_Free(&virtualMachine); return result; - - failure: - esxVI_VirtualMachineSnapshotTree_Free(rootSnapshotTreeList); - - result = -1; - - goto cleanup; } @@ -2631,7 +2589,7 @@ esxVI_LookupCurrentSnapshotTree esxVI_VirtualMachineSnapshotTree **currentSnapshotTree, esxVI_Occurrence occurrence) { - int result = 0; + int result = -1; esxVI_String *propertyNameList = NULL; esxVI_ObjectContent *virtualMachine = NULL; esxVI_DynamicProperty *dynamicProperty = NULL; @@ -2650,7 +2608,7 @@ esxVI_LookupCurrentSnapshotTree esxVI_LookupVirtualMachineByUuid(ctx, virtualMachineUuid, propertyNameList, &virtualMachine, esxVI_Occurrence_RequiredItem) < 0) { - goto failure; + goto cleanup; } for (dynamicProperty = virtualMachine->propSet; dynamicProperty != NULL; @@ -2658,12 +2616,12 @@ esxVI_LookupCurrentSnapshotTree if (STREQ(dynamicProperty->name, "snapshot.currentSnapshot")) { if (esxVI_ManagedObjectReference_CastFromAnyType (dynamicProperty->val, ¤tSnapshot) < 0) { - goto failure; + goto cleanup; } } else if (STREQ(dynamicProperty->name, "snapshot.rootSnapshotList")) { if (esxVI_VirtualMachineSnapshotTree_CastListFromAnyType (dynamicProperty->val, &rootSnapshotTreeList) < 0) { - goto failure; + goto cleanup; } } else { VIR_WARN("Unexpected '%s' property", dynamicProperty->name); @@ -2676,23 +2634,25 @@ esxVI_LookupCurrentSnapshotTree } else { ESX_VI_ERROR(VIR_ERR_NO_DOMAIN_SNAPSHOT, "%s", _("Domain has no current snapshot")); - goto failure; + goto cleanup; } } if (rootSnapshotTreeList == NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not lookup root snapshot list")); - goto failure; + goto cleanup; } if (esxVI_GetSnapshotTreeBySnapshot(rootSnapshotTreeList, currentSnapshot, &snapshotTree) < 0 || esxVI_VirtualMachineSnapshotTree_DeepCopy(currentSnapshotTree, snapshotTree) < 0) { - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_String_Free(&propertyNameList); esxVI_ObjectContent_Free(&virtualMachine); @@ -2700,11 +2660,6 @@ esxVI_LookupCurrentSnapshotTree esxVI_VirtualMachineSnapshotTree_Free(&rootSnapshotTreeList); return result; - - failure: - result = -1; - - goto cleanup; } @@ -2715,7 +2670,7 @@ esxVI_HandleVirtualMachineQuestion esxVI_VirtualMachineQuestionInfo *questionInfo, esxVI_Boolean autoAnswer) { - int result = 0; + int result = -1; esxVI_ElementDescription *elementDescription = NULL; virBuffer buffer = VIR_BUFFER_INITIALIZER; esxVI_ElementDescription *answerChoice = NULL; @@ -2743,7 +2698,7 @@ esxVI_HandleVirtualMachineQuestion if (virBufferError(&buffer)) { virReportOOMError(); - goto failure; + goto cleanup; } possibleAnswers = virBufferContentAndReset(&buffer); @@ -2755,14 +2710,14 @@ esxVI_HandleVirtualMachineQuestion _("Pending question blocks virtual machine execution, " "question is '%s', no possible answers"), questionInfo->text); - goto failure; + goto cleanup; } else if (answerChoice == NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("Pending question blocks virtual machine execution, " "question is '%s', possible answers are %s, but no " "default answer is specified"), questionInfo->text, possibleAnswers); - goto failure; + goto cleanup; } VIR_INFO("Pending question blocks virtual machine execution, " @@ -2772,7 +2727,7 @@ esxVI_HandleVirtualMachineQuestion if (esxVI_AnswerVM(ctx, virtualMachine, questionInfo->id, answerChoice->key) < 0) { - goto failure; + goto cleanup; } } else { if (possibleAnswers != NULL) { @@ -2787,20 +2742,19 @@ esxVI_HandleVirtualMachineQuestion questionInfo->text); } - goto failure; + goto cleanup; } + result = 0; + cleanup: + if (result < 0) { + virBufferFreeAndReset(&buffer); + } + VIR_FREE(possibleAnswers); return result; - - failure: - virBufferFreeAndReset(&buffer); - - result = -1; - - goto cleanup; } @@ -2812,7 +2766,7 @@ esxVI_WaitForTaskCompletion(esxVI_Context *ctx, esxVI_Boolean autoAnswer, esxVI_TaskInfoState *finalState) { - int result = 0; + int result = -1; esxVI_ObjectSpec *objectSpec = NULL; esxVI_PropertySpec *propertySpec = NULL; esxVI_PropertyFilterSpec *propertyFilterSpec = NULL; @@ -2830,18 +2784,18 @@ esxVI_WaitForTaskCompletion(esxVI_Context *ctx, if (version == NULL) { virReportOOMError(); - goto failure; + return -1; } if (esxVI_ObjectSpec_Alloc(&objectSpec) < 0) { - goto failure; + goto cleanup; } objectSpec->obj = task; objectSpec->skip = esxVI_Boolean_False; if (esxVI_PropertySpec_Alloc(&propertySpec) < 0) { - goto failure; + goto cleanup; } propertySpec->type = task->type; @@ -2855,7 +2809,7 @@ esxVI_WaitForTaskCompletion(esxVI_Context *ctx, objectSpec) < 0 || esxVI_CreateFilter(ctx, propertyFilterSpec, esxVI_Boolean_True, &propertyFilter) < 0) { - goto failure; + goto cleanup; } while (state != esxVI_TaskInfoState_Success && @@ -2871,7 +2825,7 @@ esxVI_WaitForTaskCompletion(esxVI_Context *ctx, * don't overwrite the actual error */ if (esxVI_LookupTaskInfoByTask(ctx, task, &taskInfo)) { - goto failure; + goto cleanup; } if (taskInfo->cancelable == esxVI_Boolean_True) { @@ -2887,12 +2841,12 @@ esxVI_WaitForTaskCompletion(esxVI_Context *ctx, /* FIXME: Enable error reporting here again */ - goto failure; + goto cleanup; } } if (esxVI_WaitForUpdates(ctx, version, &updateSet) < 0) { - goto failure; + goto cleanup; } VIR_FREE(version); @@ -2900,7 +2854,7 @@ esxVI_WaitForTaskCompletion(esxVI_Context *ctx, if (version == NULL) { virReportOOMError(); - goto failure; + goto cleanup; } if (updateSet->filterSet == NULL) { @@ -2932,7 +2886,7 @@ esxVI_WaitForTaskCompletion(esxVI_Context *ctx, } if (esxVI_TaskInfoState_CastFromAnyType(propertyValue, &state) < 0) { - goto failure; + goto cleanup; } } @@ -2941,9 +2895,11 @@ esxVI_WaitForTaskCompletion(esxVI_Context *ctx, } if (esxVI_TaskInfoState_CastFromAnyType(propertyValue, finalState) < 0) { - goto failure; + goto cleanup; } + result = 0; + cleanup: /* * Remove values given by the caller from the data structures to prevent @@ -2964,11 +2920,6 @@ esxVI_WaitForTaskCompletion(esxVI_Context *ctx, esxVI_TaskInfo_Free(&taskInfo); return result; - - failure: - result = -1; - - goto cleanup; } @@ -2994,7 +2945,7 @@ esxVI_ParseHostCpuIdInfo(esxVI_ParsedHostCpuIdInfo *parsedHostCpuIdInfo, ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("HostCpuIdInfo register '%s' has an unexpected length"), name[r]); - goto failure; + return -1; } /* Strip the ':' and invert the "bit" order from 31..0 to 0..31 */ @@ -3008,15 +2959,10 @@ esxVI_ParseHostCpuIdInfo(esxVI_ParsedHostCpuIdInfo *parsedHostCpuIdInfo, ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, _("HostCpuIdInfo register '%s' has an unexpected format"), name[r]); - goto failure; + return -1; } } } return 0; - - failure: - memset(parsedHostCpuIdInfo, 0, sizeof (*parsedHostCpuIdInfo)); - - return -1; } diff --git a/src/esx/esx_vi_methods.c b/src/esx/esx_vi_methods.c index 8f841e3eb6..56d2e5839f 100644 --- a/src/esx/esx_vi_methods.c +++ b/src/esx/esx_vi_methods.c @@ -74,14 +74,14 @@ #define ESX_VI__METHOD__DESERIALIZE_OUTPUT__RequiredItem(_type) \ if (esxVI_##_type##_Deserialize(response->node, output) < 0) { \ - goto failure; \ + goto cleanup; \ } #define ESX_VI__METHOD__DESERIALIZE_OUTPUT__RequiredList(_type) \ if (esxVI_##_type##_DeserializeList(response->node, output) < 0) { \ - goto failure; \ + goto cleanup; \ } @@ -89,7 +89,7 @@ #define ESX_VI__METHOD__DESERIALIZE_OUTPUT__OptionalItem(_type) \ if (response->node != NULL && \ esxVI_##_type##_Deserialize(response->node, output) < 0) { \ - goto failure; \ + goto cleanup; \ } @@ -97,7 +97,7 @@ #define ESX_VI__METHOD__DESERIALIZE_OUTPUT__OptionalList(_type) \ if (response->node != NULL && \ esxVI_##_type##_DeserializeList(response->node, output) < 0) { \ - goto failure; \ + goto cleanup; \ } @@ -107,7 +107,7 @@ int \ esxVI_##_name _parameters \ { \ - int result = 0; \ + int result = -1; \ const char *methodName = #_name; \ virBuffer buffer = VIR_BUFFER_INITIALIZER; \ char *request = NULL; \ @@ -129,30 +129,29 @@ \ if (virBufferError(&buffer)) { \ virReportOOMError(); \ - goto failure; \ + goto cleanup; \ } \ \ request = virBufferContentAndReset(&buffer); \ \ if (esxVI_Context_Execute(ctx, methodName, request, &response, \ esxVI_Occurrence_##_occurrence) < 0) { \ - goto failure; \ + goto cleanup; \ } \ \ ESX_VI__METHOD__DESERIALIZE_OUTPUT__##_occurrence(_output_type) \ \ + result = 0; \ + \ cleanup: \ + if (result < 0) { \ + virBufferFreeAndReset(&buffer); \ + } \ + \ VIR_FREE(request); \ esxVI_Response_Free(&response); \ \ return result; \ - \ - failure: \ - virBufferFreeAndReset(&buffer); \ - \ - result = -1; \ - \ - goto cleanup; \ } @@ -216,21 +215,21 @@ #define ESX_VI__METHOD__PARAMETER__SERIALIZE(_type, _name) \ if (esxVI_##_type##_Serialize(_name, #_name, &buffer) < 0) { \ - goto failure; \ + goto cleanup; \ } #define ESX_VI__METHOD__PARAMETER__SERIALIZE_LIST(_type, _name) \ if (esxVI_##_type##_SerializeList(_name, #_name, &buffer) < 0) { \ - goto failure; \ + goto cleanup; \ } #define ESX_VI__METHOD__PARAMETER__SERIALIZE_VALUE(_type, _name) \ if (esxVI_##_type##_SerializeValue(_name, #_name, &buffer) < 0) { \ - goto failure; \ + goto cleanup; \ } @@ -243,7 +242,7 @@ int esxVI_RetrieveServiceContent(esxVI_Context *ctx, esxVI_ServiceContent **serviceContent) { - int result = 0; + int result = -1; const char *request = ESX_VI__SOAP__REQUEST_HEADER "" "<_this xmlns=\"urn:vim25\" " @@ -263,18 +262,15 @@ esxVI_RetrieveServiceContent(esxVI_Context *ctx, if (esxVI_Context_Execute(ctx, "RetrieveServiceContent", request, &response, esxVI_Occurrence_RequiredItem) < 0 || esxVI_ServiceContent_Deserialize(response->node, serviceContent) < 0) { - goto failure; + goto cleanup; } + result = 0; + cleanup: esxVI_Response_Free(&response); return result; - - failure: - result = -1; - - goto cleanup; } diff --git a/src/esx/esx_vi_types.c b/src/esx/esx_vi_types.c index 8334efdd37..3f34fee60f 100644 --- a/src/esx/esx_vi_types.c +++ b/src/esx/esx_vi_types.c @@ -297,7 +297,7 @@ int \ esxVI_##_type##_Deserialize(xmlNodePtr node, esxVI_##_type **number) \ { \ - int result = 0; \ + int result = -1; \ char *string; \ long long value; \ \ @@ -317,35 +317,34 @@ ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, \ "XML node doesn't contain text, expecting an " \ _xsdType" value"); \ - goto failure; \ + goto cleanup; \ } \ \ if (virStrToLong_ll(string, NULL, 10, &value) < 0) { \ ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, \ "Unknown value '%s' for "_xsdType, string); \ - goto failure; \ + goto cleanup; \ } \ \ if (value < (_min) || value > (_max)) { \ ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, \ "Value '%s' is not representable as "_xsdType, \ (const char *)string); \ - goto failure; \ + goto cleanup; \ } \ \ (*number)->value = value; \ \ + result = 0; \ + \ cleanup: \ + if (result < 0) { \ + esxVI_##_type##_Free(number); \ + } \ + \ VIR_FREE(string); \ \ return result; \ - \ - failure: \ - esxVI_##_type##_Free(number); \ - \ - result = -1; \ - \ - goto cleanup; \ } @@ -930,7 +929,7 @@ esxVI_String_AppendValueToList(esxVI_String **stringList, const char *value) esxVI_String *string = NULL; if (esxVI_String_Alloc(&string) < 0) { - goto failure; + return -1; } string->value = strdup(value); diff --git a/src/esx/esx_vmx.c b/src/esx/esx_vmx.c index 142f2f7662..5cadb5a26c 100644 --- a/src/esx/esx_vmx.c +++ b/src/esx/esx_vmx.c @@ -590,6 +590,7 @@ char * esxVMX_AbsolutePathToDatastoreRelatedPath(esxVI_Context *ctx, const char *absolutePath) { + bool success = false; char *copyOfAbsolutePath = NULL; char *tmp = NULL; char *saveptr = NULL; @@ -601,7 +602,7 @@ esxVMX_AbsolutePathToDatastoreRelatedPath(esxVI_Context *ctx, const char *datastoreName = NULL; if (esxVI_String_DeepCopyValue(©OfAbsolutePath, absolutePath) < 0) { - goto failure; + return NULL; } /* Expected format: '/vmfs/volumes//' */ @@ -611,14 +612,14 @@ esxVMX_AbsolutePathToDatastoreRelatedPath(esxVI_Context *ctx, ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Absolute path '%s' doesn't have expected format " "'/vmfs/volumes//'"), absolutePath); - goto failure; + goto cleanup; } if (ctx != NULL) { if (esxVI_LookupDatastoreByName(ctx, preliminaryDatastoreName, NULL, &datastore, esxVI_Occurrence_OptionalItem) < 0) { - goto failure; + goto cleanup; } if (datastore != NULL) { @@ -629,7 +630,7 @@ esxVMX_AbsolutePathToDatastoreRelatedPath(esxVI_Context *ctx, } else if (STREQ(dynamicProperty->name, "summary.name")) { if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_String) < 0) { - goto failure; + goto cleanup; } datastoreName = dynamicProperty->val->string; @@ -656,21 +657,22 @@ esxVMX_AbsolutePathToDatastoreRelatedPath(esxVI_Context *ctx, if (virAsprintf(&datastoreRelatedPath, "[%s] %s", datastoreName, directoryAndFileName) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } /* FIXME: Check if referenced path/file really exists */ + success = true; + cleanup: + if (! success) { + VIR_FREE(datastoreRelatedPath); + } + VIR_FREE(copyOfAbsolutePath); esxVI_ObjectContent_Free(&datastore); return datastoreRelatedPath; - - failure: - VIR_FREE(datastoreRelatedPath); - - goto cleanup; } @@ -727,6 +729,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, const char *datastoreName, const char *directoryName, esxVI_ProductVersion productVersion) { + bool success = false; virConfPtr conf = NULL; virDomainDefPtr def = NULL; long long config_version = 0; @@ -750,7 +753,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, if (VIR_ALLOC(def) < 0) { virReportOOMError(); - goto failure; + return NULL; } def->virtType = VIR_DOMAIN_VIRT_VMWARE; /* FIXME: maybe add VIR_DOMAIN_VIRT_ESX ? */ @@ -759,20 +762,20 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, /* vmx:config.version */ if (esxUtil_GetConfigLong(conf, "config.version", &config_version, 0, 0) < 0) { - goto failure; + goto cleanup; } if (config_version != 8) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VMX entry 'config.version' to be 8 but found " "%lld"), config_version); - goto failure; + goto cleanup; } /* vmx:virtualHW.version */ if (esxUtil_GetConfigLong(conf, "virtualHW.version", &virtualHW_version, 0, 0) < 0) { - goto failure; + goto cleanup; } /* @@ -790,7 +793,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, _("Expecting VMX entry 'virtualHW.version' to be 4 " "but found %lld"), virtualHW_version); - goto failure; + goto cleanup; } break; @@ -802,7 +805,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, _("Expecting VMX entry 'virtualHW.version' to be 4 or 7 " "but found %lld"), virtualHW_version); - goto failure; + goto cleanup; } break; @@ -810,37 +813,37 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, default: ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Unexpected product version")); - goto failure; + goto cleanup; } /* vmx:uuid.bios -> def:uuid */ /* FIXME: Need to handle 'uuid.action = "create"' */ if (esxUtil_GetConfigUUID(conf, "uuid.bios", def->uuid, 1) < 0) { - goto failure; + goto cleanup; } /* vmx:displayName -> def:name */ if (esxUtil_GetConfigString(conf, "displayName", &def->name, 1) < 0) { - goto failure; + goto cleanup; } /* vmx:memsize -> def:maxmem */ if (esxUtil_GetConfigLong(conf, "memsize", &memsize, 32, 1) < 0) { - goto failure; + goto cleanup; } if (memsize <= 0 || memsize % 4 != 0) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VMX entry 'memsize' to be an unsigned " "integer (multiple of 4) but found %lld"), memsize); - goto failure; + goto cleanup; } def->maxmem = memsize * 1024; /* Scale from megabytes to kilobytes */ /* vmx:sched.mem.max -> def:memory */ if (esxUtil_GetConfigLong(conf, "sched.mem.max", &memory, memsize, 1) < 0) { - goto failure; + goto cleanup; } if (memory < 0) { @@ -855,14 +858,14 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, /* vmx:numvcpus -> def:vcpus */ if (esxUtil_GetConfigLong(conf, "numvcpus", &numvcpus, 1, 1) < 0) { - goto failure; + goto cleanup; } if (numvcpus <= 0 || (numvcpus % 2 != 0 && numvcpus != 1)) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VMX entry 'numvcpus' to be an unsigned " "integer (1 or a multiple of 2) but found %lld"), numvcpus); - goto failure; + goto cleanup; } def->vcpus = numvcpus; @@ -871,7 +874,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, // VirtualMachine:config.cpuAffinity.affinitySet if (esxUtil_GetConfigString(conf, "sched.cpu.affinity", &sched_cpu_affinity, 1) < 0) { - goto failure; + goto cleanup; } if (sched_cpu_affinity != NULL && STRNEQ(sched_cpu_affinity, "all")) { @@ -882,7 +885,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, if (VIR_ALLOC_N(def->cpumask, VIR_DOMAIN_CPUMASK_LEN) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } while (*current != '\0') { @@ -895,14 +898,14 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, _("Expecting VMX entry 'sched.cpu.affinity' to be " "a comma separated list of unsigned integers but " "found '%s'"), sched_cpu_affinity); - goto failure; + goto cleanup; } if (number >= VIR_DOMAIN_CPUMASK_LEN) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("VMX entry 'sched.cpu.affinity' contains a %d, " "this value is too large"), number); - goto failure; + goto cleanup; } if (number + 1 > def->cpumasklen) { @@ -923,7 +926,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, _("Expecting VMX entry 'sched.cpu.affinity' to be " "a comma separated list of unsigned integers but " "found '%s'"), sched_cpu_affinity); - goto failure; + goto cleanup; } virSkipSpaces(¤t); @@ -934,7 +937,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, _("Expecting VMX entry 'sched.cpu.affinity' to contain " "at least as many values as 'numvcpus' (%lld) but " "found only %d value(s)"), numvcpus, count); - goto failure; + goto cleanup; } } @@ -948,12 +951,12 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, if (def->os.type == NULL) { virReportOOMError(); - goto failure; + goto cleanup; } /* vmx:guestOS -> def:os.arch */ if (esxUtil_GetConfigString(conf, "guestOS", &guestOS, 1) < 0) { - goto failure; + goto cleanup; } if (guestOS != NULL && virFileHasSuffix(guestOS, "-64")) { @@ -964,7 +967,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, if (def->os.arch == NULL) { virReportOOMError(); - goto failure; + goto cleanup; } /* @@ -977,13 +980,13 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, /* def:graphics */ if (VIR_ALLOC_N(def->graphics, 1) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } def->ngraphics = 0; if (esxVMX_ParseVNC(conf, &def->graphics[def->ngraphics]) < 0) { - goto failure; + goto cleanup; } if (def->graphics[def->ngraphics] != NULL) { @@ -993,7 +996,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, /* def:disks: 4 * 15 scsi + 2 * 2 ide + 2 floppy = 66 */ if (VIR_ALLOC_N(def->disks, 66) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } def->ndisks = 0; @@ -1004,7 +1007,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, if (esxVMX_ParseSCSIController(conf, controller, &present, &scsi_virtualDev) < 0) { - goto failure; + goto cleanup; } if (! present) { @@ -1024,7 +1027,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, VIR_DOMAIN_DISK_BUS_SCSI, controller, id, scsi_virtualDev, datastoreName, directoryName, &def->disks[def->ndisks]) < 0) { - goto failure; + goto cleanup; } if (def->disks[def->ndisks] != NULL) { @@ -1036,7 +1039,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, VIR_DOMAIN_DISK_BUS_SCSI, controller, id, scsi_virtualDev, datastoreName, directoryName, &def->disks[def->ndisks]) < 0) { - goto failure; + goto cleanup; } if (def->disks[def->ndisks] != NULL) { @@ -1052,7 +1055,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, VIR_DOMAIN_DISK_BUS_IDE, controller, id, NULL, datastoreName, directoryName, &def->disks[def->ndisks]) < 0) { - goto failure; + goto cleanup; } if (def->disks[def->ndisks] != NULL) { @@ -1064,7 +1067,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, VIR_DOMAIN_DISK_BUS_IDE, controller, id, NULL, datastoreName, directoryName, &def->disks[def->ndisks]) < 0) { - goto failure; + goto cleanup; } if (def->disks[def->ndisks] != NULL) { @@ -1079,7 +1082,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, VIR_DOMAIN_DISK_BUS_FDC, controller, -1, NULL, datastoreName, directoryName, &def->disks[def->ndisks]) < 0) { - goto failure; + goto cleanup; } if (def->disks[def->ndisks] != NULL) { @@ -1093,7 +1096,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, /* def:nets */ if (VIR_ALLOC_N(def->nets, 4) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } def->nnets = 0; @@ -1101,7 +1104,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, for (controller = 0; controller < 4; ++controller) { if (esxVMX_ParseEthernet(conf, controller, &def->nets[def->nnets]) < 0) { - goto failure; + goto cleanup; } if (def->nets[def->nnets] != NULL) { @@ -1121,7 +1124,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, /* def:serials */ if (VIR_ALLOC_N(def->serials, 4) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } def->nserials = 0; @@ -1130,7 +1133,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, if (esxVMX_ParseSerial(ctx, conf, port, datastoreName, directoryName, &def->serials[def->nserials]) < 0) { - goto failure; + goto cleanup; } if (def->serials[def->nserials] != NULL) { @@ -1141,7 +1144,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, /* def:parallels */ if (VIR_ALLOC_N(def->parallels, 3) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } def->nparallels = 0; @@ -1150,7 +1153,7 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, if (esxVMX_ParseParallel(ctx, conf, port, datastoreName, directoryName, &def->parallels[def->nparallels]) < 0) { - goto failure; + goto cleanup; } if (def->parallels[def->nparallels] != NULL) { @@ -1158,19 +1161,20 @@ esxVMX_ParseConfig(esxVI_Context *ctx, const char *vmx, } } + success = true; + cleanup: + if (! success) { + virDomainDefFree(def); + def = NULL; + } + virConfFree(conf); VIR_FREE(sched_cpu_affinity); VIR_FREE(guestOS); VIR_FREE(scsi_virtualDev); return def; - - failure: - virDomainDefFree(def); - def = NULL; - - goto cleanup; } @@ -1335,7 +1339,7 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, * virtualDev = NULL */ - int result = 0; + int result = -1; char *prefix = NULL; char present_name[32] = ""; @@ -1366,7 +1370,7 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, if (VIR_ALLOC(*def) < 0) { virReportOOMError(); - goto failure; + return -1; } (*def)->device = device; @@ -1380,18 +1384,18 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("SCSI controller index %d out of [0..3] range"), controller); - goto failure; + goto cleanup; } if (id < 0 || id > 15 || id == 7) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("SCSI ID %d out of [0..6,8..15] range"), id); - goto failure; + goto cleanup; } if (virAsprintf(&prefix, "scsi%d:%d", controller, id) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } (*def)->dst = @@ -1399,7 +1403,7 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, (controller * 15 + (id < 7 ? id : id - 1), "sd"); if ((*def)->dst == NULL) { - goto failure; + goto cleanup; } if (virtualDev != NULL) { @@ -1407,7 +1411,7 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, if ((*def)->driverName == NULL) { virReportOOMError(); - goto failure; + goto cleanup; } } } else if (bus == VIR_DOMAIN_DISK_BUS_IDE) { @@ -1415,31 +1419,31 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("IDE controller index %d out of [0..1] range"), controller); - goto failure; + goto cleanup; } if (id < 0 || id > 1) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("IDE ID %d out of [0..1] range"), id); - goto failure; + goto cleanup; } if (virAsprintf(&prefix, "ide%d:%d", controller, id) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } (*def)->dst = virIndexToDiskName(controller * 2 + id, "hd"); if ((*def)->dst == NULL) { - goto failure; + goto cleanup; } } else { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Unsupported bus type '%s' for device type '%s'"), virDomainDiskBusTypeToString(bus), virDomainDiskDeviceTypeToString(device)); - goto failure; + goto cleanup; } } else if (device == VIR_DOMAIN_DISK_DEVICE_FLOPPY) { if (bus == VIR_DOMAIN_DISK_BUS_FDC) { @@ -1447,31 +1451,31 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Floppy controller index %d out of [0..1] range"), controller); - goto failure; + goto cleanup; } if (virAsprintf(&prefix, "floppy%d", controller) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } (*def)->dst = virIndexToDiskName(controller, "fd"); if ((*def)->dst == NULL) { - goto failure; + goto cleanup; } } else { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Unsupported bus type '%s' for device type '%s'"), virDomainDiskBusTypeToString(bus), virDomainDiskDeviceTypeToString(device)); - goto failure; + goto cleanup; } } else { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Unsupported device type '%s'"), virDomainDiskDeviceTypeToString(device)); - goto failure; + goto cleanup; } ESX_BUILD_VMX_NAME(present); @@ -1484,13 +1488,13 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, /* vmx:present */ if (esxUtil_GetConfigBoolean(conf, present_name, &present, 0, 1) < 0) { - goto failure; + goto cleanup; } /* vmx:startConnected */ if (esxUtil_GetConfigBoolean(conf, startConnected_name, &startConnected, 1, 1) < 0) { - goto failure; + goto cleanup; } /* FIXME: Need to distiguish between active and inactive domains here */ @@ -1500,13 +1504,13 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, /* vmx:deviceType -> def:type */ if (esxUtil_GetConfigString(conf, deviceType_name, &deviceType, 1) < 0) { - goto failure; + goto cleanup; } /* vmx:clientDevice */ if (esxUtil_GetConfigBoolean(conf, clientDevice_name, &clientDevice, 0, 1) < 0) { - goto failure; + goto cleanup; } if (clientDevice) { @@ -1519,18 +1523,18 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, /* vmx:fileType -> def:type */ if (esxUtil_GetConfigString(conf, fileType_name, &fileType, 1) < 0) { - goto failure; + goto cleanup; } /* vmx:fileName -> def:src, def:type */ if (esxUtil_GetConfigString(conf, fileName_name, &fileName, 0) < 0) { - goto failure; + goto cleanup; } /* vmx:writeThrough -> def:cachemode */ if (esxUtil_GetConfigBoolean(conf, writeThrough_name, &writeThrough, 0, 1) < 0) { - goto failure; + goto cleanup; } /* Setup virDomainDiskDef */ @@ -1542,13 +1546,13 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VMX entry '%s' to be 'scsi-hardDisk' " "but found '%s'"), deviceType_name, deviceType); - goto failure; + goto cleanup; } else if (bus == VIR_DOMAIN_DISK_BUS_IDE && STRCASENEQ(deviceType, "ata-hardDisk")) { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VMX entry '%s' to be 'ata-hardDisk' " "but found '%s'"), deviceType_name, deviceType); - goto failure; + goto cleanup; } } @@ -1569,7 +1573,7 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, : VIR_DOMAIN_DISK_CACHE_DEFAULT; if ((*def)->src == NULL) { - goto failure; + goto cleanup; } } else if (virFileHasSuffix(fileName, ".iso") || STREQ(deviceType, "atapi-cdrom")) { @@ -1584,7 +1588,7 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Invalid or not yet handled value '%s' for VMX entry " "'%s'"), fileName, fileName_name); - goto failure; + goto cleanup; } } else if (device == VIR_DOMAIN_DISK_DEVICE_CDROM) { if (virFileHasSuffix(fileName, ".iso")) { @@ -1593,7 +1597,7 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VMX entry '%s' to be 'cdrom-image' " "but found '%s'"), deviceType_name, deviceType); - goto failure; + goto cleanup; } } @@ -1602,7 +1606,7 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, directoryName); if ((*def)->src == NULL) { - goto failure; + goto cleanup; } } else if (virFileHasSuffix(fileName, ".vmdk")) { /* @@ -1621,7 +1625,7 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Invalid or not yet handled value '%s' for VMX entry " "'%s'"), fileName, fileName_name); - goto failure; + goto cleanup; } } else if (device == VIR_DOMAIN_DISK_DEVICE_FLOPPY) { if (virFileHasSuffix(fileName, ".flp")) { @@ -1630,7 +1634,7 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VMX entry '%s' to be 'file' but " "found '%s'"), fileType_name, fileType); - goto failure; + goto cleanup; } } @@ -1639,7 +1643,7 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, directoryName); if ((*def)->src == NULL) { - goto failure; + goto cleanup; } } else if (fileType != NULL && STREQ(fileType, "device")) { (*def)->type = VIR_DOMAIN_DISK_TYPE_BLOCK; @@ -1650,15 +1654,22 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Invalid or not yet handled value '%s' for VMX entry " "'%s'"), fileName, fileName_name); - goto failure; + goto cleanup; } } else { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Unsupported device type '%s'"), virDomainDiskDeviceTypeToString(device)); - goto failure; + goto cleanup; } + result = 0; + cleanup: + if (result < 0) { + virDomainDiskDefFree(*def); + *def = NULL; + } + VIR_FREE(prefix); VIR_FREE(deviceType); VIR_FREE(fileType); @@ -1666,13 +1677,12 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, return result; - failure: - result = -1; - ignore: virDomainDiskDefFree(*def); *def = NULL; + result = 0; + goto cleanup; } @@ -1681,7 +1691,7 @@ esxVMX_ParseDisk(esxVI_Context *ctx, virConfPtr conf, int device, int bus, int esxVMX_ParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) { - int result = 0; + int result = -1; char prefix[48] = ""; char present_name[48] = ""; @@ -1728,7 +1738,7 @@ esxVMX_ParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) if (VIR_ALLOC(*def) < 0) { virReportOOMError(); - goto failure; + return -1; } snprintf(prefix, sizeof(prefix), "ethernet%d", controller); @@ -1746,13 +1756,13 @@ esxVMX_ParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) /* vmx:present */ if (esxUtil_GetConfigBoolean(conf, present_name, &present, 0, 1) < 0) { - goto failure; + goto cleanup; } /* vmx:startConnected */ if (esxUtil_GetConfigBoolean(conf, startConnected_name, &startConnected, 1, 1) < 0) { - goto failure; + goto cleanup; } /* FIXME: Need to distiguish between active and inactive domains here */ @@ -1763,7 +1773,7 @@ esxVMX_ParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) /* vmx:connectionType -> def:type */ if (esxUtil_GetConfigString(conf, connectionType_name, &connectionType, 1) < 0) { - goto failure; + goto cleanup; } /* vmx:addressType, vmx:generatedAddress, vmx:address -> def:mac */ @@ -1771,7 +1781,7 @@ esxVMX_ParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) esxUtil_GetConfigString(conf, generatedAddress_name, &generatedAddress, 1) < 0 || esxUtil_GetConfigString(conf, address_name, &address, 1) < 0) { - goto failure; + goto cleanup; } if (addressType == NULL || STRCASEEQ(addressType, "generated") || @@ -1782,7 +1792,7 @@ esxVMX_ParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) _("Expecting VMX entry '%s' to be MAC address but " "found '%s'"), generatedAddress_name, generatedAddress); - goto failure; + goto cleanup; } } } else if (STRCASEEQ(addressType, "static")) { @@ -1791,20 +1801,20 @@ esxVMX_ParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VMX entry '%s' to be MAC address but " "found '%s'"), address_name, address); - goto failure; + goto cleanup; } } } else { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VMX entry '%s' to be 'generated' or 'static' or " "'vpx' but found '%s'"), addressType_name, addressType); - goto failure; + goto cleanup; } /* vmx:virtualDev, vmx:features -> def:model */ if (esxUtil_GetConfigString(conf, virtualDev_name, &virtualDev, 1) < 0 || esxUtil_GetConfigLong(conf, features_name, &features, 0, 1) < 0) { - goto failure; + goto cleanup; } if (virtualDev != NULL) { @@ -1816,7 +1826,7 @@ esxVMX_ParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) _("Expecting VMX entry '%s' to be 'vlance' or 'vmxnet' or " "'vmxnet3' or 'e1000' but found '%s'"), virtualDev_name, virtualDev); - goto failure; + goto cleanup; } if (STRCASEEQ(virtualDev, "vmxnet") && features == 15) { @@ -1826,7 +1836,7 @@ esxVMX_ParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) if (virtualDev == NULL) { virReportOOMError(); - goto failure; + goto cleanup; } } } @@ -1836,13 +1846,13 @@ esxVMX_ParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) STRCASEEQ(connectionType, "bridged") || STRCASEEQ(connectionType, "custom")) && esxUtil_GetConfigString(conf, networkName_name, &networkName, 0) < 0) { - goto failure; + goto cleanup; } /* vmx:vnet -> def:data.ifname */ if (connectionType != NULL && STRCASEEQ(connectionType, "custom") && esxUtil_GetConfigString(conf, vnet_name, &vnet, 0) < 0) { - goto failure; + goto cleanup; } /* Setup virDomainNetDef */ @@ -1858,13 +1868,13 @@ esxVMX_ParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("No yet handled value '%s' for VMX entry '%s'"), connectionType, connectionType_name); - goto failure; + goto cleanup; } else if (STRCASEEQ(connectionType, "nat")) { /* FIXME */ ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("No yet handled value '%s' for VMX entry '%s'"), connectionType, connectionType_name); - goto failure; + goto cleanup; } else if (STRCASEEQ(connectionType, "custom")) { (*def)->type = VIR_DOMAIN_NET_TYPE_BRIDGE; (*def)->model = virtualDev; @@ -1878,10 +1888,17 @@ esxVMX_ParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Invalid value '%s' for VMX entry '%s'"), connectionType, connectionType_name); - goto failure; + goto cleanup; } + result = 0; + cleanup: + if (result < 0) { + virDomainNetDefFree(*def); + *def = NULL; + } + VIR_FREE(connectionType); VIR_FREE(addressType); VIR_FREE(generatedAddress); @@ -1891,13 +1908,12 @@ esxVMX_ParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) return result; - failure: - result = -1; - ignore: virDomainNetDefFree(*def); *def = NULL; + result = 0; + goto cleanup; } @@ -1908,7 +1924,7 @@ esxVMX_ParseSerial(esxVI_Context *ctx, virConfPtr conf, int port, const char *datastoreName, const char *directoryName, virDomainChrDefPtr *def) { - int result = 0; + int result = -1; char prefix[48] = ""; char present_name[48] = ""; @@ -1936,7 +1952,7 @@ esxVMX_ParseSerial(esxVI_Context *ctx, virConfPtr conf, int port, if (VIR_ALLOC(*def) < 0) { virReportOOMError(); - goto failure; + return -1; } (*def)->targetType = VIR_DOMAIN_CHR_TARGET_TYPE_SERIAL; @@ -1950,13 +1966,13 @@ esxVMX_ParseSerial(esxVI_Context *ctx, virConfPtr conf, int port, /* vmx:present */ if (esxUtil_GetConfigBoolean(conf, present_name, &present, 0, 1) < 0) { - goto failure; + goto cleanup; } /* vmx:startConnected */ if (esxUtil_GetConfigBoolean(conf, startConnected_name, &startConnected, 1, 1) < 0) { - goto failure; + goto cleanup; } /* FIXME: Need to distiguish between active and inactive domains here */ @@ -1966,12 +1982,12 @@ esxVMX_ParseSerial(esxVI_Context *ctx, virConfPtr conf, int port, /* vmx:fileType -> def:type */ if (esxUtil_GetConfigString(conf, fileType_name, &fileType, 0) < 0) { - goto failure; + goto cleanup; } /* vmx:fileName -> def:data.file.path */ if (esxUtil_GetConfigString(conf, fileName_name, &fileName, 0) < 0) { - goto failure; + goto cleanup; } /* Setup virDomainChrDef */ @@ -1989,7 +2005,7 @@ esxVMX_ParseSerial(esxVI_Context *ctx, virConfPtr conf, int port, directoryName); if ((*def)->data.file.path == NULL) { - goto failure; + goto cleanup; } } else if (STRCASEEQ(fileType, "pipe")) { /* @@ -2005,22 +2021,28 @@ esxVMX_ParseSerial(esxVI_Context *ctx, virConfPtr conf, int port, ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VMX entry '%s' to be 'device', 'file' or 'pipe' " "but found '%s'"), fileType_name, fileType); - goto failure; + goto cleanup; } + result = 0; + cleanup: + if (result < 0) { + virDomainChrDefFree(*def); + *def = NULL; + } + VIR_FREE(fileType); VIR_FREE(fileName); return result; - failure: - result = -1; - ignore: virDomainChrDefFree(*def); *def = NULL; + result = 0; + goto cleanup; } @@ -2031,7 +2053,7 @@ esxVMX_ParseParallel(esxVI_Context *ctx, virConfPtr conf, int port, const char *datastoreName, const char *directoryName, virDomainChrDefPtr *def) { - int result = 0; + int result = -1; char prefix[48] = ""; char present_name[48] = ""; @@ -2059,7 +2081,7 @@ esxVMX_ParseParallel(esxVI_Context *ctx, virConfPtr conf, int port, if (VIR_ALLOC(*def) < 0) { virReportOOMError(); - goto failure; + return -1; } (*def)->targetType = VIR_DOMAIN_CHR_TARGET_TYPE_PARALLEL; @@ -2073,13 +2095,13 @@ esxVMX_ParseParallel(esxVI_Context *ctx, virConfPtr conf, int port, /* vmx:present */ if (esxUtil_GetConfigBoolean(conf, present_name, &present, 0, 1) < 0) { - goto failure; + goto cleanup; } /* vmx:startConnected */ if (esxUtil_GetConfigBoolean(conf, startConnected_name, &startConnected, 1, 1) < 0) { - goto failure; + goto cleanup; } /* FIXME: Need to distiguish between active and inactive domains here */ @@ -2089,12 +2111,12 @@ esxVMX_ParseParallel(esxVI_Context *ctx, virConfPtr conf, int port, /* vmx:fileType -> def:type */ if (esxUtil_GetConfigString(conf, fileType_name, &fileType, 0) < 0) { - goto failure; + goto cleanup; } /* vmx:fileName -> def:data.file.path */ if (esxUtil_GetConfigString(conf, fileName_name, &fileName, 0) < 0) { - goto failure; + goto cleanup; } /* Setup virDomainChrDef */ @@ -2112,28 +2134,34 @@ esxVMX_ParseParallel(esxVI_Context *ctx, virConfPtr conf, int port, directoryName); if ((*def)->data.file.path == NULL) { - goto failure; + goto cleanup; } } else { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Expecting VMX entry '%s' to be 'device' or 'file' but " "found '%s'"), fileType_name, fileType); - goto failure; + goto cleanup; } + result = 0; + cleanup: + if (result < 0) { + virDomainChrDefFree(*def); + *def = NULL; + } + VIR_FREE(fileType); VIR_FREE(fileName); return result; - failure: - result = -1; - ignore: virDomainChrDefFree(*def); *def = NULL; + result = 0; + goto cleanup; } @@ -2146,6 +2174,7 @@ esxVMX_ParseParallel(esxVI_Context *ctx, virConfPtr conf, int port, char * esxVMX_FormatFileName(esxVI_Context *ctx ATTRIBUTE_UNUSED, const char *src) { + bool success = false; char *datastoreName = NULL; char *directoryName = NULL; char *fileName = NULL; @@ -2155,20 +2184,20 @@ esxVMX_FormatFileName(esxVI_Context *ctx ATTRIBUTE_UNUSED, const char *src) /* Found potential datastore related path */ if (esxUtil_ParseDatastoreRelatedPath(src, &datastoreName, &directoryName, &fileName) < 0) { - goto failure; + goto cleanup; } if (directoryName == NULL) { if (virAsprintf(&absolutePath, "/vmfs/volumes/%s/%s", datastoreName, fileName) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } } else { if (virAsprintf(&absolutePath, "/vmfs/volumes/%s/%s/%s", datastoreName, directoryName, fileName) < 0) { virReportOOMError(); - goto failure; + goto cleanup; } } } else if (STRPREFIX(src, "/")) { @@ -2177,29 +2206,30 @@ esxVMX_FormatFileName(esxVI_Context *ctx ATTRIBUTE_UNUSED, const char *src) if (absolutePath == NULL) { virReportOOMError(); - goto failure; + goto cleanup; } } else { /* Found relative path, this is not supported */ ESX_ERROR(VIR_ERR_INTERNAL_ERROR, _("Found relative path '%s' in domain XML, this is not " "supported"), src); - goto failure; + goto cleanup; } /* FIXME: Check if referenced path/file really exists */ + success = true; + cleanup: + if (! success) { + VIR_FREE(absolutePath); + } + VIR_FREE(datastoreName); VIR_FREE(directoryName); VIR_FREE(fileName); return absolutePath; - - failure: - VIR_FREE(absolutePath); - - goto cleanup; } -- GitLab