diff options
author | Jeff Trawick <trawick@apache.org> | 2011-04-02 20:11:54 +0000 |
---|---|---|
committer | Jeff Trawick <trawick@apache.org> | 2011-04-02 20:11:54 +0000 |
commit | dcdcfbc1207f525b8ca1333107e83ce33a577607 (patch) | |
tree | 8161b22413db66591d6ccb8b73529aac89517e3a /network_io/win32 | |
parent | b73b04d64f6fb22ac433e63b11ea445c97049c49 (diff) | |
download | apr-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.c | 35 |
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; } |