You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
378 lines
6.4 KiB
378 lines
6.4 KiB
/*++
|
|
|
|
Copyright (c) 2000-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
resolver.c
|
|
|
|
Abstract:
|
|
|
|
Domain Name System (DNS) API
|
|
|
|
Resolver control.
|
|
|
|
Author:
|
|
|
|
Jim Gilroy (jamesg) March 2000
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
|
|
#include "local.h"
|
|
|
|
|
|
|
|
//
|
|
// Flush cache routines
|
|
//
|
|
|
|
BOOL
|
|
WINAPI
|
|
DnsFlushResolverCache(
|
|
VOID
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Flush resolver cache.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
TRUE if successful.
|
|
FALSE otherwise.
|
|
|
|
--*/
|
|
{
|
|
DNS_STATUS status = ERROR_SUCCESS;
|
|
|
|
DNSDBG( TRACE, ( "DnsFlushResolverCache()\n" ));
|
|
|
|
RpcTryExcept
|
|
{
|
|
R_ResolverFlushCache( NULL );
|
|
}
|
|
RpcExcept( DNS_RPC_EXCEPTION_FILTER )
|
|
{
|
|
status = RpcExceptionCode();
|
|
}
|
|
RpcEndExcept
|
|
|
|
if ( status )
|
|
{
|
|
DNSDBG( RPC, (
|
|
"DnsFlushResolverCache() RPC failed status = %d\n",
|
|
status ));
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
WINAPI
|
|
DnsFlushResolverCacheEntry_W(
|
|
IN PWSTR pszName
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Flush resolver cache entry.
|
|
|
|
Arguments:
|
|
|
|
pszName -- name of entry to flush in unicode
|
|
|
|
Return Value:
|
|
|
|
TRUE if entry non-existant or flushed.
|
|
FALSE on error.
|
|
|
|
--*/
|
|
{
|
|
DWORD status;
|
|
|
|
DNSDBG( TRACE, (
|
|
"DnsFlushResolverCacheEntry_W( %S )\n",
|
|
pszName ));
|
|
|
|
if ( !pszName )
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
RpcTryExcept
|
|
{
|
|
status = R_ResolverFlushCacheEntry(
|
|
NULL, // dummy handle
|
|
pszName,
|
|
0 // flush all types
|
|
);
|
|
}
|
|
RpcExcept( DNS_RPC_EXCEPTION_FILTER )
|
|
{
|
|
status = RpcExceptionCode();
|
|
}
|
|
RpcEndExcept
|
|
|
|
if ( status != ERROR_SUCCESS )
|
|
{
|
|
DNSDBG( RPC, (
|
|
"DnsFlushResolverCacheEntry() RPC failed status = %d\n",
|
|
status ));
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
WINAPI
|
|
FlushResolverCacheEntryNarrow(
|
|
IN PSTR pszName,
|
|
IN DNS_CHARSET CharSet
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Flush resolver cache entry with narrow string name.
|
|
|
|
Handles flush for _A and _UTF8
|
|
|
|
Arguments:
|
|
|
|
pszName -- name of entry to flush
|
|
|
|
CharSet -- char set of name
|
|
|
|
Return Value:
|
|
|
|
TRUE if entry non-existant or flushed.
|
|
FALSE on error.
|
|
|
|
--*/
|
|
{
|
|
WCHAR wideNameBuffer[ DNS_MAX_NAME_BUFFER_LENGTH ];
|
|
DWORD bufLength = DNS_MAX_NAME_BUFFER_LENGTH * sizeof(WCHAR);
|
|
BOOL flag = TRUE;
|
|
|
|
DNSDBG( TRACE, (
|
|
"FlushResolverCacheEntryNarrow( %s )\n",
|
|
pszName ));
|
|
|
|
// must have name
|
|
|
|
if ( !pszName )
|
|
{
|
|
// return ERROR_INVALID_NAME;
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// convert name to unicode
|
|
// - bail if name too long or conversion error
|
|
|
|
if ( ! Dns_NameCopy(
|
|
(PBYTE) wideNameBuffer,
|
|
& bufLength,
|
|
pszName,
|
|
0, // name is string
|
|
CharSet,
|
|
DnsCharSetUnicode ))
|
|
{
|
|
// return ERROR_INVALID_NAME;
|
|
return FALSE;
|
|
}
|
|
|
|
// flush cache entry
|
|
|
|
return DnsFlushResolverCacheEntry_W( wideNameBuffer );
|
|
}
|
|
|
|
|
|
BOOL
|
|
WINAPI
|
|
DnsFlushResolverCacheEntry_A(
|
|
IN PSTR pszName
|
|
)
|
|
{
|
|
return FlushResolverCacheEntryNarrow(
|
|
pszName,
|
|
DnsCharSetAnsi );
|
|
}
|
|
|
|
BOOL
|
|
WINAPI
|
|
DnsFlushResolverCacheEntry_UTF8(
|
|
IN PSTR pszName
|
|
)
|
|
{
|
|
return FlushResolverCacheEntryNarrow(
|
|
pszName,
|
|
DnsCharSetUtf8 );
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Resolver poke
|
|
//
|
|
|
|
VOID
|
|
DnsNotifyResolverEx(
|
|
IN DWORD Id,
|
|
IN DWORD Flag,
|
|
IN DWORD Cookie,
|
|
IN PVOID pReserved
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Notify resolver of cluster IP coming on\offline.
|
|
|
|
Arguments:
|
|
|
|
ClusterIp -- cluster IP
|
|
|
|
fAdd -- TRUE if coming online; FALSE if offline.
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
RpcTryExcept
|
|
{
|
|
R_ResolverPoke(
|
|
NULL, // RPC handle
|
|
Cookie,
|
|
Id );
|
|
}
|
|
RpcExcept( DNS_RPC_EXCEPTION_FILTER )
|
|
{
|
|
}
|
|
RpcEndExcept
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Cluster interface
|
|
//
|
|
|
|
DNS_STATUS
|
|
DnsRegisterClusterAddress(
|
|
IN DWORD Tag,
|
|
IN PWSTR pwsName,
|
|
IN PSOCKADDR pSockaddr,
|
|
IN DWORD Flag
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Register cluster addresses with resolver.
|
|
|
|
Arguments:
|
|
|
|
pwsName -- cluster name
|
|
|
|
pSockaddr -- sockaddr for cluster address
|
|
|
|
fAdd -- TRUE if coming online; FALSE if offline.
|
|
|
|
Tag -- cluster add tag
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
DNS_ADDR addr;
|
|
DNS_STATUS status;
|
|
|
|
DNSDBG( TRACE, (
|
|
"DnsRegisterClusterAddress()\n"
|
|
"\tTag = %08x\n"
|
|
"\tpName = %S\n"
|
|
"\tpSockaddr = %p (fam=%d)\n"
|
|
"\tFlag = %d\n",
|
|
Tag,
|
|
pwsName,
|
|
pSockaddr, pSockaddr->sa_family,
|
|
Flag ));
|
|
|
|
//
|
|
// DCR: write cluster key
|
|
//
|
|
// DCR: check that we are on cluster machime
|
|
//
|
|
|
|
if ( !g_IsServer )
|
|
{
|
|
return ERROR_ACCESS_DENIED;
|
|
}
|
|
|
|
//
|
|
// convert to our private IP union
|
|
//
|
|
|
|
if ( ! DnsAddr_Build(
|
|
&addr,
|
|
pSockaddr,
|
|
0, // default family
|
|
0, // no subnet info
|
|
0 // no flags
|
|
) )
|
|
{
|
|
DNSDBG( ANY, (
|
|
"ERROR: failed converting sockaddr to DNS_ADDR!\n" ));
|
|
return ERROR_INVALID_PARAMETER;
|
|
}
|
|
|
|
//
|
|
// notify resolver of cluster IP
|
|
//
|
|
|
|
RpcTryExcept
|
|
{
|
|
status = R_ResolverRegisterCluster(
|
|
NULL, // RPC handle
|
|
Tag,
|
|
pwsName,
|
|
& addr,
|
|
Flag );
|
|
}
|
|
RpcExcept( DNS_RPC_EXCEPTION_FILTER )
|
|
{
|
|
status = RpcExceptionCode();
|
|
}
|
|
RpcEndExcept
|
|
|
|
|
|
DNSDBG( TRACE, (
|
|
"Leave DnsRegisterClusterAddress( %S ) => %d\n",
|
|
pwsName,
|
|
status ));
|
|
|
|
return status;
|
|
}
|
|
|
|
//
|
|
// End resolver.c
|
|
//
|