summaryrefslogtreecommitdiff
path: root/ext/sockets
diff options
context:
space:
mode:
authorSara Golemon <pollita@php.net>2003-07-08 03:38:00 +0000
committerSara Golemon <pollita@php.net>2003-07-08 03:38:00 +0000
commit010f5a12c7017f7325141e0a30aa9f3b41e95f4c (patch)
tree9c211b1a5becf114d607c6024aed24c243ffca18 /ext/sockets
parent61b47cdaf021d08a6443d89f4f09150ad583459c (diff)
downloadphp-git-010f5a12c7017f7325141e0a30aa9f3b41e95f4c.tar.gz
Make php_set_inet6_addr happy with any environment. Use getaddrinfo() if available, gethostbyname2() if not, and simply fail if neither is present.
Diffstat (limited to 'ext/sockets')
-rw-r--r--ext/sockets/config.m43
-rw-r--r--ext/sockets/sockets.c29
2 files changed, 32 insertions, 0 deletions
diff --git a/ext/sockets/config.m4 b/ext/sockets/config.m4
index 1509dd80cb..e88b54ecda 100644
--- a/ext/sockets/config.m4
+++ b/ext/sockets/config.m4
@@ -30,3 +30,6 @@ if test "$PHP_SOCKETS" != "no"; then
PHP_NEW_EXTENSION([sockets], [sockets.c], [$ext_shared])
fi
+
+PHP_CHECK_FUNC(gethostbyname2)
+
diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c
index 609e8974f9..5421195739 100644
--- a/ext/sockets/sockets.c
+++ b/ext/sockets/sockets.c
@@ -378,12 +378,18 @@ 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;
+#ifdef HAVE_GETADDRINFO
struct addrinfo hints;
struct addrinfo *addrinfo = NULL;
+#elif defined(HAVE_GETHOSTBYNAME2)
+ struct hostent *host_entry;
+#endif
if (inet_pton(AF_INET6, string, &tmp)) {
memcpy(&(sin6->sin6_addr.s6_addr), &(tmp.s6_addr), sizeof(struct in6_addr));
} else {
+#ifdef HAVE_GETADDRINFO
+
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = PF_INET6;
getaddrinfo(string, NULL, &hints, &addrinfo);
@@ -403,6 +409,29 @@ static int php_set_inet6_addr(struct sockaddr_in6 *sin6, char *string, php_socke
memcpy(&(sin6->sin6_addr.s6_addr), ((struct sockaddr_in6*)(addrinfo->ai_addr))->sin6_addr.s6_addr, sizeof(struct in6_addr));
freeaddrinfo(addrinfo);
+
+#elif defined(HAVE_GETHOSTBYNAME2)
+
+ if (! (host_entry = gethostbyname2(string, AF_INET6))) {
+#ifdef PHP_WIN32
+ PHP_SOCKET_ERROR(php_sock, "Host lookup failed", WSAGetLastError());
+#else
+ PHP_SOCKET_ERROR(php_sock, "Host lookup failed", (-10000 - h_errno));
+#endif
+ return 0;
+ }
+ if (host_entry->h_addrtype != AF_INET6) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Host lookup failed: Non AF_INET6 domain returned on AF_INET6 socket");
+ return 0;
+ }
+ memcpy(&(sin6->sin6_addr.s6_addr), host_entry->h_addr_list[0], host_entry->h_length);
+
+#else
+ /* No IPv6 specific hostname resolution is available on this system? */
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "No IPv6 compatable hostname resolution available on system.");
+ reurn 0;
+#endif
+
}
return 1;