summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavformat/tls_gnutls.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/libavformat/tls_gnutls.c b/libavformat/tls_gnutls.c
index 1ae7656dcb..7bfe02deb0 100644
--- a/libavformat/tls_gnutls.c
+++ b/libavformat/tls_gnutls.c
@@ -61,6 +61,7 @@ static int print_tls_error(URLContext *h, int ret)
{
switch (ret) {
case GNUTLS_E_AGAIN:
+ return AVERROR(EAGAIN);
case GNUTLS_E_INTERRUPTED:
break;
case GNUTLS_E_WARNING_ALERT_RECEIVED:
@@ -97,7 +98,10 @@ static ssize_t gnutls_url_pull(gnutls_transport_ptr_t transport,
return ret;
if (ret == AVERROR_EXIT)
return 0;
- errno = EIO;
+ if (ret == AVERROR(EAGAIN))
+ errno = EAGAIN;
+ else
+ errno = EIO;
return -1;
}
@@ -110,7 +114,10 @@ static ssize_t gnutls_url_push(gnutls_transport_ptr_t transport,
return ret;
if (ret == AVERROR_EXIT)
return 0;
- errno = EIO;
+ if (ret == AVERROR(EAGAIN))
+ errno = EAGAIN;
+ else
+ errno = EIO;
return -1;
}
@@ -202,7 +209,11 @@ fail:
static int tls_read(URLContext *h, uint8_t *buf, int size)
{
TLSContext *c = h->priv_data;
- int ret = gnutls_record_recv(c->session, buf, size);
+ int ret;
+ // Set or clear the AVIO_FLAG_NONBLOCK on c->tls_shared.tcp
+ c->tls_shared.tcp->flags &= ~AVIO_FLAG_NONBLOCK;
+ c->tls_shared.tcp->flags |= h->flags & AVIO_FLAG_NONBLOCK;
+ ret = gnutls_record_recv(c->session, buf, size);
if (ret > 0)
return ret;
if (ret == 0)
@@ -213,7 +224,11 @@ static int tls_read(URLContext *h, uint8_t *buf, int size)
static int tls_write(URLContext *h, const uint8_t *buf, int size)
{
TLSContext *c = h->priv_data;
- int ret = gnutls_record_send(c->session, buf, size);
+ int ret;
+ // Set or clear the AVIO_FLAG_NONBLOCK on c->tls_shared.tcp
+ c->tls_shared.tcp->flags &= ~AVIO_FLAG_NONBLOCK;
+ c->tls_shared.tcp->flags |= h->flags & AVIO_FLAG_NONBLOCK;
+ ret = gnutls_record_send(c->session, buf, size);
if (ret > 0)
return ret;
if (ret == 0)