You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
5.0 KiB
153 lines
5.0 KiB
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) {
|