windows-nt/Source/XPSP1/NT/inetsrv/iis/staxinc/cdns.h
2020-09-26 16:20:57 +08:00

294 lines
6.8 KiB
C++

/*++
Copyright (c) 1994 Microsoft Corporation
Module Name :
cdns.h
Abstract:
This module defines the DNS connection class.
Author:
Rohan Phillips ( Rohanp ) 07-May-1998
Project:
Revision History:
--*/
# ifndef _ADNS_CLIENT_HXX_
# define _ADNS_CLIENT_HXX_
#include <dnsapi.h>
/************************************************************
* Include Headers
************************************************************/
//
// Redefine the type to indicate that this is a call-back function
//
typedef ATQ_COMPLETION PFN_ATQ_COMPLETION;
/************************************************************
* Symbolic Constants
************************************************************/
//
// Valid & Invalid Signatures for Client Connection object
// (Ims Connection USed/FRee)
//
# define DNS_CONNECTION_SIGNATURE_VALID 'DNSU'
# define DNS_CONNECTION_SIGNATURE_FREE 'DNSF'
//
// POP3 requires a minimum of 10 minutes before a timeout
// (SMTP doesn't specify, but might as well follow POP3)
//
# define MINIMUM_CONNECTION_IO_TIMEOUT (10 * 60) // 10 minutes
//
//
#define DNS_TCP_DEFAULT_PACKET_LENGTH (0x4000)
enum DNSLASTIOSTATE
{
DNS_READIO, DNS_WRITEIO
};
typedef struct _DNS_OVERLAPPED
{
OVERLAPPED Overlapped;
DNSLASTIOSTATE LastIoState;
} DNS_OVERLAPPED;
/************************************************************
* Type Definitions
************************************************************/
/*++
class CLIENT_CONNECTION
This class is used for keeping track of individual client
connections established with the server.
It maintains the state of the connection being processed.
In addition it also encapsulates data related to Asynchronous
thread context used for processing the request.
--*/
class CAsyncDns
{
private:
ULONG m_signature; // signature on object for sanity check
LONG m_cPendingIoCount;
LONG m_cThreadCount;
DWORD m_cbReceived;
DWORD m_BytesToRead;
DWORD m_dwIpServer;
DWORD m_LocalPref;
DWORD m_Index;
BOOL m_fUdp;
BOOL m_fUsingMx;
BOOL m_FirstRead;
BOOL m_SeenLocal;
PDNS_MESSAGE_BUFFER m_pMsgRecv;
BYTE *m_pMsgRecvBuf;
PDNS_MESSAGE_BUFFER m_pMsgSend;
BYTE *m_pMsgSendBuf;
WORD m_cbSendBufSize;
SOCKADDR_IN m_RemoteAddress;
PDNS_RECORD m_ppRecord;
PDNS_RECORD * m_ppResponseRecords;
PATQ_CONTEXT m_pAtqContext;
SOCKET m_DnsSocket; // socket for this connection
WCHAR m_wszHostName[MAX_PATH];
DWORD m_Weight [100];
DWORD m_Prefer [100];
protected:
DWORD m_dwFlags;
char m_FQDNToDrop [MAX_PATH];
char m_HostName [MAX_PATH];
DWORD m_dwDiagnostic;
PSMTPDNS_RECS m_AuxList;
//
// The overlapped structure for reads (one outstanding read at a time)
// -- writes will dynamically allocate them
//
DNS_OVERLAPPED m_ReadOverlapped;
DNS_OVERLAPPED m_WriteOverlapped;
SOCKET QuerySocket( VOID) const
{ return ( m_DnsSocket); }
PATQ_CONTEXT QueryAtqContext( VOID) const
{ return ( m_pAtqContext); }
LPOVERLAPPED QueryAtqOverlapped( void ) const
{ return ( m_pAtqContext == NULL ? NULL : &m_pAtqContext->Overlapped ); }
public:
CAsyncDns();
virtual ~CAsyncDns(VOID);
DNS_STATUS DnsSendRecord();
DNS_STATUS DnsParseMessage( IN PDNS_MESSAGE_BUFFER pMsg,
IN WORD wMessageLength,
OUT PDNS_RECORD * ppRecord);
DNS_STATUS Dns_OpenTcpConnectionAndSend();
DNS_STATUS Dns_Send( );
DNS_STATUS SendPacket( void);
DNS_STATUS Dns_QueryLib( DNS_NAME, WORD wQuestionType, DWORD dwFlags, char * MyFQDN, BOOL fUdp );
SOCKET Dns_CreateSocket( IN INT SockType );
//BOOL MakeDnsConnection(void);
//
// IsValid()
// o Checks the signature of the object to determine
//
// Returns: TRUE on success and FALSE if invalid.
//
BOOL IsValid( VOID) const
{
return ( m_signature == DNS_CONNECTION_SIGNATURE_VALID);
}
//-------------------------------------------------------------------------
// Virtual method that MUST be defined by derived classes.
//
// Processes a completed IO on the connection for the client.
//
// -- Calls and maybe called from the Atq functions.
//
virtual BOOL ProcessClient(
IN DWORD cbWritten,
IN DWORD dwCompletionStatus,
IN OUT OVERLAPPED * lpo
) ;
LONG IncPendingIoCount(void)
{
LONG RetVal;
RetVal = InterlockedIncrement( &m_cPendingIoCount );
return RetVal;
}
LONG DecPendingIoCount(void) { return InterlockedDecrement( &m_cPendingIoCount );}
LONG IncThreadCount(void)
{
LONG RetVal;
RetVal = InterlockedIncrement( &m_cThreadCount );
return RetVal;
}
LONG DecThreadCount(void) { return InterlockedDecrement( &m_cThreadCount );}
BOOL ReadFile(
IN LPVOID pBuffer,
IN DWORD cbSize /* = MAX_READ_BUFF_SIZE */
);
BOOL WriteFile(
IN LPVOID pBuffer,
IN DWORD cbSize /* = MAX_READ_BUFF_SIZE */
);
BOOL ProcessReadIO(IN DWORD InputBufferLen,
IN DWORD dwCompletionStatus,
IN OUT OVERLAPPED * lpo);
void DisconnectClient(void);
void ProcessMxRecord(PDNS_RECORD pnewRR);
void ProcessARecord(PDNS_RECORD pnewRR);
//
// These functions need access to data declared in CAsyncSmtpDns but are called from
// CAsyncDns. For example some of the retry logic (when DNS servers are down for
// example) is handled by CAsyncDns. However to kick off a retry, we need to create a
// new DNS query and pass it all the parameters of the old DNS query, and some of the
// parameters are in CAsyncSmtpDns. So we declare these as virtual functions to be
// overridden by CAsyncSmtpDns.
//
virtual void HandleCompletedData(DNS_STATUS dwDnsStatus) = 0;
virtual BOOL RetryAsyncDnsQuery(BOOL fUdp) = 0;
BOOL SortMxList(void);
BOOL CheckList(void);
void MarkDown(DWORD dwIpServer, DWORD dwError, BOOL fUdp);
public:
//
// LIST_ENTRY object for storing client connections in a list.
//
LIST_ENTRY m_listEntry;
LIST_ENTRY & QueryListEntry( VOID)
{ return ( m_listEntry); }
};
typedef CAsyncDns * PCAsyncDns;
//
// Auxiliary functions
//
INT ShutAndCloseSocket( IN SOCKET sock);
# endif
/************************ End of File ***********************/