summaryrefslogtreecommitdiff
path: root/libavformat/tls_gnutls.c
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2017-11-02 23:39:28 -0300
committerJames Almer <jamrial@gmail.com>2017-11-02 23:39:28 -0300
commit2805c8dcfc3b7d3701a72cef06af5e477c6c0cdb (patch)
tree038b9c8e01f5a317fae41d634dadf74448fd2370 /libavformat/tls_gnutls.c
parent575fc7e80a1beb74f4afd6616f57cb8bfda4dba0 (diff)
parenteb061ad6fd0e3cea7cf7cfbff0749bc90dd7d888 (diff)
downloadffmpeg-2805c8dcfc3b7d3701a72cef06af5e477c6c0cdb.tar.gz
Merge commit 'eb061ad6fd0e3cea7cf7cfbff0749bc90dd7d888'
* commit 'eb061ad6fd0e3cea7cf7cfbff0749bc90dd7d888': tls_gnutls: Readd support for nonblocking operation Merged-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavformat/tls_gnutls.c')
-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 7adb4eed56..0cef9575ec 100644
--- a/libavformat/tls_gnutls.c
+++ b/libavformat/tls_gnutls.c
@@ -75,6 +75,7 @@ static int print_tls_error(URLContext *h, int ret)
{
switch (ret) {
case GNUTLS_E_AGAIN:
+ return AVERROR(EAGAIN);
case GNUTLS_E_INTERRUPTED:
#ifdef GNUTLS_E_PREMATURE_TERMINATION
case GNUTLS_E_PREMATURE_TERMINATION:
@@ -114,7 +115,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;
}
@@ -127,7 +131,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;
}
@@ -223,7 +230,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)
@@ -234,7 +245,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)