#include #include #include #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; }