Copyright (C) 2010 RĂ©mi Denis-Courmont. Licensed under GNU General Public License version 2 or higher. diff -ru live.orig//groupsock/GroupsockHelper.cpp live//groupsock/GroupsockHelper.cpp --- live.orig//groupsock/GroupsockHelper.cpp 2010-04-09 22:27:39.000000000 +0300 +++ live//groupsock/GroupsockHelper.cpp 2010-04-17 20:18:11.000000000 +0300 @@ -625,25 +625,29 @@ #include if (ERROR == (ourAddress = hostGetByName( hostname ))) break; #else - struct hostent* hstent - = (struct hostent*)gethostbyname(hostname); - if (hstent == NULL || hstent->h_length != 4) { - env.setResultErrMsg("initial gethostbyname() failed"); + struct addrinfo hints, *res; + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_DGRAM; + hints.ai_protocol = IPPROTO_UDP; + if (getaddrinfo(hostname, NULL, &hints, &res)) { + env.setResultErrMsg("initial getaddrinfo() failed"); break; } // Take the first address that's not bad // (This code, like many others, won't handle IPv6) netAddressBits addr = 0; - for (unsigned i = 0; ; ++i) { - char* addrPtr = hstent->h_addr_list[i]; - if (addrPtr == NULL) break; + for (const struct addrinfo *p = res; p; p = p->ai_next) { + const struct in_addr in = + ((const struct sockaddr_in *)p->ai_addr)->sin_addr; - netAddressBits a = *(netAddressBits*)addrPtr; + netAddressBits a = in.s_addr; if (!badAddress(a)) { addr = a; break; } } + freeaddrinfo(res); if (addr != 0) { fromAddr.sin_addr.s_addr = addr; } else { diff -ru live.orig//groupsock/inet.c live//groupsock/inet.c --- live.orig//groupsock/inet.c 2010-04-09 22:27:39.000000000 +0300 +++ live//groupsock/inet.c 2010-04-17 20:14:07.000000000 +0300 @@ -83,16 +83,6 @@ #define NULL 0 #endif -#if !defined(VXWORKS) -struct hostent* our_gethostbyname(name) - char* name; -{ - if (!initializeWinsockIfNecessary()) return NULL; - - return (struct hostent*) gethostbyname(name); -} -#endif - #ifndef USE_OUR_RANDOM /* Use the system-supplied "random()" and "srandom()" functions */ #include diff -ru live.orig//groupsock/NetAddress.cpp live//groupsock/NetAddress.cpp --- live.orig//groupsock/NetAddress.cpp 2010-04-09 22:27:39.000000000 +0300 +++ live//groupsock/NetAddress.cpp 2010-04-17 20:13:29.000000000 +0300 @@ -83,15 +83,12 @@ NetAddressList::NetAddressList(char const* hostname) : fNumAddresses(0), fAddressArray(NULL) { - struct hostent* host; + + struct addrinfo *res; // Check first whether "hostname" is an IP address string: netAddressBits addr = our_inet_addr((char*)hostname); if (addr != INADDR_NONE) { // yes it was an IP address string - //##### host = gethostbyaddr((char*)&addr, sizeof (netAddressBits), AF_INET); - host = NULL; // don't bother calling gethostbyaddr(); we only want 1 addr - - if (host == NULL) { // For some unknown reason, gethostbyaddr() failed, so just // return a 1-element list with the address we were given: fNumAddresses = 1; @@ -101,41 +98,40 @@ fAddressArray[0] = new NetAddress((u_int8_t*)&addr, sizeof (netAddressBits)); return; - } } else { // Try resolving "hostname" as a real host name -#if defined(VXWORKS) - char hostentBuf[512]; - host = (struct hostent*)resolvGetHostByName((char*)hostname,(char*)&hostentBuf,sizeof hostentBuf); -#else - host = our_gethostbyname((char*)hostname); -#endif + struct addrinfo hints; + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_DGRAM; /* be sure to not get dups! */ + hints.ai_protocol = IPPROTO_UDP; - if (host == NULL) { + if (getaddrinfo(hostname, NULL, &hints, &res)) // It was a host name, and we couldn't resolve it. We're SOL. return; - } } - u_int8_t const** const hAddrPtr - = (u_int8_t const**)host->h_addr_list; - if (hAddrPtr != NULL) { - // First, count the number of addresses: - u_int8_t const** hAddrPtr1 = hAddrPtr; - while (*hAddrPtr1 != NULL) { - ++fNumAddresses; - ++hAddrPtr1; - } - - // Next, set up the list: - fAddressArray = new NetAddress*[fNumAddresses]; - if (fAddressArray == NULL) return; - - for (unsigned i = 0; i < fNumAddresses; ++i) { - fAddressArray[i] - = new NetAddress(hAddrPtr[i], host->h_length); - } + // First, count the number of addresses: + for (const struct addrinfo *p = res; p; p = p->ai_next) + fNumAddresses++; + + // Next, set up the list: + fAddressArray = new NetAddress*[fNumAddresses]; + + unsigned i = 0; + for (const struct addrinfo *p = res; p; p = p->ai_next) { + union + { + struct in_addr ip4; + uint8_t b[4]; + } buf; + const struct sockaddr_in *sin = + (const struct sockaddr_in *)p->ai_addr; + + buf.ip4 = sin->sin_addr; + fAddressArray[i++] = new NetAddress(buf.b, 4); } + freeaddrinfo(res); } NetAddressList::NetAddressList(NetAddressList const& orig) {