mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +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);
|
||||
sa = (struct sockaddr *) &ftp->pasvaddr;
|
||||
|
||||
#ifdef HAVE_IPV6
|
||||
#if HAVE_IPV6
|
||||
if (getpeername(ftp->fd, sa, &n) < 0) {
|
||||
return 0;
|
||||
}
|
||||
|
@ -1454,7 +1454,7 @@ ftp_getdata(ftpbuf_t *ftp TSRMLS_DC)
|
|||
|
||||
data->listener = fd;
|
||||
|
||||
#ifdef HAVE_IPV6
|
||||
#if HAVE_IPV6
|
||||
if (sa->sa_family == AF_INET6) {
|
||||
/* need to use EPRT */
|
||||
char eprtarg[INET6_ADDRSTRLEN + sizeof("|x||xxxxx|")];
|
||||
|
|
|
@ -357,12 +357,12 @@ static char *php_strerror(int error TSRMLS_DC)
|
|||
return (buf ? (char *) buf : "");
|
||||
}
|
||||
|
||||
#ifdef HAVE_IPV6
|
||||
#if HAVE_IPV6
|
||||
/* 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)
|
||||
{
|
||||
struct in6_addr tmp;
|
||||
#ifdef HAVE_GETADDRINFO
|
||||
#if HAVE_GETADDRINFO
|
||||
struct addrinfo hints;
|
||||
struct addrinfo *addrinfo = NULL;
|
||||
#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)) {
|
||||
memcpy(&(sin6->sin6_addr.s6_addr), &(tmp.s6_addr), sizeof(struct in6_addr));
|
||||
} else {
|
||||
#ifdef HAVE_GETADDRINFO
|
||||
#if HAVE_GETADDRINFO
|
||||
|
||||
memset(&hints, 0, sizeof(struct addrinfo));
|
||||
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_INET", AF_INET, CONST_CS | CONST_PERSISTENT);
|
||||
#ifdef HAVE_IPV6
|
||||
#if HAVE_IPV6
|
||||
REGISTER_LONG_CONSTANT("AF_INET6", AF_INET6, CONST_CS | CONST_PERSISTENT);
|
||||
#endif
|
||||
REGISTER_LONG_CONSTANT("SOCK_STREAM", SOCK_STREAM, CONST_CS | CONST_PERSISTENT);
|
||||
|
@ -871,7 +871,7 @@ PHP_FUNCTION(socket_getsockname)
|
|||
php_socket *php_sock;
|
||||
struct sockaddr *sa;
|
||||
struct sockaddr_in *sin;
|
||||
#ifdef HAVE_IPV6
|
||||
#if HAVE_IPV6
|
||||
struct sockaddr_in6 *sin6;
|
||||
char addr6[INET6_ADDRSTRLEN+1];
|
||||
#endif
|
||||
|
@ -892,7 +892,7 @@ PHP_FUNCTION(socket_getsockname)
|
|||
}
|
||||
|
||||
switch (sa->sa_family) {
|
||||
#ifdef HAVE_IPV6
|
||||
#if HAVE_IPV6
|
||||
case AF_INET6:
|
||||
sin6 = (struct sockaddr_in6 *) sa;
|
||||
inet_ntop(AF_INET6, &sin6->sin6_addr, addr6, INET6_ADDRSTRLEN);
|
||||
|
@ -947,7 +947,7 @@ PHP_FUNCTION(socket_getpeername)
|
|||
php_socket *php_sock;
|
||||
struct sockaddr *sa;
|
||||
struct sockaddr_in *sin;
|
||||
#ifdef HAVE_IPV6
|
||||
#if HAVE_IPV6
|
||||
struct sockaddr_in6 *sin6;
|
||||
char addr6[INET6_ADDRSTRLEN+1];
|
||||
#endif
|
||||
|
@ -968,7 +968,7 @@ PHP_FUNCTION(socket_getpeername)
|
|||
}
|
||||
|
||||
switch (sa->sa_family) {
|
||||
#ifdef HAVE_IPV6
|
||||
#if HAVE_IPV6
|
||||
case AF_INET6:
|
||||
sin6 = (struct sockaddr_in6 *) sa;
|
||||
inet_ntop(AF_INET6, &sin6->sin6_addr, addr6, INET6_ADDRSTRLEN);
|
||||
|
@ -1029,7 +1029,7 @@ PHP_FUNCTION(socket_create)
|
|||
}
|
||||
|
||||
if (arg1 != AF_UNIX
|
||||
#ifdef HAVE_IPV6
|
||||
#if HAVE_IPV6
|
||||
&& arg1 != AF_INET6
|
||||
#endif
|
||||
&& arg1 != AF_INET) {
|
||||
|
@ -1063,7 +1063,7 @@ PHP_FUNCTION(socket_connect)
|
|||
zval *arg1;
|
||||
php_socket *php_sock;
|
||||
struct sockaddr_in sin;
|
||||
#ifdef HAVE_IPV6
|
||||
#if HAVE_IPV6
|
||||
struct sockaddr_in6 sin6;
|
||||
#endif
|
||||
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);
|
||||
|
||||
switch(php_sock->type) {
|
||||
#ifdef HAVE_IPV6
|
||||
#if HAVE_IPV6
|
||||
case AF_INET6:
|
||||
if (argc != 3) {
|
||||
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));
|
||||
break;
|
||||
}
|
||||
#ifdef HAVE_IPV6
|
||||
#if HAVE_IPV6
|
||||
case AF_INET6:
|
||||
{
|
||||
struct sockaddr_in6 *sa = (struct sockaddr_in6 *) sock_type;
|
||||
|
@ -1298,7 +1298,7 @@ PHP_FUNCTION(socket_recvfrom)
|
|||
php_socket *php_sock;
|
||||
struct sockaddr_un s_un;
|
||||
struct sockaddr_in sin;
|
||||
#ifdef HAVE_IPV6
|
||||
#if HAVE_IPV6
|
||||
struct sockaddr_in6 sin6;
|
||||
char addr6[INET6_ADDRSTRLEN];
|
||||
#endif
|
||||
|
@ -1361,7 +1361,7 @@ PHP_FUNCTION(socket_recvfrom)
|
|||
ZVAL_STRING(arg5, address ? address : "0.0.0.0", 1);
|
||||
ZVAL_LONG(arg6, ntohs(sin.sin_port));
|
||||
break;
|
||||
#ifdef HAVE_IPV6
|
||||
#if HAVE_IPV6
|
||||
case AF_INET6:
|
||||
slen = sizeof(sin6);
|
||||
memset(&sin6, 0, slen);
|
||||
|
@ -1407,7 +1407,7 @@ PHP_FUNCTION(socket_sendto)
|
|||
php_socket *php_sock;
|
||||
struct sockaddr_un s_un;
|
||||
struct sockaddr_in sin;
|
||||
#ifdef HAVE_IPV6
|
||||
#if HAVE_IPV6
|
||||
struct sockaddr_in6 sin6;
|
||||
#endif
|
||||
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));
|
||||
break;
|
||||
#ifdef HAVE_IPV6
|
||||
#if HAVE_IPV6
|
||||
case AF_INET6:
|
||||
if (argc != 6) {
|
||||
WRONG_PARAM_COUNT;
|
||||
|
@ -1647,7 +1647,7 @@ PHP_FUNCTION(socket_create_pair)
|
|||
php_sock[1] = (php_socket*)emalloc(sizeof(php_socket));
|
||||
|
||||
if (domain != AF_INET
|
||||
#ifdef HAVE_IPV6
|
||||
#if HAVE_IPV6
|
||||
&& domain != AF_INET6
|
||||
#endif
|
||||
&& 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" );
|
||||
#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;
|
||||
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
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_GETADDRINFO
|
||||
#if HAVE_GETADDRINFO
|
||||
#ifdef HAVE_GAI_STRERROR
|
||||
# define PHP_GAI_STRERROR(x) (gai_strerror(x))
|
||||
#else
|
||||
|
@ -168,7 +168,7 @@ static int php_network_getaddresses(const char *host, int socktype, struct socka
|
|||
{
|
||||
struct sockaddr **sap;
|
||||
int n;
|
||||
#ifdef HAVE_GETADDRINFO
|
||||
#if HAVE_GETADDRINFO
|
||||
static int ipv6_borked = -1; /* the way this is used *is* thread safe */
|
||||
struct addrinfo hints, *res, *sai;
|
||||
#else
|
||||
|
@ -179,13 +179,13 @@ static int php_network_getaddresses(const char *host, int socktype, struct socka
|
|||
if (host == NULL) {
|
||||
return 0;
|
||||
}
|
||||
#ifdef HAVE_GETADDRINFO
|
||||
#if HAVE_GETADDRINFO
|
||||
memset(&hints, '\0', sizeof(hints));
|
||||
|
||||
hints.ai_family = AF_INET; /* default to regular inet (see below) */
|
||||
hints.ai_socktype = socktype;
|
||||
|
||||
# ifdef HAVE_IPV6
|
||||
# if HAVE_IPV6
|
||||
/* 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
|
||||
* 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;
|
||||
int n;
|
||||
char *errstr = NULL;
|
||||
#ifdef HAVE_IPV6
|
||||
#if HAVE_IPV6
|
||||
struct sockaddr_in6 *in6 = (struct sockaddr_in6*)sa;
|
||||
#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));
|
||||
switch (family) {
|
||||
#ifdef HAVE_IPV6
|
||||
#if HAVE_IPV6
|
||||
case AF_INET6: {
|
||||
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) addr;
|
||||
sin6->sin6_family = AF_INET6;
|
||||
|
@ -888,7 +888,7 @@ PHPAPI int php_sockaddr_size(php_sockaddr_storage *addr)
|
|||
switch (((struct sockaddr *)addr)->sa_family) {
|
||||
case AF_INET:
|
||||
return sizeof(struct sockaddr_in);
|
||||
#ifdef HAVE_IPV6
|
||||
#if HAVE_IPV6
|
||||
case AF_INET6:
|
||||
return sizeof(struct sockaddr_in6);
|
||||
#endif
|
||||
|
|
|
@ -27,7 +27,12 @@
|
|||
# endif
|
||||
# undef FD_SETSIZE
|
||||
# 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
|
||||
# undef closesocket
|
||||
# define closesocket close
|
||||
|
|
|
@ -181,3 +181,17 @@ ADD_SOURCES("regex", "regcomp.c regerror.c regexec.c regfree.c");
|
|||
|
||||
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 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") {
|
||||
ADD_FLAG(flag_name, '/I "' + p + '" ');
|
||||
have = 1;
|
||||
} else if (p == false) {
|
||||
/* not found in the defaults or the explicit paths,
|
||||
* so check the general extra includes; if we find
|
||||
* it here, no need to add another /I for it as we
|
||||
* already have it covered */
|
||||
p = search_paths(header_name, PHP_EXTRA_INCLUDES, null);
|
||||
}
|
||||
}
|
||||
have = p ? 1 : 0
|
||||
|
||||
sym = header_name.toUpperCase();
|
||||
sym = sym.replace(new RegExp("[\\\\/\.-]", "g"), "_");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue