Пытается использовать 3-ю часть библиотеки, 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 ответа

Вероятно, волшебная база данных по умолчанию (что вы получаете при прохождении NULL в качестве второго аргумента magic_load() не установлен или не найден в Windows. Попробуйте быть явным, то есть дать ему фактическое абсолютное имя файла.

Документы говорят:

Функция magic_load() должна использоваться для загрузки списка файлов базы данных, разделенных двоеточиями, переданного как имя файла, или NULL для файла базы данных по умолчанию, прежде чем можно будет выполнять какие-либо магические запросы.

Ваш код правильный (кроме проверки 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" это то, что вы ищете. Затем сделать file на том же file.yay с strace снова (это подтвердит, если *mgc файл был хорош)

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

Удачи!

Man-страница для libmagic имеет это.

magic_load(magic_t cookie, const char *filename);

Вы проходите NULLдля filename параметр, поэтому он попытается загрузить файл базы данных по умолчанию. Который, кажется, терпит неудачу. Изменить это на actual_file возможно и попробуйте еще раз.

Другие вопросы по тегам