summaryrefslogtreecommitdiff
path: root/libavformat/tls_gnutls.c
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2021-03-26 15:41:07 +0200
committerMartin Storsjö <martin@martin.st>2021-04-01 09:05:10 +0300
commitb484e140efb406422eb4cbef0e8ae51bfb54a69d (patch)
treee0e8518c13335d3cfc2afe3970420565345acf19 /libavformat/tls_gnutls.c
parent84ad471fce1f6d6f785c1d0617254f1e7b3d95c6 (diff)
downloadffmpeg-b484e140efb406422eb4cbef0e8ae51bfb54a69d.tar.gz
tls_gnutls: Print the underlying IO error message and pass the error code through
Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'libavformat/tls_gnutls.c')
-rw-r--r--libavformat/tls_gnutls.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/libavformat/tls_gnutls.c b/libavformat/tls_gnutls.c
index f9d5af7096..741578a596 100644
--- a/libavformat/tls_gnutls.c
+++ b/libavformat/tls_gnutls.c
@@ -51,6 +51,7 @@ typedef struct TLSContext {
gnutls_session_t session;
gnutls_certificate_credentials_t cred;
int need_shutdown;
+ int io_err;
} TLSContext;
void ff_gnutls_init(void)
@@ -73,6 +74,7 @@ void ff_gnutls_deinit(void)
static int print_tls_error(URLContext *h, int ret)
{
+ TLSContext *c = h->priv_data;
switch (ret) {
case GNUTLS_E_AGAIN:
return AVERROR(EAGAIN);
@@ -88,6 +90,12 @@ static int print_tls_error(URLContext *h, int ret)
av_log(h, AV_LOG_ERROR, "%s\n", gnutls_strerror(ret));
break;
}
+ if (c->io_err) {
+ av_log(h, AV_LOG_ERROR, "IO error: %s\n", av_err2str(c->io_err));
+ ret = c->io_err;
+ c->io_err = 0;
+ return ret;
+ }
return AVERROR(EIO);
}
@@ -108,32 +116,36 @@ static int tls_close(URLContext *h)
static ssize_t gnutls_url_pull(gnutls_transport_ptr_t transport,
void *buf, size_t len)
{
- URLContext *h = (URLContext*) transport;
- int ret = ffurl_read(h, buf, len);
+ TLSContext *c = (TLSContext*) transport;
+ int ret = ffurl_read(c->tls_shared.tcp, buf, len);
if (ret >= 0)
return ret;
if (ret == AVERROR_EXIT)
return 0;
- if (ret == AVERROR(EAGAIN))
+ if (ret == AVERROR(EAGAIN)) {
errno = EAGAIN;
- else
+ } else {
errno = EIO;
+ c->io_err = ret;
+ }
return -1;
}
static ssize_t gnutls_url_push(gnutls_transport_ptr_t transport,
const void *buf, size_t len)
{
- URLContext *h = (URLContext*) transport;
- int ret = ffurl_write(h, buf, len);
+ TLSContext *c = (TLSContext*) transport;
+ int ret = ffurl_write(c->tls_shared.tcp, buf, len);
if (ret >= 0)
return ret;
if (ret == AVERROR_EXIT)
return 0;
- if (ret == AVERROR(EAGAIN))
+ if (ret == AVERROR(EAGAIN)) {
errno = EAGAIN;
- else
+ } else {
errno = EIO;
+ c->io_err = ret;
+ }
return -1;
}
@@ -179,7 +191,7 @@ static int tls_open(URLContext *h, const char *uri, int flags, AVDictionary **op
gnutls_credentials_set(p->session, GNUTLS_CRD_CERTIFICATE, p->cred);
gnutls_transport_set_pull_function(p->session, gnutls_url_pull);
gnutls_transport_set_push_function(p->session, gnutls_url_push);
- gnutls_transport_set_ptr(p->session, c->tcp);
+ gnutls_transport_set_ptr(p->session, p);
gnutls_priority_set_direct(p->session, "NORMAL", NULL);
do {
if (ff_check_interrupt(&h->interrupt_callback)) {