Fixed possible issues with EAGAIN on Windows.

This commit is contained in:
Vincent Richard 2014-02-26 19:10:40 +01:00
parent 86eae80b68
commit a2708e745c
2 changed files with 16 additions and 12 deletions

View File

@ -59,12 +59,13 @@ shared_ptr <TLSSocket> TLSSocket::wrap(shared_ptr <TLSSession> session, shared_p
TLSSocket_GnuTLS::TLSSocket_GnuTLS(shared_ptr <TLSSession_GnuTLS> session, shared_ptr <socket> sok) TLSSocket_GnuTLS::TLSSocket_GnuTLS(shared_ptr <TLSSession_GnuTLS> session, shared_ptr <socket> sok)
: m_session(session), m_wrapped(sok), m_connected(false), : m_session(session), m_wrapped(sok), m_connected(false),
m_ex(NULL), m_status(0) m_ex(NULL), m_status(0), m_errno(0)
{ {
gnutls_transport_set_ptr(*m_session->m_gnutlsSession, this); gnutls_transport_set_ptr(*m_session->m_gnutlsSession, this);
gnutls_transport_set_push_function(*m_session->m_gnutlsSession, gnutlsPushFunc); gnutls_transport_set_push_function(*m_session->m_gnutlsSession, gnutlsPushFunc);
gnutls_transport_set_pull_function(*m_session->m_gnutlsSession, gnutlsPullFunc); gnutls_transport_set_pull_function(*m_session->m_gnutlsSession, gnutlsPullFunc);
gnutls_transport_set_errno_function(*m_session->m_gnutlsSession, gnutlsErrnoFunc);
} }
@ -308,7 +309,6 @@ void TLSSocket_GnuTLS::handshake()
else if (ret == GNUTLS_E_INTERRUPTED) else if (ret == GNUTLS_E_INTERRUPTED)
{ {
// Non-fatal error // Non-fatal error
m_wrapped->waitForRead();
} }
else else
{ {
@ -339,6 +339,13 @@ void TLSSocket_GnuTLS::handshake()
} }
int TLSSocket_GnuTLS::gnutlsErrnoFunc(gnutls_transport_ptr trspt)
{
TLSSocket_GnuTLS* sok = reinterpret_cast <TLSSocket_GnuTLS*>(trspt);
return sok->m_errno;
}
ssize_t TLSSocket_GnuTLS::gnutlsPushFunc ssize_t TLSSocket_GnuTLS::gnutlsPushFunc
(gnutls_transport_ptr trspt, const void* data, size_t len) (gnutls_transport_ptr trspt, const void* data, size_t len)
{ {
@ -352,11 +359,8 @@ ssize_t TLSSocket_GnuTLS::gnutlsPushFunc
if (ret == 0) if (ret == 0)
{ {
if (sok->m_wrapped->getStatus() & socket::STATUS_WOULDBLOCK) gnutls_transport_set_errno(*sok->m_session->m_gnutlsSession, EAGAIN);
gnutls_transport_set_errno(*sok->m_session->m_gnutlsSession, EAGAIN); sok->m_errno = EAGAIN;
else
gnutls_transport_set_errno(*sok->m_session->m_gnutlsSession, 0);
return -1; return -1;
} }
@ -385,11 +389,8 @@ ssize_t TLSSocket_GnuTLS::gnutlsPullFunc
if (n == 0) if (n == 0)
{ {
if (sok->m_wrapped->getStatus() & socket::STATUS_WOULDBLOCK) gnutls_transport_set_errno(*sok->m_session->m_gnutlsSession, EAGAIN);
gnutls_transport_set_errno(*sok->m_session->m_gnutlsSession, EAGAIN); sok->m_errno = EAGAIN;
else
gnutls_transport_set_errno(*sok->m_session->m_gnutlsSession, 0);
return -1; return -1;
} }

View File

@ -90,9 +90,11 @@ private:
#ifdef LIBGNUTLS_VERSION #ifdef LIBGNUTLS_VERSION
static ssize_t gnutlsPushFunc(gnutls_transport_ptr trspt, const void* data, size_t len); static ssize_t gnutlsPushFunc(gnutls_transport_ptr trspt, const void* data, size_t len);
static ssize_t gnutlsPullFunc(gnutls_transport_ptr trspt, void* data, size_t len); static ssize_t gnutlsPullFunc(gnutls_transport_ptr trspt, void* data, size_t len);
static int gnutlsErrnoFunc(gnutls_transport_ptr trspt);
#else #else
static int gnutlsPushFunc(void* trspt, const void* data, size_t len); static int gnutlsPushFunc(void* trspt, const void* data, size_t len);
static int gnutlsPullFunc(void* trspt, void* data, size_t len); static int gnutlsPullFunc(void* trspt, void* data, size_t len);
static int gnutlsErrnoFunc(void* trspt);
#endif // LIBGNUTLS_VERSION #endif // LIBGNUTLS_VERSION
@ -106,6 +108,7 @@ private:
exception* m_ex; exception* m_ex;
unsigned int m_status; unsigned int m_status;
int m_errno;
}; };