Leaked source code of windows server 2003
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.
 
 
 
 
 
 

484 lines
7.4 KiB

/*++
Copyright (c) 2001-2002 Microsoft Corporation
Module Name:
util.c
Abstract:
Domain Name System (DNS) API
General utils.
Includes:
Extra info processing.
Author:
Jim Gilroy (jamesg) October, 1996
Revision History:
--*/
#include "local.h"
//
// Extra info routines.
//
PDNS_EXTRA_INFO
ExtraInfo_FindInList(
IN OUT PDNS_EXTRA_INFO pExtraList,
IN DWORD Id
)
/*++
Routine Description:
Get extra info blob from extra list.
Arguments:
pExtra -- ptr to extra info
Id -- ID to find
Return Value:
Ptr to extra info of ID type -- if found.
NULL if not found.
--*/
{
PDNS_EXTRA_INFO pextra = pExtraList;
//
// find and set extra info result blob (if any)
//
while ( pextra )
{
if ( pextra->Id == Id )
{
break;
}
pextra = pextra->pNext;
}
return pextra;
}
BOOL
ExtraInfo_SetBasicResults(
IN OUT PDNS_EXTRA_INFO pExtraList,
IN PBASIC_RESULTS pResults
)
/*++
Routine Description:
Get extra info blob from extra list.
Arguments:
pExtraList -- ptr to extra info
pResults to write.
Return Value:
TRUE if found, wrote results extra info.
FALSE otherwise.
--*/
{
PDNS_EXTRA_INFO pextra;
//
// find results extra
//
pextra = ExtraInfo_FindInList(
pExtraList,
DNS_EXINFO_ID_RESULTS_BASIC );
if ( pextra )
{
RtlCopyMemory(
& pextra->ResultsBasic,
pResults,
sizeof( pextra->ResultsBasic ) );
}
return( pextra != NULL );
}
PDNS_ADDR_ARRAY
ExtraInfo_GetServerList(
IN PDNS_EXTRA_INFO pExtraList
)
/*++
Routine Description:
Get server list from extra info.
Arguments:
pExtraList -- ptr to extra info
pResults to write.
Return Value:
Allocated DNS_ADDR_ARRAY server list if found.
NULL if not found or error.
--*/
{
PDNS_EXTRA_INFO pextra;
PDNS_ADDR_ARRAY parray = NULL;
//
// find server list
//
pextra = ExtraInfo_FindInList(
pExtraList,
DNS_EXINFO_ID_SERVER_LIST );
if ( pextra && pextra->pServerList )
{
parray = DnsAddrArray_CreateCopy( pextra->pServerList );
if ( parray )
{
goto Done;
}
}
//
// check IP4
//
pextra = ExtraInfo_FindInList(
pExtraList,
DNS_EXINFO_ID_SERVER_LIST_IP4 );
if ( pextra && pextra->pServerList4 )
{
parray = DnsAddrArray_CreateFromIp4Array( pextra->pServerList4 );
if ( parray )
{
goto Done;
}
}
#if 0
//
// check IP6
//
pextra = ExtraInfo_FindInList(
pExtraList,
DNS_EXINFO_ID_SERVER_LIST_IP6 );
if ( pextra && pextra->pServerList6 )
{
parray = DnsAddrArray_CreateFromIp6Array( pextra->pServerList6 );
if ( parray )
{
goto Done;
}
}
#endif
Done:
return( parray );
}
PDNS_ADDR_ARRAY
ExtraInfo_GetServerListPossiblyImbedded(
IN PIP4_ARRAY pList
)
/*++
Routine Description:
Get server list from extra info.
Arguments:
pExtraList -- ptr to extra info
pResults to write.
Return Value:
Allocated DNS_ADDR_ARRAY server list if found.
NULL if not found or error.
--*/
{
if ( !pList )
{
return NULL;
}
//
// check for imbedded
//
if ( pList->AddrCount == DNS_IMBEDDED_EXTRA_INFO_TAG )
{
return ExtraInfo_GetServerList(
((PDNS_IMBEDDED_EXTRA_INFO)pList)->pExtraInfo );
}
//
// check IP4 directly
//
return DnsAddrArray_CreateFromIp4Array( pList );
}
//
// Random utils
//
VOID
Util_SetBasicResults(
OUT PBASIC_RESULTS pResults,
IN DWORD Status,
IN DWORD Rcode,
IN PDNS_ADDR pServerAddr
)
/*++
Routine Description:
Save basic result info.
Arguments:
pResults -- results
Status -- update status
Rcode -- returned RCODE
pServerAddr -- ptr to DNS_ADDR of server
Return Value:
None
--*/
{
pResults->Rcode = Rcode;
pResults->Status = Status;
if ( pServerAddr )
{
DnsAddr_Copy(
(PDNS_ADDR) &pResults->ServerAddr,
pServerAddr );
}
else
{
DnsAddr_Clear( (PDNS_ADDR)&pResults->ServerAddr );
}
}
PDNS_ADDR_ARRAY
Util_GetAddrArray(
OUT PDWORD fCopy,
IN PDNS_ADDR_ARRAY pServList,
IN PIP4_ARRAY pServList4,
IN PDNS_EXTRA_INFO pExtraInfo
)
/*++
Routine Description:
Build combined server list.
Arguments:
fCopy -- currently ignored (idea is to grab without copy)
pServList -- input server list
pServList4 -- IP4 server list
pExtraInfo -- ptr to extra info
Return Value:
Allocated DNS_ADDR_ARRAY server list if found.
NULL if not found or error.
--*/
{
PDNS_ADDR_ARRAY parray = NULL;
//
// explicit list
//
if ( pServList )
{
parray = DnsAddrArray_CreateCopy( pServList );
if ( parray )
{
goto Done;
}
}
//
// IP4 list
//
if ( pServList4 )
{
parray = ExtraInfo_GetServerListPossiblyImbedded( pServList4 );
if ( parray )
{
goto Done;
}
}
//
// check extra info
//
if ( pExtraInfo )
{
parray = ExtraInfo_GetServerList( pExtraInfo );
if ( parray )
{
goto Done;
}
}
Done:
return parray;
}
//
// IP6 active test
//
VOID
Util_GetActiveProtocols(
OUT PBOOL pfRunning6,
OUT PBOOL pfRunning4
)
/*++
Routine Description:
Determine protocols running.
Arguments:
pfRunning6 -- addr to hold running IP6 flag
pfRunning4 -- addr to hold running IP4 flag
Return Value:
None
--*/
{
SOCKET sock;
//
// open IP6 socket
//
sock = Socket_Create(
AF_INET6,
SOCK_DGRAM,
NULL,
0,
0 );
*pfRunning6 = ( sock != 0 );
Socket_Close( sock );
sock = Socket_Create(
AF_INET,
SOCK_DGRAM,
NULL,
0,
0 );
*pfRunning4 = ( sock != 0 );
Socket_Close( sock );
}
BOOL
Util_IsIp6Running(
VOID
)
/*++
Routine Description:
Determine if IP6 running.
Arguments:
Return Value:
None
--*/
{
SOCKET sock;
//
// open IP6 socket
//
sock = Socket_Create(
AF_INET6,
SOCK_DGRAM,
NULL,
0,
0 );
Socket_Close( sock );
return ( sock != 0 );
}
//
// End util.c
//