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.
323 lines
6.5 KiB
323 lines
6.5 KiB
#include <windows.h>
|
|
#include <winsock.h>
|
|
#include <wininet.h>
|
|
#undef INTERNET_MAX_URL_LENGTH
|
|
#include "autoprox.hxx"
|
|
|
|
#define INET_ASSERT
|
|
#define DEBUG_PRINT(a,b,c)
|
|
#define PERF_LOG(a,b)
|
|
|
|
DWORD
|
|
AUTO_PROXY_HELPER_APIS::ResolveHostName(
|
|
IN LPSTR lpszHostName,
|
|
IN OUT LPSTR lpszIPAddress,
|
|
IN OUT LPDWORD lpdwIPAddressSize
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Resolves a HostName to an IP address by using Winsock DNS.
|
|
|
|
Arguments:
|
|
|
|
lpszHostName - the host name that should be used.
|
|
|
|
lpszIPAddress - the output IP address as a string.
|
|
|
|
lpdwIPAddressSize - the size of the outputed IP address string.
|
|
|
|
Return Value:
|
|
|
|
DWORD
|
|
Win32 error code.
|
|
|
|
--*/
|
|
|
|
{
|
|
//
|
|
// figure out if we're being asked to resolve a name or an address. If
|
|
// inet_addr() succeeds then we were given a string respresentation of an
|
|
// address
|
|
//
|
|
|
|
DWORD ipAddr;
|
|
LPBYTE address;
|
|
LPHOSTENT lpHostent;
|
|
DWORD ttl;
|
|
DWORD dwIPAddressSize;
|
|
BOOL bFromCache = FALSE;
|
|
|
|
DWORD error = ERROR_SUCCESS;
|
|
|
|
ipAddr = inet_addr(lpszHostName);
|
|
if (ipAddr != INADDR_NONE)
|
|
{
|
|
dwIPAddressSize = lstrlen(lpszHostName);
|
|
|
|
if ( *lpdwIPAddressSize < dwIPAddressSize ||
|
|
lpszIPAddress == NULL )
|
|
{
|
|
*lpdwIPAddressSize = dwIPAddressSize+1;
|
|
error = ERROR_INSUFFICIENT_BUFFER;
|
|
goto quit;
|
|
}
|
|
|
|
lstrcpy(lpszIPAddress, lpszHostName);
|
|
goto quit;
|
|
}
|
|
|
|
ipAddr = 0;
|
|
address = (LPBYTE) &ipAddr;
|
|
|
|
//
|
|
// now try to find the name or address in the cache. If it's not in the
|
|
// cache then resolve it
|
|
//
|
|
|
|
// if (QueryHostentCache(lpszHostName, address, &lpHostent, &ttl)) {
|
|
// bFromCache = TRUE;
|
|
// } else {
|
|
{
|
|
|
|
DEBUG_PRINT(SOCKETS,
|
|
INFO,
|
|
("resolving %q\n",
|
|
lpszHostName
|
|
));
|
|
|
|
PERF_LOG(PE_NAMERES_START, 0);
|
|
|
|
lpHostent = gethostbyname(lpszHostName);
|
|
|
|
PERF_LOG(PE_NAMERES_END, 0);
|
|
|
|
DEBUG_PRINT(SOCKETS,
|
|
INFO,
|
|
("%q %sresolved\n",
|
|
lpszHostName,
|
|
lpHostent ? "" : "NOT "
|
|
));
|
|
|
|
|
|
//
|
|
// if we successfully resolved the name or address then add the
|
|
// information to the cache
|
|
//
|
|
|
|
if (lpHostent != NULL)
|
|
{
|
|
// CacheHostent(lpszHostName, lpHostent, LIVE_DEFAULT);
|
|
}
|
|
}
|
|
|
|
|
|
if ( lpHostent )
|
|
{
|
|
char *pszAddressStr;
|
|
LPBYTE * addressList;
|
|
struct in_addr sin_addr;
|
|
|
|
// *(LPDWORD)&lpSin->sin_addr = *(LPDWORD)addressList[i];
|
|
// ((struct sockaddr_in*)lpSockAddr)->sin_addr
|
|
// struct in_addr sin_addr
|
|
|
|
addressList = (LPBYTE *)lpHostent->h_addr_list;
|
|
*(LPDWORD)&sin_addr = *(LPDWORD)addressList[0] ;
|
|
|
|
pszAddressStr = inet_ntoa (sin_addr);
|
|
|
|
INET_ASSERT(pszAddressStr);
|
|
|
|
dwIPAddressSize = lstrlen(pszAddressStr);
|
|
|
|
if ( *lpdwIPAddressSize < dwIPAddressSize ||
|
|
lpszIPAddress == NULL )
|
|
{
|
|
*lpdwIPAddressSize = dwIPAddressSize+1;
|
|
error = ERROR_INSUFFICIENT_BUFFER;
|
|
goto quit;
|
|
}
|
|
|
|
lstrcpy(lpszIPAddress, pszAddressStr);
|
|
|
|
goto quit;
|
|
|
|
}
|
|
|
|
//
|
|
// otherwise, if we get here its an error
|
|
//
|
|
|
|
error = ERROR_INTERNET_NAME_NOT_RESOLVED;
|
|
|
|
quit:
|
|
|
|
if (bFromCache) {
|
|
|
|
INET_ASSERT(lpHostent != NULL);
|
|
|
|
// ReleaseHostentCacheEntry(lpHostent);
|
|
}
|
|
|
|
return error;
|
|
}
|
|
|
|
BOOL
|
|
AUTO_PROXY_HELPER_APIS::IsResolvable(
|
|
IN LPSTR lpszHost
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Determines wheter a HostName can be resolved. Performs a Winsock DNS query,
|
|
and if it succeeds returns TRUE.
|
|
|
|
Arguments:
|
|
|
|
lpszHost - the host name that should be used.
|
|
|
|
Return Value:
|
|
|
|
BOOL
|
|
TRUE - the host is resolved.
|
|
|
|
FALSE - could not resolve.
|
|
|
|
--*/
|
|
|
|
{
|
|
|
|
DWORD dwDummySize;
|
|
DWORD error;
|
|
|
|
error = ResolveHostName(
|
|
lpszHost,
|
|
NULL,
|
|
&dwDummySize
|
|
);
|
|
|
|
if ( error == ERROR_INSUFFICIENT_BUFFER )
|
|
{
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
INET_ASSERT(error != ERROR_SUCCESS );
|
|
return FALSE;
|
|
}
|
|
|
|
}
|
|
DWORD
|
|
AUTO_PROXY_HELPER_APIS::GetIPAddress(
|
|
IN OUT LPSTR lpszIPAddress,
|
|
IN OUT LPDWORD lpdwIPAddressSize
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Acquires the IP address string of this client machine WININET is running on.
|
|
|
|
Arguments:
|
|
|
|
lpszIPAddress - the IP address of the machine, returned.
|
|
|
|
lpdwIPAddressSize - size of the IP address string.
|
|
|
|
Return Value:
|
|
|
|
DWORD
|
|
Win32 Error.
|
|
|
|
--*/
|
|
|
|
{
|
|
|
|
CHAR szHostBuffer[255];
|
|
int serr;
|
|
|
|
serr = gethostname(
|
|
szHostBuffer,
|
|
255-1
|
|
);
|
|
|
|
if ( serr != 0)
|
|
{
|
|
return ERROR_INTERNET_INTERNAL_ERROR;
|
|
}
|
|
|
|
return ResolveHostName(
|
|
szHostBuffer,
|
|
lpszIPAddress,
|
|
lpdwIPAddressSize
|
|
);
|
|
|
|
}
|
|
|
|
BOOL
|
|
AUTO_PROXY_HELPER_APIS::IsInNet(
|
|
IN LPSTR lpszIPAddress,
|
|
IN LPSTR lpszDest,
|
|
IN LPSTR lpszMask
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Determines whether a given IP address is in a given dest/mask IP address.
|
|
|
|
Arguments:
|
|
|
|
lpszIPAddress - the host name that should be used.
|
|
|
|
lpszDest - the IP address dest to check against.
|
|
|
|
lpszMask - the IP mask string
|
|
|
|
Return Value:
|
|
|
|
BOOL
|
|
TRUE - the IP address is in the given dest/mask
|
|
|
|
FALSE - the IP address is NOT in the given dest/mask
|
|
|
|
--*/
|
|
|
|
{
|
|
DWORD dwDest, dwIpAddr, dwMask;
|
|
|
|
INET_ASSERT(lpszIPAddress);
|
|
INET_ASSERT(lpszDest);
|
|
INET_ASSERT(lpszMask);
|
|
|
|
dwIpAddr = inet_addr(lpszIPAddress);
|
|
dwDest = inet_addr(lpszDest);
|
|
dwMask = inet_addr(lpszMask);
|
|
|
|
if ( dwDest == INADDR_NONE ||
|
|
dwIpAddr == INADDR_NONE )
|
|
|
|
{
|
|
INET_ASSERT(FALSE);
|
|
return FALSE;
|
|
}
|
|
|
|
if ( (dwIpAddr & dwMask) != dwDest)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// Pass, its Matches.
|
|
//
|
|
|
|
return TRUE;
|
|
}
|
|
|