windows-nt/Source/XPSP1/NT/inetsrv/iis/svcs/smtp/server/asyncmx.hxx
2020-09-26 16:20:57 +08:00

142 lines
3.9 KiB
C++

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name :
asyncmx.hxx
Abstract:
This file contains type definitions for async connections
Author:
Rohan Phillips (Rohanp) Feb-26-1998
Revision History:
--*/
#ifndef _ASYNC_MX_HXX_
#define _ASYNC_MX_HXX_
#include "dnsreci.h"
class SMTP_SERVER_INSTANCE;
#define ASYNCMX_SIGNATURE 'uAMX'
#define ASYNCMX_SIGNATURE_FREE 'fAMX'
class DNS_RESOLVER_RECORD;
typedef struct _MXINIT_STRUCT_
{
char * HostName;
DWORD PortNum;
DWORD TimeOut;
USERCALLBACKFUNC CallBack;
ISMTPConnection *pISMTPConnection;
SMTP_SERVER_INSTANCE * pInstance;
SMTPDNS_RECS * pDnsRec;
DNS_RESOLVER_RECORD *pDNS_RESOLVER_RECORD;
}MXPARAMS, *PMXPARAMS;
class CAsyncMx : public CAsyncConnection
{
private:
DWORD m_Signature;
DWORD NumMxRecords;
DWORD m_CurrentMxRec;
DWORD m_NextMxRecord;
DWORD m_DomainOptions;
BOOL m_fTriedOnFailHost;
BOOL m_fLoopback;
LIST_ENTRY * m_pNextIpAddress;
SMTPDNS_RECS * m_pDnsRec;
SMTP_SERVER_INSTANCE * pServiceInstance;
ISMTPConnection *pSmtpConnection;
DNS_RESOLVER_RECORD *m_pDNS_RESOLVER_RECORD;
LPSTR m_pszSSLVerificationName;
BOOL m_fInitCalled;
public:
//use CPool for better memory management
static CPool Pool;
// override the mem functions to use CPool functions
void *operator new (size_t cSize)
{ return Pool.Alloc(); }
void operator delete (void *pInstance)
{ Pool.Free(pInstance); }
LIST_ENTRY m_ListEntry;
CAsyncMx::CAsyncMx(PMXPARAMS Parameters);
~CAsyncMx();
BOOL Init (LPSTR pszSSLVerificationName);
LPSTR GetSSLVerificationName () { return m_pszSSLVerificationName; }
LIST_ENTRY & QueryListEntry( VOID){ return ( m_ListEntry); }
ISMTPConnection * GetSmtpConnectionObj(void) {return pSmtpConnection;}
SMTP_SERVER_INSTANCE * GetParentInst(void) {return pServiceInstance;}
BOOL GetTriedOnFailHost(void){return m_fTriedOnFailHost;}
void SetTriedOnFailHost(void){ m_fTriedOnFailHost = TRUE;}
void SetNumMxRecords(DWORD NumRecords) {NumMxRecords = NumRecords;}
void SetDomainOptions(DWORD Options) {m_DomainOptions = Options;}
DWORD GetDomainOptions (void) {return m_DomainOptions;}
virtual void IncNextIpToTry (void);
virtual BOOL MakeFirstAsyncConnect(void);
virtual BOOL IsMoreIpAddresses(void) ;
virtual BOOL CheckIpAddress(DWORD IpAddress, DWORD PortNum);
BOOL ConnectToNextMxHost(void);
BOOL OnConnect(BOOL fConnected);
DWORD GetNextIpAddress(void);
void SetDnsRecToNull(void) { m_pDnsRec = NULL;}
SMTPDNS_RECS * GetDnsRec(void) {return m_pDnsRec;}
virtual BOOL SetSocketOptions(void)
{
BOOL fRet = FALSE;
int err;
//Alway enable linger so sockets that connect to the server.
//This will send a hard close to the server which will cause
//the servers TCP/IP socket table to be flushed very early.
//We should see very few, if any, sockets in the TIME_WAIT
//state
struct linger Linger;
Linger.l_onoff = 1;
Linger.l_linger = 0;
err = setsockopt(GetSockethandle(), SOL_SOCKET, SO_LINGER, (const char FAR *)&Linger, sizeof(Linger));
if (err == NO_ERROR)
{
fRet = TRUE;
}
return fRet;
}
void AckMessage(void);
void IncRecordsTriedSofar(void){m_NextMxRecord++;}
BOOL IsMoreMxRecords (void) {return ++m_NextMxRecord < NumMxRecords;}
BOOL WasLoopback(void) {return m_fLoopback;}
DNS_RESOLVER_RECORD *GetDnsResolverRecord() { return m_pDNS_RESOLVER_RECORD; }
void SetDnsResolverRecord (DNS_RESOLVER_RECORD *pDNS_RESOLVER_RECORD)
{ m_pDNS_RESOLVER_RECORD = pDNS_RESOLVER_RECORD; }
};
#endif