|
Packit Service |
4684c1 |
#ifndef GNUTLS_TESTS_EAGAIN_COMMON_H
|
|
Packit Service |
4684c1 |
#define GNUTLS_TESTS_EAGAIN_COMMON_H
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#include <errno.h>
|
|
Packit Service |
4684c1 |
#include <time.h>
|
|
Packit Service |
4684c1 |
#include <stdio.h>
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#define min(x,y) ((x)<(y)?(x):(y))
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
extern const char *side;
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#ifdef USE_CMOCKA
|
|
Packit Service |
4684c1 |
# define failure() fail()
|
|
Packit Service |
4684c1 |
# define client_transfer_failure(r) {fprintf(stderr, "client transfer failure: %s\n", gnutls_strerror(r)); fail();}
|
|
Packit Service |
4684c1 |
# define server_transfer_failure(r) {fprintf(stderr, "server transfer failure: %s\n", gnutls_strerror(r)); fail();}
|
|
Packit Service |
4684c1 |
# define switch_side(str)
|
|
Packit Service |
4684c1 |
#else
|
|
Packit Service |
4684c1 |
# define failure() fail("Handshake failed\n")
|
|
Packit Service |
4684c1 |
# define client_transfer_failure(r) fail("client transfer failure: %s\n", gnutls_strerror(r))
|
|
Packit Service |
4684c1 |
# define server_transfer_failure(r) fail("client transfer failure: %s\n", gnutls_strerror(r))
|
|
Packit Service |
4684c1 |
# define switch_side(str) side = str
|
|
Packit Service |
4684c1 |
#endif
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#define HANDSHAKE_EXPECT(c, s, clierr, serverr) \
|
|
Packit Service |
4684c1 |
sret = cret = GNUTLS_E_AGAIN; \
|
|
Packit Service |
4684c1 |
do \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
if (cret == GNUTLS_E_AGAIN) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
switch_side("client"); \
|
|
Packit Service |
4684c1 |
cret = gnutls_handshake (c); \
|
|
Packit Service |
4684c1 |
if (cret == GNUTLS_E_INTERRUPTED) cret = GNUTLS_E_AGAIN; \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
if (sret == GNUTLS_E_AGAIN) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
switch_side("server"); \
|
|
Packit Service |
4684c1 |
sret = gnutls_handshake (s); \
|
|
Packit Service |
4684c1 |
if (sret == GNUTLS_E_INTERRUPTED) sret = GNUTLS_E_AGAIN; \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
while ((cret == GNUTLS_E_AGAIN || (cret == 0 && sret == GNUTLS_E_AGAIN)) && (sret == GNUTLS_E_AGAIN || (sret == 0 && cret == GNUTLS_E_AGAIN))); \
|
|
Packit Service |
4684c1 |
if ((clierr != -1 && cret != clierr) || (serverr != -1 && sret != serverr)) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
fprintf(stderr, "client[%d]: %s\n", cret, gnutls_strerror(cret)); \
|
|
Packit Service |
4684c1 |
fprintf(stderr, "server[%d]: %s\n", sret, gnutls_strerror(sret)); \
|
|
Packit Service |
4684c1 |
failure(); \
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#define HANDSHAKE(c, s) \
|
|
Packit Service |
4684c1 |
HANDSHAKE_EXPECT(c,s,0,0)
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#define HANDSHAKE_DTLS_EXPECT(c, s, clierr, serverr) \
|
|
Packit Service |
4684c1 |
sret = cret = GNUTLS_E_AGAIN; \
|
|
Packit Service |
4684c1 |
do \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
if (cret == GNUTLS_E_LARGE_PACKET) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
unsigned int mtu = gnutls_dtls_get_mtu(s); \
|
|
Packit Service |
4684c1 |
gnutls_dtls_set_mtu(s, mtu/2); \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
if (cret < 0 && gnutls_error_is_fatal(cret) == 0) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
switch_side("client"); \
|
|
Packit Service |
4684c1 |
cret = gnutls_handshake (c); \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
if (sret == GNUTLS_E_LARGE_PACKET) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
unsigned int mtu = gnutls_dtls_get_mtu(s); \
|
|
Packit Service |
4684c1 |
gnutls_dtls_set_mtu(s, mtu/2); \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
if (sret < 0 && gnutls_error_is_fatal(sret) == 0) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
switch_side("server"); \
|
|
Packit Service |
4684c1 |
sret = gnutls_handshake (s); \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
while (((gnutls_error_is_fatal(cret) == 0 && gnutls_error_is_fatal(sret) == 0)) && (cret < 0 || sret < 0)); \
|
|
Packit Service |
4684c1 |
if (cret != clierr || sret != serverr) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
fprintf(stderr, "client: %s\n", gnutls_strerror(cret)); \
|
|
Packit Service |
4684c1 |
fprintf(stderr, "server: %s\n", gnutls_strerror(sret)); \
|
|
Packit Service |
4684c1 |
failure(); \
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#define HANDSHAKE_DTLS(c, s) \
|
|
Packit Service |
4684c1 |
HANDSHAKE_DTLS_EXPECT(c,s,0,0)
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#define HANDSHAKE(c, s) \
|
|
Packit Service |
4684c1 |
HANDSHAKE_EXPECT(c,s,0,0)
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#define TRANSFER2(c, s, msg, msglen, buf, buflen, retry_send_with_null) { \
|
|
Packit Service |
4684c1 |
int _ret; \
|
|
Packit Service |
4684c1 |
switch_side("client"); \
|
|
Packit Service |
4684c1 |
_ret = record_send_loop (c, msg, msglen, retry_send_with_null); \
|
|
Packit Service |
4684c1 |
\
|
|
Packit Service |
4684c1 |
if (_ret < 0) client_transfer_failure(_ret); \
|
|
Packit Service |
4684c1 |
\
|
|
Packit Service |
4684c1 |
do \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
do \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
switch_side("server"); \
|
|
Packit Service |
4684c1 |
_ret = gnutls_record_recv (s, buf, buflen); \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
while(_ret == GNUTLS_E_AGAIN); \
|
|
Packit Service |
4684c1 |
if (_ret <= 0) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
server_transfer_failure(_ret); \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
else \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
transferred += _ret; \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
switch_side("server"); \
|
|
Packit Service |
4684c1 |
_ret = record_send_loop (server, msg, msglen, retry_send_with_null); \
|
|
Packit Service |
4684c1 |
if (_ret < 0) server_transfer_failure(_ret); \
|
|
Packit Service |
4684c1 |
do \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
switch_side("client"); \
|
|
Packit Service |
4684c1 |
_ret = gnutls_record_recv (client, buf, buflen); \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
while(_ret == GNUTLS_E_AGAIN); \
|
|
Packit Service |
4684c1 |
if (_ret <= 0) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
client_transfer_failure(_ret); \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
else \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
if (msglen != _ret || memcmp (buf, msg, msglen) != 0) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
failure(); \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
/* echo back */ \
|
|
Packit Service |
4684c1 |
switch_side("client"); \
|
|
Packit Service |
4684c1 |
_ret = record_send_loop (client, buf, msglen, retry_send_with_null); \
|
|
Packit Service |
4684c1 |
if (_ret < 0) client_transfer_failure(_ret); \
|
|
Packit Service |
4684c1 |
transferred += _ret; \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
while (transferred < 70000); \
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#define EMPTY_BUF(s, c, buf, buflen) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
switch_side("client"); int _ret = 0; \
|
|
Packit Service |
4684c1 |
while((_ret == GNUTLS_E_AGAIN && to_server_len > 0) || to_server_len > 0) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
switch_side("server"); \
|
|
Packit Service |
4684c1 |
_ret = gnutls_record_recv (s, buf, buflen); \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
if (_ret < 0 && _ret !=GNUTLS_E_AGAIN) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
server_transfer_failure(_ret); \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
switch_side("server"); _ret = 0; \
|
|
Packit Service |
4684c1 |
while((to_client_len > 0 && _ret == GNUTLS_E_AGAIN) || to_client_len > 0) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
switch_side("client"); \
|
|
Packit Service |
4684c1 |
_ret = gnutls_record_recv (client, buf, buflen); \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
if (_ret < 0 && _ret !=GNUTLS_E_AGAIN) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
client_transfer_failure(_ret); \
|
|
Packit Service |
4684c1 |
} \
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#define TRANSFER(c, s, msg, msglen, buf, buflen) \
|
|
Packit Service |
4684c1 |
TRANSFER2(c, s, msg, msglen, buf, buflen, 0); \
|
|
Packit Service |
4684c1 |
TRANSFER2(c, s, msg, msglen, buf, buflen, 1)
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
static char to_server[64 * 1024];
|
|
Packit Service |
4684c1 |
static size_t to_server_len = 0;
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
static char to_client[64 * 1024];
|
|
Packit Service |
4684c1 |
static size_t to_client_len = 0;
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#ifdef RANDOMIZE
|
|
Packit Service |
4684c1 |
#define RETURN_RND_EAGAIN(session) \
|
|
Packit Service |
4684c1 |
unsigned int rnd = time(0); \
|
|
Packit Service |
4684c1 |
if (rnd++ % 3 == 0) \
|
|
Packit Service |
4684c1 |
{ \
|
|
Packit Service |
4684c1 |
gnutls_transport_set_errno (session, EAGAIN); \
|
|
Packit Service |
4684c1 |
return -1; \
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
#else
|
|
Packit Service |
4684c1 |
#define RETURN_RND_EAGAIN(session)
|
|
Packit Service |
4684c1 |
#endif
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#ifndef IGNORE_PUSH
|
|
Packit Service |
4684c1 |
static ssize_t
|
|
Packit Service |
4684c1 |
client_push(gnutls_transport_ptr_t tr, const void *data, size_t len)
|
|
Packit Service |
4684c1 |
{
|
|
Packit Service |
4684c1 |
size_t newlen;
|
|
Packit Service |
4684c1 |
RETURN_RND_EAGAIN(tr);
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
len = min(len, sizeof(to_server) - to_server_len);
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
newlen = to_server_len + len;
|
|
Packit Service |
4684c1 |
memcpy(to_server + to_server_len, data, len);
|
|
Packit Service |
4684c1 |
to_server_len = newlen;
|
|
Packit Service |
4684c1 |
#ifdef EAGAIN_DEBUG
|
|
Packit Service |
4684c1 |
fprintf(stderr, "eagain: pushed %d bytes to server (avail: %d)\n",
|
|
Packit Service |
4684c1 |
(int) len, (int) to_server_len);
|
|
Packit Service |
4684c1 |
#endif
|
|
Packit Service |
4684c1 |
return len;
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#endif
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
static ssize_t
|
|
Packit Service |
4684c1 |
client_pull(gnutls_transport_ptr_t tr, void *data, size_t len)
|
|
Packit Service |
4684c1 |
{
|
|
Packit Service |
4684c1 |
RETURN_RND_EAGAIN(tr);
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
if (to_client_len == 0) {
|
|
Packit Service |
4684c1 |
#ifdef EAGAIN_DEBUG
|
|
Packit Service |
4684c1 |
fprintf(stderr,
|
|
Packit Service |
4684c1 |
"eagain: Not enough data by server (asked for: %d, have: %d)\n",
|
|
Packit Service |
4684c1 |
(int) len, (int) to_client_len);
|
|
Packit Service |
4684c1 |
#endif
|
|
Packit Service |
4684c1 |
gnutls_transport_set_errno((gnutls_session_t) tr, EAGAIN);
|
|
Packit Service |
4684c1 |
return -1;
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
len = min(len, to_client_len);
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
memcpy(data, to_client, len);
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
memmove(to_client, to_client + len, to_client_len - len);
|
|
Packit Service |
4684c1 |
to_client_len -= len;
|
|
Packit Service |
4684c1 |
#ifdef EAGAIN_DEBUG
|
|
Packit Service |
4684c1 |
fprintf(stderr, "eagain: pulled %d bytes by client (avail: %d)\n",
|
|
Packit Service |
4684c1 |
(int) len, (int) to_client_len);
|
|
Packit Service |
4684c1 |
#endif
|
|
Packit Service |
4684c1 |
return len;
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
static ssize_t
|
|
Packit Service |
4684c1 |
server_pull(gnutls_transport_ptr_t tr, void *data, size_t len)
|
|
Packit Service |
4684c1 |
{
|
|
Packit Service |
4684c1 |
//success ("server_pull len %d has %d\n", len, to_server_len);
|
|
Packit Service |
4684c1 |
RETURN_RND_EAGAIN(tr);
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
if (to_server_len == 0) {
|
|
Packit Service |
4684c1 |
#ifdef EAGAIN_DEBUG
|
|
Packit Service |
4684c1 |
fprintf(stderr,
|
|
Packit Service |
4684c1 |
"eagain: Not enough data by client (asked for: %d, have: %d)\n",
|
|
Packit Service |
4684c1 |
(int) len, (int) to_server_len);
|
|
Packit Service |
4684c1 |
#endif
|
|
Packit Service |
4684c1 |
gnutls_transport_set_errno((gnutls_session_t) tr, EAGAIN);
|
|
Packit Service |
4684c1 |
return -1;
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
len = min(len, to_server_len);
|
|
Packit Service |
4684c1 |
#ifdef EAGAIN_DEBUG
|
|
Packit Service |
4684c1 |
fprintf(stderr, "eagain: pulled %d bytes by server (avail: %d)\n",
|
|
Packit Service |
4684c1 |
(int) len, (int) to_server_len);
|
|
Packit Service |
4684c1 |
#endif
|
|
Packit Service |
4684c1 |
memcpy(data, to_server, len);
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
memmove(to_server, to_server + len, to_server_len - len);
|
|
Packit Service |
4684c1 |
to_server_len -= len;
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
return len;
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#ifndef IGNORE_PUSH
|
|
Packit Service |
4684c1 |
static ssize_t
|
|
Packit Service |
4684c1 |
server_push(gnutls_transport_ptr_t tr, const void *data, size_t len)
|
|
Packit Service |
4684c1 |
{
|
|
Packit Service |
4684c1 |
size_t newlen;
|
|
Packit Service |
4684c1 |
RETURN_RND_EAGAIN(tr);
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
// hexprint (data, len);
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
len = min(len, sizeof(to_client) - to_client_len);
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
newlen = to_client_len + len;
|
|
Packit Service |
4684c1 |
memcpy(to_client + to_client_len, data, len);
|
|
Packit Service |
4684c1 |
to_client_len = newlen;
|
|
Packit Service |
4684c1 |
#ifdef EAGAIN_DEBUG
|
|
Packit Service |
4684c1 |
fprintf(stderr, "eagain: pushed %d bytes to client (avail: %d)\n",
|
|
Packit Service |
4684c1 |
(int) len, (int) to_client_len);
|
|
Packit Service |
4684c1 |
#endif
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#ifdef SERVER_PUSH_ADD
|
|
Packit Service |
4684c1 |
SERVER_PUSH_ADD
|
|
Packit Service |
4684c1 |
#endif
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
return len;
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#endif
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
/* inline is used to avoid a gcc warning if used in mini-eagain */
|
|
Packit Service |
4684c1 |
inline static int server_pull_timeout_func(gnutls_transport_ptr_t ptr,
|
|
Packit Service |
4684c1 |
unsigned int ms)
|
|
Packit Service |
4684c1 |
{
|
|
Packit Service |
4684c1 |
int ret;
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
if (to_server_len > 0)
|
|
Packit Service |
4684c1 |
ret = 1; /* available data */
|
|
Packit Service |
4684c1 |
else
|
|
Packit Service |
4684c1 |
ret = 0; /* timeout */
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#ifdef EAGAIN_DEBUG
|
|
Packit Service |
4684c1 |
fprintf(stderr,
|
|
Packit Service |
4684c1 |
"eagain: server_pull_timeout: %d (avail: cli %d, serv %d)\n",
|
|
Packit Service |
4684c1 |
ret, (int) to_client_len, (int) to_server_len);
|
|
Packit Service |
4684c1 |
#endif
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
return ret;
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
inline static int client_pull_timeout_func(gnutls_transport_ptr_t ptr,
|
|
Packit Service |
4684c1 |
unsigned int ms)
|
|
Packit Service |
4684c1 |
{
|
|
Packit Service |
4684c1 |
int ret;
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
if (to_client_len > 0)
|
|
Packit Service |
4684c1 |
ret = 1;
|
|
Packit Service |
4684c1 |
else
|
|
Packit Service |
4684c1 |
ret = 0;
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#ifdef EAGAIN_DEBUG
|
|
Packit Service |
4684c1 |
fprintf(stderr,
|
|
Packit Service |
4684c1 |
"eagain: client_pull_timeout: %d (avail: cli %d, serv %d)\n",
|
|
Packit Service |
4684c1 |
ret, (int) to_client_len, (int) to_server_len);
|
|
Packit Service |
4684c1 |
#endif
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
return ret;
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
inline static void reset_buffers(void)
|
|
Packit Service |
4684c1 |
{
|
|
Packit Service |
4684c1 |
to_server_len = 0;
|
|
Packit Service |
4684c1 |
to_client_len = 0;
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
inline static int record_send_loop(gnutls_session_t session,
|
|
Packit Service |
4684c1 |
const void *data, size_t sizeofdata,
|
|
Packit Service |
4684c1 |
int use_null_on_retry)
|
|
Packit Service |
4684c1 |
{
|
|
Packit Service |
4684c1 |
int ret;
|
|
Packit Service |
4684c1 |
const void *retry_data;
|
|
Packit Service |
4684c1 |
size_t retry_sizeofdata;
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
if (use_null_on_retry) {
|
|
Packit Service |
4684c1 |
retry_data = 0;
|
|
Packit Service |
4684c1 |
retry_sizeofdata = 0;
|
|
Packit Service |
4684c1 |
} else {
|
|
Packit Service |
4684c1 |
retry_data = data;
|
|
Packit Service |
4684c1 |
retry_sizeofdata = sizeofdata;
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
ret = gnutls_record_send(session, data, sizeofdata);
|
|
Packit Service |
4684c1 |
while (ret == GNUTLS_E_AGAIN) {
|
|
Packit Service |
4684c1 |
ret =
|
|
Packit Service |
4684c1 |
gnutls_record_send(session, retry_data,
|
|
Packit Service |
4684c1 |
retry_sizeofdata);
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
return ret;
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#endif /* GNUTLS_TESTS_EAGAIN_COMMON_H */
|