TMPFS_MAGIC в заголовке linux и ошибка определения свободного места на диске

Извините, если я задаю «двойной вопрос», но я не хочу разделять эти два :) Может быть, кто-нибудь знает, для чего используется TMPFS_MAGIC со значением 0x01021994? Он определен в /usr/include/linux/magic.h, и я нашел его при запуске следующего кода, который пытается определить доступное пространство в каталоге linux (обычно это раздел):

QString path = "/dev/sde1";
struct stat stst;
struct statfs stfs;

if ( ::stat(path.toLocal8Bit(), &stst) == -1 )
{
    return 0.0;
}

if ( ::statfs(path.toLocal8Bit(), &stfs) == -1 )
{
    return 0.0;
}

return m_diskFree = stfs.f_bavail * ( stst.st_blksize / 1024 );

из командной строки gdb:

(gdb) print stfs
$1 = {f_type = 16914836, f_bsize = 4096, f_blocks = 2042909, f_bfree = 2042907, f_bavail = 2042907, f_files = 2042909, f_ffree = 2042267, f_fsid = {__val = {0, 0}}, f_namelen = 255, f_frsize = 4096, f_flags = 4128, f_spare = {0, 
0, 0, 0}}

где f_type = 16914836 это магия сверху. К вашему сведению, «/dev/sde1» — это внешний диск с разделом NTFS.

А также приведенный выше код работает некорректно для разделов NTFS, смонтированных на Linux-системах (он работает для файловых систем ext*fs), поэтому я спрашиваю: знаете ли вы, как правильно находить свободное место для дисков NTFS, смонтированных на Linux-хостах? Команда linux df, кажется, выполняет свою работу правильно, но мне не удалось найти правильный способ сделать это (пока...).

Спасибо, ф.


person Ferenc Deak    schedule 20.02.2013    source источник


Ответы (1)


Итак, после нескольких отладок и бессонных ночей решение было довольно простым. Найдите источник df.c и прочитайте его. Да здравствует свободный и открытый исходный код.

И объяснение: когда вы используете stat и statfs для поиска свободного места на жестком диске, вы не пытаетесь найти свободное место на самом устройстве, потому что это волшебство... но вы пытаетесь найти свободное место каталога, в котором смонтировано устройство. Итак, вместо

QString path = "/dev/sde1";

там должен быть

QString path = "/mnt/DISK";

где "mnt/DISK" — это каталог, в который смонтирован диск "/dev/sde1". Я использовал libext2fs, чтобы найти точку монтирования диска, но я уверен, что есть другие лучшие решения, такие как разбор /etc/mtab

person Ferenc Deak    schedule 02.03.2013