From ca86194b50559abc99d1429dfa7c5f9f78997d9e Mon Sep 17 00:00:00 2001 From: Nikos Mavrogiannopoulos Date: Sun, 30 Dec 2018 16:25:08 +0100 Subject: examples: ignore GNUTLS_E_AGAIN or INTERRUPTED errors Signed-off-by: Nikos Mavrogiannopoulos --- doc/examples/ex-client-anon.c | 13 ++++++++++--- doc/examples/ex-client-dtls.c | 9 +++++++-- doc/examples/ex-client-psk.c | 9 +++++++-- doc/examples/ex-client-resume.c | 9 +++++++-- doc/examples/ex-client-x509-3.1.c | 9 +++++++-- doc/examples/ex-client-x509.c | 9 +++++++-- doc/examples/ex-serv-dtls.c | 23 ++++++++++------------- doc/examples/ex-serv-psk.c | 11 ++++++++--- doc/examples/ex-serv-srp.c | 15 ++++++++------- doc/examples/ex-serv-x509.c | 14 +++++++------- 10 files changed, 78 insertions(+), 43 deletions(-) (limited to 'doc/examples') diff --git a/doc/examples/ex-client-anon.c b/doc/examples/ex-client-anon.c index e86e9302f5..39d5a7e3cd 100644 --- a/doc/examples/ex-client-anon.c +++ b/doc/examples/ex-client-anon.c @@ -11,11 +11,18 @@ #include #include #include +#include #include /* A very basic TLS client, with anonymous authentication. */ +#define LOOP_CHECK(rval, cmd) \ + do { \ + rval = cmd; \ + } while(rval == GNUTLS_E_AGAIN || rval == GNUTLS_E_INTERRUPTED); \ + assert(rval >= 0) + #define MAX_BUF 1024 #define MSG "GET / HTTP/1.0\r\n\r\n" @@ -74,9 +81,9 @@ int main(void) gnutls_free(desc); } - gnutls_record_send(session, MSG, strlen(MSG)); + LOOP_CHECK(ret, gnutls_record_send(session, MSG, strlen(MSG))); - ret = gnutls_record_recv(session, buffer, MAX_BUF); + LOOP_CHECK(ret, gnutls_record_recv(session, buffer, MAX_BUF)); if (ret == 0) { printf("- Peer has closed the TLS connection\n"); goto end; @@ -95,7 +102,7 @@ int main(void) fputs("\n", stdout); } - gnutls_bye(session, GNUTLS_SHUT_RDWR); + LOOP_CHECK(ret, gnutls_bye(session, GNUTLS_SHUT_RDWR)); end: diff --git a/doc/examples/ex-client-dtls.c b/doc/examples/ex-client-dtls.c index 6c1b59bb82..095246e26c 100644 --- a/doc/examples/ex-client-dtls.c +++ b/doc/examples/ex-client-dtls.c @@ -19,6 +19,11 @@ */ #define CHECK(x) assert((x)>=0) +#define LOOP_CHECK(rval, cmd) \ + do { \ + rval = cmd; \ + } while(rval == GNUTLS_E_AGAIN || rval == GNUTLS_E_INTERRUPTED); \ + assert(rval >= 0) #define MAX_BUF 1024 #define MSG "GET / HTTP/1.0\r\n\r\n" @@ -89,9 +94,9 @@ int main(void) gnutls_free(desc); } - CHECK(gnutls_record_send(session, MSG, strlen(MSG))); + LOOP_CHECK(ret, gnutls_record_send(session, MSG, strlen(MSG))); - ret = gnutls_record_recv(session, buffer, MAX_BUF); + LOOP_CHECK(ret, gnutls_record_recv(session, buffer, MAX_BUF)); if (ret == 0) { printf("- Peer has closed the TLS connection\n"); goto end; diff --git a/doc/examples/ex-client-psk.c b/doc/examples/ex-client-psk.c index 4b393d877f..63ef884c70 100644 --- a/doc/examples/ex-client-psk.c +++ b/doc/examples/ex-client-psk.c @@ -18,6 +18,11 @@ */ #define CHECK(x) assert((x)>=0) +#define LOOP_CHECK(rval, cmd) \ + do { \ + rval = cmd; \ + } while(rval == GNUTLS_E_AGAIN || rval == GNUTLS_E_INTERRUPTED); \ + assert(rval >= 0) #define MAX_BUF 1024 #define MSG "GET / HTTP/1.0\r\n\r\n" @@ -95,9 +100,9 @@ int main(void) gnutls_free(desc); } - CHECK(gnutls_record_send(session, MSG, strlen(MSG))); + LOOP_CHECK(ret, gnutls_record_send(session, MSG, strlen(MSG))); - ret = gnutls_record_recv(session, buffer, MAX_BUF); + LOOP_CHECK(ret, gnutls_record_recv(session, buffer, MAX_BUF)); if (ret == 0) { printf("- Peer has closed the TLS connection\n"); goto end; diff --git a/doc/examples/ex-client-resume.c b/doc/examples/ex-client-resume.c index 69e798e295..3161ef3165 100644 --- a/doc/examples/ex-client-resume.c +++ b/doc/examples/ex-client-resume.c @@ -21,6 +21,11 @@ extern void tcp_close(int sd); */ #define CHECK(x) assert((x)>=0) +#define LOOP_CHECK(rval, cmd) \ + do { \ + rval = cmd; \ + } while(rval == GNUTLS_E_AGAIN || rval == GNUTLS_E_INTERRUPTED); \ + assert(rval >= 0) #define MAX_BUF 1024 #define MSG "GET / HTTP/1.0\r\n\r\n" @@ -100,9 +105,9 @@ int main(void) } } - gnutls_record_send(session, MSG, strlen(MSG)); + LOOP_CHECK(ret, gnutls_record_send(session, MSG, strlen(MSG))); - ret = gnutls_record_recv(session, buffer, MAX_BUF); + LOOP_CHECK(ret, gnutls_record_recv(session, buffer, MAX_BUF)); if (ret == 0) { printf("- Peer has closed the TLS connection\n"); goto end; diff --git a/doc/examples/ex-client-x509-3.1.c b/doc/examples/ex-client-x509-3.1.c index ec03b15d00..bd7fd2fcb6 100644 --- a/doc/examples/ex-client-x509-3.1.c +++ b/doc/examples/ex-client-x509-3.1.c @@ -18,6 +18,11 @@ */ #define CHECK(x) assert((x)>=0) +#define LOOP_CHECK(rval, cmd) \ + do { \ + rval = cmd; \ + } while(rval == GNUTLS_E_AGAIN || rval == GNUTLS_E_INTERRUPTED); \ + assert(rval >= 0) #define MAX_BUF 1024 #define CAFILE "/etc/ssl/certs/ca-certificates.crt" @@ -112,9 +117,9 @@ int main(void) gnutls_free(desc); } - CHECK(gnutls_record_send(session, MSG, strlen(MSG))); + LOOP_CHECK(ret, gnutls_record_send(session, MSG, strlen(MSG))); - ret = gnutls_record_recv(session, buffer, MAX_BUF); + LOOP_CHECK(ret, gnutls_record_recv(session, buffer, MAX_BUF)); if (ret == 0) { printf("- Peer has closed the TLS connection\n"); goto end; diff --git a/doc/examples/ex-client-x509.c b/doc/examples/ex-client-x509.c index 64e5eed4ad..07abcf015c 100644 --- a/doc/examples/ex-client-x509.c +++ b/doc/examples/ex-client-x509.c @@ -17,6 +17,11 @@ */ #define CHECK(x) assert((x)>=0) +#define LOOP_CHECK(rval, cmd) \ + do { \ + rval = cmd; \ + } while(rval == GNUTLS_E_AGAIN || rval == GNUTLS_E_INTERRUPTED); \ + assert(rval >= 0) #define MAX_BUF 1024 #define MSG "GET / HTTP/1.0\r\n\r\n" @@ -101,9 +106,9 @@ int main(void) } /* send data */ - CHECK(gnutls_record_send(session, MSG, strlen(MSG))); + LOOP_CHECK(ret, gnutls_record_send(session, MSG, strlen(MSG))); - ret = gnutls_record_recv(session, buffer, MAX_BUF); + LOOP_CHECK(ret, gnutls_record_recv(session, buffer, MAX_BUF)); if (ret == 0) { printf("- Peer has closed the TLS connection\n"); goto end; diff --git a/doc/examples/ex-serv-dtls.c b/doc/examples/ex-serv-dtls.c index 40b4f4728f..7374d96b45 100644 --- a/doc/examples/ex-serv-dtls.c +++ b/doc/examples/ex-serv-dtls.c @@ -27,6 +27,11 @@ * Note that error checking is minimal to simplify the example. */ +#define LOOP_CHECK(rval, cmd) \ + do { \ + rval = cmd; \ + } while(rval == GNUTLS_E_AGAIN || rval == GNUTLS_E_INTERRUPTED) + #define MAX_BUFFER 1024 #define PORT 5557 @@ -197,11 +202,7 @@ int main(void) gnutls_transport_set_pull_timeout_function(session, pull_timeout_func); - do { - ret = gnutls_handshake(session); - } - while (ret == GNUTLS_E_INTERRUPTED - || ret == GNUTLS_E_AGAIN); + LOOP_CHECK(ret, gnutls_handshake(session)); /* Note that DTLS may also receive GNUTLS_E_LARGE_PACKET. * In that case the MTU should be adjusted. */ @@ -216,14 +217,10 @@ int main(void) printf("- Handshake was completed\n"); for (;;) { - do { - ret = + LOOP_CHECK(ret, gnutls_record_recv_seq(session, buffer, MAX_BUFFER, - sequence); - } - while (ret == GNUTLS_E_AGAIN - || ret == GNUTLS_E_INTERRUPTED); + sequence)); if (ret < 0 && gnutls_error_is_fatal(ret) == 0) { fprintf(stderr, "*** Warning: %s\n", @@ -248,7 +245,7 @@ int main(void) sequence[6], sequence[7], buffer); /* reply back */ - ret = gnutls_record_send(session, buffer, ret); + LOOP_CHECK(ret, gnutls_record_send(session, buffer, ret)); if (ret < 0) { fprintf(stderr, "Error in send(): %s\n", gnutls_strerror(ret)); @@ -256,7 +253,7 @@ int main(void) } } - gnutls_bye(session, GNUTLS_SHUT_WR); + LOOP_CHECK(ret, gnutls_bye(session, GNUTLS_SHUT_WR)); gnutls_deinit(session); } diff --git a/doc/examples/ex-serv-psk.c b/doc/examples/ex-serv-psk.c index 4c469819be..b6d5d11c8d 100644 --- a/doc/examples/ex-serv-psk.c +++ b/doc/examples/ex-serv-psk.c @@ -20,6 +20,11 @@ #define CAFILE "/etc/ssl/certs/ca-certificates.crt" #define CRLFILE "crl.pem" +#define LOOP_CHECK(rval, cmd) \ + do { \ + rval = cmd; \ + } while(rval == GNUTLS_E_AGAIN || rval == GNUTLS_E_INTERRUPTED) + /* This is a sample TLS echo server, supporting X.509 and PSK authentication. */ @@ -132,7 +137,7 @@ int main(void) sizeof(topbuf)), ntohs(sa_cli.sin_port)); gnutls_transport_set_int(session, sd); - ret = gnutls_handshake(session); + LOOP_CHECK(ret, gnutls_handshake(session)); if (ret < 0) { close(sd); gnutls_deinit(session); @@ -154,7 +159,7 @@ int main(void) /* print_info(session); */ for (;;) { - ret = gnutls_record_recv(session, buffer, MAX_BUF); + LOOP_CHECK(ret, gnutls_record_recv(session, buffer, MAX_BUF)); if (ret == 0) { printf @@ -178,7 +183,7 @@ int main(void) printf("\n"); /* do not wait for the peer to close the connection. */ - gnutls_bye(session, GNUTLS_SHUT_WR); + LOOP_CHECK(ret, gnutls_bye(session, GNUTLS_SHUT_WR)); close(sd); gnutls_deinit(session); diff --git a/doc/examples/ex-serv-srp.c b/doc/examples/ex-serv-srp.c index c79ceb20c5..7686a8fc1c 100644 --- a/doc/examples/ex-serv-srp.c +++ b/doc/examples/ex-serv-srp.c @@ -22,6 +22,11 @@ #define CERTFILE "cert.pem" #define CAFILE "/etc/ssl/certs/ca-certificates.crt" +#define LOOP_CHECK(rval, cmd) \ + do { \ + rval = cmd; \ + } while(rval == GNUTLS_E_AGAIN || rval == GNUTLS_E_INTERRUPTED) + /* This is a sample TLS-SRP echo server. */ @@ -117,11 +122,7 @@ int main(void) gnutls_transport_set_int(session, sd); - do { - ret = gnutls_handshake(session); - } - while (ret < 0 && gnutls_error_is_fatal(ret) == 0); - + LOOP_CHECK(ret, gnutls_handshake(session)); if (ret < 0) { close(sd); gnutls_deinit(session); @@ -137,7 +138,7 @@ int main(void) /* print_info(session); */ for (;;) { - ret = gnutls_record_recv(session, buffer, MAX_BUF); + LOOP_CHECK(ret, gnutls_record_recv(session, buffer, MAX_BUF)); if (ret == 0) { printf @@ -160,7 +161,7 @@ int main(void) } printf("\n"); /* do not wait for the peer to close the connection. */ - gnutls_bye(session, GNUTLS_SHUT_WR); + LOOP_CHECK(ret, gnutls_bye(session, GNUTLS_SHUT_WR)); close(sd); gnutls_deinit(session); diff --git a/doc/examples/ex-serv-x509.c b/doc/examples/ex-serv-x509.c index c2545a6688..df57207140 100644 --- a/doc/examples/ex-serv-x509.c +++ b/doc/examples/ex-serv-x509.c @@ -22,6 +22,10 @@ #define CRLFILE "crl.pem" #define CHECK(x) assert((x)>=0) +#define LOOP_CHECK(rval, cmd) \ + do { \ + rval = cmd; \ + } while(rval == GNUTLS_E_AGAIN || rval == GNUTLS_E_INTERRUPTED) /* The OCSP status file contains up to date information about revocation * of the server's certificate. That can be periodically be updated @@ -137,11 +141,7 @@ int main(void) gnutls_transport_set_int(session, sd); - do { - ret = gnutls_handshake(session); - } - while (ret < 0 && gnutls_error_is_fatal(ret) == 0); - + LOOP_CHECK(ret, gnutls_handshake(session)); if (ret < 0) { close(sd); gnutls_deinit(session); @@ -156,7 +156,7 @@ int main(void) /* print_info(session); */ for (;;) { - ret = gnutls_record_recv(session, buffer, MAX_BUF); + LOOP_CHECK(ret, gnutls_record_recv(session, buffer, MAX_BUF)); if (ret == 0) { printf @@ -180,7 +180,7 @@ int main(void) printf("\n"); /* do not wait for the peer to close the connection. */ - CHECK(gnutls_bye(session, GNUTLS_SHUT_WR)); + LOOP_CHECK(ret, gnutls_bye(session, GNUTLS_SHUT_WR)); close(sd); gnutls_deinit(session); -- cgit v1.2.1