/* 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.
#include <assert.h>
#include <errno.h>
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
+#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <dirent.h>
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/... */
if (ret < 0)
ctx->last_error = ret;
+
return ret;
}
{
int ret = 0;
struct wgnutls_transport_context *ctx = arg;
- int offset = ctx->peeklen;
-
+ int offset = MIN (bufsize, ctx->peeklen);
if (bufsize > sizeof ctx->peekbuf)
bufsize = sizeof ctx->peekbuf;
- if (offset)
+ if (ctx->peeklen)
memcpy (buf, ctx->peekbuf, offset);
- do
+ if (bufsize > offset)
{
- if (gnutls_record_check_pending (ctx->session)
- || select_fd (fd, 0, WAIT_FOR_READ))
- ret = gnutls_record_recv (ctx->session, buf + offset, bufsize - offset);
- }
- while (ret == GNUTLS_E_INTERRUPTED);
+ do
+ {
+ ret = gnutls_record_recv (ctx->session, buf + offset,
+ bufsize - offset);
+ }
+ while (ret == GNUTLS_E_INTERRUPTED);
- if (ret > 0)
- {
- memcpy (ctx->peekbuf + offset, buf + offset, ret);
- ctx->peeklen += ret;
+ if (ret < 0)
+ {
+ if (offset)
+ ret = 0;
+ else
+ return ret;
+ }
+
+ if (ret > 0)
+ {
+ memcpy (ctx->peekbuf + offset, buf + offset,
+ ret);
+ ctx->peeklen += ret;
+ }
}
- return ctx->peeklen;
+
+ return offset + ret;
}
static const char *
/* 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
};