试图使用第三部分库,libmagic

时间:2013-02-07 13:48:05

标签: c visual-studio-2010 libmagic

我尝试使用此代码:

#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,没有任何构建错误。

3 个答案:

答案 0 :(得分:2)

可能是默认魔术数据库(将NULL作为第二个论证者传递给magic_load()时获得的内容未安装,或者在Windows下找不到。请尝试显式,即给它实际的绝对值文件名。

文档说:

  

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

答案 1 :(得分:1)

libmagic的手册页有这个。

magic_load(magic_t cookie, const char *filename);

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

答案 2 :(得分:1)

您的代码是正确的(除了最后没有检查magic_full NULL。它实际上可以在我的机器上运行。

你有魔术库的问题 - 也许你没有合适的魔术签名文件,或者你没有访问它,甚至文件已损坏!如果你有MAGIC env var set,请检查它是否指向正确的文件!

还尝试确定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在同一个filefile.yay(这将确认*mgc文件是否良好):

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