diff options
Diffstat (limited to 'file_io/win32/readwrite.c')
-rw-r--r-- | file_io/win32/readwrite.c | 63 |
1 files changed, 48 insertions, 15 deletions
diff --git a/file_io/win32/readwrite.c b/file_io/win32/readwrite.c index 701bec75b..fa4a23fbe 100644 --- a/file_io/win32/readwrite.c +++ b/file_io/win32/readwrite.c @@ -20,10 +20,12 @@ #include "apr_strings.h" #include "apr_lib.h" #include "apr_errno.h" -#include <malloc.h> +#include "apr_arch_networkio.h" #include "apr_arch_atime.h" #include "apr_arch_misc.h" +#include <malloc.h> + /* * read_with_timeout() * Uses async i/o to emulate unix non-blocking i/o with timeouts. @@ -40,7 +42,7 @@ static apr_status_t read_with_timeout(apr_file_t *file, void *buf, apr_size_t le /* Peek at the pipe. If there is no data available, return APR_EAGAIN. * If data is available, go ahead and read it. */ - if (file->pipe) { + if (file->ftype == APR_FILETYPE_PIPE) { DWORD bytes; if (!PeekNamedPipe(file->filehand, NULL, 0, NULL, &bytes, NULL)) { rv = apr_get_os_error(); @@ -68,13 +70,28 @@ static apr_status_t read_with_timeout(apr_file_t *file, void *buf, apr_size_t le } } - if (file->pOverlapped && !file->pipe) { + if (file->pOverlapped && file->ftype == APR_FILETYPE_FILE) { file->pOverlapped->Offset = (DWORD)file->filePtr; file->pOverlapped->OffsetHigh = (DWORD)(file->filePtr >> 32); } - if (ReadFile(file->filehand, buf, len, - &bytesread, file->pOverlapped)) { + if (file->ftype == APR_FILETYPE_SOCKET) { + WSABUF wsaData; + DWORD flags = 0; + + wsaData.buf = (char*) buf; + wsaData.len = (u_long)len; + if (WSARecv((SOCKET)file->filehand, &wsaData, 1, &bytesread, + &flags, NULL, NULL) == SOCKET_ERROR) { + rv = apr_get_netos_error(); + bytesread = 0; + } + else { + rv = APR_SUCCESS; + } + } + else if (ReadFile(file->filehand, buf, len, + &bytesread, file->pOverlapped)) { rv = APR_SUCCESS; } else { @@ -133,7 +150,7 @@ static apr_status_t read_with_timeout(apr_file_t *file, void *buf, apr_size_t le if (rv == APR_SUCCESS && bytesread == 0) rv = APR_EOF; - if (rv == APR_SUCCESS && file->pOverlapped && !file->pipe) { + if (rv == APR_SUCCESS && file->pOverlapped && file->ftype == APR_FILETYPE_FILE) { file->filePtr += bytesread; } *nbytes = bytesread; @@ -246,7 +263,7 @@ APR_DECLARE(apr_status_t) apr_file_read(apr_file_t *thefile, void *buf, apr_size APR_DECLARE(apr_status_t) apr_file_write(apr_file_t *thefile, const void *buf, apr_size_t *nbytes) { apr_status_t rv; - DWORD bwrote; + DWORD bwrote = 0; /* If the file is open for xthread support, allocate and * initialize the overlapped and io completion event (hEvent). @@ -298,9 +315,29 @@ APR_DECLARE(apr_status_t) apr_file_write(apr_file_t *thefile, const void *buf, a if (thefile->flags & APR_FOPEN_XTHREAD) { apr_thread_mutex_unlock(thefile->mutex); } - return rv; - } else { - if (!thefile->pipe) { + } + else if (thefile->ftype == APR_FILETYPE_SOCKET) { + WSABUF wsaData; + DWORD flags = 0; + + wsaData.buf = (char*) buf; + wsaData.len = (u_long)*nbytes; + if (WSASend((SOCKET)file->filehand, &wsaData, 1, &bwrote, + flags, NULL, NULL) == SOCKET_ERROR) { + rv = apr_get_netos_error(); + bwrote = 0; + } + else { + rv = APR_SUCCESS; + } + *nbytes = bwrote; + } + else { + if (thefile->ftype != APR_FILETYPE_FILE) { + rv = WriteFile(thefile->filehand, buf, (DWORD)*nbytes, &bwrote, + thefile->pOverlapped); + } + else { apr_off_t offset = 0; apr_status_t rc; if (thefile->append) { @@ -332,10 +369,6 @@ APR_DECLARE(apr_status_t) apr_file_write(apr_file_t *thefile, const void *buf, a apr_thread_mutex_unlock(thefile->mutex); } } - else { - rv = WriteFile(thefile->filehand, buf, (DWORD)*nbytes, &bwrote, - thefile->pOverlapped); - } if (rv) { *nbytes = bwrote; rv = APR_SUCCESS; @@ -382,7 +415,7 @@ APR_DECLARE(apr_status_t) apr_file_write(apr_file_t *thefile, const void *buf, a } } } - if (rv == APR_SUCCESS && thefile->pOverlapped && !thefile->pipe) { + if (rv == APR_SUCCESS && thefile->pOverlapped && thefile->ftype == APR_FILETYPE_FILE) { thefile->filePtr += *nbytes; } } |