Example #1
0
DWORD
VmDnsGetForwarders_inlock(
    PVMDNS_FORWARDER_CONTEXT    pForwarder,
    PSTR**                      pppszForwarders,
    PDWORD                      pdwCount
    )
{
    DWORD dwError = 0;
    PSTR* pszForwarders = NULL;
    DWORD dwCount = 0, i = 0;

    BAIL_ON_VMDNS_INVALID_POINTER(pForwarder, dwError);
    BAIL_ON_VMDNS_INVALID_POINTER(pppszForwarders, dwError);
    BAIL_ON_VMDNS_INVALID_POINTER(pdwCount, dwError);

    dwCount = pForwarder->dwCount;

    dwError = VmDnsAllocateMemory(
                        (dwCount + 1) * sizeof(PSTR),
                        (PVOID*)&pszForwarders);
    BAIL_ON_VMDNS_ERROR(dwError);

    for (; i < dwCount; ++i)
    {
        dwError = VmDnsAllocateStringA(
                            pForwarder->pForwarderEntries[i]->pszForwarder,
                            &pszForwarders[i]);
        BAIL_ON_VMDNS_ERROR(dwError);
    }

    *pdwCount = dwCount;
    *pppszForwarders = pszForwarders;

cleanup:

    return dwError;

error:
    VmDnsFreeStringArrayA(pszForwarders);

    goto cleanup;
}
Example #2
0
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;
}