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.
402 lines
6.5 KiB
402 lines
6.5 KiB
/*++
|
|
|
|
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.
|
|
//
|
|
|
|
|
|
|