X-Git-Url: http://sjero.net/git/?p=wget;a=blobdiff_plain;f=src%2Fgnutls.c;h=db9241678c45bf58d7662028112d9fe0526fe1a0;hp=4f38aca1d9c43ed302159d3ecf29c0e8f44fe29b;hb=ee6021a3b09fd65b7fa08a14dd37bd5010219d42;hpb=ca244196f1c7347f89e4b382198177a48b44133c diff --git a/src/gnutls.c b/src/gnutls.c index 4f38aca1..db924167 100644 --- a/src/gnutls.c +++ b/src/gnutls.c @@ -40,7 +40,7 @@ as that of the covered work. */ #include #include -#include +#include #include "utils.h" #include "connect.h" @@ -66,6 +66,8 @@ ssl_init () gnutls_global_init (); gnutls_certificate_allocate_credentials (&credentials); + gnutls_certificate_set_verify_flags(credentials, + GNUTLS_VERIFY_ALLOW_X509_V1_CA_CRT); ca_directory = opt.ca_directory ? opt.ca_directory : "/etc/ssl/certs"; @@ -140,7 +142,7 @@ wgnutls_read (int fd, char *buf, int bufsize, void *arg) do ret = gnutls_record_recv (ctx->session, buf, bufsize); - while (ret == GNUTLS_E_INTERRUPTED); + while (ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN); if (ret < 0) ctx->last_error = ret; @@ -155,7 +157,7 @@ wgnutls_write (int fd, char *buf, int bufsize, void *arg) struct wgnutls_transport_context *ctx = arg; do ret = gnutls_record_send (ctx->session, buf, bufsize); - while (ret == GNUTLS_E_INTERRUPTED); + while (ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN); if (ret < 0) ctx->last_error = ret; return ret; @@ -172,7 +174,7 @@ wgnutls_poll (int fd, double timeout, int wait_for, void *arg) static int wgnutls_peek (int fd, char *buf, int bufsize, void *arg) { - int ret = 0; + int read = 0; struct wgnutls_transport_context *ctx = arg; int offset = MIN (bufsize, ctx->peeklen); if (bufsize > sizeof ctx->peekbuf) @@ -183,43 +185,30 @@ 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 - { - ret = gnutls_record_recv (ctx->session, buf + offset, - bufsize - offset); - } - while (ret == GNUTLS_E_INTERRUPTED); - - if (ret < 0) + 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) - ret = 0; + read = 0; else - return ret; + return read; } - if (ret > 0) + if (read > 0) { memcpy (ctx->peekbuf + offset, buf + offset, - ret); - ctx->peeklen += ret; + read); + ctx->peeklen += read; } - - fcntl (fd, F_SETFL, flags); - if (ret < 0) - return ret; } - return offset + ret; + return offset + read; } static const char *