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)