avio: add avio_check()

The new function is more flexible than url_exist(), as it allows to
specify which access flags to check, and does not require an explicit
open of the checked resource.

Signed-off-by: Anton Khirnov <anton@khirnov.net>
This commit is contained in:
Stefano Sabatini 2011-04-08 18:32:25 +02:00 committed by Anton Khirnov
parent cbea3ac820
commit 175389c854
3 changed files with 38 additions and 0 deletions

View File

@ -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;

View File

@ -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

View File

@ -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