/*
* Copyright (c) Likewise Software. All rights Reserved.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the license, or (at
* your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
* General Public License for more details. You should have received a copy
* of the GNU Lesser General Public License along with this program. If
* not, see .
*
* LIKEWISE SOFTWARE MAKES THIS SOFTWARE AVAILABLE UNDER OTHER LICENSING
* TERMS AS WELL. IF YOU HAVE ENTERED INTO A SEPARATE LICENSE AGREEMENT
* WITH LIKEWISE SOFTWARE, THEN YOU MAY ELECT TO USE THE SOFTWARE UNDER THE
* TERMS OF THAT SOFTWARE LICENSE AGREEMENT INSTEAD OF THE TERMS OF THE GNU
* LESSER GENERAL PUBLIC LICENSE, NOTWITHSTANDING THE ABOVE NOTICE. IF YOU
* HAVE QUESTIONS, OR WISH TO REQUEST A COPY OF THE ALTERNATE LICENSING
* TERMS OFFERED BY LIKEWISE SOFTWARE, PLEASE CONTACT LIKEWISE SOFTWARE AT
* license@likewise.com
*/
/*
* Copyright (C) Likewise Software. All rights reserved.
*
* Module Name:
*
* plugin.c
*
* Abstract:
*
* Likewise Netlogon
*
* Test Plugin
*
* Authors: Danilo Almeida (dalmeida@likewise.com)
*
*/
#include "lwnet-plugin.h"
// For error codes, we currently need lwnet.h. In the future,
// lwnet-plugin.h will pull in error codes directly from lwerror.h
#include "lwnet.h"
#include
#include
static LWNET_PLUGIN_SERVER_ADDRESS gDcList[] = {
{ "a1.b.c", "10.100.100.101" },
{ "a2.b.c", "10.100.100.102" },
{ "a3.b.c", "10.100.100.103" },
{ "a4.b.c", "10.100.100.104" },
};
#define DC_LIST_COUNT (sizeof(gDcList)/sizeof(gDcList[0]))
//
// Prototypes
//
static
VOID
TestPluginFreeDcList(
LW_IN PLWNET_PLUGIN_INTERFACE pInterface,
LW_IN LW_OUT PLWNET_PLUGIN_SERVER_ADDRESS pDcArray,
LW_IN LW_DWORD dwDcCount
);
//
// Implementations
//
static
DWORD
TestPluginAlloc(
OUT PVOID* ppMemory,
IN size_t Size
)
{
DWORD dwError = 0;
PVOID pMemory = NULL;
pMemory = malloc(Size);
if (!pMemory)
{
dwError = LWNET_ERROR_OUT_OF_MEMORY;
}
else
{
memset(pMemory, 0, Size);
}
*ppMemory = pMemory;
return dwError;
}
static
VOID
TestPluginFree(
IN OUT PVOID pMemory
)
{
if (pMemory)
{
free(pMemory);
}
}
static
DWORD
TestPluginStrdup(
OUT PSTR* ppszAllocatedString,
IN PCSTR pszSource
)
{
DWORD dwError = 0;
PSTR pszResult = NULL;
if (pszSource)
{
pszResult = strdup(pszSource);
if (!pszResult)
{
dwError = LWNET_ERROR_OUT_OF_MEMORY;
}
}
*ppszAllocatedString = pszResult;
return dwError;
}
static
VOID
TestPluginCleanup(
IN OUT PLWNET_PLUGIN_INTERFACE pInterface
)
{
TestPluginFree(pInterface);
}
static
DWORD
TestPluginGetDcList(
LW_IN PLWNET_PLUGIN_INTERFACE pInterface,
LW_IN LW_PCSTR pszDnsDomainName,
LW_IN LW_OPTIONAL LW_PCSTR pszSiteName,
LW_IN LW_DWORD dwDsFlags,
LW_OUT PLWNET_PLUGIN_SERVER_ADDRESS* ppDcArray,
LW_OUT LW_PDWORD pdwDcCount
)
{
DWORD dwError = 0;
DWORD i = 0;
PLWNET_PLUGIN_SERVER_ADDRESS pDcArray = NULL;
DWORD dwDcCount = 0;
dwDcCount = DC_LIST_COUNT;
dwError = TestPluginAlloc((PVOID*)&pDcArray, sizeof(pDcArray[0]) * dwDcCount);
if (dwError)
{
goto error;
}
for (i = 0; i < dwDcCount; i++)
{
dwError = TestPluginStrdup(&pDcArray[i].pszDnsName, gDcList[i].pszDnsName);
if (dwError)
{
goto error;
}
dwError = TestPluginStrdup(&pDcArray[i].pszIpAddress, gDcList[i].pszIpAddress);
if (dwError)
{
goto error;
}
}
error:
if (dwError)
{
TestPluginFreeDcList(pInterface, pDcArray, dwDcCount);
pDcArray = NULL;
dwDcCount = 0;
}
*ppDcArray = pDcArray;
*pdwDcCount = dwDcCount;
return dwError;
}
static
VOID
TestPluginFreeDcList(
LW_IN PLWNET_PLUGIN_INTERFACE pInterface,
LW_IN LW_OUT PLWNET_PLUGIN_SERVER_ADDRESS pDcArray,
LW_IN LW_DWORD dwDcCount
)
{
if (pDcArray)
{
DWORD i = 0;
for (i = 0; i < dwDcCount; i++)
{
TestPluginFree(pDcArray[i].pszDnsName);
TestPluginFree(pDcArray[i].pszIpAddress);
}
TestPluginFree(pDcArray);
}
}
DWORD
LWNetPluginGetInterface(
IN DWORD dwVersion,
OUT PLWNET_PLUGIN_INTERFACE* ppInterface
)
{
DWORD dwError = 0;
PLWNET_PLUGIN_INTERFACE pInterface = NULL;
if (dwVersion != LWNET_PLUGIN_VERSION)
{
dwError = LWNET_ERROR_NOT_SUPPORTED;
goto error;
}
dwError = TestPluginAlloc((PVOID*)&pInterface, sizeof(*pInterface));
if (dwError)
{
goto error;
}
pInterface->Cleanup = TestPluginCleanup;
pInterface->GetDcList = TestPluginGetDcList;
pInterface->FreeDcList = TestPluginFreeDcList;
error:
if (dwError)
{
TestPluginCleanup(pInterface);
pInterface = NULL;
}
*ppInterface = pInterface;
return dwError;
}