автоопределение файловой системы при монтировании()

Мое приложение должно монтировать и проверять содержимое любого флеш-накопителя, вставленного в USB-разъем. Проблема в том, что некоторые пользователи могут использовать флешки, отформатированные для файловых систем, отличных от стандартного vfat. Стандарт

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

будет достаточно для моих нужд - это работает, и будет использоваться любая файловая система, читаемая ядром. Проблема в том, что я должен делать это из приложения, и я бы предпочел избегать вызова system() и команд оболочки, когда существует «естественное» решение C.

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

работает правильно. Но если я заменю "vfat" на "auto" или NULL, ничего не смонтируется.

Когда я проверил источники для монтирования busybox, кажется, что файловая система устанавливается в NULL в вызове mount(), если указано «авто» или тип файловой системы не указан. Но этот трюк, кажется, не работает для меня. Что мне не хватает? Есть ли какой-то относительно простой способ сделать это?


person SF.    schedule 09.07.2012    source источник
comment
Утилита монтирования пытается определить файловую систему, когда вы указываете параметр auto в качестве типа файловой системы.   -  person Petesh    schedule 09.07.2012


Ответы (3)


Ядро не может автоматически определить файловую систему, поэтому вам придется сделать это самостоятельно.

На самом деле busybox просто перебирает все соответствующие файловые системы, анализирует /proc/filesystems и вызывает mount() до тех пор, пока не добьется успеха (см. строку 1898 )

person nos    schedule 09.07.2012

Почему бы просто не использовать цикл?

#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;
    }
}

Я понимаю, что это старый вопрос, но он кажется актуальным для других, ищущих ответы.

person Subsentient    schedule 02.09.2013

Если mount /dev/sda1 /mnt/pendrive -t auto это то, что вам нужно сделать. Тогда просто сделайте это.

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

or

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

Должен работать нормально. Возможно, вам придется прослушивать события udev или сканировать журнал udev на наличие подключенных в данный момент USB-накопителей, чтобы получить путь к узлу, но это должно помочь вам начать работу.

person linsek    schedule 09.07.2012
comment
Тот, кто задал вопрос, прямо спросил, что он предпочел бы не использовать system() и не открывать оболочку... - person Piranna; 10.10.2014