diff options
Diffstat (limited to 'srclib/apr/network_io/win32')
-rw-r--r-- | srclib/apr/network_io/win32/sendrecv.c | 3 | ||||
-rw-r--r-- | srclib/apr/network_io/win32/sockets.c | 9 | ||||
-rw-r--r-- | srclib/apr/network_io/win32/sockopt.c | 25 |
3 files changed, 32 insertions, 5 deletions
diff --git a/srclib/apr/network_io/win32/sendrecv.c b/srclib/apr/network_io/win32/sendrecv.c index 80adccdd..3fa0c8dd 100644 --- a/srclib/apr/network_io/win32/sendrecv.c +++ b/srclib/apr/network_io/win32/sendrecv.c @@ -210,6 +210,7 @@ APR_DECLARE(apr_status_t) apr_socket_recvfrom(apr_sockaddr_t *from, } +#if APR_HAS_SENDFILE static apr_status_t collapse_iovec(char **off, apr_size_t *len, struct iovec *iovec, int numvec, char *buf, apr_size_t buflen) @@ -240,7 +241,6 @@ static apr_status_t collapse_iovec(char **off, apr_size_t *len, } -#if APR_HAS_SENDFILE /* * apr_status_t apr_socket_sendfile(apr_socket_t *, apr_file_t *, apr_hdtr_t *, * apr_off_t *, apr_size_t *, apr_int32_t flags) @@ -266,7 +266,6 @@ APR_DECLARE(apr_status_t) apr_socket_sendfile(apr_socket_t *sock, DWORD dwFlags = 0; apr_size_t nbytes; TRANSMIT_FILE_BUFFERS tfb, *ptfb = NULL; - int ptr = 0; apr_size_t bytes_to_send; /* Bytes to send out of the file (not including headers) */ int disconnected = 0; int sendv_trailers = 0; diff --git a/srclib/apr/network_io/win32/sockets.c b/srclib/apr/network_io/win32/sockets.c index 88a362f7..1ed58d09 100644 --- a/srclib/apr/network_io/win32/sockets.c +++ b/srclib/apr/network_io/win32/sockets.c @@ -51,6 +51,12 @@ static void set_socket_vars(apr_socket_t *sock, int family, int type, int protoc sock->protocol = protocol; apr_sockaddr_vars_set(sock->local_addr, family, 0); apr_sockaddr_vars_set(sock->remote_addr, family, 0); +#if APR_HAVE_IPV6 + /* hard-coded behavior for older Windows IPv6 */ + if (apr_os_level < APR_WIN_VISTA && family == AF_INET6) { + apr_set_option(sock, APR_IPV6_V6ONLY, 1); + } +#endif } static void alloc_socket(apr_socket_t **new, apr_pool_t *p) { @@ -81,7 +87,9 @@ APR_DECLARE(apr_status_t) apr_socket_create(apr_socket_t **new, int family, int type, int protocol, apr_pool_t *cont) { +#if APR_HAVE_IPV6 int downgrade = (family == AF_UNSPEC); +#endif if (family == AF_UNSPEC) { #if APR_HAVE_IPV6 @@ -251,6 +259,7 @@ APR_DECLARE(apr_status_t) apr_socket_accept(apr_socket_t **new, (*new)->remote_addr->salen = sizeof((*new)->remote_addr->sa); memcpy (&(*new)->remote_addr->sa, &sa, salen); *(*new)->local_addr = *sock->local_addr; + (*new)->remote_addr_unknown = 0; /* The above assignment just overwrote the pool entry. Setting the local_addr pool for the accepted socket back to what it should be. Otherwise all diff --git a/srclib/apr/network_io/win32/sockopt.c b/srclib/apr/network_io/win32/sockopt.c index c8e670fa..5914dfa8 100644 --- a/srclib/apr/network_io/win32/sockopt.c +++ b/srclib/apr/network_io/win32/sockopt.c @@ -15,12 +15,21 @@ */ #include "apr_arch_networkio.h" +#include "apr_arch_misc.h" /* apr_os_level */ #include "apr_network_io.h" #include "apr_general.h" #include "apr_strings.h" #include <string.h> -apr_status_t soblock(SOCKET sd) +/* IPV6_V6ONLY is missing from pre-Windows 2008 SDK as well as MinGW + * (at least up through 1.0.16). + * Runtime support is a separate issue. + */ +#ifndef IPV6_V6ONLY +#define IPV6_V6ONLY 27 +#endif + +static apr_status_t soblock(SOCKET sd) { u_long zero = 0; @@ -30,7 +39,7 @@ apr_status_t soblock(SOCKET sd) return APR_SUCCESS; } -apr_status_t sononblock(SOCKET sd) +static apr_status_t sononblock(SOCKET sd) { u_long one = 1; @@ -195,7 +204,17 @@ APR_DECLARE(apr_status_t) apr_socket_opt_set(apr_socket_t *sock, } break; case APR_IPV6_V6ONLY: -#if APR_HAVE_IPV6 && defined(IPV6_V6ONLY) +#if APR_HAVE_IPV6 + if (apr_os_level < APR_WIN_VISTA && + sock->local_addr->family == AF_INET6) { + /* apr_set_option() called at socket creation */ + if (on) { + return APR_SUCCESS; + } + else { + return APR_ENOTIMPL; + } + } /* we don't know the initial setting of this option, * so don't check sock->options since that optimization * won't work |