diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2014-03-02 10:37:05 +0100 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2014-03-02 10:37:05 +0100 |
commit | 078e3914e824bc143324a57d508990ebecdadea5 (patch) | |
tree | c8d36bad79e21b5b6a9f0d0ed70c887287391e99 /src/common.h | |
parent | f01323ba1700c2c3ae80c8dc61aaeed1fc40b426 (diff) | |
download | gnutls-078e3914e824bc143324a57d508990ebecdadea5.tar.gz |
replace select() on windows
Diffstat (limited to 'src/common.h')
-rw-r--r-- | src/common.h | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/src/common.h b/src/common.h index 927c175987..37912ecc43 100644 --- a/src/common.h +++ b/src/common.h @@ -34,6 +34,7 @@ #ifdef _WIN32 #include <io.h> #include <winbase.h> +#include <sys/select.h> #undef OCSP_RESPONSE #endif @@ -68,18 +69,23 @@ pin_callback(void *user, int attempt, const char *token_url, void pkcs11_common(void); #ifdef _WIN32 -# include <errno.h> -static int neterrno(void) +static int system_recv_timeout(gnutls_transport_ptr_t ptr, unsigned int ms) { -int err = WSAGetLastError(); - - if (err == WSAEWOULDBLOCK) - return EAGAIN; - else if (err == WSAEINTR) - return EINTR; - else if (err == WSAEINPROGRESS) - return EINPROGRESS; - return 0; + fd_set rfds; + struct timeval tv; + int ret, fd = (long)ptr; + + FD_ZERO(&rfds); + FD_SET(fd, &rfds); + + tv.tv_sec = 0; + tv.tv_usec = ms * 1000; + while (tv.tv_usec >= 1000000) { + tv.tv_usec -= 1000000; + tv.tv_sec++; + } + + return select(fd + 1, &rfds, NULL, NULL, &tv); } static ssize_t @@ -99,8 +105,7 @@ void set_read_funcs(gnutls_session_t session) { gnutls_transport_set_push_function(session, system_write); gnutls_transport_set_pull_function(session, system_read); - gnutls_transport_set_errno_function(session, neterrno); - + gnutls_transport_set_pull_timeout_function(session, system_recv_timeout); } #else # define set_read_funcs(x) |