420 lines
9.7 KiB
C
420 lines
9.7 KiB
C
|
/*****************************************\
|
|||
|
* Data Logging -- Debug only *
|
|||
|
\*****************************************/
|
|||
|
|
|||
|
//
|
|||
|
// Need local header ONLY to allow precompiled header.
|
|||
|
// Nothing in this module depends on specific DNS resolver
|
|||
|
// definitions.
|
|||
|
//
|
|||
|
#include "local.h"
|
|||
|
|
|||
|
//
|
|||
|
// NT Headers
|
|||
|
//
|
|||
|
#include <nt.h>
|
|||
|
#include <ntrtl.h>
|
|||
|
#include <nturtl.h>
|
|||
|
|
|||
|
//
|
|||
|
// Windows Headers
|
|||
|
//
|
|||
|
#include <windows.h>
|
|||
|
|
|||
|
#pragma hdrstop
|
|||
|
|
|||
|
#include "logit.h"
|
|||
|
|
|||
|
|
|||
|
// #if DBG
|
|||
|
|
|||
|
int LoggingMode;
|
|||
|
time_t long_time; // has to be in DS, assumed by time() funcs
|
|||
|
int LineCount;
|
|||
|
|
|||
|
char * month[] =
|
|||
|
{
|
|||
|
"January",
|
|||
|
"February",
|
|||
|
"March",
|
|||
|
"April",
|
|||
|
"May",
|
|||
|
"June",
|
|||
|
"July",
|
|||
|
"August",
|
|||
|
"September",
|
|||
|
"October",
|
|||
|
"November",
|
|||
|
"December"
|
|||
|
} ;
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
- LogInit
|
|||
|
-
|
|||
|
* Purpose:
|
|||
|
* Determines if logging is desired and if so, adds a header to log file.
|
|||
|
*
|
|||
|
* Parameters:
|
|||
|
*
|
|||
|
*/
|
|||
|
void LogInit()
|
|||
|
{
|
|||
|
FILE *fp;
|
|||
|
struct tm *newtime;
|
|||
|
char am_pm[] = "a.m.";
|
|||
|
|
|||
|
LoggingMode = 0;
|
|||
|
LineCount = 0;
|
|||
|
|
|||
|
if ( fp = fopen( "dnsrslvr.log", "r+" ) )
|
|||
|
{
|
|||
|
LoggingMode = 1;
|
|||
|
fclose( fp );
|
|||
|
|
|||
|
// Get time and date information
|
|||
|
|
|||
|
long_time = time( NULL); /* Get time as long integer. */
|
|||
|
newtime = localtime( &long_time ); /* Convert to local time. */
|
|||
|
|
|||
|
if( newtime->tm_hour > 12 ) /* Set up extension. */
|
|||
|
am_pm[0] = 'p';
|
|||
|
if( newtime->tm_hour > 12 ) /* Convert from 24-hour */
|
|||
|
newtime->tm_hour -= 12; /* to 12-hour clock. */
|
|||
|
if( newtime->tm_hour == 0 ) /*Set hour to 12 if midnight. */
|
|||
|
newtime->tm_hour = 12;
|
|||
|
|
|||
|
// Write out a header to file
|
|||
|
|
|||
|
fp = fopen("dnsrslvr.log", "w" );
|
|||
|
if ( !fp )
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
fprintf( fp, "Logging information for DNS Caching Resolver service\n" );
|
|||
|
fprintf( fp, "****************************************************\n" );
|
|||
|
fprintf( fp, "\tTime: %d:%02d %s\n\tDate: %s %d, 19%d\n",
|
|||
|
newtime->tm_hour, newtime->tm_min, am_pm,
|
|||
|
month[newtime->tm_mon], newtime->tm_mday,
|
|||
|
newtime->tm_year );
|
|||
|
fprintf( fp, "****************************************************\n\n" );
|
|||
|
fclose( fp );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
- LogIt
|
|||
|
-
|
|||
|
* Purpose:
|
|||
|
* Formats a string and prints it to a log file with handle hLog.
|
|||
|
*
|
|||
|
* Parameters:
|
|||
|
* LPSTR - Pointer to string to format
|
|||
|
* ... - variable argument list
|
|||
|
*/
|
|||
|
|
|||
|
#ifdef WIN32
|
|||
|
#define S16
|
|||
|
#else
|
|||
|
#define S16 static
|
|||
|
#endif
|
|||
|
|
|||
|
void CDECL LogIt( char * lpszFormat, ... )
|
|||
|
{
|
|||
|
FILE *fp;
|
|||
|
#ifndef _ALPHA_
|
|||
|
va_list pArgs = NULL; // reference to quiet compiler
|
|||
|
#else
|
|||
|
va_list pArgs = {NULL,0};
|
|||
|
#endif
|
|||
|
S16 char szLogStr[1024];
|
|||
|
int i;
|
|||
|
|
|||
|
if ( !LoggingMode )
|
|||
|
return;
|
|||
|
|
|||
|
#ifdef WIN32 // parse parameters and insert in string
|
|||
|
va_start( pArgs, lpszFormat);
|
|||
|
vsprintf(szLogStr, lpszFormat, pArgs);
|
|||
|
va_end(pArgs);
|
|||
|
|
|||
|
i = lstrlenA( szLogStr);
|
|||
|
#else // parsing doesn't work, just give them string.
|
|||
|
_fstrcpy( szLogStr, lpszFormat);
|
|||
|
i = _fstrlen( szLogStr);
|
|||
|
#endif
|
|||
|
szLogStr[i] = '\n';
|
|||
|
szLogStr[i+1] = '\0';
|
|||
|
|
|||
|
|
|||
|
if ( LineCount > 50000 )
|
|||
|
{
|
|||
|
fp = fopen( "dnsrslvr.log", "w" );
|
|||
|
LineCount = 0;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
fp = fopen( "dnsrslvr.log", "a" );
|
|||
|
}
|
|||
|
if( fp )
|
|||
|
{
|
|||
|
fprintf( fp, szLogStr );
|
|||
|
LineCount++;
|
|||
|
fclose( fp );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void LogTime()
|
|||
|
{
|
|||
|
struct tm *newtime;
|
|||
|
char am_pm[] = "a.m.";
|
|||
|
|
|||
|
if ( !LoggingMode )
|
|||
|
return;
|
|||
|
|
|||
|
// Get time and date information
|
|||
|
|
|||
|
long_time = time( NULL); /* Get time as long integer. */
|
|||
|
newtime = localtime( &long_time ); /* Convert to local time. */
|
|||
|
|
|||
|
if ( !newtime )
|
|||
|
return;
|
|||
|
|
|||
|
if( newtime->tm_hour > 12 ) /* Set up extension. */
|
|||
|
am_pm[0] = 'p';
|
|||
|
if( newtime->tm_hour > 12 ) /* Convert from 24-hour */
|
|||
|
newtime->tm_hour -= 12; /* to 12-hour clock. */
|
|||
|
if( newtime->tm_hour == 0 ) /*Set hour to 12 if midnight. */
|
|||
|
newtime->tm_hour = 12;
|
|||
|
|
|||
|
// Write out a header to file
|
|||
|
|
|||
|
LogIt( "DNS Caching Resolver service" );
|
|||
|
LogIt( "System Time Information" );
|
|||
|
LogIt( "****************************************************" );
|
|||
|
LogIt( "\tTime: %d:%02d %s\n\tDate: %s %d, 19%d",
|
|||
|
newtime->tm_hour, newtime->tm_min, am_pm,
|
|||
|
month[newtime->tm_mon], newtime->tm_mday,
|
|||
|
newtime->tm_year );
|
|||
|
LogIt( "****************************************************" );
|
|||
|
LogIt( "" );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
DWORD LogIn( char * string )
|
|||
|
{
|
|||
|
LogIt( "%s", string );
|
|||
|
return GetTickCount();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void LogOut( char * string, DWORD InTime )
|
|||
|
{
|
|||
|
LogIt( "%s --- Duration: %ld milliseconds", string, GetTickCount() - InTime );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// #endif
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Special logging routines
|
|||
|
//
|
|||
|
|
|||
|
//
|
|||
|
// ENHANCE: print routines here are really log routines
|
|||
|
// - they are really log routines
|
|||
|
// - should print generically so can be hooked to any print duty
|
|||
|
// - and have macros to log desired structure
|
|||
|
//
|
|||
|
|
|||
|
VOID
|
|||
|
PrintIpAddress(
|
|||
|
IN DWORD dwIpAddress
|
|||
|
)
|
|||
|
{
|
|||
|
DNSLOG_F5(
|
|||
|
" %d.%d.%d.%d",
|
|||
|
((BYTE *) &dwIpAddress)[0],
|
|||
|
((BYTE *) &dwIpAddress)[1],
|
|||
|
((BYTE *) &dwIpAddress)[2],
|
|||
|
((BYTE *) &dwIpAddress)[3] );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
PrintAddressInfo(
|
|||
|
IN DNS_ADDRESS_INFO AddressInfo
|
|||
|
)
|
|||
|
{
|
|||
|
DNSLOG_F1( " ipAddress : " );
|
|||
|
PrintIpAddress( AddressInfo.ipAddress );
|
|||
|
DNSLOG_F1( " subnetMask : " );
|
|||
|
PrintIpAddress( AddressInfo.subnetMask );
|
|||
|
DNSLOG_F1( "" );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
PrintSearchList(
|
|||
|
IN PSEARCH_LIST pSearchList
|
|||
|
)
|
|||
|
{
|
|||
|
DWORD iter;
|
|||
|
|
|||
|
DNSLOG_F1( "" );
|
|||
|
DNSLOG_F1( " DNS Search List :" );
|
|||
|
|
|||
|
for ( iter = 0; iter < pSearchList->cNameCount; iter++ )
|
|||
|
{
|
|||
|
DNSLOG_F3( " %s (Flags: 0x%X)",
|
|||
|
pSearchList->SearchNameArray[iter].pszName,
|
|||
|
pSearchList->SearchNameArray[iter].Flags );
|
|||
|
}
|
|||
|
|
|||
|
DNSLOG_F1( "" );
|
|||
|
|
|||
|
if ( pSearchList->pszDomainOrZoneName )
|
|||
|
DNSLOG_F2( " Primary domain name : %s",
|
|||
|
pSearchList->pszDomainOrZoneName );
|
|||
|
|
|||
|
DNSLOG_F1( "" );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
PrintServerInfo(
|
|||
|
IN DNS_SERVER_INFO ServerInfo
|
|||
|
)
|
|||
|
{
|
|||
|
DNSLOG_F1( " IpAddress : " );
|
|||
|
PrintIpAddress( ServerInfo.IpAddress );
|
|||
|
DNSLOG_F2( " Priority : %d", ServerInfo.Priority );
|
|||
|
DNSLOG_F2( " status : %d", ServerInfo.Status );
|
|||
|
DNSLOG_F1( "" );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
PrintAdapterInfo(
|
|||
|
IN PDNS_ADAPTER pAdapter
|
|||
|
)
|
|||
|
{
|
|||
|
DWORD iter;
|
|||
|
|
|||
|
DNSLOG_F2( " %s", pAdapter->pszAdapterGuidName );
|
|||
|
DNSLOG_F1( " ----------------------------------------------------" );
|
|||
|
DNSLOG_F2( " pszAdapterDomain : %s", pAdapter->pszAdapterDomain );
|
|||
|
if ( pAdapter->pAdapterIPAddresses )
|
|||
|
{
|
|||
|
PIP_ARRAY pIp = pAdapter->pAdapterIPAddresses;
|
|||
|
|
|||
|
DNSLOG_F1( " Adapter Ip Address(es) :" );
|
|||
|
for ( iter = 0; iter < pIp->AddrCount; iter++ )
|
|||
|
{
|
|||
|
PrintIpAddress( pIp->AddrArray[iter] );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if ( pAdapter->pAdapterIPSubnetMasks )
|
|||
|
{
|
|||
|
PIP_ARRAY pMask = pAdapter->pAdapterIPSubnetMasks;
|
|||
|
|
|||
|
DNSLOG_F1( " Adapter Ip Subnet Mask(s) :" );
|
|||
|
for ( iter = 0; iter < pMask->AddrCount; iter++ )
|
|||
|
{
|
|||
|
PrintIpAddress( pMask->AddrArray[iter] );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
DNSLOG_F2( " Status : 0x%x", pAdapter->Status );
|
|||
|
DNSLOG_F2( " InfoFlags : 0x%x", pAdapter->InfoFlags );
|
|||
|
DNSLOG_F2( " ReturnFlags : 0x%x", pAdapter->ReturnFlags );
|
|||
|
DNSLOG_F1( " IpLastSend : " );
|
|||
|
PrintIpAddress( pAdapter->IpLastSend );
|
|||
|
DNSLOG_F2( " cServerCount : %d", pAdapter->cServerCount );
|
|||
|
DNSLOG_F2( " cTotalListSize : %d", pAdapter->cTotalListSize );
|
|||
|
DNSLOG_F1( "" );
|
|||
|
|
|||
|
for ( iter = 0; iter < pAdapter->cServerCount; iter++ )
|
|||
|
{
|
|||
|
DNSLOG_F1( " ------------------------" );
|
|||
|
DNSLOG_F2( " DNS Server Info (%d)", iter + 1 );
|
|||
|
DNSLOG_F1( " ------------------------" );
|
|||
|
PrintServerInfo( pAdapter->ServerArray[iter] );
|
|||
|
}
|
|||
|
|
|||
|
DNSLOG_F1( "" );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
PrintNetworkInfoToLog(
|
|||
|
IN PDNS_NETINFO pNetworkInfo
|
|||
|
)
|
|||
|
{
|
|||
|
DWORD iter;
|
|||
|
|
|||
|
if ( pNetworkInfo )
|
|||
|
{
|
|||
|
DNSLOG_F1( "Current network adapter information is :" );
|
|||
|
DNSLOG_F1( "" );
|
|||
|
DNSLOG_F2( " pNetworkInfo->ReturnFlags : 0x%x", pNetworkInfo->ReturnFlags );
|
|||
|
|
|||
|
if ( pNetworkInfo->pSearchList )
|
|||
|
PrintSearchList( pNetworkInfo->pSearchList );
|
|||
|
|
|||
|
DNSLOG_F2( " pNetworkInfo->cAdapterCount : %d", pNetworkInfo->cAdapterCount );
|
|||
|
DNSLOG_F2( " pNetworkInfo->cTotalListSize : %d", pNetworkInfo->cTotalListSize );
|
|||
|
DNSLOG_F1( "" );
|
|||
|
|
|||
|
for ( iter = 0; iter < pNetworkInfo->cAdapterCount; iter++ )
|
|||
|
{
|
|||
|
DNSLOG_F1( " ----------------------------------------------------" );
|
|||
|
DNSLOG_F2( " Adapter Info (%d)", iter + 1 );
|
|||
|
DNSLOG_F1( "" );
|
|||
|
PrintAdapterInfo( pNetworkInfo->AdapterArray[iter] );
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
DNSLOG_F1( "Current network adapter information is empty" );
|
|||
|
DNSLOG_F1( "" );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
PrintIpAddressListToLog (
|
|||
|
IN PDNS_ADDRESS_INFO AddressInfoList,
|
|||
|
IN DWORD AddressInfoListCount
|
|||
|
)
|
|||
|
{
|
|||
|
DWORD iter;
|
|||
|
|
|||
|
if ( AddressInfoList && AddressInfoListCount )
|
|||
|
{
|
|||
|
DNSLOG_F1( "Current IP address list is :" );
|
|||
|
|
|||
|
for ( iter = 0; iter < AddressInfoListCount; iter++ )
|
|||
|
{
|
|||
|
PrintAddressInfo( AddressInfoList[iter] );
|
|||
|
}
|
|||
|
DNSLOG_F1( "" );
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
DNSLOG_F1( "Current IP address list is empty" );
|
|||
|
DNSLOG_F1( "" );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// End of logit.c
|
|||
|
//
|