1
#define min(x,y) ((x)<(y)?(x):(y))
4
#define HANDSHAKE_EXPECT(c, s, clierr, serverr) \
5
sret = cret = GNUTLS_E_AGAIN; \
8
if (cret == GNUTLS_E_AGAIN) \
10
cret = gnutls_handshake (c); \
12
if (sret == GNUTLS_E_AGAIN) \
14
sret = gnutls_handshake (s); \
17
while ((cret == GNUTLS_E_AGAIN || (cret == 0 && sret == GNUTLS_E_AGAIN)) && (sret == GNUTLS_E_AGAIN || (sret == 0 && cret == GNUTLS_E_AGAIN))); \
18
if (cret != clierr || sret != serverr) \
20
fprintf(stderr, "client: %s\n", gnutls_strerror(cret)); \
21
fprintf(stderr, "server: %s\n", gnutls_strerror(sret)); \
22
fail("Handshake failed\n"); \
26
#define HANDSHAKE(c, s) \
27
HANDSHAKE_EXPECT(c,s,0,0)
29
#define TRANSFER(c, s, msg, msglen, buf, buflen) \
32
ret = gnutls_record_send (c, msg, msglen); \
34
while(ret == GNUTLS_E_AGAIN); \
39
ret = gnutls_record_recv (s, buf, buflen); \
41
while(ret == GNUTLS_E_AGAIN); \
43
fail ("server: didn't receive any data\n"); \
46
fail ("server: error: %s\n", gnutls_strerror (ret)); \
54
ns = gnutls_record_send (server, msg, msglen); \
56
while (ns == GNUTLS_E_AGAIN); \
59
ret = gnutls_record_recv (client, buf, buflen); \
61
while(ret == GNUTLS_E_AGAIN); \
64
fail ("client: Peer has closed the TLS connection\n"); \
69
fputs ("!", stdout); \
70
fail ("client: Error: %s\n", gnutls_strerror (ret)); \
74
if (msglen != ret || memcmp (buf, msg, msglen) != 0) \
76
fail ("client: Transmitted data do not match\n"); \
81
ns = gnutls_record_send (client, buf, msglen); \
83
while (ns == GNUTLS_E_AGAIN); \
86
fputs (".", stdout); \
89
while (transferred < 70000)
92
static char to_server[64*1024];
93
static size_t to_server_len = 0;
95
static char to_client[64*1024];
96
static size_t to_client_len = 0;
99
#define RETURN_RND_EAGAIN(session) \
100
static unsigned char rnd = 0; \
101
if (rnd++ % 2 == 0) \
103
gnutls_transport_set_errno (session, EAGAIN); \
107
#define RETURN_RND_EAGAIN(session)
111
client_push (gnutls_transport_ptr_t tr, const void *data, size_t len)
114
RETURN_RND_EAGAIN(tr);
116
len = min(len, sizeof(to_server)-to_server_len);
118
newlen = to_server_len + len;
119
memcpy (to_server + to_server_len, data, len);
120
to_server_len = newlen;
122
fprintf(stderr, "eagain: pushed %d bytes to server (avail: %d)\n", (int)len, (int)to_server_len);
128
client_pull (gnutls_transport_ptr_t tr, void *data, size_t len)
130
RETURN_RND_EAGAIN(tr);
132
if (to_client_len == 0)
135
fprintf(stderr, "eagain: Not enough data by server (asked for: %d, have: %d)\n", (int)len, (int)to_client_len);
137
gnutls_transport_set_errno ((gnutls_session_t)tr, EAGAIN);
141
len = min(len, to_client_len);
143
memcpy (data, to_client, len);
145
memmove (to_client, to_client + len, to_client_len - len);
146
to_client_len -= len;
148
fprintf(stderr, "eagain: pulled %d bytes by client (avail: %d)\n", (int)len, (int)to_client_len);
154
server_pull (gnutls_transport_ptr_t tr, void *data, size_t len)
156
//success ("server_pull len %d has %d\n", len, to_server_len);
157
RETURN_RND_EAGAIN(tr);
159
if (to_server_len == 0)
162
fprintf(stderr, "eagain: Not enough data by client (asked for: %d, have: %d)\n", (int)len, (int)to_server_len);
164
gnutls_transport_set_errno ((gnutls_session_t)tr, EAGAIN);
168
len = min(len, to_server_len);
170
fprintf(stderr, "eagain: pulled %d bytes by server (avail: %d)\n", (int)len, (int)to_server_len);
172
memcpy (data, to_server, len);
174
memmove (to_server, to_server + len, to_server_len - len);
175
to_server_len -= len;
181
server_push (gnutls_transport_ptr_t tr, const void *data, size_t len)
184
RETURN_RND_EAGAIN(tr);
186
// hexprint (data, len);
188
len = min(len, sizeof(to_client)-to_client_len);
190
newlen = to_client_len + len;
191
memcpy (to_client + to_client_len, data, len);
192
to_client_len = newlen;
194
fprintf(stderr, "eagain: pushed %d bytes to client (avail: %d)\n", (int)len, (int)to_client_len);
200
/* inline is used to avoid a gcc warning if used in mini-eagain */
201
inline static int server_pull_timeout_func(gnutls_transport_ptr_t ptr, unsigned int ms)
205
if (to_server_len > 0)
206
ret = 1; /* available data */
208
ret = 0; /* timeout */
211
fprintf(stderr, "eagain: server_pull_timeout: %d\n", ret);
217
inline static int client_pull_timeout_func(gnutls_transport_ptr_t ptr, unsigned int ms)
221
if (to_client_len > 0)
227
fprintf(stderr, "eagain: client_pull_timeout: %d\n", ret);