2013-02-07 33 views
2

我嘗試使用此代碼:嘗試使用第三部分庫,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; 

} 

當執行此代碼它出現在messagge:「無法加載魔數據庫」。爲什麼?我不明白是什麼原因......。

編譯我使用visual studio 2010,沒有任何生成錯誤。

+1

您的代碼中沒有任何內容是C++,全是C. –

+0

關於錯誤,請給出_full_錯誤消息,代碼會從庫中打印出錯誤消息。 –

+0

什麼是第9行中的「MAGIC_MIME」?它看起來像一個const或#define。也許你檢查這個magic_open()函數需要什麼。 – marscode

回答

1

libmagic的手冊頁有這個。

magic_load(magic_t cookie, const char *filename);

你傳入NULLfilename參數所以它會試圖加載默認的數據庫文件。這似乎是失敗的。也許更改到actual_file並再試一次。

+0

該手冊還指出文件名可以是NULL來加載默認數據庫。 –

+0

好點。糾正。 – jcopenha

+0

默認的數據庫文件名是/ usr/share/misc/magic,這不存在 – 2013-02-07 13:58:37

2

可能默認神奇的數據庫(你得到的傳遞NULL爲第二變元到magic_load()未安裝的時候,或者它不是在Windows下找到。嘗試是明確的,即給它實際的絕對路徑。

的文件說:

()必須使用功能magic_load加載中傳遞過來的文件名,或者爲null,默認的數據庫文件中的任何魔法查詢可以執行之前,數據庫文件的冒號分隔列表

+0

我找到了問題。你是對的。我沒有找到程序搜索默認魔術數據庫的位置,所以我插入了我找到的另一個數據庫。 – user2050969

+0

不好意思,但你是怎麼寫的?我試過 magic_load(mhandle_magic,「C:\\ magic.mgc」);和magic_load(mhandle_magic,「C:\\ magic」),但它仍然失敗(你是否從Linux機器上獲取數據庫文件?或者如何?) – Tebe

+1

呵呵,結果是有不同版本的magic.mgc文件,每個版本的libmagic都不一樣,所以需要先檢查magic.mgc文件是否使用正確的版本,所以要小心!這是我遇到的問題。也許,它有助於某人。 – Tebe

1

你的代碼是正確的(除了最後沒有檢查magic_fullNULL。它實際上在我的機器上工作。

你有一個魔法庫的問題 - 也許你沒有適當的魔術簽名文件,或者你沒有訪問它,甚至文件已損壞!請檢查,如果你有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 
... 
$ 

祝你好運!