/* ======================== 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; }