summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Zhakov <ivan@apache.org>2023-02-06 13:03:08 +0000
committerIvan Zhakov <ivan@apache.org>2023-02-06 13:03:08 +0000
commit74d2332b35a3242f775bfadef02e22b39aed98cd (patch)
tree82c981961ba67f1fe920e78867be112965550305
parenta44de64ee6f32f1986004637f5d474b4e56192e6 (diff)
downloadapr-74d2332b35a3242f775bfadef02e22b39aed98cd.tar.gz
Merge r1866932 from trunk:
win32: Do not use TransmitFile directly. git-svn-id: https://svn.apache.org/repos/asf/apr/apr/branches/1.7.x@1907464 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--CHANGES3
-rw-r--r--CMakeLists.txt1
-rw-r--r--libapr.mak8
-rw-r--r--network_io/win32/sendrecv.c32
4 files changed, 32 insertions, 12 deletions
diff --git a/CHANGES b/CHANGES
index 2a77d4dfa..f4b83a38e 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,9 @@
-*- coding: utf-8 -*-
Changes for APR 1.7.3
+ *) apr_socket_sendfile: Use WSAIoctl() to get TransmitFile function
+ pointer on Windows.
+
Changes for APR 1.7.2
*) Correct a packaging issue in 1.7.1. The contents of the release were
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2b9c5d844..9acabc912 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -80,7 +80,6 @@ SET(APR_INCLUDE_DIRECTORIES
SET(APR_SYSTEM_LIBS
ws2_32
- mswsock
rpcrt4
)
diff --git a/libapr.mak b/libapr.mak
index e998aec28..75fcf705d 100644
--- a/libapr.mak
+++ b/libapr.mak
@@ -173,7 +173,7 @@ BSC32_FLAGS=/nologo /o"$(OUTDIR)\libapr.bsc"
BSC32_SBRS= \
LINK32=link.exe
-LINK32_FLAGS=kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib shell32.lib rpcrt4.lib /nologo /base:"0x6EEC0000" /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\libapr-1.pdb" /debug /out:"$(OUTDIR)\libapr-1.dll" /implib:"$(OUTDIR)\libapr-1.lib" /opt:ref
+LINK32_FLAGS=kernel32.lib advapi32.lib ws2_32.lib ole32.lib shell32.lib rpcrt4.lib /nologo /base:"0x6EEC0000" /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\libapr-1.pdb" /debug /out:"$(OUTDIR)\libapr-1.dll" /implib:"$(OUTDIR)\libapr-1.lib" /opt:ref
LINK32_OBJS= \
"$(INTDIR)\apr_atomic.obj" \
"$(INTDIR)\apr_atomic64.obj" \
@@ -417,7 +417,7 @@ BSC32_FLAGS=/nologo /o"$(OUTDIR)\libapr.bsc"
BSC32_SBRS= \
LINK32=link.exe
-LINK32_FLAGS=kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib shell32.lib rpcrt4.lib /nologo /base:"0x6EEC0000" /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\libapr-1.pdb" /debug /out:"$(OUTDIR)\libapr-1.dll" /implib:"$(OUTDIR)\libapr-1.lib"
+LINK32_FLAGS=kernel32.lib advapi32.lib ws2_32.lib ole32.lib shell32.lib rpcrt4.lib /nologo /base:"0x6EEC0000" /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\libapr-1.pdb" /debug /out:"$(OUTDIR)\libapr-1.dll" /implib:"$(OUTDIR)\libapr-1.lib"
LINK32_OBJS= \
"$(INTDIR)\apr_atomic.obj" \
"$(INTDIR)\apr_atomic64.obj" \
@@ -661,7 +661,7 @@ BSC32_FLAGS=/nologo /o"$(OUTDIR)\libapr.bsc"
BSC32_SBRS= \
LINK32=link.exe
-LINK32_FLAGS=kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib shell32.lib rpcrt4.lib /nologo /base:"0x6EEC0000" /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\libapr-1.pdb" /debug /out:"$(OUTDIR)\libapr-1.dll" /implib:"$(OUTDIR)\libapr-1.lib" /opt:ref
+LINK32_FLAGS=kernel32.lib advapi32.lib ws2_32.lib ole32.lib shell32.lib rpcrt4.lib /nologo /base:"0x6EEC0000" /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\libapr-1.pdb" /debug /out:"$(OUTDIR)\libapr-1.dll" /implib:"$(OUTDIR)\libapr-1.lib" /opt:ref
LINK32_OBJS= \
"$(INTDIR)\apr_atomic.obj" \
"$(INTDIR)\apr_atomic64.obj" \
@@ -905,7 +905,7 @@ BSC32_FLAGS=/nologo /o"$(OUTDIR)\libapr.bsc"
BSC32_SBRS= \
LINK32=link.exe
-LINK32_FLAGS=kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib shell32.lib rpcrt4.lib /nologo /base:"0x6EEC0000" /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\libapr-1.pdb" /debug /out:"$(OUTDIR)\libapr-1.dll" /implib:"$(OUTDIR)\libapr-1.lib"
+LINK32_FLAGS=kernel32.lib advapi32.lib ws2_32.lib ole32.lib shell32.lib rpcrt4.lib /nologo /base:"0x6EEC0000" /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\libapr-1.pdb" /debug /out:"$(OUTDIR)\libapr-1.dll" /implib:"$(OUTDIR)\libapr-1.lib"
LINK32_OBJS= \
"$(INTDIR)\apr_atomic.obj" \
"$(INTDIR)\apr_atomic64.obj" \
diff --git a/network_io/win32/sendrecv.c b/network_io/win32/sendrecv.c
index 6620e1382..4a01c0973 100644
--- a/network_io/win32/sendrecv.c
+++ b/network_io/win32/sendrecv.c
@@ -255,11 +255,29 @@ APR_DECLARE(apr_status_t) apr_socket_sendfile(apr_socket_t *sock,
int disconnected = 0;
int sendv_trailers = 0;
char hdtrbuf[4096];
+ LPFN_TRANSMITFILE pfn_transmit_file = NULL;
+ static GUID wsaid_transmitfile = WSAID_TRANSMITFILE;
+ DWORD dw;
if (apr_os_level < APR_WIN_NT) {
return APR_ENOTIMPL;
}
+ /* According to documentation TransmitFile() should not be used directly.
+ * Pointer to function should retrieved using WSAIoctl:
+ * https://docs.microsoft.com/en-gb/windows/win32/api/mswsock/nf-mswsock-transmitfile#remarks
+ */
+ if (WSAIoctl(sock->socketdes, SIO_GET_EXTENSION_FUNCTION_POINTER,
+ &wsaid_transmitfile, sizeof(wsaid_transmitfile),
+ &pfn_transmit_file, sizeof(pfn_transmit_file),
+ &dw, NULL, NULL) == SOCKET_ERROR) {
+ return apr_get_os_error();
+ }
+
+ if (dw != sizeof(pfn_transmit_file)) {
+ return APR_EINVAL;
+ }
+
/* Use len to keep track of number of total bytes sent (including headers) */
bytes_to_send = *len;
*len = 0;
@@ -351,13 +369,13 @@ APR_DECLARE(apr_status_t) apr_socket_sendfile(apr_socket_t *sock,
sock->overlapped->OffsetHigh = (DWORD)(curoff >> 32);
#endif
/* XXX BoundsChecker claims dwFlags must not be zero. */
- rv = TransmitFile(sock->socketdes, /* socket */
- file->filehand, /* open file descriptor of the file to be sent */
- xmitbytes, /* number of bytes to send. 0=send all */
- 0, /* Number of bytes per send. 0=use default */
- sock->overlapped, /* OVERLAPPED structure */
- ptfb, /* header and trailer buffers */
- dwFlags); /* flags to control various aspects of TransmitFile */
+ rv = pfn_transmit_file(sock->socketdes, /* socket */
+ file->filehand, /* open file descriptor of the file to be sent */
+ xmitbytes, /* number of bytes to send. 0=send all */
+ 0, /* Number of bytes per send. 0=use default */
+ sock->overlapped, /* OVERLAPPED structure */
+ ptfb, /* header and trailer buffers */
+ dwFlags); /* flags to control various aspects of TransmitFile */
if (!rv) {
status = apr_get_netos_error();
if ((status == APR_FROM_OS_ERROR(ERROR_IO_PENDING)) ||