From 23a76b71deead18fb75fc1f5af7281940778afb5 Mon Sep 17 00:00:00 2001 From: Lukasz Marek Date: Sun, 2 Jun 2013 01:41:03 +0200 Subject: ftp: reconnect on tcp read error This commit reconnect both connections and retries before ftp_read returns an error. Practical use case: resume after lock screen on iOS devices. Signed-off-by: Lukasz Marek --- libavformat/ftp.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'libavformat/ftp.c') diff --git a/libavformat/ftp.c b/libavformat/ftp.c index faa82dd30d..e818b8b757 100644 --- a/libavformat/ftp.c +++ b/libavformat/ftp.c @@ -499,8 +499,10 @@ static int ftp_abort(URLContext *h) { int err; ftp_close_both_connections(h->priv_data); - if ((err = ftp_connect_control_connection(h)) < 0) + if ((err = ftp_connect_control_connection(h)) < 0) { + av_log(h, AV_LOG_ERROR, "Reconnect failed.\n"); return err; + } return 0; } @@ -602,10 +604,14 @@ static int ftp_read(URLContext *h, unsigned char *buf, int size) av_dlog(h, "ftp protocol read %d bytes\n", size); retry: if (s->state == DISCONNECTED) { + if (s->position >= s->filesize) + return 0; if ((err = ftp_connect_data_connection(h)) < 0) return err; } if (s->state == READY) { + if (s->position >= s->filesize) + return 0; if ((err = ftp_retrieve(s)) < 0) return err; } @@ -618,15 +624,12 @@ static int ftp_read(URLContext *h, unsigned char *buf, int size) return AVERROR(EIO); } } - if (!read && s->position < s->filesize && !h->is_streamed) { + if (read <= 0 && s->position < s->filesize && !h->is_streamed) { /* Server closed connection. Probably due to inactivity */ - /* TODO: Consider retry before reconnect */ int64_t pos = s->position; av_log(h, AV_LOG_INFO, "Reconnect to FTP server.\n"); - if ((err = ftp_abort(h)) < 0) { - av_log(h, AV_LOG_ERROR, "Reconnect failed.\n"); + if ((err = ftp_abort(h)) < 0) return err; - } if ((err = ftp_seek(h, pos, SEEK_SET)) < 0) { av_log(h, AV_LOG_ERROR, "Position cannot be restored.\n"); return err; -- cgit v1.2.3