VOID VmDnsCliFreeContext( PVM_DNS_CLI_CONTEXT pContext ) { if (pContext->pszZone) { VmDnsFreeStringA(pContext->pszZone); } if (pContext->pszNSHost) { VmDnsFreeStringA(pContext->pszNSHost); } if (pContext->pszNSIp) { VmDnsFreeStringA(pContext->pszNSIp); } if (pContext->pszMboxDomain) { VmDnsFreeStringA(pContext->pszMboxDomain); } if (pContext->pszForwarder) { VmDnsFreeStringA(pContext->pszForwarder); } if (pContext->pServerContext) { VmDnsCloseServer(pContext->pServerContext); } VmDnsClearRecord(&pContext->record); VmDnsFreeMemory(pContext); }
VMDNS_API VOID VmDnsFreeZoneInfo( PVMDNS_ZONE_INFO pZoneInfo ) { if (pZoneInfo) { VmDnsFreeStringA(pZoneInfo->pszName); VmDnsFreeStringA(pZoneInfo->pszPrimaryDnsSrvName); VmDnsFreeStringA(pZoneInfo->pszRName); } }
VMDNS_API VOID VmDnsFreeForwarders( PVMDNS_FORWARDERS pForwarder ) { DWORD idx = 0; if (pForwarder) { for (; idx < pForwarder->dwCount; ++idx) { VmDnsFreeStringA(pForwarder->ppszName[idx]); } VmDnsFreeMemory(pForwarder); } }
static DWORD VmDnsCliCreatePrimaryZone( PVM_DNS_CLI_CONTEXT pContext ) { DWORD dwError = 0; PSTR pszMboxDomain = NULL; VMDNS_ZONE_INFO zoneInfo = { 0 }; VMDNS_RECORD nsRecord = {0}; VMDNS_RECORD addrRecord = {0}; PSTR pszTargetFQDN = NULL; int ret = 0; int af = AF_INET; unsigned char buf[sizeof(struct in6_addr)]; if (IsNullOrEmptyString(pContext->pszZone)) { fprintf(stderr, "Error: DNS Zone is not specified\n"); dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMDNS_ERROR(dwError); } if (IsNullOrEmptyString(pContext->pszNSHost) || VmDnsCheckIfIPV4AddressA(pContext->pszNSHost) || VmDnsCheckIfIPV6AddressA(pContext->pszNSHost)) { fprintf(stderr, "Error: Primary Nameserver host is not specified or the format is invalid\n"); dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMDNS_ERROR(dwError); } if (pContext->dwZoneType == VMDNS_ZONE_TYPE_FORWARD && IsNullOrEmptyString(pContext->pszNSIp)) { fprintf(stderr, "Error: Primary Nameserver IP Address is not specified\n"); dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMDNS_ERROR(dwError); } if (IsNullOrEmptyString(pContext->pszMboxDomain)) { dwError = VmDnsAllocateStringA("hostmaster", &pszMboxDomain); BAIL_ON_VMDNS_ERROR(dwError); } dwError = VmDnsMakeFQDN(pContext->pszNSHost, pContext->pszZone, &pszTargetFQDN); BAIL_ON_VMDNS_ERROR(dwError); zoneInfo.pszName = pContext->pszZone; zoneInfo.pszPrimaryDnsSrvName = pszTargetFQDN; zoneInfo.pszRName = pszMboxDomain ? pszMboxDomain : pContext->pszMboxDomain; zoneInfo.serial = 1; zoneInfo.refreshInterval = VMDNS_DEFAULT_REFRESH_INTERVAL; zoneInfo.retryInterval = VMDNS_DEFAULT_RETRY_INTERVAL; zoneInfo.expire = VMDNS_DEFAULT_EXPIRE; zoneInfo.minimum = VMDNS_DEFAULT_TTL; zoneInfo.dwFlags = 0; zoneInfo.dwZoneType = pContext->dwZoneType; dwError = VmDnsCreateZoneA(pContext->pServerContext, &zoneInfo); BAIL_ON_VMDNS_ERROR(dwError); if (!IsNullOrEmptyString(pContext->pszNSHost)) { nsRecord.pszName = pContext->pszZone; nsRecord.Data.NS.pNameHost = pszTargetFQDN; nsRecord.iClass = VMDNS_CLASS_IN; nsRecord.pszName = pContext->pszZone; nsRecord.dwType = VMDNS_RR_TYPE_NS; nsRecord.dwTtl = pContext->record.dwTtl; dwError = VmDnsAddRecordA( pContext->pServerContext, pContext->pszZone, &nsRecord); BAIL_ON_VMDNS_ERROR(dwError); } if (!IsNullOrEmptyString(pContext->pszNSHost) && !IsNullOrEmptyString(pContext->pszNSIp) && pContext->dwZoneType == VMDNS_ZONE_TYPE_FORWARD) { addrRecord.iClass = VMDNS_CLASS_IN; addrRecord.pszName = pszTargetFQDN; addrRecord.dwType = VMDNS_RR_TYPE_A; addrRecord.dwTtl = pContext->record.dwTtl; if (VmDnsStringChrA(pContext->pszNSIp, ':')) { af = AF_INET6; } ret = inet_pton(af, pContext->pszNSIp, buf); if (ret <= 0) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMDNS_ERROR(dwError); } if (af == AF_INET) { addrRecord.Data.A.IpAddress = (VMDNS_IP4_ADDRESS)ntohl(((struct in_addr *)buf)->s_addr); } else if (af == AF_INET6) { addrRecord.dwType = VMDNS_RR_TYPE_AAAA; dwError = VmDnsCopyMemory( addrRecord.Data.AAAA.Ip6Address.IP6Byte, sizeof(addrRecord.Data.AAAA.Ip6Address.IP6Byte), #ifdef _WIN32 ((struct in6_addr*)buf)->u.Byte, #else ((struct in6_addr*)buf)->s6_addr, #endif sizeof(addrRecord.Data.AAAA.Ip6Address.IP6Byte)); BAIL_ON_VMDNS_ERROR(dwError); } else { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMDNS_ERROR(dwError); } dwError = VmDnsAddRecordA( pContext->pServerContext, pContext->pszZone, &addrRecord); BAIL_ON_VMDNS_ERROR(dwError); } if (!IsNullOrEmptyString(pContext->pszNSHost) && !IsNullOrEmptyString(pContext->pszNSIp) && pContext->dwZoneType == VMDNS_ZONE_TYPE_REVERSE) { addrRecord.iClass = VMDNS_CLASS_IN; addrRecord.dwType = VMDNS_RR_TYPE_PTR; addrRecord.dwTtl = VMDNS_DEFAULT_TTL; addrRecord.Data.PTR.pNameHost = pszTargetFQDN; dwError = VmDnsGeneratePtrNameFromIp(pContext->pszNSIp,&addrRecord.pszName); BAIL_ON_VMDNS_ERROR(dwError); dwError = VmDnsAddRecordA( pContext->pServerContext, pContext->pszZone, &addrRecord ); BAIL_ON_VMDNS_ERROR(dwError); } cleanup: if (pszMboxDomain) { VmDnsFreeStringA(pszMboxDomain); } return dwError; error: goto cleanup; }