mirror of https://git.ffmpeg.org/ffmpeg.git
Merge commit '0671eb2346c17e8fb13784cf90ce416661fdea1c'
* commit '0671eb2346c17e8fb13784cf90ce416661fdea1c': tls_openssl: Readd support for nonblocking operation Merged-by: James Almer <jamrial@gmail.com>
This commit is contained in:
commit
575fc7e80a
|
@ -116,6 +116,12 @@ void ff_openssl_deinit(void)
|
||||||
|
|
||||||
static int print_tls_error(URLContext *h, int ret)
|
static int print_tls_error(URLContext *h, int ret)
|
||||||
{
|
{
|
||||||
|
TLSContext *c = h->priv_data;
|
||||||
|
if (h->flags & AVIO_FLAG_NONBLOCK) {
|
||||||
|
int err = SSL_get_error(c->ssl, ret);
|
||||||
|
if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_READ)
|
||||||
|
return AVERROR(EAGAIN);
|
||||||
|
}
|
||||||
av_log(h, AV_LOG_ERROR, "%s\n", ERR_error_string(ERR_get_error(), NULL));
|
av_log(h, AV_LOG_ERROR, "%s\n", ERR_error_string(ERR_get_error(), NULL));
|
||||||
return AVERROR(EIO);
|
return AVERROR(EIO);
|
||||||
}
|
}
|
||||||
|
@ -171,6 +177,8 @@ static int url_bio_bread(BIO *b, char *buf, int len)
|
||||||
if (ret >= 0)
|
if (ret >= 0)
|
||||||
return ret;
|
return ret;
|
||||||
BIO_clear_retry_flags(b);
|
BIO_clear_retry_flags(b);
|
||||||
|
if (ret == AVERROR(EAGAIN))
|
||||||
|
BIO_set_retry_read(b);
|
||||||
if (ret == AVERROR_EXIT)
|
if (ret == AVERROR_EXIT)
|
||||||
return 0;
|
return 0;
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -183,6 +191,8 @@ static int url_bio_bwrite(BIO *b, const char *buf, int len)
|
||||||
if (ret >= 0)
|
if (ret >= 0)
|
||||||
return ret;
|
return ret;
|
||||||
BIO_clear_retry_flags(b);
|
BIO_clear_retry_flags(b);
|
||||||
|
if (ret == AVERROR(EAGAIN))
|
||||||
|
BIO_set_retry_write(b);
|
||||||
if (ret == AVERROR_EXIT)
|
if (ret == AVERROR_EXIT)
|
||||||
return 0;
|
return 0;
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -302,7 +312,11 @@ fail:
|
||||||
static int tls_read(URLContext *h, uint8_t *buf, int size)
|
static int tls_read(URLContext *h, uint8_t *buf, int size)
|
||||||
{
|
{
|
||||||
TLSContext *c = h->priv_data;
|
TLSContext *c = h->priv_data;
|
||||||
int ret = SSL_read(c->ssl, 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 = SSL_read(c->ssl, buf, size);
|
||||||
if (ret > 0)
|
if (ret > 0)
|
||||||
return ret;
|
return ret;
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
|
@ -313,7 +327,11 @@ static int tls_read(URLContext *h, uint8_t *buf, int size)
|
||||||
static int tls_write(URLContext *h, const uint8_t *buf, int size)
|
static int tls_write(URLContext *h, const uint8_t *buf, int size)
|
||||||
{
|
{
|
||||||
TLSContext *c = h->priv_data;
|
TLSContext *c = h->priv_data;
|
||||||
int ret = SSL_write(c->ssl, 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 = SSL_write(c->ssl, buf, size);
|
||||||
if (ret > 0)
|
if (ret > 0)
|
||||||
return ret;
|
return ret;
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
|
|
Loading…
Reference in New Issue