|
|
/*++
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
//
|