DWORD VmDnsGetForwarders_inlock( PVMDNS_FORWARDER_CONTEXT pForwarder, PSTR** pppszForwarders, PDWORD pdwCount ) { DWORD dwError = 0; PSTR* pszForwarders = NULL; DWORD dwCount = 0, i = 0; BAIL_ON_VMDNS_INVALID_POINTER(pForwarder, dwError); BAIL_ON_VMDNS_INVALID_POINTER(pppszForwarders, dwError); BAIL_ON_VMDNS_INVALID_POINTER(pdwCount, dwError); dwCount = pForwarder->dwCount; dwError = VmDnsAllocateMemory( (dwCount + 1) * sizeof(PSTR), (PVOID*)&pszForwarders); BAIL_ON_VMDNS_ERROR(dwError); for (; i < dwCount; ++i) { dwError = VmDnsAllocateStringA( pForwarder->pForwarderEntries[i]->pszForwarder, &pszForwarders[i]); BAIL_ON_VMDNS_ERROR(dwError); } *pdwCount = dwCount; *pppszForwarders = pszForwarders; cleanup: return dwError; error: VmDnsFreeStringArrayA(pszForwarders); goto cleanup; }
static DWORD VmDnsCacheLoadInitialData( PVMDNS_CACHE_CONTEXT pContext ) { DWORD dwError = 0; PSTR *ppszZones = NULL; DWORD dwZoneCount = 0; DWORD i = 0; PVMDNS_ZONE_OBJECT pZoneObject = NULL; PVMDNS_RECORD_LIST pList = NULL; PSTR *ppszForwarders = NULL; PVMDNS_PROPERTY_LIST pPropertyList = NULL; DWORD dwForwarderCount = 0; VmDnsLockWrite(pContext->pLock); dwError = VmDnsStoreInitialize(); BAIL_ON_VMDNS_ERROR(dwError); dwError = VmDnsStoreListZones(&ppszZones, &dwZoneCount); for (i = 0; i < dwZoneCount; ++i) { VmDnsRecordListRelease(pList); pList = NULL; dwError = VmDnsStoreGetRecords(ppszZones[i], ppszZones[i], &pList); BAIL_ON_VMDNS_ERROR_IF(dwError && dwError != ERROR_NOT_FOUND) dwError = VmDnsStoreGetProperties(ppszZones[i], &pPropertyList); BAIL_ON_VMDNS_ERROR_IF(dwError && dwError != ERROR_NOT_FOUND) dwError = VmDnsZoneCreateFromRecordList(ppszZones[i], pList, pPropertyList, &pZoneObject); BAIL_ON_VMDNS_ERROR(dwError); if (pPropertyList) { VmDnsPropertyListRelease(pPropertyList); pPropertyList = NULL; } dwError = VmDnsZoneListAddZone(pContext->pZoneList, pZoneObject); BAIL_ON_VMDNS_ERROR(dwError); dwError = VmDnsStoreGetForwarders( ppszZones[i], &dwForwarderCount, &ppszForwarders); BAIL_ON_VMDNS_ERROR_IF(dwError && dwError != ERROR_NO_DATA); dwError = 0; if (dwForwarderCount > 0 && *ppszForwarders) { dwError = VmDnsSetForwarders( pZoneObject->pForwarderContext, ppszZones[i], dwForwarderCount, ppszForwarders); BAIL_ON_VMDNS_ERROR(dwError); VmDnsFreeStringCountedArrayA(ppszForwarders, dwForwarderCount); ppszForwarders = NULL; dwForwarderCount = 0; } } dwError = VmDnsStoreGetForwarders( NULL, &dwForwarderCount, &ppszForwarders); BAIL_ON_VMDNS_ERROR_IF(dwError && dwError != ERROR_NO_DATA); dwError = 0; if (dwForwarderCount > 0 && *ppszForwarders) { dwError = VmDnsSetForwarders( gpSrvContext->pForwarderContext, NULL, dwForwarderCount, ppszForwarders); BAIL_ON_VMDNS_ERROR(dwError); } cleanup: VmDnsFreeStringArrayA(ppszZones); VmDnsUnlockWrite(pContext->pLock); VmDnsRecordListRelease(pList); VmDnsPropertyListRelease(pPropertyList); VmDnsZoneObjectRelease(pZoneObject); if (ppszForwarders) { VmDnsFreeStringCountedArrayA(ppszForwarders, dwForwarderCount); } return dwError; error: goto cleanup; }