Alien-SVN
view release on metacpan or search on metacpan
src/subversion/subversion/libsvn_subr/magic.c view on Meta::CPAN
#ifdef SVN_HAVE_LIBMAGIC
mc = apr_palloc(result_pool, sizeof(*mc));
/* Initialise libmagic. */
#ifndef MAGIC_MIME_TYPE
/* Some old versions of libmagic don't support MAGIC_MIME_TYPE.
* We can use MAGIC_MIME instead. It returns more than we need
* but we can work around that (see below). */
mc->magic = magic_open(MAGIC_MIME | MAGIC_ERROR);
#else
mc->magic = magic_open(MAGIC_MIME_TYPE | MAGIC_ERROR);
#endif
if (mc->magic)
{
/* This loads the default magic database.
* Point the MAGIC environment variable at your favourite .mgc
* file to load a non-default database. */
if (magic_load(mc->magic, NULL) == -1)
{
magic_close(mc->magic);
mc = NULL;
}
else
apr_pool_cleanup_register(result_pool, mc, close_magic_cookie,
apr_pool_cleanup_null);
}
#endif
*magic_cookie = mc;
}
svn_error_t *
svn_magic__detect_binary_mimetype(const char **mimetype,
const char *local_abspath,
svn_magic__cookie_t *magic_cookie,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
const char *magic_mimetype = NULL;
#ifdef SVN_HAVE_LIBMAGIC
apr_finfo_t finfo;
/* Do not ask libmagic for the mime-types of empty files.
* This prevents mime-types like "application/x-empty" from making
* Subversion treat empty files as binary. */
SVN_ERR(svn_io_stat(&finfo, local_abspath, APR_FINFO_SIZE, scratch_pool));
if (finfo.size > 0)
{
magic_mimetype = magic_file(magic_cookie->magic, local_abspath);
if (magic_mimetype)
{
/* Only return binary mime-types. */
if (strncmp(magic_mimetype, "text/", 5) == 0)
magic_mimetype = NULL;
else
{
svn_error_t *err;
#ifndef MAGIC_MIME_TYPE
char *p;
/* Strip off trailing stuff like " charset=ascii". */
p = strchr(magic_mimetype, ' ');
if (p)
*p = '\0';
#endif
/* Make sure we got a valid mime type. */
err = svn_mime_type_validate(magic_mimetype, scratch_pool);
if (err)
{
if (err->apr_err == SVN_ERR_BAD_MIME_TYPE)
{
svn_error_clear(err);
magic_mimetype = NULL;
}
else
return svn_error_trace(err);
}
else
{
/* The string is allocated from memory managed by libmagic
* so we must copy it to the result pool. */
magic_mimetype = apr_pstrdup(result_pool, magic_mimetype);
}
}
}
}
#endif
*mimetype = magic_mimetype;
return SVN_NO_ERROR;
}
( run in 1.498 second using v1.01-cache-2.11-cpan-d7f47b0818f )