mirror of
https://github.com/php/php-src.git
synced 2025-08-16 22:18:50 +02:00
Detect and enable IPv6 support under win32.
The ws2tcpip.h header links to IPv6 functions dynamically and the generated binary will run on win98 and later.
This commit is contained in:
parent
190d8e85b5
commit
dbb152b96a
7 changed files with 54 additions and 30 deletions
|
@ -714,7 +714,7 @@ ftp_pasv(ftpbuf_t *ftp, int pasv)
|
||||||
memset(&ftp->pasvaddr, 0, n);
|
memset(&ftp->pasvaddr, 0, n);
|
||||||
sa = (struct sockaddr *) &ftp->pasvaddr;
|
sa = (struct sockaddr *) &ftp->pasvaddr;
|
||||||
|
|
||||||
#ifdef HAVE_IPV6
|
#if HAVE_IPV6
|
||||||
if (getpeername(ftp->fd, sa, &n) < 0) {
|
if (getpeername(ftp->fd, sa, &n) < 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1454,7 +1454,7 @@ ftp_getdata(ftpbuf_t *ftp TSRMLS_DC)
|
||||||
|
|
||||||
data->listener = fd;
|
data->listener = fd;
|
||||||
|
|
||||||
#ifdef HAVE_IPV6
|
#if HAVE_IPV6
|
||||||
if (sa->sa_family == AF_INET6) {
|
if (sa->sa_family == AF_INET6) {
|
||||||
/* need to use EPRT */
|
/* need to use EPRT */
|
||||||
char eprtarg[INET6_ADDRSTRLEN + sizeof("|x||xxxxx|")];
|
char eprtarg[INET6_ADDRSTRLEN + sizeof("|x||xxxxx|")];
|
||||||
|
|
|
@ -357,12 +357,12 @@ static char *php_strerror(int error TSRMLS_DC)
|
||||||
return (buf ? (char *) buf : "");
|
return (buf ? (char *) buf : "");
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_IPV6
|
#if HAVE_IPV6
|
||||||
/* Sets addr by hostname, or by ip in string form (AF_INET6) */
|
/* Sets addr by hostname, or by ip in string form (AF_INET6) */
|
||||||
static int php_set_inet6_addr(struct sockaddr_in6 *sin6, char *string, php_socket *php_sock 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 in6_addr tmp;
|
||||||
#ifdef HAVE_GETADDRINFO
|
#if HAVE_GETADDRINFO
|
||||||
struct addrinfo hints;
|
struct addrinfo hints;
|
||||||
struct addrinfo *addrinfo = NULL;
|
struct addrinfo *addrinfo = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
@ -370,7 +370,7 @@ static int php_set_inet6_addr(struct sockaddr_in6 *sin6, char *string, php_socke
|
||||||
if (inet_pton(AF_INET6, string, &tmp)) {
|
if (inet_pton(AF_INET6, string, &tmp)) {
|
||||||
memcpy(&(sin6->sin6_addr.s6_addr), &(tmp.s6_addr), sizeof(struct in6_addr));
|
memcpy(&(sin6->sin6_addr.s6_addr), &(tmp.s6_addr), sizeof(struct in6_addr));
|
||||||
} else {
|
} else {
|
||||||
#ifdef HAVE_GETADDRINFO
|
#if HAVE_GETADDRINFO
|
||||||
|
|
||||||
memset(&hints, 0, sizeof(struct addrinfo));
|
memset(&hints, 0, sizeof(struct addrinfo));
|
||||||
hints.ai_family = PF_INET6;
|
hints.ai_family = PF_INET6;
|
||||||
|
@ -450,7 +450,7 @@ PHP_MINIT_FUNCTION(sockets)
|
||||||
|
|
||||||
REGISTER_LONG_CONSTANT("AF_UNIX", AF_UNIX, CONST_CS | CONST_PERSISTENT);
|
REGISTER_LONG_CONSTANT("AF_UNIX", AF_UNIX, CONST_CS | CONST_PERSISTENT);
|
||||||
REGISTER_LONG_CONSTANT("AF_INET", AF_INET, CONST_CS | CONST_PERSISTENT);
|
REGISTER_LONG_CONSTANT("AF_INET", AF_INET, CONST_CS | CONST_PERSISTENT);
|
||||||
#ifdef HAVE_IPV6
|
#if HAVE_IPV6
|
||||||
REGISTER_LONG_CONSTANT("AF_INET6", AF_INET6, CONST_CS | CONST_PERSISTENT);
|
REGISTER_LONG_CONSTANT("AF_INET6", AF_INET6, CONST_CS | CONST_PERSISTENT);
|
||||||
#endif
|
#endif
|
||||||
REGISTER_LONG_CONSTANT("SOCK_STREAM", SOCK_STREAM, CONST_CS | CONST_PERSISTENT);
|
REGISTER_LONG_CONSTANT("SOCK_STREAM", SOCK_STREAM, CONST_CS | CONST_PERSISTENT);
|
||||||
|
@ -871,7 +871,7 @@ PHP_FUNCTION(socket_getsockname)
|
||||||
php_socket *php_sock;
|
php_socket *php_sock;
|
||||||
struct sockaddr *sa;
|
struct sockaddr *sa;
|
||||||
struct sockaddr_in *sin;
|
struct sockaddr_in *sin;
|
||||||
#ifdef HAVE_IPV6
|
#if HAVE_IPV6
|
||||||
struct sockaddr_in6 *sin6;
|
struct sockaddr_in6 *sin6;
|
||||||
char addr6[INET6_ADDRSTRLEN+1];
|
char addr6[INET6_ADDRSTRLEN+1];
|
||||||
#endif
|
#endif
|
||||||
|
@ -892,7 +892,7 @@ PHP_FUNCTION(socket_getsockname)
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (sa->sa_family) {
|
switch (sa->sa_family) {
|
||||||
#ifdef HAVE_IPV6
|
#if HAVE_IPV6
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
sin6 = (struct sockaddr_in6 *) sa;
|
sin6 = (struct sockaddr_in6 *) sa;
|
||||||
inet_ntop(AF_INET6, &sin6->sin6_addr, addr6, INET6_ADDRSTRLEN);
|
inet_ntop(AF_INET6, &sin6->sin6_addr, addr6, INET6_ADDRSTRLEN);
|
||||||
|
@ -947,7 +947,7 @@ PHP_FUNCTION(socket_getpeername)
|
||||||
php_socket *php_sock;
|
php_socket *php_sock;
|
||||||
struct sockaddr *sa;
|
struct sockaddr *sa;
|
||||||
struct sockaddr_in *sin;
|
struct sockaddr_in *sin;
|
||||||
#ifdef HAVE_IPV6
|
#if HAVE_IPV6
|
||||||
struct sockaddr_in6 *sin6;
|
struct sockaddr_in6 *sin6;
|
||||||
char addr6[INET6_ADDRSTRLEN+1];
|
char addr6[INET6_ADDRSTRLEN+1];
|
||||||
#endif
|
#endif
|
||||||
|
@ -968,7 +968,7 @@ PHP_FUNCTION(socket_getpeername)
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (sa->sa_family) {
|
switch (sa->sa_family) {
|
||||||
#ifdef HAVE_IPV6
|
#if HAVE_IPV6
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
sin6 = (struct sockaddr_in6 *) sa;
|
sin6 = (struct sockaddr_in6 *) sa;
|
||||||
inet_ntop(AF_INET6, &sin6->sin6_addr, addr6, INET6_ADDRSTRLEN);
|
inet_ntop(AF_INET6, &sin6->sin6_addr, addr6, INET6_ADDRSTRLEN);
|
||||||
|
@ -1029,7 +1029,7 @@ PHP_FUNCTION(socket_create)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (arg1 != AF_UNIX
|
if (arg1 != AF_UNIX
|
||||||
#ifdef HAVE_IPV6
|
#if HAVE_IPV6
|
||||||
&& arg1 != AF_INET6
|
&& arg1 != AF_INET6
|
||||||
#endif
|
#endif
|
||||||
&& arg1 != AF_INET) {
|
&& arg1 != AF_INET) {
|
||||||
|
@ -1063,7 +1063,7 @@ PHP_FUNCTION(socket_connect)
|
||||||
zval *arg1;
|
zval *arg1;
|
||||||
php_socket *php_sock;
|
php_socket *php_sock;
|
||||||
struct sockaddr_in sin;
|
struct sockaddr_in sin;
|
||||||
#ifdef HAVE_IPV6
|
#if HAVE_IPV6
|
||||||
struct sockaddr_in6 sin6;
|
struct sockaddr_in6 sin6;
|
||||||
#endif
|
#endif
|
||||||
struct sockaddr_un s_un;
|
struct sockaddr_un s_un;
|
||||||
|
@ -1078,7 +1078,7 @@ PHP_FUNCTION(socket_connect)
|
||||||
ZEND_FETCH_RESOURCE(php_sock, php_socket *, &arg1, -1, le_socket_name, le_socket);
|
ZEND_FETCH_RESOURCE(php_sock, php_socket *, &arg1, -1, le_socket_name, le_socket);
|
||||||
|
|
||||||
switch(php_sock->type) {
|
switch(php_sock->type) {
|
||||||
#ifdef HAVE_IPV6
|
#if HAVE_IPV6
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
if (argc != 3) {
|
if (argc != 3) {
|
||||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Socket of type AF_INET6 requires 3 arguments");
|
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Socket of type AF_INET6 requires 3 arguments");
|
||||||
|
@ -1189,7 +1189,7 @@ PHP_FUNCTION(socket_bind)
|
||||||
retval = bind(php_sock->bsd_socket, (struct sockaddr *)sa, sizeof(struct sockaddr_in));
|
retval = bind(php_sock->bsd_socket, (struct sockaddr *)sa, sizeof(struct sockaddr_in));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#ifdef HAVE_IPV6
|
#if HAVE_IPV6
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
{
|
{
|
||||||
struct sockaddr_in6 *sa = (struct sockaddr_in6 *) sock_type;
|
struct sockaddr_in6 *sa = (struct sockaddr_in6 *) sock_type;
|
||||||
|
@ -1298,7 +1298,7 @@ PHP_FUNCTION(socket_recvfrom)
|
||||||
php_socket *php_sock;
|
php_socket *php_sock;
|
||||||
struct sockaddr_un s_un;
|
struct sockaddr_un s_un;
|
||||||
struct sockaddr_in sin;
|
struct sockaddr_in sin;
|
||||||
#ifdef HAVE_IPV6
|
#if HAVE_IPV6
|
||||||
struct sockaddr_in6 sin6;
|
struct sockaddr_in6 sin6;
|
||||||
char addr6[INET6_ADDRSTRLEN];
|
char addr6[INET6_ADDRSTRLEN];
|
||||||
#endif
|
#endif
|
||||||
|
@ -1361,7 +1361,7 @@ PHP_FUNCTION(socket_recvfrom)
|
||||||
ZVAL_STRING(arg5, address ? address : "0.0.0.0", 1);
|
ZVAL_STRING(arg5, address ? address : "0.0.0.0", 1);
|
||||||
ZVAL_LONG(arg6, ntohs(sin.sin_port));
|
ZVAL_LONG(arg6, ntohs(sin.sin_port));
|
||||||
break;
|
break;
|
||||||
#ifdef HAVE_IPV6
|
#if HAVE_IPV6
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
slen = sizeof(sin6);
|
slen = sizeof(sin6);
|
||||||
memset(&sin6, 0, slen);
|
memset(&sin6, 0, slen);
|
||||||
|
@ -1407,7 +1407,7 @@ PHP_FUNCTION(socket_sendto)
|
||||||
php_socket *php_sock;
|
php_socket *php_sock;
|
||||||
struct sockaddr_un s_un;
|
struct sockaddr_un s_un;
|
||||||
struct sockaddr_in sin;
|
struct sockaddr_in sin;
|
||||||
#ifdef HAVE_IPV6
|
#if HAVE_IPV6
|
||||||
struct sockaddr_in6 sin6;
|
struct sockaddr_in6 sin6;
|
||||||
#endif
|
#endif
|
||||||
int retval, buf_len, addr_len;
|
int retval, buf_len, addr_len;
|
||||||
|
@ -1445,7 +1445,7 @@ PHP_FUNCTION(socket_sendto)
|
||||||
|
|
||||||
retval = sendto(php_sock->bsd_socket, buf, (len > buf_len) ? buf_len : len, flags, (struct sockaddr *) &sin, sizeof(sin));
|
retval = sendto(php_sock->bsd_socket, buf, (len > buf_len) ? buf_len : len, flags, (struct sockaddr *) &sin, sizeof(sin));
|
||||||
break;
|
break;
|
||||||
#ifdef HAVE_IPV6
|
#if HAVE_IPV6
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
if (argc != 6) {
|
if (argc != 6) {
|
||||||
WRONG_PARAM_COUNT;
|
WRONG_PARAM_COUNT;
|
||||||
|
@ -1647,7 +1647,7 @@ PHP_FUNCTION(socket_create_pair)
|
||||||
php_sock[1] = (php_socket*)emalloc(sizeof(php_socket));
|
php_sock[1] = (php_socket*)emalloc(sizeof(php_socket));
|
||||||
|
|
||||||
if (domain != AF_INET
|
if (domain != AF_INET
|
||||||
#ifdef HAVE_IPV6
|
#if HAVE_IPV6
|
||||||
&& domain != AF_INET6
|
&& domain != AF_INET6
|
||||||
#endif
|
#endif
|
||||||
&& domain != AF_UNIX) {
|
&& domain != AF_UNIX) {
|
||||||
|
|
|
@ -467,6 +467,11 @@ PHPAPI void php_print_info(int flag TSRMLS_DC)
|
||||||
php_info_print_table_row(2, "Thread Safety", "disabled" );
|
php_info_print_table_row(2, "Thread Safety", "disabled" );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_IPV6
|
||||||
|
php_info_print_table_row(2, "IPv6 Support", "enabled" );
|
||||||
|
#else
|
||||||
|
php_info_print_table_row(2, "IPv6 Support", "disabled" );
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
HashTable *url_stream_wrappers_hash;
|
HashTable *url_stream_wrappers_hash;
|
||||||
char *stream_protocol, *stream_protocols_buf = NULL;
|
char *stream_protocol, *stream_protocols_buf = NULL;
|
||||||
|
|
|
@ -103,7 +103,7 @@ int inet_aton(const char *, struct in_addr *);
|
||||||
# define PHP_TIMEOUT_ERROR_VALUE ETIMEDOUT
|
# define PHP_TIMEOUT_ERROR_VALUE ETIMEDOUT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_GETADDRINFO
|
#if HAVE_GETADDRINFO
|
||||||
#ifdef HAVE_GAI_STRERROR
|
#ifdef HAVE_GAI_STRERROR
|
||||||
# define PHP_GAI_STRERROR(x) (gai_strerror(x))
|
# define PHP_GAI_STRERROR(x) (gai_strerror(x))
|
||||||
#else
|
#else
|
||||||
|
@ -168,7 +168,7 @@ static int php_network_getaddresses(const char *host, int socktype, struct socka
|
||||||
{
|
{
|
||||||
struct sockaddr **sap;
|
struct sockaddr **sap;
|
||||||
int n;
|
int n;
|
||||||
#ifdef HAVE_GETADDRINFO
|
#if HAVE_GETADDRINFO
|
||||||
static int ipv6_borked = -1; /* the way this is used *is* thread safe */
|
static int ipv6_borked = -1; /* the way this is used *is* thread safe */
|
||||||
struct addrinfo hints, *res, *sai;
|
struct addrinfo hints, *res, *sai;
|
||||||
#else
|
#else
|
||||||
|
@ -179,13 +179,13 @@ static int php_network_getaddresses(const char *host, int socktype, struct socka
|
||||||
if (host == NULL) {
|
if (host == NULL) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#ifdef HAVE_GETADDRINFO
|
#if HAVE_GETADDRINFO
|
||||||
memset(&hints, '\0', sizeof(hints));
|
memset(&hints, '\0', sizeof(hints));
|
||||||
|
|
||||||
hints.ai_family = AF_INET; /* default to regular inet (see below) */
|
hints.ai_family = AF_INET; /* default to regular inet (see below) */
|
||||||
hints.ai_socktype = socktype;
|
hints.ai_socktype = socktype;
|
||||||
|
|
||||||
# ifdef HAVE_IPV6
|
# if HAVE_IPV6
|
||||||
/* probe for a working IPv6 stack; even if detected as having v6 at compile
|
/* probe for a working IPv6 stack; even if detected as having v6 at compile
|
||||||
* time, at runtime some stacks are slow to resolve or have other issues
|
* time, at runtime some stacks are slow to resolve or have other issues
|
||||||
* if they are not correctly configured.
|
* if they are not correctly configured.
|
||||||
|
@ -488,7 +488,7 @@ PHPAPI int php_network_parse_network_address_with_port(const char *addr, long ad
|
||||||
struct sockaddr **psal;
|
struct sockaddr **psal;
|
||||||
int n;
|
int n;
|
||||||
char *errstr = NULL;
|
char *errstr = NULL;
|
||||||
#ifdef HAVE_IPV6
|
#if HAVE_IPV6
|
||||||
struct sockaddr_in6 *in6 = (struct sockaddr_in6*)sa;
|
struct sockaddr_in6 *in6 = (struct sockaddr_in6*)sa;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -860,7 +860,7 @@ PHPAPI void php_any_addr(int family, php_sockaddr_storage *addr, unsigned short
|
||||||
{
|
{
|
||||||
memset(addr, 0, sizeof(php_sockaddr_storage));
|
memset(addr, 0, sizeof(php_sockaddr_storage));
|
||||||
switch (family) {
|
switch (family) {
|
||||||
#ifdef HAVE_IPV6
|
#if HAVE_IPV6
|
||||||
case AF_INET6: {
|
case AF_INET6: {
|
||||||
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) addr;
|
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) addr;
|
||||||
sin6->sin6_family = AF_INET6;
|
sin6->sin6_family = AF_INET6;
|
||||||
|
@ -888,7 +888,7 @@ PHPAPI int php_sockaddr_size(php_sockaddr_storage *addr)
|
||||||
switch (((struct sockaddr *)addr)->sa_family) {
|
switch (((struct sockaddr *)addr)->sa_family) {
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
return sizeof(struct sockaddr_in);
|
return sizeof(struct sockaddr_in);
|
||||||
#ifdef HAVE_IPV6
|
#if HAVE_IPV6
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
return sizeof(struct sockaddr_in6);
|
return sizeof(struct sockaddr_in6);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -27,7 +27,12 @@
|
||||||
# endif
|
# endif
|
||||||
# undef FD_SETSIZE
|
# undef FD_SETSIZE
|
||||||
# include "arpa/inet.h"
|
# include "arpa/inet.h"
|
||||||
# define socklen_t unsigned int
|
# if HAVE_WS2TCPIP_H
|
||||||
|
/* IPv6 stuff, also defines socklen_t */
|
||||||
|
# include <ws2tcpip.h>
|
||||||
|
# else
|
||||||
|
typedef unsigned int socklen_t;
|
||||||
|
# endif
|
||||||
#else
|
#else
|
||||||
# undef closesocket
|
# undef closesocket
|
||||||
# define closesocket close
|
# define closesocket close
|
||||||
|
|
|
@ -181,3 +181,17 @@ ADD_SOURCES("regex", "regcomp.c regerror.c regexec.c regfree.c");
|
||||||
|
|
||||||
STDOUT.WriteBlankLines(1);
|
STDOUT.WriteBlankLines(1);
|
||||||
|
|
||||||
|
/* Can we build with IPv6 support? */
|
||||||
|
ARG_ENABLE("ipv6", "Disable IPv6 support (default is turn it on if available)", "yes");
|
||||||
|
|
||||||
|
var main_network_has_ipv6 = 0;
|
||||||
|
if (PHP_IPV6 == "yes") {
|
||||||
|
main_network_has_ipv6 = CHECK_HEADER_ADD_INCLUDE("ws2tcpip.h", "CFLAGS") ? 1 : 0;
|
||||||
|
}
|
||||||
|
if (main_network_has_ipv6) {
|
||||||
|
STDOUT.WriteLine("Enabling IPv6 support");
|
||||||
|
}
|
||||||
|
AC_DEFINE('HAVE_GETADDRINFO', main_network_has_ipv6);
|
||||||
|
AC_DEFINE('HAVE_GAI_STRERROR', main_network_has_ipv6);
|
||||||
|
AC_DEFINE('HAVE_IPV6', main_network_has_ipv6);
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
+----------------------------------------------------------------------+
|
+----------------------------------------------------------------------+
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// $Id: confutils.js,v 1.17 2003-12-05 02:41:00 wez Exp $
|
// $Id: confutils.js,v 1.18 2003-12-06 00:00:31 wez Exp $
|
||||||
|
|
||||||
var STDOUT = WScript.StdOut;
|
var STDOUT = WScript.StdOut;
|
||||||
var STDERR = WScript.StdErr;
|
var STDERR = WScript.StdErr;
|
||||||
|
@ -427,14 +427,14 @@ function CHECK_HEADER_ADD_INCLUDE(header_name, flag_name, path_to_check, use_env
|
||||||
|
|
||||||
if (typeof(p) == "string") {
|
if (typeof(p) == "string") {
|
||||||
ADD_FLAG(flag_name, '/I "' + p + '" ');
|
ADD_FLAG(flag_name, '/I "' + p + '" ');
|
||||||
have = 1;
|
|
||||||
} else if (p == false) {
|
} else if (p == false) {
|
||||||
/* not found in the defaults or the explicit paths,
|
/* not found in the defaults or the explicit paths,
|
||||||
* so check the general extra includes; if we find
|
* so check the general extra includes; if we find
|
||||||
* it here, no need to add another /I for it as we
|
* it here, no need to add another /I for it as we
|
||||||
* already have it covered */
|
* already have it covered */
|
||||||
p = search_paths(header_name, PHP_EXTRA_INCLUDES, null);
|
p = search_paths(header_name, PHP_EXTRA_INCLUDES, null);
|
||||||
}
|
}
|
||||||
|
have = p ? 1 : 0
|
||||||
|
|
||||||
sym = header_name.toUpperCase();
|
sym = header_name.toUpperCase();
|
||||||
sym = sym.replace(new RegExp("[\\\\/\.-]", "g"), "_");
|
sym = sym.replace(new RegExp("[\\\\/\.-]", "g"), "_");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue