Предоставьте базу данных magic в libmagic

#file-type #libmagic

Вопрос:

У меня есть простой код на языке Си, который возвращает тип файла данного файла. Я могу указать ему любое имя файла из командной строки, и он вернет тип файла:

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

int main(int argc, char **argv) {
    unsigned modes = (
        MAGIC_MIME | MAGIC_CHECK |
        MAGIC_CONTINUE | MAGIC_SYMLINK
    ) ;

    struct magic_set *magic = magic_open(modes) ;

    // unsigned long value ;
    // magic_getparam(magic, MAGIC_PARAM_REGEX_MAX, amp;value) ;
    // printf("%ldn", value) ;

    magic_load(magic, NULL) ;

    if(!argv[1]) return 1 ;

    const char *mm = magic_file(magic, argv[1]) ;

    if(mm < 0) {
        const char *err = magic_error(magic) ;
        puts(err) ;
        return 1 ;
    }

    puts(mm) ;
    magic_close(magic) ;
}
 

Проблема в том, что я не хочу полагаться для этого на файл пакета. И если я переименую /usr/share/file/misc/magic.mgc что-то другое, это не сработает. На справочной странице говорится, что это скомпилированный файл, также может быть просто некомпилированная база данных.

Поэтому я хочу скопировать файл magic.mgc в локальный каталог и запустить скомпилированную программу как есть.

Можно ли передать локальную базу данных magic в программу C, чтобы она не полагалась на базу данных, предоставляемую системой?

Ответ №1:

Так что я могу использовать это:

 magic_load(magic, "/tmp/magic.mgc") ;
 

Предполагая, что файл находится в каталоге /tmp/. Я видел, что mgc расширение важно, иначе программа получит segfault.