summaryrefslogtreecommitdiff
path: root/network_io/win32
diff options
context:
space:
mode:
authorJeff Trawick <trawick@apache.org>2011-04-02 20:11:54 +0000
committerJeff Trawick <trawick@apache.org>2011-04-02 20:11:54 +0000
commitdcdcfbc1207f525b8ca1333107e83ce33a577607 (patch)
tree8161b22413db66591d6ccb8b73529aac89517e3a /network_io/win32
parentb73b04d64f6fb22ac433e63b11ea445c97049c49 (diff)
downloadapr-dcdcfbc1207f525b8ca1333107e83ce33a577607.tar.gz
apr_socket_wait() for Windows
git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1088103 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'network_io/win32')
-rw-r--r--network_io/win32/sendrecv.c35
1 files changed, 34 insertions, 1 deletions
diff --git a/network_io/win32/sendrecv.c b/network_io/win32/sendrecv.c
index 0fb11add5..61bc20746 100644
--- a/network_io/win32/sendrecv.c
+++ b/network_io/win32/sendrecv.c
@@ -457,6 +457,39 @@ APR_DECLARE(apr_status_t) apr_socket_sendfile(apr_socket_t *sock,
APR_DECLARE(apr_status_t) apr_socket_wait(apr_socket_t *sock, apr_wait_type_t direction)
{
- return APR_ENOTIMPL;
+ fd_set fdset, *rptr, *wptr;
+ int rc;
+ struct timeval tv, *tvptr;
+
+ FD_ZERO(&fdset);
+ FD_SET(sock->socketdes, &fdset);
+
+ if (direction == APR_WAIT_READ) {
+ rptr = &fdset;
+ wptr = NULL;
+ }
+ else { /* APR_WAIT_WRITE */
+ rptr = NULL;
+ wptr = &fdset;
+ }
+
+ if (sock->timeout < 0) {
+ tvptr = NULL;
+ }
+ else {
+ /* casts for winsock/timeval definition */
+ tv.tv_sec = (long)apr_time_sec(sock->timeout);
+ tv.tv_usec = (int)apr_time_usec(sock->timeout);
+ tvptr = &tv;
+ }
+ rc = select(/* ignored */ FD_SETSIZE+1, rptr, wptr, NULL, tvptr);
+ if (rc == SOCKET_ERROR) {
+ return apr_get_netos_error();
+ }
+ else if (!rc) {
+ return APR_FROM_OS_ERROR(WSAETIMEDOUT);
+ }
+
+ return APR_SUCCESS;
}