/* * Qsort comparison function for char** data type */ int VmDnsQsortPPCHARCmp( const void* ppStr1, const void* ppStr2 ) { if ((ppStr1 == NULL || *(char * const *)ppStr1 == NULL) && (ppStr2 == NULL || *(char * const *)ppStr2 == NULL)) { return 0; } if (ppStr1 == NULL || *(char * const *)ppStr1 == NULL) { return -1; } if (ppStr2 == NULL || *(char * const *)ppStr2 == NULL) { return 1; } return VmDnsStringCompareA(* (char * const *) ppStr1, * (char * const *) ppStr2, TRUE); }
DWORD VmDnsParseRecordType( PSTR pszRecordType, VMDNS_RR_TYPE* pType ) { DWORD idx = 0; DWORD dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMDNS_INVALID_POINTER(pszRecordType, dwError); BAIL_ON_VMDNS_INVALID_POINTER(pType, dwError); for (; idx < gRecordTypeMapSize; ++idx) { if (!VmDnsStringCompareA(pszRecordType, gRecordTypeMap[idx].pszName, FALSE)) { *pType = gRecordTypeMap[idx].type; dwError = ERROR_SUCCESS; break; } } cleanup: return dwError; error: goto cleanup; }
BOOLEAN VmDnsCompareRecordCommon( PVMDNS_RECORD pRecord1, PVMDNS_RECORD pRecord2 ) { BOOLEAN result = TRUE; if (!pRecord1 && !pRecord2) { result = TRUE; } else if (!pRecord1 || !pRecord2) { result = FALSE; } else if (pRecord1->dwType != pRecord2->dwType) { result = FALSE; } else if (pRecord1->iClass != pRecord2->iClass) { result = FALSE; } else if (pRecord1->dwTtl != pRecord2->dwTtl) { result = FALSE; } else if (VmDnsStringCompareA(pRecord1->pszName, pRecord2->pszName, TRUE)) { result = FALSE; } return result; }
BOOLEAN VmDnsMatchSrvRecord( PVMDNS_RECORD pRecord, PVMDNS_RECORD pTemplate ) { return VmDnsMatchRecordCommon(pRecord, pTemplate) && VmDnsStringCompareA(pRecord->Data.SRV.pNameTarget, pTemplate->Data.SRV.pNameTarget, FALSE) == 0; }
BOOLEAN VmDnsComparePtrRecord( PVMDNS_RECORD pRecord1, PVMDNS_RECORD pRecord2 ) { return VmDnsCompareRecordCommon(pRecord1, pRecord2) && VmDnsStringCompareA(pRecord1->Data.PTR.pNameHost, pRecord2->Data.PTR.pNameHost, FALSE) == 0; }
BOOLEAN VmDnsCompareSrvRecord( PVMDNS_RECORD pRecord1, PVMDNS_RECORD pRecord2 ) { return VmDnsCompareRecordCommon(pRecord1, pRecord2) && VmDnsStringCompareA(pRecord1->Data.SRV.pNameTarget, pRecord2->Data.SRV.pNameTarget, FALSE) == 0 && pRecord1->Data.SRV.wPort == pRecord2->Data.SRV.wPort && pRecord1->Data.SRV.wPriority == pRecord2->Data.SRV.wPriority && pRecord1->Data.SRV.wWeight == pRecord2->Data.SRV.wWeight; }
DWORD VmDnsCacheEvictEntryProc( PVMDNS_NAME_ENTRY pNameEntry, PVMDNS_ZONE_OBJECT pZoneObject ) { //assumes locks for cache and hashmap are already held DWORD dwError = 0; //Remove if not SOA if (VmDnsStringCompareA( pZoneObject->pszName, pNameEntry->pszName, FALSE ) != 0) { dwError = VmDnsZoneRemoveNameEntry( pZoneObject, pNameEntry ); BAIL_ON_VMDNS_ERROR(dwError); VmDnsLog( VMDNS_LOG_LEVEL_DEBUG, "Purged (%s) from Zone (%s) Cache", pNameEntry->pszName, pZoneObject->pszName ); } else { dwError = ERROR_INVALID_PARAMETER; } cleanup: return dwError; error: goto cleanup; }
DWORD VmDnsParseServiceProtocol( PSTR pszServiceType, VMDNS_SERVICE_PROTOCOL* pProtocol, PSTR* ppszName ) { DWORD idx = 0; DWORD dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMDNS_INVALID_POINTER(pszServiceType, dwError); for (; idx < gProtocolNameMapSize; ++idx) { if (!VmDnsStringCompareA(pszServiceType, gProtocolNameMap[idx].pszUserFriendlyName, FALSE)) { dwError = ERROR_SUCCESS; if (pProtocol) { *pProtocol = gProtocolNameMap[idx].protocol; } if (ppszName) { dwError = VmDnsAllocateStringA(gProtocolNameMap[idx].pszName, ppszName); } break; } } cleanup: return dwError; error: goto cleanup; }
static int VmDnsForwarderLookup( PVMDNS_FORWARDER_CONTEXT pForwarder, PCSTR pszForwardHost ) { int index = -1; DWORD i = 0; for (i = 0; i < pForwarder->dwCount; ++i) { int match = VmDnsStringCompareA( pForwarder->pForwarderEntries[i]->pszForwarder, pszForwardHost, FALSE); if (match == 0) { index = i; break; } } return index; }
static BOOL VmDnsIsMemberOf( PSTR* ppszMemberships, DWORD dwMemberships, PCSTR pszGroupName ) { BOOL bRetVal = FALSE; int nCmpRet = 0; DWORD i = 0; for(i = 0; i < dwMemberships; ++i) { nCmpRet = VmDnsStringCompareA(ppszMemberships[i], pszGroupName, FALSE); if (nCmpRet == 0) { bRetVal = TRUE; break; } } return bRetVal; }
DWORD VmDnsCachePurgeRecord( PVMDNS_ZONE_OBJECT pZoneObject, PCSTR pszRecord, DWORD dwCachePurgeEvent ) { PVMDNS_RECORD_LIST pList = NULL; DWORD dwError = 0; if (VmDnsStringCompareA(pZoneObject->pszName, pszRecord, FALSE) == 0) { //update SOA record dwError = VmDnsStoreGetRecords( pZoneObject->pszName, pZoneObject->pszName, &pList ); BAIL_ON_VMDNS_ERROR(dwError); dwError = VmDnsZoneUpdateRecords( pZoneObject, pZoneObject->pszName, pList ); BAIL_ON_VMDNS_ERROR(dwError); VmDnsLog( VMDNS_LOG_LEVEL_DEBUG, "Refreshed (%s) in Cache", pZoneObject->pszName ); } else { dwError = VmDnsZonePurgeRecords(pZoneObject, pszRecord); BAIL_ON_VMDNS_ERROR_IF(dwError && dwError != ERROR_NOT_FOUND) if (dwError == ERROR_NOT_FOUND) { VmDnsLog( VMDNS_LOG_LEVEL_DEBUG, "Record (%s) not found in Cache", pszRecord ); dwError = 0; } else { if (dwCachePurgeEvent == CACHE_PURGE_MODIFICATION) { VmMetricsCounterIncrement(gVmDnsCounterMetrics[CACHE_MODIFY_PURGE_COUNT]); } else if (dwCachePurgeEvent == CACHE_PURGE_REPLICATION) { VmMetricsCounterIncrement(gVmDnsCounterMetrics[CACHE_NOTIFY_PURGE_COUNT]); } VmDnsLog( VMDNS_LOG_LEVEL_DEBUG, "Succesfully Purged (%s) from Cache", pszRecord ); } } cleanup: if (pList) { VmDnsRecordListRelease(pList); } return dwError; error: goto cleanup; }
DWORD VmDnsParseArgs( int argc, char* argv[], int* pLoggingLevel, PCSTR* ppszLogFileName, int* pLdapPort, PBOOLEAN pbEnableSysLog, PBOOLEAN pbConsoleMode ) { DWORD dwError = ERROR_SUCCESS; int i = 1; // first arg is the <name of exe>.exe while( i < argc ) { if( VmDnsIsCmdLineOption( argv[i] ) != FALSE ) { if ( VmDnsStringCompareA( VMDNS_OPTION_LOGGING_LEVEL, argv[i], TRUE ) == 0 ) { dwError = VmDnsGetCmdLineIntOption( argc, argv, &i, pLoggingLevel ); BAIL_ON_VMDNS_ERROR(dwError); } else if ( VmDnsStringCompareA( VMDNS_OPTION_LOG_FILE_NAME, argv[i], TRUE ) == 0 ) { VmDnsGetCmdLineOption( argc, argv, &i, ppszLogFileName ); } else if ( VmDnsStringCompareA( VMDNS_OPTION_PORT, argv[i], TRUE ) == 0 ) { dwError = VmDnsGetCmdLineIntOption( argc, argv, &i, pLdapPort ); BAIL_ON_VMDNS_ERROR(dwError); } else if ( VmDnsStringCompareA( VMDNS_OPTION_ENABLE_SYSLOG, argv[i], TRUE ) == 0 ) { if ( pbEnableSysLog != NULL ) { *pbEnableSysLog = TRUE; } } else if (VmDnsStringCompareA( VMDNS_OPTION_CONSOLE_MODE, argv[i], TRUE) == 0) { if (pbConsoleMode != NULL) { *pbConsoleMode = TRUE; } } else { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMDNS_ERROR(dwError); } } i++; } // while error: return dwError; }