【问题标题】:trying to use 3rd part library, libmagic尝试使用第三部分库 libmagic
【发布时间】:2013-01-23 01:02:33
【问题描述】:

我尝试使用此代码:

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

int main(void)
{
    char *actual_file = "/file/you/want.yay";
    const char *magic_full;
    magic_t magic_cookie;
    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;

}

执行此代码时,会出现消息:“无法加载魔法数据库”。为什么?我不明白是什么原因……。

我使用 Visual Studio 2010 进行编译,没有任何构建错误。

【问题讨论】:

  • 你的代码中没有任何东西是 C++,都是 C。
  • 关于错误,请给出full错误信息,代码会从库中打印错误信息。
  • 第 9 行中的“MAGIC_MIME”是什么?它看起来像一个 const 或 #define。也许你检查一下这个 magic_open() 函数需要什么。

标签: c visual-studio-2010 libmagic


【解决方案1】:

libmagic 的手册页有这个。

magic_load(magic_t cookie, const char *filename);

您正在为filename 参数传递NULL,因此它将尝试加载默认数据库文件。这似乎失败了。或许将其更改为 actual_file,然后重试。

【讨论】:

  • 手册中还说文件名可以是NULL来加载默认数据库。
  • 默认数据库文件名是/usr/share/misc/magic,不存在
【解决方案2】:

可能是默认的魔法数据库(将NULL 作为第二个参数传递给magic_load() 时得到的结果未安装,或者在Windows 下找不到。尝试明确,即给它实际的绝对文件名。

文档说:

magic_load() 函数必须用于加载以冒号分隔的数据库文件列表作为文件名传入,或者在执行任何魔术查询之前,默认数据库文件为 NULL。

【讨论】:

  • 我发现了问题。你说的对。我没有找到程序搜索默认魔法数据库的位置,所以我插入了另一个我找到的数据库。
  • 对不起,你是怎么写的?我试过 magic_load(mhandle_magic,"C:\\magic.mgc");和 magic_load(mhandle_magic,"C:\\magic"),但它仍然失败(你是从 Linux 机器上用数据库获取文件吗?或者如何?)
  • 哈哈,原来magic.mgc文件有不同的版本,每个版本的libmagic都不一样,所以首先需要检查magic.mgc文件的版本是否正确使用过,所以要小心!这是我一直坚持的问题。也许,它可以帮助某人。
【解决方案3】:

您的代码是正确的(除了最后没有检查magic_fullNULL。它实际上在我的机器上工作。

您的魔术库有问题 - 可能您没有正确的魔术签名文件,或者您无权访问它,甚至文件已损坏!请检查您是否设置了 MAGIC env var 是否指向正确的文件!

还尝试像这样确定 magic_load 的默认文件:

$ strace ./magic 2>&1 | grep open
open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/usr/lib64/libmagic.so.1", O_RDONLY) = 3
open("/lib64/libc.so.6", O_RDONLY)      = 3
open("/lib64/libz.so.1", O_RDONLY)      = 3
open("/usr/share/file/magic.mime.mgc", O_RDONLY) = 3
$

这个:"/usr/share/file/magic.mime.mgc" 就是您要查找的内容。 然后,再次使用 strace 在同一 file.yay 上执行 file(这将确认 *mgc 文件是否良好):

$ strace file --mime `/path/to/file.yay` 2>&1 | grep open
...
open("/usr/share/file/magic.mime.mgc", O_RDONLY) = 3
...
$

祝你好运!

【讨论】:

    猜你喜欢
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    相关资源
    最近更新 更多