X-Git-Url: http://sjero.net/git/?a=blobdiff_plain;f=src%2Fgnutls.c;h=4f38aca1d9c43ed302159d3ecf29c0e8f44fe29b;hb=ca244196f1c7347f89e4b382198177a48b44133c;hp=17c7c9287662b10292cc5c7b22babd33b3ae750e;hpb=75c6ca0f5d1cc9baf604ed44f1a7b68a0373357d;p=wget diff --git a/src/gnutls.c b/src/gnutls.c index 17c7c928..4f38aca1 100644 --- a/src/gnutls.c +++ b/src/gnutls.c @@ -1,5 +1,5 @@ /* SSL support via GnuTLS library. - Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Free Software + Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. This file is part of GNU Wget. @@ -32,9 +32,7 @@ as that of the covered work. */ #include #include -#ifdef HAVE_UNISTD_H -# include -#endif +#include #include #include #include @@ -42,6 +40,7 @@ as that of the covered work. */ #include #include +#include #include "utils.h" #include "connect.h" @@ -104,7 +103,8 @@ ssl_init () return true; } -struct wgnutls_transport_context { +struct wgnutls_transport_context +{ gnutls_session session; /* GnuTLS session handle */ int last_error; /* last error returned by read/write/... */ @@ -144,6 +144,7 @@ wgnutls_read (int fd, char *buf, int bufsize, void *arg) if (ret < 0) ctx->last_error = ret; + return ret; } @@ -182,21 +183,40 @@ wgnutls_peek (int fd, char *buf, int bufsize, void *arg) if (bufsize > offset) { + 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; + do { - if (gnutls_record_check_pending (ctx->session) - || select_fd (fd, 0, WAIT_FOR_READ)) - ret = gnutls_record_recv (ctx->session, buf + offset, - bufsize - offset); + ret = gnutls_record_recv (ctx->session, buf + offset, + bufsize - offset); } while (ret == GNUTLS_E_INTERRUPTED); + if (ret < 0) + { + if (offset) + ret = 0; + else + return ret; + } + if (ret > 0) { memcpy (ctx->peekbuf + offset, buf + offset, ret); ctx->peeklen += ret; } + + fcntl (fd, F_SETFL, flags); + if (ret < 0) + return ret; } return offset + ret; @@ -222,7 +242,8 @@ wgnutls_close (int fd, void *arg) /* gnutls_transport is the singleton that describes the SSL transport methods provided by this file. */ -static struct transport_implementation wgnutls_transport = { +static struct transport_implementation wgnutls_transport = +{ wgnutls_read, wgnutls_write, wgnutls_poll, wgnutls_peek, wgnutls_errstr, wgnutls_close };