403 lines
6.1 KiB
C++
403 lines
6.1 KiB
C++
/*++
|
||
|
||
Copyright (c) 1997 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
iisbind.cxx
|
||
|
||
Abstract:
|
||
|
||
This module implements the IIS_SERVER_BINDING class.
|
||
|
||
Author:
|
||
|
||
Keith Moore (keithmo) 16-Jan-1997
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
|
||
#include "tcpdllp.hxx"
|
||
#pragma hdrstop
|
||
#include <iisbind.hxx>
|
||
|
||
|
||
//
|
||
// Private constants.
|
||
//
|
||
|
||
|
||
//
|
||
// Private types.
|
||
//
|
||
|
||
|
||
//
|
||
// Private globals.
|
||
//
|
||
|
||
|
||
//
|
||
// Private prototypes.
|
||
//
|
||
|
||
|
||
//
|
||
// Public functions.
|
||
//
|
||
|
||
|
||
IIS_SERVER_BINDING::IIS_SERVER_BINDING(
|
||
IN DWORD IpAddress,
|
||
IN USHORT IpPort,
|
||
IN const CHAR * HostName,
|
||
IN PIIS_ENDPOINT Endpoint
|
||
) :
|
||
m_IpAddress( IpAddress ),
|
||
m_IpPort( IpPort ),
|
||
m_HostName( HostName ),
|
||
m_Endpoint( Endpoint )
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
IIS_SERVER_BINDING constructor.
|
||
|
||
Arguments:
|
||
|
||
IpAddress - The IP address for this binding. May be INADDR_ANY.
|
||
|
||
IpPort - The IP port for this binding. Required.
|
||
|
||
HostName - The host name for this binding. May be empty ("").
|
||
|
||
Endpoint - The IIS_ENDPOINT to associate with this binding.
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
{
|
||
|
||
//
|
||
// Sanity check.
|
||
//
|
||
|
||
DBG_ASSERT( HostName != NULL );
|
||
DBG_ASSERT( Endpoint != NULL );
|
||
|
||
} // IIS_SERVER_BINDING::IIS_SERVER_BINDING
|
||
|
||
|
||
IIS_SERVER_BINDING::~IIS_SERVER_BINDING()
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
IIS_SERVER_BINDING destructor.
|
||
|
||
Arguments:
|
||
|
||
None.
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
{
|
||
|
||
//
|
||
// This space intentionally left blank.
|
||
//
|
||
|
||
} // IIS_SERVER_BINDING::~IIS_SERVER_BINDING()
|
||
|
||
|
||
DWORD
|
||
IIS_SERVER_BINDING::ParseDescriptor(
|
||
IN const CHAR * Descriptor,
|
||
OUT LPDWORD IpAddress,
|
||
OUT PUSHORT IpPort,
|
||
OUT const CHAR ** HostName
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Parses a descriptor string of the form "ip_address:ip_port:host_name"
|
||
into its component parts.
|
||
|
||
Arguments:
|
||
|
||
Descriptor - The descriptor string.
|
||
|
||
IpAddress - Receives the IP address component if present, or
|
||
INADDR_ANY if not.
|
||
|
||
IpPort - Recieves the IP port component.
|
||
|
||
HostName - Receives a pointer to the host name component.
|
||
|
||
Return Value:
|
||
|
||
DWORD - Completion status. 0 if successful, !0 otherwise.
|
||
|
||
--*/
|
||
{
|
||
|
||
const CHAR * ipAddressString;
|
||
const CHAR * ipPortString;
|
||
const CHAR * hostNameString;
|
||
const CHAR * end;
|
||
CHAR temp[sizeof("123.123.123.123")];
|
||
INT length;
|
||
LONG tempPort;
|
||
|
||
//
|
||
// Sanity check.
|
||
//
|
||
|
||
DBG_ASSERT( Descriptor != NULL );
|
||
DBG_ASSERT( IpAddress != NULL );
|
||
DBG_ASSERT( IpPort != NULL );
|
||
DBG_ASSERT( HostName != NULL );
|
||
|
||
//
|
||
// Find the various parts of the descriptor;
|
||
//
|
||
|
||
ipAddressString = Descriptor;
|
||
|
||
ipPortString = strchr( ipAddressString, ':' );
|
||
|
||
if( ipPortString == NULL ) {
|
||
goto fatal;
|
||
}
|
||
|
||
ipPortString++;
|
||
|
||
hostNameString = strchr( ipPortString, ':' );
|
||
|
||
if( hostNameString == NULL ) {
|
||
goto fatal;
|
||
}
|
||
|
||
hostNameString++;
|
||
|
||
//
|
||
// Validate and parse the IP address portion.
|
||
//
|
||
|
||
if( *ipAddressString == ':' ) {
|
||
|
||
*IpAddress = INADDR_ANY;
|
||
|
||
} else {
|
||
|
||
length = DIFF(ipPortString - ipAddressString) - 1;
|
||
|
||
if( length > sizeof(temp) ) {
|
||
goto fatal;
|
||
}
|
||
|
||
memcpy(
|
||
temp,
|
||
ipAddressString,
|
||
length
|
||
);
|
||
|
||
temp[length] = '\0';
|
||
|
||
*IpAddress = (DWORD)inet_addr( temp );
|
||
|
||
if( *IpAddress == INADDR_NONE ) {
|
||
goto fatal;
|
||
}
|
||
|
||
}
|
||
|
||
//
|
||
// Validate and parse the port.
|
||
//
|
||
|
||
if( *ipPortString == ':' ) {
|
||
goto fatal;
|
||
}
|
||
|
||
length = DIFF(hostNameString - ipPortString);
|
||
|
||
if( length > sizeof(temp) ) {
|
||
goto fatal;
|
||
}
|
||
|
||
memcpy(
|
||
temp,
|
||
ipPortString,
|
||
length
|
||
);
|
||
|
||
temp[length] = '\0';
|
||
|
||
tempPort = strtol(
|
||
temp,
|
||
(CHAR **)&end,
|
||
0
|
||
);
|
||
|
||
if( tempPort <= 0 || tempPort > 0xFFFF ) {
|
||
goto fatal;
|
||
}
|
||
|
||
if( *end != ':' ) {
|
||
goto fatal;
|
||
}
|
||
|
||
*IpPort = (USHORT)tempPort;
|
||
|
||
//
|
||
// Validate and parse the host name.
|
||
//
|
||
|
||
if( *hostNameString == ' ' || *hostNameString == ':' ) {
|
||
goto fatal;
|
||
}
|
||
|
||
*HostName = hostNameString;
|
||
|
||
return NO_ERROR;
|
||
|
||
fatal:
|
||
|
||
return ERROR_INVALID_PARAMETER;
|
||
|
||
} // IIS_SERVER_BINDING::ParseDescriptor
|
||
|
||
|
||
DWORD
|
||
IIS_SERVER_BINDING::Compare(
|
||
IN const CHAR * Descriptor,
|
||
OUT LPBOOL Result
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Compares the current binding with the descriptor string.
|
||
|
||
Arguments:
|
||
|
||
Descriptor - The descriptor to compare against.
|
||
|
||
Result - Receives the result of the comparison (TRUE if they match,
|
||
FALSE otherwise).
|
||
|
||
Return Value:
|
||
|
||
DWORD - Completion status. 0 if successful, !0 otherwise.
|
||
|
||
--*/
|
||
{
|
||
|
||
DWORD ipAddress;
|
||
USHORT ipPort;
|
||
const CHAR * hostName;
|
||
DWORD status;
|
||
|
||
//
|
||
// Sanity check.
|
||
//
|
||
|
||
DBG_ASSERT( Descriptor != NULL );
|
||
DBG_ASSERT( Result != NULL );
|
||
|
||
//
|
||
// Parse the descriptor.
|
||
//
|
||
|
||
status = ParseDescriptor(
|
||
Descriptor,
|
||
&ipAddress,
|
||
&ipPort,
|
||
&hostName
|
||
);
|
||
|
||
if( status == NO_ERROR ) {
|
||
|
||
*Result = Compare(
|
||
ipAddress,
|
||
ipPort,
|
||
hostName
|
||
);
|
||
|
||
}
|
||
|
||
return status;
|
||
|
||
} // IIS_SERVER_BINDING::Compare
|
||
|
||
|
||
BOOL
|
||
IIS_SERVER_BINDING::Compare(
|
||
IN DWORD IpAddress,
|
||
IN USHORT IpPort,
|
||
IN const CHAR * HostName
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Compares the current binding with the specified IP address, IP port,
|
||
and host name.
|
||
|
||
Arguments:
|
||
|
||
IpAddress - The IP address to compare against.
|
||
|
||
IpPort - The IP port to compare against.
|
||
|
||
HostName - The host name to compare against.
|
||
|
||
Return Value:
|
||
|
||
BOOL - TRUE if they match, FALSE otherwise.
|
||
|
||
--*/
|
||
{
|
||
|
||
//
|
||
// Sanity check.
|
||
//
|
||
|
||
DBG_ASSERT( HostName != NULL );
|
||
|
||
//
|
||
// Compare the components.
|
||
//
|
||
|
||
if( IpAddress == QueryIpAddress() &&
|
||
IpPort == QueryIpPort() &&
|
||
!_stricmp(
|
||
HostName,
|
||
QueryHostName()
|
||
) ) {
|
||
|
||
return TRUE;
|
||
|
||
}
|
||
|
||
return FALSE;
|
||
|
||
} // IIS_SERVER_BINDING::Compare
|
||
|
||
|
||
//
|
||
// Private functions.
|
||
//
|
||
|
||
|
||
|