DWORD VmDnsDeleteForwarder( PVMDNS_FORWARDER_CONTEXT pForwarder, PCSTR pszForwarder ) { DWORD dwError = 0; DWORD index = 0; BOOL bLocked = FALSE; PSTR* ppszForwarders = NULL; DWORD dwCount = 0; BAIL_ON_VMDNS_INVALID_POINTER(pForwarder, dwError); BAIL_ON_VMDNS_INVALID_POINTER(pszForwarder, dwError); VMDNS_LOCKWRITE(pForwarder->pLock); bLocked = TRUE; index = VmDnsForwarderLookup( pForwarder, pszForwarder); if (index != -1) { dwError = VmDnsForwarderRemoveAt( pForwarder, index); BAIL_ON_VMDNS_ERROR(dwError); dwError = VmDnsGetForwarders_inlock( pForwarder, &ppszForwarders, &dwCount); BAIL_ON_VMDNS_ERROR(dwError); dwError = VmDnsStoreSaveForwarders( pForwarder->dwCount, ppszForwarders); BAIL_ON_VMDNS_ERROR(dwError); } else { dwError = ERROR_NOT_FOUND; BAIL_ON_VMDNS_ERROR(dwError); } cleanup: if (ppszForwarders) { VmDnsFreeStringCountedArrayA(ppszForwarders, dwCount); } if (bLocked) { VMDNS_UNLOCKWRITE(pForwarder->pLock); } return dwError; error: goto cleanup; }
DWORD VmDnsAddForwarder( PVMDNS_FORWARDER_CONTEXT pForwarder, PCSTR pszForwarder ) { DWORD dwError = 0; BOOL bLocked = FALSE; PSTR* ppszForwarders = NULL; DWORD dwCount = 0; BAIL_ON_VMDNS_INVALID_POINTER(pForwarder, dwError); BAIL_ON_VMDNS_INVALID_POINTER(pszForwarder, dwError); if (!VmDnsValidateForwarder(pszForwarder)) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMDNS_ERROR(dwError); } VMDNS_LOCKWRITE(pForwarder->pLock); bLocked = TRUE; int index = VmDnsForwarderLookup( pForwarder, pszForwarder); if (index < 0) { dwError = VmDnsForwarderAppend( pForwarder, pszForwarder); BAIL_ON_VMDNS_ERROR(dwError); VMDNS_UNLOCKWRITE(pForwarder->pLock); bLocked = FALSE; dwError = VmDnsGetForwarders_inlock( pForwarder, &ppszForwarders, &dwCount); BAIL_ON_VMDNS_ERROR(dwError); dwError = VmDnsStoreSaveForwarders( pForwarder->dwCount, ppszForwarders); BAIL_ON_VMDNS_ERROR(dwError); } else { dwError = ERROR_ALREADY_EXISTS; BAIL_ON_VMDNS_ERROR(dwError); } cleanup: if (ppszForwarders) { VmDnsFreeStringCountedArrayA(ppszForwarders, dwCount); } if (bLocked) { VMDNS_UNLOCKWRITE(pForwarder->pLock); } return dwError; error: 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; }
static DWORD _GetForwarders( PVMDNS_SERVER_CONTEXT pServerContext, PCSTR pszZone, PVMDNS_FORWARDERS* ppForwarders ) { DWORD dwError = 0; PVMDNS_FORWARDERS pDnsForwarders = NULL; PVMDNS_FORWARDERS pDnsForwardersOutput = NULL; PSTR* ppszForwarders = NULL; DWORD dwCount = 0; dwError = VmDnsValidateContext(pServerContext); BAIL_ON_VMDNS_ERROR(dwError); BAIL_ON_VMDNS_INVALID_POINTER(ppForwarders, dwError); DCETHREAD_TRY { if (pszZone) { dwError = VmDnsRpcGetZoneForwarders( pServerContext->hBinding, (PDNS_STRING)pszZone, &pDnsForwarders); } else { dwError = VmDnsRpcGetForwarders( pServerContext->hBinding, &pDnsForwarders); } } DCETHREAD_CATCH_ALL(THIS_CATCH) { dwError = VmDnsRpcGetErrorCode(THIS_CATCH); } DCETHREAD_ENDTRY; BAIL_ON_VMDNS_ERROR(dwError); if (pDnsForwarders) { DWORD i = 0; PSTR szTemp = NULL; if (pDnsForwarders->dwCount > 0) { dwError = VmDnsAllocateMemory( pDnsForwarders->dwCount * sizeof(PSTR), (PVOID*)&ppszForwarders); BAIL_ON_VMDNS_ERROR(dwError); for (i = 0; i < pDnsForwarders->dwCount; ++i) { dwError = VmDnsAllocateStringA( pDnsForwarders->ppszName[i], &szTemp ); BAIL_ON_VMDNS_ERROR(dwError); ppszForwarders[i] = szTemp; ++dwCount; } } dwError = VmDnsAllocateMemory( sizeof(VMDNS_FORWARDERS), (PVOID*)&pDnsForwardersOutput); BAIL_ON_VMDNS_ERROR(dwError); pDnsForwardersOutput->dwCount = pDnsForwarders->dwCount; pDnsForwardersOutput->ppszName = ppszForwarders; } *ppForwarders = pDnsForwardersOutput; cleanup: if (pDnsForwarders) { VmDnsRpcFreeForwarders(pDnsForwarders); } return dwError; error: if (ppszForwarders) { VmDnsFreeStringCountedArrayA(ppszForwarders, dwCount); } if (pDnsForwardersOutput) { VMDNS_SAFE_FREE_MEMORY(pDnsForwardersOutput); } goto cleanup; }
DWORD VmDnsCacheSyncZoneProc( PVOID pData, PCSTR pszZone ) { PVMDNS_CACHE_CONTEXT pCacheContext = (PVMDNS_CACHE_CONTEXT) pData; PVMDNS_ZONE_OBJECT pZoneObject = NULL; DWORD dwError = 0; DWORD dwForwarderCount = 0; PSTR* ppszForwarders = NULL; dwError = VmDnsCacheFindZone( pCacheContext, pszZone, &pZoneObject ); BAIL_ON_VMDNS_ERROR_IF(dwError && dwError != ERROR_NOT_FOUND); if (dwError == ERROR_NOT_FOUND) { dwError = VmDnsCacheLoadZoneFromStore(pCacheContext, pszZone); BAIL_ON_VMDNS_ERROR(dwError); VmDnsLog( VMDNS_LOG_LEVEL_DEBUG, "Added Zone %s to Cache", pszZone ); } else if (pZoneObject && pZoneObject->zoneId == VMDNS_ZONE_ID_FORWARDER) { dwError = VmDnsStoreGetForwarders( pszZone, &dwForwarderCount, &ppszForwarders); BAIL_ON_VMDNS_ERROR_IF(dwError && dwError != ERROR_NO_DATA); dwError = 0; if (dwForwarderCount > 0 && *ppszForwarders) { dwError = VmDnsSetForwarders( pZoneObject->pForwarderContext, pszZone, dwForwarderCount, ppszForwarders); BAIL_ON_VMDNS_ERROR(dwError); VmDnsFreeStringCountedArrayA(ppszForwarders, dwForwarderCount); ppszForwarders = NULL; dwForwarderCount = 0; } } cleanup: VmDnsZoneObjectRelease(pZoneObject); if (ppszForwarders) { VmDnsFreeStringCountedArrayA(ppszForwarders, dwForwarderCount); } return dwError; error: goto cleanup; }