summaryrefslogtreecommitdiff
path: root/ext/sockets
diff options
context:
space:
mode:
authorSara Golemon <pollita@php.net>2003-07-07 22:27:32 +0000
committerSara Golemon <pollita@php.net>2003-07-07 22:27:32 +0000
commitacc587fdfa693cb3f21c518987c8b6400c227aa1 (patch)
treeb5c80e67d02950e950e9d38c5695ee92dcbeb698 /ext/sockets
parent3b2507b910cd64a1094bf5490a5fb0a4ed611760 (diff)
downloadphp-git-acc587fdfa693cb3f21c518987c8b6400c227aa1.tar.gz
Fix non-GNU build. Use getaddrinfo() rather than gethostbyname2()
Diffstat (limited to 'ext/sockets')
-rw-r--r--ext/sockets/sockets.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c
index 242956baa0..609e8974f9 100644
--- a/ext/sockets/sockets.c
+++ b/ext/sockets/sockets.c
@@ -378,12 +378,16 @@ static char *php_strerror(int error TSRMLS_DC)
static int php_set_inet6_addr(struct sockaddr_in6 *sin6, char *string, php_socket *php_sock TSRMLS_DC)
{
struct in6_addr tmp;
- struct hostent *host_entry;
+ struct addrinfo hints;
+ struct addrinfo *addrinfo = NULL;
if (inet_pton(AF_INET6, string, &tmp)) {
memcpy(&(sin6->sin6_addr.s6_addr), &(tmp.s6_addr), sizeof(struct in6_addr));
} else {
- if (! (host_entry = gethostbyname2(string, AF_INET6))) {
+ memset(&hints, 0, sizeof(struct addrinfo));
+ hints.ai_family = PF_INET6;
+ getaddrinfo(string, NULL, &hints, &addrinfo);
+ if (!addrinfo) {
#ifdef PHP_WIN32
PHP_SOCKET_ERROR(php_sock, "Host lookup failed", WSAGetLastError());
#else
@@ -391,11 +395,14 @@ static int php_set_inet6_addr(struct sockaddr_in6 *sin6, char *string, php_socke
#endif
return 0;
}
- if (host_entry->h_addrtype != AF_INET6) {
+ if (addrinfo->ai_family != PF_INET6 || addrinfo->ai_addrlen != sizeof(struct sockaddr_in6)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Host lookup failed: Non AF_INET6 domain returned on AF_INET6 socket");
+ freeaddrinfo(addrinfo);
return 0;
}
- memcpy(&(sin6->sin6_addr.s6_addr), host_entry->h_addr_list[0], host_entry->h_length);
+
+ memcpy(&(sin6->sin6_addr.s6_addr), ((struct sockaddr_in6*)(addrinfo->ai_addr))->sin6_addr.s6_addr, sizeof(struct in6_addr));
+ freeaddrinfo(addrinfo);
}
return 1;