|
|
@ -206,24 +206,21 @@ int url_open(URLContext **puc, const char *filename, int flags) |
|
|
|
return ret; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int url_read(URLContext *h, unsigned char *buf, int size) |
|
|
|
static inline int retry_transfer_wrapper(URLContext *h, unsigned char *buf, int size, int size_min, |
|
|
|
{ |
|
|
|
|
|
|
|
int ret; |
|
|
|
|
|
|
|
if (h->flags & URL_WRONLY) |
|
|
|
|
|
|
|
return AVERROR(EIO); |
|
|
|
|
|
|
|
ret = h->prot->url_read(h, buf, size); |
|
|
|
|
|
|
|
return ret; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static inline int retry_transfer_wrapper(URLContext *h, unsigned char *buf, int size, |
|
|
|
|
|
|
|
int (*transfer_func)(URLContext *h, unsigned char *buf, int size)) |
|
|
|
int (*transfer_func)(URLContext *h, unsigned char *buf, int size)) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int ret, len; |
|
|
|
int ret, len; |
|
|
|
int fast_retries = 5; |
|
|
|
int fast_retries = 5; |
|
|
|
|
|
|
|
|
|
|
|
len = 0; |
|
|
|
len = 0; |
|
|
|
while (len < size) { |
|
|
|
while (len < size_min) { |
|
|
|
|
|
|
|
if (url_interrupt_cb()) |
|
|
|
|
|
|
|
return AVERROR(EINTR); |
|
|
|
ret = transfer_func(h, buf+len, size-len); |
|
|
|
ret = transfer_func(h, buf+len, size-len); |
|
|
|
|
|
|
|
if (ret == AVERROR(EINTR)) |
|
|
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
if (h->flags & URL_FLAG_NONBLOCK) |
|
|
|
|
|
|
|
return ret; |
|
|
|
if (ret == AVERROR(EAGAIN)) { |
|
|
|
if (ret == AVERROR(EAGAIN)) { |
|
|
|
ret = 0; |
|
|
|
ret = 0; |
|
|
|
if (fast_retries) |
|
|
|
if (fast_retries) |
|
|
@ -239,9 +236,18 @@ static inline int retry_transfer_wrapper(URLContext *h, unsigned char *buf, int |
|
|
|
return len; |
|
|
|
return len; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int url_read(URLContext *h, unsigned char *buf, int size) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (h->flags & URL_WRONLY) |
|
|
|
|
|
|
|
return AVERROR(EIO); |
|
|
|
|
|
|
|
return retry_transfer_wrapper(h, buf, size, 1, h->prot->url_read); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int url_read_complete(URLContext *h, unsigned char *buf, int size) |
|
|
|
int url_read_complete(URLContext *h, unsigned char *buf, int size) |
|
|
|
{ |
|
|
|
{ |
|
|
|
return retry_transfer_wrapper(h, buf, size, url_read); |
|
|
|
if (h->flags & URL_WRONLY) |
|
|
|
|
|
|
|
return AVERROR(EIO); |
|
|
|
|
|
|
|
return retry_transfer_wrapper(h, buf, size, size, h->prot->url_read); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int url_write(URLContext *h, const unsigned char *buf, int size) |
|
|
|
int url_write(URLContext *h, const unsigned char *buf, int size) |
|
|
@ -252,7 +258,7 @@ int url_write(URLContext *h, const unsigned char *buf, int size) |
|
|
|
if (h->max_packet_size && size > h->max_packet_size) |
|
|
|
if (h->max_packet_size && size > h->max_packet_size) |
|
|
|
return AVERROR(EIO); |
|
|
|
return AVERROR(EIO); |
|
|
|
|
|
|
|
|
|
|
|
return retry_transfer_wrapper(h, buf, size, h->prot->url_write); |
|
|
|
return retry_transfer_wrapper(h, buf, size, size, h->prot->url_write); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int64_t url_seek(URLContext *h, int64_t pos, int whence) |
|
|
|
int64_t url_seek(URLContext *h, int64_t pos, int whence) |
|
|
|