summaryrefslogtreecommitdiff
path: root/srclib/apr/network_io/win32
diff options
context:
space:
mode:
Diffstat (limited to 'srclib/apr/network_io/win32')
-rw-r--r--srclib/apr/network_io/win32/sendrecv.c3
-rw-r--r--srclib/apr/network_io/win32/sockets.c9
-rw-r--r--srclib/apr/network_io/win32/sockopt.c25
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