Beispiel #1
0
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);
}
Beispiel #2
0
VMDNS_API
VOID
VmDnsFreeZoneInfo(
    PVMDNS_ZONE_INFO        pZoneInfo
    )
{
    if (pZoneInfo)
    {
        VmDnsFreeStringA(pZoneInfo->pszName);
        VmDnsFreeStringA(pZoneInfo->pszPrimaryDnsSrvName);
        VmDnsFreeStringA(pZoneInfo->pszRName);
    }
}
Beispiel #3
0
VMDNS_API
VOID
VmDnsFreeForwarders(
    PVMDNS_FORWARDERS       pForwarder
    )
{
    DWORD idx = 0;
    if (pForwarder)
    {
        for (; idx < pForwarder->dwCount; ++idx)
        {
            VmDnsFreeStringA(pForwarder->ppszName[idx]);
        }
        VmDnsFreeMemory(pForwarder);
    }
}
Beispiel #4
0
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;
}