--- /dev/null
+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 <hostLib.h>
+ 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 <stdlib.h>
+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) {