diff options
author | James Almer <jamrial@gmail.com> | 2017-11-02 23:39:28 -0300 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2017-11-02 23:39:28 -0300 |
commit | 2805c8dcfc3b7d3701a72cef06af5e477c6c0cdb (patch) | |
tree | 038b9c8e01f5a317fae41d634dadf74448fd2370 | |
parent | 575fc7e80a1beb74f4afd6616f57cb8bfda4dba0 (diff) | |
parent | eb061ad6fd0e3cea7cf7cfbff0749bc90dd7d888 (diff) | |
download | ffmpeg-streaming-2805c8dcfc3b7d3701a72cef06af5e477c6c0cdb.zip ffmpeg-streaming-2805c8dcfc3b7d3701a72cef06af5e477c6c0cdb.tar.gz |
Merge commit 'eb061ad6fd0e3cea7cf7cfbff0749bc90dd7d888'
* commit 'eb061ad6fd0e3cea7cf7cfbff0749bc90dd7d888':
tls_gnutls: Readd support for nonblocking operation
Merged-by: James Almer <jamrial@gmail.com>
-rw-r--r-- | libavformat/tls_gnutls.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/libavformat/tls_gnutls.c b/libavformat/tls_gnutls.c index 7adb4ee..0cef957 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) |