Пытается использовать 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
возможно и попробуйте еще раз.