2012-07-09 98 views
3

我的應用程序應該安裝並檢查插入USB插槽中的任何pendrive的內容。 問題是,有些用戶可能使用格式化爲其他文件系統的pendrives而不是標準的'vfat'。 標準mount()上自動檢測文件系統

mount /dev/sda1 /mnt/pendrive -t auto 

會滿足我的需求是不夠的 - 它的工作原理和內核可讀的任何文件系統將被使用。 問題是我必須從應用程序中完成它,並且我寧願避免在存在「自然」C解決方案時調用system()和shell命令。

#include <sys/mount.h> 
... 
result = mount("/dev/sda1", "/mnt/pendrive", "vfat" ,0, NULL); 

工作正常。但如果我用"auto"NULL替換"vfat",則不會安裝任何內容。

當我檢查busybox掛載的源文件時,如果提供'auto'或沒有文件系統類型,它似乎在mount()調用中將文件系統設置爲NULL。但是這個伎倆似乎並不適合我。我錯過了什麼?有沒有一些相對簡單的方法來做到這一點?

+1

errno設置爲什麼? – Duck 2012-07-09 15:34:47

+1

當您將'auto'選項指定爲文件系統類型時,mount實用程序在內部嘗試檢測文件系統 – Petesh 2012-07-09 15:43:19

回答

5

內核不能自動檢測文件系統,所以你必須自己做。

實際上做什麼busybox的僅僅是通過所有相關的文件系統,從/ proc /文件系統解析循環,並調用安裝(),直到成功爲止(見行1898

1

如果mount /dev/sda1 /mnt/pendrive -t auto是你需要做什麼。然後就這樣做。

sprintf(cmd, "mount /dev/sda1 /mnt/pendrive -t auto")  
rc = system(cmd); 

sprintf(cmd, "mount /dev/sda1 /mnt/pendrive -t auto")  
if ((p = popen(cmd, "w")) != NULL) 
{ 
    ... 
} 

應該正常工作。您可能需要監聽udev事件或掃描當前連接的USB海量存儲設備的udev日誌以獲取節點路徑,但這應該讓您開始。

+1

明確提出問題的人不希望使用系統( )'''也不打開shell ... – Piranna 2014-10-10 16:38:30

3

爲什麼不使用循環?

#define MAX 4 
const char *FSTypes[MAX] = { "ext4", "btrfs", "ntfs", "vfat" }; 
short Inc = 0; 

for (; Inc < MAX; ++Inc) 
{ 
    if (mount("/source", "/target", FSTypes[Inc], 0, NULL) == 0) 
    { /*If it's successful, stop.*/ 
     break; 
    } 
} 

我意識到這是一個老問題,但這似乎有關爲他人尋找答案。