コード例 #1
0
DWORD
VmDnsDeleteForwarder(
    PVMDNS_FORWARDER_CONTEXT    pForwarder,
    PCSTR                       pszForwarder
    )
{
    DWORD dwError = 0;
    DWORD index = 0;
    BOOL bLocked = FALSE;
    PSTR* ppszForwarders = NULL;
    DWORD dwCount = 0;

    BAIL_ON_VMDNS_INVALID_POINTER(pForwarder, dwError);
    BAIL_ON_VMDNS_INVALID_POINTER(pszForwarder, dwError);

    VMDNS_LOCKWRITE(pForwarder->pLock);
    bLocked = TRUE;

    index = VmDnsForwarderLookup(
                            pForwarder,
                            pszForwarder);
    if (index != -1)
    {
        dwError = VmDnsForwarderRemoveAt(
                            pForwarder,
                            index);
        BAIL_ON_VMDNS_ERROR(dwError);

        dwError = VmDnsGetForwarders_inlock(
                            pForwarder,
                            &ppszForwarders,
                            &dwCount);
        BAIL_ON_VMDNS_ERROR(dwError);

        dwError = VmDnsStoreSaveForwarders(
                            pForwarder->dwCount,
                            ppszForwarders);
        BAIL_ON_VMDNS_ERROR(dwError);
    }
    else
    {
        dwError = ERROR_NOT_FOUND;
        BAIL_ON_VMDNS_ERROR(dwError);
    }

cleanup:

    if (ppszForwarders)
    {
        VmDnsFreeStringCountedArrayA(ppszForwarders, dwCount);
    }

    if (bLocked)
    {
        VMDNS_UNLOCKWRITE(pForwarder->pLock);
    }

    return dwError;

error:

    goto cleanup;
}
コード例 #2
0
DWORD
VmDnsAddForwarder(
    PVMDNS_FORWARDER_CONTEXT    pForwarder,
    PCSTR                       pszForwarder
    )
{
    DWORD dwError = 0;
    BOOL bLocked = FALSE;
    PSTR* ppszForwarders = NULL;
    DWORD dwCount = 0;

    BAIL_ON_VMDNS_INVALID_POINTER(pForwarder, dwError);
    BAIL_ON_VMDNS_INVALID_POINTER(pszForwarder, dwError);

    if (!VmDnsValidateForwarder(pszForwarder))
    {
        dwError = ERROR_INVALID_PARAMETER;
        BAIL_ON_VMDNS_ERROR(dwError);
    }

    VMDNS_LOCKWRITE(pForwarder->pLock);
    bLocked = TRUE;

    int index = VmDnsForwarderLookup(
                        pForwarder,
                        pszForwarder);
    if (index < 0)
    {
        dwError = VmDnsForwarderAppend(
                        pForwarder,
                        pszForwarder);
        BAIL_ON_VMDNS_ERROR(dwError);

        VMDNS_UNLOCKWRITE(pForwarder->pLock);
        bLocked = FALSE;

        dwError = VmDnsGetForwarders_inlock(
                        pForwarder,
                        &ppszForwarders,
                        &dwCount);
        BAIL_ON_VMDNS_ERROR(dwError);

        dwError = VmDnsStoreSaveForwarders(
                        pForwarder->dwCount,
                        ppszForwarders);
        BAIL_ON_VMDNS_ERROR(dwError);
    }
    else
    {
        dwError = ERROR_ALREADY_EXISTS;
        BAIL_ON_VMDNS_ERROR(dwError);
    }

cleanup:

    if (ppszForwarders)
    {
        VmDnsFreeStringCountedArrayA(ppszForwarders, dwCount);
    }

    if (bLocked)
    {
        VMDNS_UNLOCKWRITE(pForwarder->pLock);
    }

    return dwError;

error:

    goto cleanup;
}
コード例 #3
0
ファイル: cache.c プロジェクト: vmware/lightwave
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;
}
コード例 #4
0
ファイル: client.c プロジェクト: vmware/lightwave
static
DWORD
_GetForwarders(
    PVMDNS_SERVER_CONTEXT   pServerContext,
    PCSTR                   pszZone,
    PVMDNS_FORWARDERS*      ppForwarders
    )
{
    DWORD dwError = 0;
    PVMDNS_FORWARDERS pDnsForwarders = NULL;
    PVMDNS_FORWARDERS pDnsForwardersOutput = NULL;
    PSTR* ppszForwarders = NULL;
    DWORD dwCount = 0;

    dwError = VmDnsValidateContext(pServerContext);
    BAIL_ON_VMDNS_ERROR(dwError);

    BAIL_ON_VMDNS_INVALID_POINTER(ppForwarders, dwError);

    DCETHREAD_TRY
    {
        if (pszZone)
        {
            dwError = VmDnsRpcGetZoneForwarders(
                                pServerContext->hBinding,
                                (PDNS_STRING)pszZone,
                                &pDnsForwarders);
        }
        else
        {
            dwError = VmDnsRpcGetForwarders(
                                pServerContext->hBinding,
                                &pDnsForwarders);
        }
    }
    DCETHREAD_CATCH_ALL(THIS_CATCH)
    {
        dwError = VmDnsRpcGetErrorCode(THIS_CATCH);
    }
    DCETHREAD_ENDTRY;
    BAIL_ON_VMDNS_ERROR(dwError);

    if (pDnsForwarders)
    {
        DWORD i = 0;
        PSTR szTemp = NULL;

        if (pDnsForwarders->dwCount > 0)
        {
            dwError = VmDnsAllocateMemory(
                                    pDnsForwarders->dwCount * sizeof(PSTR),
                                    (PVOID*)&ppszForwarders);
            BAIL_ON_VMDNS_ERROR(dwError);

            for (i = 0; i < pDnsForwarders->dwCount; ++i)
            {
                dwError = VmDnsAllocateStringA(
                                    pDnsForwarders->ppszName[i],
                                    &szTemp
                                    );
                BAIL_ON_VMDNS_ERROR(dwError);

                ppszForwarders[i] = szTemp;
                ++dwCount;
            }
        }

        dwError = VmDnsAllocateMemory(
                                sizeof(VMDNS_FORWARDERS),
                                (PVOID*)&pDnsForwardersOutput);
        BAIL_ON_VMDNS_ERROR(dwError);

        pDnsForwardersOutput->dwCount = pDnsForwarders->dwCount;
        pDnsForwardersOutput->ppszName = ppszForwarders;
    }

    *ppForwarders = pDnsForwardersOutput;

cleanup:

    if (pDnsForwarders)
    {
        VmDnsRpcFreeForwarders(pDnsForwarders);
    }

    return dwError;

error:

    if (ppszForwarders)
    {
        VmDnsFreeStringCountedArrayA(ppszForwarders, dwCount);
    }

    if (pDnsForwardersOutput)
    {
        VMDNS_SAFE_FREE_MEMORY(pDnsForwardersOutput);
    }

    goto cleanup;
}
コード例 #5
0
ファイル: cache.c プロジェクト: vmware/lightwave
DWORD
VmDnsCacheSyncZoneProc(
    PVOID pData,
    PCSTR pszZone
    )
{
    PVMDNS_CACHE_CONTEXT pCacheContext = (PVMDNS_CACHE_CONTEXT) pData;
    PVMDNS_ZONE_OBJECT pZoneObject = NULL;
    DWORD dwError = 0;
    DWORD dwForwarderCount = 0;
    PSTR* ppszForwarders = NULL;

    dwError = VmDnsCacheFindZone(
                        pCacheContext,
                        pszZone,
                        &pZoneObject
                        );
    BAIL_ON_VMDNS_ERROR_IF(dwError && dwError != ERROR_NOT_FOUND);

    if (dwError == ERROR_NOT_FOUND)
    {
        dwError = VmDnsCacheLoadZoneFromStore(pCacheContext, pszZone);
        BAIL_ON_VMDNS_ERROR(dwError);

        VmDnsLog(
            VMDNS_LOG_LEVEL_DEBUG,
            "Added Zone %s to Cache",
            pszZone
            );
    }
    else if (pZoneObject && pZoneObject->zoneId == VMDNS_ZONE_ID_FORWARDER)
    {
        dwError = VmDnsStoreGetForwarders(
                    pszZone,
                    &dwForwarderCount,
                    &ppszForwarders);
        BAIL_ON_VMDNS_ERROR_IF(dwError && dwError != ERROR_NO_DATA);

        dwError = 0;

        if (dwForwarderCount > 0 && *ppszForwarders)
        {
            dwError = VmDnsSetForwarders(
                            pZoneObject->pForwarderContext,
                            pszZone,
                            dwForwarderCount,
                            ppszForwarders);
            BAIL_ON_VMDNS_ERROR(dwError);

            VmDnsFreeStringCountedArrayA(ppszForwarders, dwForwarderCount);
            ppszForwarders = NULL;
            dwForwarderCount = 0;
        }
    }

cleanup:
    VmDnsZoneObjectRelease(pZoneObject);

    if (ppszForwarders)
    {
        VmDnsFreeStringCountedArrayA(ppszForwarders, dwForwarderCount);
    }

    return dwError;

error:
    goto cleanup;
}