static DWORD VmDnsCliListRecord( PVM_DNS_CLI_CONTEXT pContext ) { DWORD dwError = 0; PVMDNS_RECORD_ARRAY pRecordArray = NULL; dwError = VmDnsListRecordsA(pContext->pServerContext, pContext->pszZone, &pRecordArray); BAIL_ON_VMDNS_ERROR(dwError); VmDnsCliPrintRecordArray(pRecordArray); cleanup: VmDnsFreeRecordArray(pRecordArray); return dwError; error: goto cleanup; }
static DWORD VmDnsCliQueryRecord( PVM_DNS_CLI_CONTEXT pContext ) { DWORD dwError = 0; PVMDNS_RECORD_ARRAY pRecordArray = NULL; if (IsNullOrEmptyString(pContext->pszZone) || IsNullOrEmptyString(pContext->record.pszName) || pContext->record.dwType == VMDNS_RR_TYPE_NONE) { fprintf( stderr, "Zone, record name and type are required for querying record.\n"); dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMDNS_ERROR(dwError); } dwError = VmDnsQueryRecordsA(pContext->pServerContext, pContext->pszZone, pContext->record.pszName, pContext->record.dwType, 0, // Options - Reserved &pRecordArray); BAIL_ON_VMDNS_ERROR(dwError); VmDnsCliPrintRecordArray(pRecordArray); cleanup: VmDnsFreeRecordArray(pRecordArray); return dwError; error: goto cleanup; }
static DWORD VmDnsCliDelRecord( PVM_DNS_CLI_CONTEXT pContext ) { DWORD dwError = 0; DWORD idx = 0; PVMDNS_RECORD_ARRAY pRecordArray = NULL; BOOL bFound = FALSE; PSTR pszTargetFQDN = NULL; if (pContext->record.dwType == VMDNS_RR_TYPE_SOA) { fprintf(stdout, "SOA record cannot be deleted.\n"); dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMDNS_ERROR(dwError); } dwError = VmDnsCliValidateAndCompleteRecord(pContext); BAIL_ON_VMDNS_ERROR(dwError); if (pContext->record.dwType == VMDNS_RR_TYPE_SRV) { dwError = VmDnsMakeFQDN(pContext->record.Data.SRV.pNameTarget, pContext->pszZone, &pszTargetFQDN); BAIL_ON_VMDNS_ERROR(dwError); if (pszTargetFQDN) { VMDNS_SAFE_FREE_STRINGA(pContext->record.Data.SRV.pNameTarget); pContext->record.Data.SRV.pNameTarget = pszTargetFQDN; pszTargetFQDN = NULL; } } if (pContext->record.dwType == VMDNS_RR_TYPE_NS) { dwError = VmDnsMakeFQDN(pContext->record.Data.NS.pNameHost, pContext->pszZone, &pszTargetFQDN); BAIL_ON_VMDNS_ERROR(dwError); if (pszTargetFQDN) { VMDNS_SAFE_FREE_STRINGA(pContext->record.Data.NS.pNameHost); pContext->record.Data.NS.pNameHost = pszTargetFQDN; pszTargetFQDN = NULL; } DWORD dwNameLen = strlen(pContext->record.pszName); if (pContext->record.pszName[dwNameLen -1] != '.') { VmDnsAllocateStringPrintfA(&pszTargetFQDN, "%s.", pContext->record.pszName); VMDNS_SAFE_FREE_STRINGA(pContext->record.pszName); pContext->record.pszName = pszTargetFQDN; pszTargetFQDN = NULL; } } if (pContext->record.dwType == VMDNS_RR_TYPE_PTR) { dwError = VmDnsMakeFQDN( pContext->record.pszName, pContext->pszZone, &pszTargetFQDN); BAIL_ON_VMDNS_ERROR(dwError); if (pszTargetFQDN) { VMDNS_SAFE_FREE_STRINGA(pContext->record.pszName); pContext->record.pszName = pszTargetFQDN; pszTargetFQDN = NULL; } } else { VmDnsTrimDomainNameSuffix(pContext->record.pszName, pContext->pszZone); dwError = VmDnsMakeFQDN( pContext->record.pszName, pContext->pszZone, &pszTargetFQDN); BAIL_ON_VMDNS_ERROR(dwError); if (pszTargetFQDN) { VMDNS_SAFE_FREE_STRINGA(pContext->record.pszName); pContext->record.pszName = pszTargetFQDN; pszTargetFQDN = NULL; } } dwError = VmDnsQueryRecordsA( pContext->pServerContext, pContext->pszZone, pContext->record.pszName, pContext->record.dwType, 0, &pRecordArray); BAIL_ON_VMDNS_ERROR(dwError); for (; idx < pRecordArray->dwCount; ++idx) { if (VmDnsMatchRecord(&pRecordArray->Records[idx], &pContext->record)) { dwError = VmDnsDeleteRecordA( pContext->pServerContext, pContext->pszZone, &pRecordArray->Records[idx] ); BAIL_ON_VMDNS_ERROR(dwError); bFound = TRUE; } } error: if (!bFound) { fprintf(stderr, "Error: no matching record found.\n"); } VMDNS_SAFE_FREE_STRINGA(pszTargetFQDN); VmDnsFreeRecordArray(pRecordArray); return dwError; }
static DWORD CdcGetDomainControllers( PWSTR** ppszDomainControllers, PDWORD pdwCount ) { DWORD dwError = 0; DWORD dwIndex = 0; PWSTR pwszDomain = NULL; PSTR pszDomain = NULL; PSTR pszDCName = NULL; PWSTR pwszAccount = NULL; PSTR pszAccount = NULL; PWSTR pwszPassword = NULL; PSTR pszPassword = NULL; PWSTR pwszAccountDN = NULL; PSTR pszAccountDN = NULL; PVMDNS_SERVER_CONTEXT pConnection = NULL; PVMDNS_RECORD_ARRAY pRecordArray = NULL; PWSTR* pszDomainControllers = NULL; PCDC_DC_INFO_W pAffinitizedDC = NULL; if (!ppszDomainControllers || !pdwCount) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMAFD_ERROR(dwError); } dwError = VmAfSrvGetMachineAccountInfo( &pwszAccount, &pwszPassword, &pwszAccountDN, NULL ); BAIL_ON_VMAFD_ERROR(dwError); dwError = VmAfdAllocateStringAFromW( pwszAccount, &pszAccount ); BAIL_ON_VMAFD_ERROR(dwError); dwError = VmAfdAllocateStringAFromW( pwszPassword, &pszPassword ); BAIL_ON_VMAFD_ERROR(dwError); dwError = VmAfSrvGetDomainName(&pwszDomain); BAIL_ON_VMAFD_ERROR(dwError); dwError = VmAfdAllocateStringAFromW( pwszDomain, &pszDomain ); BAIL_ON_VMAFD_ERROR(dwError); dwError = CdcSrvGetDCName(pwszDomain,&pAffinitizedDC); BAIL_ON_VMAFD_ERROR(dwError); dwError = VmAfdAllocateStringAFromW( pAffinitizedDC->pszDCName, &pszDCName ); BAIL_ON_VMAFD_ERROR(dwError); dwError = VmDnsOpenServerA( pszDCName, pszAccount, pszDomain, pszPassword, 0, NULL, &pConnection); BAIL_ON_VMAFD_ERROR(dwError); dwError = VmDnsQueryRecordsA( pConnection, pszDomain, "_ldap._tcp", VMDNS_RR_TYPE_SRV, 0, &pRecordArray); BAIL_ON_VMAFD_ERROR(dwError); if (pRecordArray->dwCount) { dwError = VmAfdAllocateMemory( sizeof(PWSTR)*pRecordArray->dwCount, (PVOID *)&pszDomainControllers ); BAIL_ON_VMAFD_ERROR(dwError); } for (; dwIndex < pRecordArray->dwCount; dwIndex++) { dwError = VmAfdAllocateStringWFromA( pRecordArray->Records[dwIndex].Data.SRV.pNameTarget, &pszDomainControllers[dwIndex] ); BAIL_ON_VMAFD_ERROR(dwError); dwError = VmAfdTrimFQDNTrailingDot(pszDomainControllers[dwIndex]); BAIL_ON_VMAFD_ERROR(dwError); } dwIndex = 0; *ppszDomainControllers = pszDomainControllers; *pdwCount = pRecordArray->dwCount; cleanup: VMAFD_SAFE_FREE_MEMORY(pwszDomain); VMAFD_SAFE_FREE_MEMORY(pszDomain); VMAFD_SAFE_FREE_MEMORY(pszDCName); VMAFD_SAFE_FREE_MEMORY(pwszAccount); VMAFD_SAFE_FREE_MEMORY(pszAccount); VMAFD_SAFE_FREE_MEMORY(pwszPassword); VMAFD_SAFE_FREE_MEMORY(pszPassword); VMAFD_SAFE_FREE_MEMORY(pwszAccountDN); VMAFD_SAFE_FREE_MEMORY(pszAccountDN); if (pAffinitizedDC) { VmAfdFreeDomainControllerInfoW(pAffinitizedDC); } if (pRecordArray) { VmDnsFreeRecordArray(pRecordArray); } if (pConnection) { VmDnsCloseServer(pConnection); } return dwError; error: if (ppszDomainControllers) { *ppszDomainControllers = NULL; } if (pszDomainControllers) { VmAfdFreeStringArrayW(pszDomainControllers,pRecordArray->dwCount); } goto cleanup; }