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
);