]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Introduced GNUTLS_INDEFINITE_TIMEOUT
authorNikos Mavrogiannopoulos <nmav@redhat.com>
Mon, 12 Oct 2015 11:52:03 +0000 (13:52 +0200)
committerNikos Mavrogiannopoulos <nmav@redhat.com>
Mon, 12 Oct 2015 12:56:17 +0000 (14:56 +0200)
This allows to specify an indefinite timeout to gnutls_record_set_timeout().
In addition this flag is accepted by gnutls_handshake_set_timeout() and
cancels out a previously set timeout.
Resolves #41

lib/buffers.c
lib/dtls.c
lib/handshake.c
lib/includes/gnutls/gnutls.h.in
lib/record.c
lib/system.c
lib/system_override.c

index cc340710ff11a6040ebb97e8ad2d12d6b0b27b84..e43a0c4b5d920816e89c575e94c8441dcc220551 100644 (file)
@@ -380,7 +380,7 @@ _gnutls_stream_read(gnutls_session_t session, mbuffer_st ** bufel,
                left -= i;
                (*bufel)->msg.size += i;
 
-               if (ms && *ms > 0) {
+               if (ms && *ms > 0 && *ms != GNUTLS_INDEFINITE_TIMEOUT) {
                        gettime(&t2);
                        diff = timespec_sub_ms(&t2, &t1);
                        if (diff < *ms)
index 26ddaf2b774968fc412f50776ea0778368cdad57..36728a4f14c0edc98ef74f4f7a62ee78e037e025 100644 (file)
@@ -557,8 +557,12 @@ void gnutls_dtls_set_timeouts(gnutls_session_t session,
                              unsigned int retrans_timeout,
                              unsigned int total_timeout)
 {
+       if (total_timeout == GNUTLS_INDEFINITE_TIMEOUT)
+               session->internals.handshake_timeout_ms = 0;
+       else
+               session->internals.handshake_timeout_ms = total_timeout;
+
        session->internals.dtls.retrans_timeout_ms = retrans_timeout;
-       session->internals.handshake_timeout_ms = total_timeout;
 }
 
 /**
index 776513b63477e45087618e679ab5fdfa4ac6283c..f9ffb14213429c9db70fafe66ad6bc0f8f93c8cf 100644 (file)
@@ -2630,6 +2630,11 @@ int gnutls_handshake(gnutls_session_t session)
 void
 gnutls_handshake_set_timeout(gnutls_session_t session, unsigned int ms)
 {
+       if (ms == GNUTLS_INDEFINITE_TIMEOUT) {
+               session->internals.handshake_timeout_ms = 0;
+               return;
+       }
+
        if (ms == GNUTLS_DEFAULT_HANDSHAKE_TIMEOUT)
                ms = DEFAULT_HANDSHAKE_TIMEOUT_MS;
 
index 6f5ba278c0699b8bb43df735b728f317b354dc7c..79c4949f34e95d8ddca9842d59bf8f28269991a8 100644 (file)
@@ -834,6 +834,7 @@ int gnutls_bye(gnutls_session_t session, gnutls_close_request_t how);
 int gnutls_handshake(gnutls_session_t session);
 
 #define GNUTLS_DEFAULT_HANDSHAKE_TIMEOUT ((unsigned int)-1)
+#define GNUTLS_INDEFINITE_TIMEOUT ((unsigned int)-2)
 void gnutls_handshake_set_timeout(gnutls_session_t session,
                                  unsigned int ms);
 int gnutls_rehandshake(gnutls_session_t session);
index ee13f23488b8d8e1c911808cd37785779fdfdb91..2ae3ca93c2010940541ed7f2a0555421012cabd1 100644 (file)
@@ -1738,7 +1738,8 @@ gnutls_record_recv_seq(gnutls_session_t session, void *data,
  *
  * This function sets the receive timeout for the record layer
  * to the provided value. Use an @ms value of zero to disable
- * timeout (the default).
+ * timeout (the default), or %GNUTLS_INDEFINITE_TIMEOUT, to
+ * set an indefinite timeout.
  *
  * This function requires to set a pull timeout callback. See
  * gnutls_transport_set_pull_timeout_function().
index 4d72968f13666d6f43d50aa0dca6152bfb43fa0d..ab8d89df8e1bc69bce66ce9ca0c1de9b64bff9be 100644 (file)
@@ -160,17 +160,20 @@ system_read(gnutls_transport_ptr_t ptr, void *data, size_t data_size)
 int gnutls_system_recv_timeout(gnutls_transport_ptr_t ptr, unsigned int ms)
 {
        fd_set rfds;
-       struct timeval tv;
+       struct timeval _tv, *tv = NULL;
        int ret;
        int fd = GNUTLS_POINTER_TO_INT(ptr);
 
        FD_ZERO(&rfds);
        FD_SET(fd, &rfds);
 
-       tv.tv_sec = ms/1000;
-       tv.tv_usec = (ms % 1000) * 1000;
+       if (ms != GNUTLS_INDEFINITE_TIMEOUT) {
+               _tv.tv_sec = ms/1000;
+               _tv.tv_usec = (ms % 1000) * 1000;
+               tv = &_tv;
+       }
 
-       ret = select(fd + 1, &rfds, NULL, NULL, &tv);
+       ret = select(fd + 1, &rfds, NULL, NULL, tv);
        if (ret <= 0)
                return ret;
 
index 79a4db0de46973cc221d15050c0b8f07348d7351..27959c3af4d2545fe9a40e88e2e1ce93c05f8e28 100644 (file)
@@ -95,7 +95,9 @@ gnutls_transport_set_pull_function(gnutls_session_t session,
  * for the provided transport calls.
  *
  * As with select(), if the timeout value is zero the callback should return
- * zero if no data are immediately available.
+ * zero if no data are immediately available. The special value
+ * %GNUTLS_INDEFINITE_TIMEOUT indicates that the callback should wait indefinitely
+ * for data.
  *
  * @gnutls_pull_timeout_func is of the form,
  * int (*gnutls_pull_timeout_func)(gnutls_transport_ptr_t, unsigned int ms);