}
timeout:
- RETURN_DTLS_EAGAIN_OR_TIMEOUT(session);
+ RETURN_DTLS_EAGAIN_OR_TIMEOUT(session, 0);
}
/* This is a receive function for the gnutls handshake
if (buf != NULL)
gnutls_free(buf);
- RETURN_DTLS_EAGAIN_OR_TIMEOUT(session);
+ RETURN_DTLS_EAGAIN_OR_TIMEOUT(session, ret);
}
/* Waits for the last flight or retransmits
ret = _dtls_retransmit(session);
if (ret == 0)
{
- RETURN_DTLS_EAGAIN_OR_TIMEOUT(session);
+ RETURN_DTLS_EAGAIN_OR_TIMEOUT(session, 0);
}
else
return gnutls_assert_val(ret);
(b->tv_sec * 1000 + b->tv_nsec / (1000 * 1000)));
}
-#define RETURN_DTLS_EAGAIN_OR_TIMEOUT(session) { \
+#define RETURN_DTLS_EAGAIN_OR_TIMEOUT(session, r) { \
struct timespec now; \
unsigned int diff; \
gettime(&now); \
} \
else \
{ \
+ int rr; \
+ if (r != GNUTLS_E_INTERRUPTED) rr = GNUTLS_E_AGAIN; \
+ else rr = r; \
if (session->internals.dtls.blocking != 0) \
millisleep(50); \
- return gnutls_assert_val(GNUTLS_E_AGAIN); \
+ return gnutls_assert_val(rr); \
} \
}
if (IS_DTLS(session) && ret != GNUTLS_E_REHANDSHAKE)
{
_mbuffer_xfree(&bufel);
- RETURN_DTLS_EAGAIN_OR_TIMEOUT(session);
+ RETURN_DTLS_EAGAIN_OR_TIMEOUT(session, ret);
}
cleanup: