Example #1
0
/*
========================
Net_StringToSockaddr
========================
*/
static bool Net_StringToSockaddr( const char* s, sockaddr_in* sadr, bool doDNSResolve )
{
	struct hostent*	h;
	char buf[256];
	int port;
	
	memset( sadr, 0, sizeof( *sadr ) );
	
	sadr->sin_family = AF_INET;
	sadr->sin_port = 0;
	
	if( s[0] >= '0' && s[0] <= '9' )
	{
		unsigned long ret = inet_addr( s );
		if( ret != INADDR_NONE )
		{
			*( int* )&sadr->sin_addr = ret;
		}
		else
		{
			// check for port
			if( !Net_ExtractPort( s, buf, sizeof( buf ), &port ) )
			{
				return false;
			}
			ret = inet_addr( buf );
			if( ret == INADDR_NONE )
			{
				return false;
			}
			*( int* )&sadr->sin_addr = ret;
			sadr->sin_port = htons( port );
		}
	}
	else if( doDNSResolve )
	{
		// try to remove the port first, otherwise the DNS gets confused into multiple timeouts
		// failed or not failed, buf is expected to contain the appropriate host to resolve
		if( Net_ExtractPort( s, buf, sizeof( buf ), &port ) )
		{
			sadr->sin_port = htons( port );
		}
		h = gethostbyname( buf );
		if( h == 0 )
		{
			return false;
		}
		*( int* )&sadr->sin_addr = *( int* )h->h_addr_list[0];
	}
	
	return true;
}
/*
========================
Net_StringToSockaddr
========================
*/
static bool Net_StringToSockaddr( const char* s, sockaddr_in* sadr, bool doDNSResolve )
{
	/* NOTE: the doDNSResolve argument is ignored for two reasons:
	 * 1. domains can start with numbers nowadays so the old heuristic to find out if it's
	 *    an IP (check if the first char is a digit) isn't reliable
	 * 2. gethostbyname() works fine for IPs and doesn't do a lookup if the passed string
	 *    is an IP
	 */
	struct hostent*	h;
	char buf[256];
	int port;
	
	memset( sadr, 0, sizeof( *sadr ) );
	
	sadr->sin_family = AF_INET;
	sadr->sin_port = 0;
	
	// try to remove the port first, otherwise the DNS gets confused into multiple timeouts
	// failed or not failed, buf is expected to contain the appropriate host to resolve
	if( Net_ExtractPort( s, buf, sizeof( buf ), &port ) )
	{
		sadr->sin_port = htons( port );
	}
	// buf contains the host, even if Net_ExtractPort returned false
	h = gethostbyname( buf );
	if( h == NULL )
	{
		return false;
	}
	sadr->sin_addr.s_addr = *( in_addr_t* ) h->h_addr_list[0];
	
	return true;
}