0

我正在尝试使用 libmagic 和以下代码来确定几种类型的文件的 mime 类型:

auto handle = ::magic_open(MAGIC_MIME_TYPE);
::magic_load(handle, NULL);

// Both of these fail with the same error
// file_path being a const char* with the path to the file.
auto type2 = ::magic_file(handle, file_path);

// svg_content being an std::vector<char> with the contents of the file.
//auto type2 = ::magic_buffer(handle, svg_content.data(), svg_content.size()); 

if(!type2)
{
   std::cout << magic_error(handle) << std::endl;
}
    
::magic_close(handle);

但是对于我尝试的任何文件或缓冲区,我都会收到正则表达式错误,或者是或类似于:

46: '(dryad-bibo/v)[0-9].[0-9]' 的正则表达式错误 17,(匹配失败)

例如这个 .svg 文件:

<svg xmlns="http://www.w3.org/2000/svg" id="flag-icon-css-no" viewBox="0 0 640 480">
  <path fill="#ed2939" d="M0 0h640v480H0z"/>
  <path fill="#fff" d="M180 0h120v480H180z"/>
  <path fill="#fff" d="M0 180h640v120H0z"/>
  <path fill="#002664" d="M210 0h60v480h-60z"/>
  <path fill="#002664" d="M0 210h640v60H0z"/>
</svg>

到目前为止我已经尝试过:

  • libmagic 5.35
  • libmagic 5.39
  • libmagic 5.40
  • 来自 opensource.apple 的 libmagic
  • 将 LC_TYPE 和 LANG 设置为“C”

我正在链接本地构建的 libmagic 版本,在构建时我会遗漏什么吗?是否有任何呼叫不正确或有什么我遗漏的?

尝试运行在本地编译的相关文件二进制文件时出现类似错误。而当我使用默认可用的文件命令时,我会得到 image/svg+xml 作为输出。

编辑

为了构建 libmagic(适用于 macOS 和 Ubuntu),我按照以下步骤操作:

  • 从Github下载相关版本
  • 自动重新配置——安装
  • 。/配置
  • 制作
  • 进行安装

更新

看起来这个文件底部的正则表达式导致了问题(至少对于 svg):

https://github.com/file/file/blob/b56b58d499dbe58f2bed28e6b3c297fe7add992e/magic/Magdir/dataone

更新 2

发生了一些奇怪的事情;在我让它工作的系统上,按预期magic_version()报告540 。但是在出现此错误而失败的系统上,magic_version()报告538

这对我来说毫无意义,因为我在系统本身的任何地方都找不到该版本,当我./file --version在构建库中运行时,它会报告file-5.40.

4

2 回答 2

1

非常不满意的答案,但它链接到GoogleTest以某种方式导致了这个错误,甚至没有运行任何测试,只是链接到它。

我改用Catch2并解决了问题。

于 2021-09-21T09:11:11.827 回答
0

在 Ubuntu 20.04 上测试:

克隆仓库

git clone git@github.com:file/file.git
cd file/

在 repo 的新克隆中试试这个:

autoreconf -f -i
./configure --disable-silent-rules
make -j4
make -C tests check

并查看是否有报错。安装后make install,获取一些名为“test.xml”的有效xml文件并将其与此一起放入某个文件夹main.c

#include <stdio.h>
#include <magic.h>

int main(void)
{
    char *actual_file = "test.xml";
    const char *magic_full;
    magic_t magic_cookie;

    /* MAGIC_MIME tells magic to return a mime of the file,
       but you can specify different things */
    magic_cookie = magic_open(MAGIC_MIME);

    if (magic_cookie == NULL) {
        printf("unable to initialize magic library\n");
        return 1;
    }

    printf("Loading default magic database\n");

    if (magic_load(magic_cookie, NULL) != 0) {
        printf("cannot load magic database - %s\n", magic_error(magic_cookie));
        magic_close(magic_cookie);
        return 1;
    }

    magic_full = magic_file(magic_cookie, actual_file);
    printf("%s\n", magic_full);
    magic_close(magic_cookie);
    return 0;
}

(由vivihemage提供。)

编译并尝试:

$ gcc main.c -lmagic
$ ./a.out 
Loading default magic database
text/xml; charset=us-ascii

如果它在您的系统上不起作用,请在项目的 bugtracker上报告错误,并说明您的操作系统和体系结构的规范。您可以尝试通过从您在更新中找到的文件中删除违规记录来修复您的问题。

于 2021-09-20T12:24:27.300 回答