diff --git a/libavformat/avio.c b/libavformat/avio.c index ad1f1b40c2..18b2ee6c22 100644 --- a/libavformat/avio.c +++ b/libavformat/avio.c @@ -374,6 +374,25 @@ int url_exist(const char *filename) return 1; } +int avio_check(const char *url, int flags) +{ + URLContext *h; + int ret = ffurl_alloc(&h, url, flags); + if (ret) + return ret; + + if (h->prot->url_check) { + ret = h->prot->url_check(h, flags); + } else { + ret = ffurl_connect(h); + if (ret >= 0) + ret = flags; + } + + ffurl_close(h); + return ret; +} + int64_t ffurl_size(URLContext *h) { int64_t pos, size; diff --git a/libavformat/avio.h b/libavformat/avio.h index a4109a2996..14aa599fe0 100644 --- a/libavformat/avio.h +++ b/libavformat/avio.h @@ -134,6 +134,7 @@ typedef struct URLProtocol { int priv_data_size; const AVClass *priv_data_class; int flags; + int (*url_check)(URLContext *h, int mask); } URLProtocol; typedef struct URLPollEntry { @@ -346,6 +347,23 @@ attribute_deprecated int url_close_buf(AVIOContext *s); */ int url_exist(const char *url); +/** + * Return AVIO_* access flags corresponding to the access permissions + * of the resource in url, or a negative value corresponding to an + * AVERROR code in case of failure. The returned access flags are + * masked by the value in flags. + * + * @note This function is intrinsically unsafe, in the sense that the + * checked resource may change its existence or permission status from + * one call to another. Thus you should not trust the returned value, + * unless you are sure that no other processes are accessing the + * checked resource. + * + * @note This function is slightly broken until next major bump + * because of AVIO_RDONLY == 0. Don't use it until then. + */ +int avio_check(const char *url, int flags); + /** * The callback is called in blocking functions to test regulary if * asynchronous interruption is needed. AVERROR_EXIT is returned diff --git a/libavformat/url.h b/libavformat/url.h index bde06d91da..c5732c64c6 100644 --- a/libavformat/url.h +++ b/libavformat/url.h @@ -59,6 +59,7 @@ typedef struct URLProtocol { int priv_data_size; const AVClass *priv_data_class; int flags; + int (*url_check)(URLContext *h, int mask); } URLProtocol; #endif