reactos/dll/win32/dnsapi/context.c
2019-11-17 16:37:13 +01:00

125 lines
3.5 KiB
C

/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries
* FILE: lib/dnsapi/dnsapi/context.c
* PURPOSE: DNSAPI functions built on the ADNS library.
* PROGRAMER: Art Yerkes
* UPDATE HISTORY:
* 12/15/03 -- Created
*/
#include "precomp.h"
#define NDEBUG
#include <debug.h>
/* DnsAcquireContextHandle *************
* Create a context handle that will allow us to open and retrieve queries.
*
* DWORD CredentialsFlags -- TRUE -- Unicode
* FALSE -- Ansi or UTF-8?
*
* PVOID Credentials -- Pointer to a SEC_WINNT_AUTH_IDENTITY
* TODO: Use it.
*
* PHANDLE ContextHandle -- Pointer to a HANDLE that will receive
* our context pointer.
*
* RETURNS:
* ERROR_SUCCESS or a failure code.
* TODO: Which ones area allowed?
*/
extern DNS_STATUS WINAPI DnsAcquireContextHandle_UTF8(DWORD CredentialsFlags, PVOID Credentials, HANDLE *ContextHandle);
DNS_STATUS WINAPI
DnsAcquireContextHandle_W(DWORD CredentialsFlags,
PVOID Credentials,
HANDLE *ContextHandle)
{
if(CredentialsFlags)
{
PWINDNS_CONTEXT Context;
int adns_status;
/* For now, don't worry about the user's identity. */
Context = (PWINDNS_CONTEXT)RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(WINDNS_CONTEXT));
if(!Context)
{
*ContextHandle = 0;
return ERROR_OUTOFMEMORY;
}
/* The real work here is to create an adns_state that will help us
* do what we want to later. */
adns_status = adns_init(&Context->State, adns_if_noenv | adns_if_noerrprint | adns_if_noserverwarn, 0);
if(adns_status != adns_s_ok)
{
*ContextHandle = 0;
RtlFreeHeap(RtlGetProcessHeap(), 0, Context);
return DnsIntTranslateAdnsToDNS_STATUS(adns_status);
}
else
{
*ContextHandle = (HANDLE)Context;
return ERROR_SUCCESS;
}
}
else
{
return DnsAcquireContextHandle_UTF8(CredentialsFlags, Credentials, ContextHandle);
}
}
DNS_STATUS WINAPI
DnsAcquireContextHandle_UTF8(DWORD CredentialsFlags,
PVOID Credentials,
HANDLE *ContextHandle)
{
if( CredentialsFlags )
{
return DnsAcquireContextHandle_W(CredentialsFlags, Credentials, ContextHandle);
}
else
{
/* Convert to unicode, then call the _W version
* For now, there is no conversion */
DNS_STATUS Status;
Status = DnsAcquireContextHandle_W(TRUE, Credentials, /* XXX arty */ ContextHandle);
/* Free the unicode credentials when they exist. */
return Status;
}
}
DNS_STATUS WINAPI
DnsAcquireContextHandle_A(DWORD CredentialFlags,
PVOID Credentials,
HANDLE *ContextHandle)
{
if(CredentialFlags)
{
return DnsAcquireContextHandle_W(CredentialFlags, Credentials, ContextHandle);
}
else
{
return DnsAcquireContextHandle_UTF8(CredentialFlags, Credentials, ContextHandle);
}
}
/* DnsReleaseContextHandle *************
* Release a context handle, freeing all resources.
*/
void WINAPI
DnsReleaseContextHandle(HANDLE ContextHandle)
{
PWINDNS_CONTEXT Context = (PWINDNS_CONTEXT)ContextHandle;
adns_finish(Context->State);
RtlFreeHeap(RtlGetProcessHeap(), 0, Context);
}