diff --git a/src/ChangeLog b/src/ChangeLog index 1bbc6acc..0a16c79f 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,9 @@ 2011-04-19 Giuseppe Scrivano <gscrivano@gnu.org> + * gnutls.c: Do not include <fcntl.h>. + * gnutls.c (wgnutls_peek): Ensure there is data available before attempt + a read on the blocking socket. + * Makefile.am (LIBS): Add $(LIB_CLOCK_GETTIME) * utils.c: Include <sys/stat.h>. Do not include <sys/time.h>. (touch): Use `futimens' instead of `utimes'. diff --git a/src/gnutls.c b/src/gnutls.c index a1054a4d..1f96d9ac 100644 --- a/src/gnutls.c +++ b/src/gnutls.c @@ -40,7 +40,6 @@ as that of the covered work. */ #include <gnutls/gnutls.h> #include <gnutls/x509.h> -#include <fcntl.h> #include <sys/ioctl.h> #include "utils.h" @@ -186,24 +185,13 @@ wgnutls_peek (int fd, char *buf, int bufsize, void *arg) if (bufsize > offset) { -#ifdef F_GETFL - int flags; - flags = fcntl (fd, F_GETFL, 0); - if (flags < 0) - return ret; - - ret = fcntl (fd, F_SETFL, flags | O_NONBLOCK); - if (ret < 0) - return ret; -#else - /* XXX: Assume it was blocking before. */ - const int one = 1; - ret = ioctl (fd, FIONBIO, &one); - if (ret < 0) - return ret; -#endif - read = gnutls_record_recv (ctx->session, buf + offset, - bufsize - offset); + if (gnutls_record_check_pending (ctx->session) <= 0 + && select_fd (fd, 0.0, WAIT_FOR_READ) <= 0) + read = 0; + else + read = gnutls_record_recv (ctx->session, buf + offset, + bufsize - offset); + if (read < 0) { if (offset) @@ -218,17 +206,6 @@ wgnutls_peek (int fd, char *buf, int bufsize, void *arg) read); ctx->peeklen += read; } - -#ifdef F_GETFL - ret = fcntl (fd, F_SETFL, flags); - if (ret < 0) - return ret; -#else - const int zero = 0; - ret = ioctl (fd, FIONBIO, &zero); - if (ret < 0) - return ret; -#endif } return offset + read;