Provided by: manpages-ru-dev_4.19.0-7_all
ИМЯ
ioctl_fat - управление файловой системой FAT
LIBRARY
Standard C library (libc, -lc)
СИНТАКСИС
#include <linux/msdos_fs.h> /* Definition of [V]FAT_* and ATTR_* constants*/" #include <sys/ioctl.h> int ioctl(int fd, FAT_IOCTL_GET_ATTRIBUTES, uint32_t *attr); int ioctl(int fd, FAT_IOCTL_SET_ATTRIBUTES, uint32_t *attr); int ioctl(int fd, FAT_IOCTL_GET_VOLUME_ID, uint32_t *id); int ioctl(int fd, VFAT_IOCTL_READDIR_BOTH, struct __fat_dirent entry[2]); int ioctl(int fd, VFAT_IOCTL_READDIR_SHORT, struct __fat_dirent entry[2]);
ОПИСАНИЕ
Системный вызов ioctl(2) можно использовать для чтения и записи метаданных файловых систем FAT, которые недоступны через другие системные вызовы. Чтение и установка файловых атрибутов У файлов и каталогов и в файловой системе FAT есть битовая маска атрибутов, которую можно прочитать с помощью FAT_IOCTL_GET_ATTRIBUTES и записать с FAT_IOCTL_SET_ATTRIBUTES. Аргумент fd содержит файловый дескриптор файла или каталога. Для создания файлового дескриптора достаточно вызвать open(2) с флагом O_RDONLY. Аргумент attr содержит указатель на битовую маску. Назначение битов в маске: ATTR_RO Данный бит означает, что файл или каталог доступен только для чтения. ATTR_HIDDEN Данный бит означает, что файл или каталог скрыт. ATTR_SYS Данный бит означает, что файл является системным. ATTR_VOLUME Данный бит означает, что файл является меткой тома. Данный атрибут доступен только для чтения. ATTR_DIR Данный бит означает, что это каталог. Данный атрибут доступен только для чтения. ATTR_ARCH Данный бит означает, что файл или каталог должны архивироваться. Он устанавливается при создании или изменении файла. Он сбрасывается системой архивирования. Нулевое значение ATTR_NONE можно использовать для указания, что все биты атрибутов не установлены. Чтение идентификатора тома Файловые системы FAT маркируются идентификатором тома. Идентификатор тома может быть прочитан с помощью FAT_IOCTL_GET_VOLUME_ID. Аргумент fd может быть файловым дескриптором файла или каталога файловой системы. Для создания файлового дескриптора достаточно вызвать open(2) с флагом O_RDONLY. Аргумент id — это указатель на поле, которое будет заполнено ID тома. Обычно, идентификатор тома выдаётся пользователю как группа из двух 16-битных полей: printf("Volume ID %04x-%04x\n", id >> 16, id & 0xFFFF); Чтение коротких имён файлов каталога Файл или каталог файловой системы FAT всегда имеет короткое имя файла, состоящее из не более чем 8 заглавных букв, необязательной точки и до 3 заглавных букв расширения файла. Если реальное имя файла не следует такой схеме, то оно сохраняется как длинное имя файла — до 255 символов UTF-16. Короткие имена файлов в каталоге можно прочитать с помощью VFAT_IOCTL_READDIR_SHORT. С помощью VFAT_IOCTL_READDIR_BOTH можно прочитать как короткие так и длинные имена файлов. Аргумент fd должен содержать файловый дескриптор каталога. Для создания файлового дескриптора достаточно вызвать open(2) с флагом O_RDONLY. Файловый дескриптор можно использовать только однажды для обхода всех элементов каталога повторными вызовами ioctl(2). Параметр info представляет собой двухэлементный массив структур следующего вида: struct __fat_dirent { long d_ino; __kernel_off_t d_off; uint32_t short d_reclen; char d_name[256]; }; Первый элемент массива содержит короткое имя файла. Во втором содержится длинное имя файла. Поля d_ino и d_off заполняются только для длинных имён. Поле d_ino содержит номер inode каталога. Поле d_off содержит смещение записи файла в каталоге. Так как эти поля недоступны для коротких имён, пользовательский код должен просто игнорировать их. В поле d_reclen содержится длина имени файла из поля d_name. Для сохранения обратной совместимости длина 0 для короткого имени указывает на достижение конца каталога. Однако предпочтительным методом определения конца каталога является проверка возвращаемого ioctl(2) значения. Если длинное имя не существует, то поле d_reclen устанавливается в 0 и d_name — строка символов длиной 0 для длинного имени файла.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
В случае ошибки возвращается -1, а errno устанавливается в значение ошибки. При использовании VFAT_IOCTL_READDIR_BOTH и VFAT_IOCTL_READDIR_SHORT возвращается значение 1, означающее, что был прочитан новый элемент каталога и 0, когда достигнут конец каталога.
ОШИБКИ
ENOENT Данная ошибка может возвращаться при VFAT_IOCTL_READDIR_BOTH и VFAT_IOCTL_READDIR_SHORT, если файловый дескриптор fd указывает на на удалённый, но ещё открытый каталог. ENOTDIR Данная ошибка может возвращаться при VFAT_IOCTL_READDIR_BOTH и VFAT_IOCTL_READDIR_SHORT, если файловый дескриптор fd не указывает на каталог. ENOTTY Файловый дескриптор fd указывает не на объект в файловой системе FAT. Дополнительные значения ошибок смотрите в ioctl(2).
ВЕРСИИ
VFAT_IOCTL_READDIR_BOTH и VFAT_IOCTL_READDIR_SHORT впервые появились в Linux 2.0. FAT_IOCTL_GET_ATTRIBUTES и FAT_IOCTL_SET_ATTRIBUTES впервые появились в Linux 2.6.12. FAT_IOCTL_GET_VOLUME_ID появился в версии 3.11 ядра Linux.
СТАНДАРТЫ
Данный программный интерфейс существует только в Linux.
ПРИМЕРЫ
Переключение флага архивирования В следующей программе показано использование ioctl(2) для изменения атрибутов файлов. Программа читает и показывает атрибут архивирования файла. После изменения значения атрибута на противоположный, программа читает и показывает атрибут ещё раз. Пример сеанса работы программы с файлом /mnt/user/foo: # ./toggle_fat_archive_flag /mnt/user/foo Флаг архивирования установлен Переключение флага архивирования Флаг архивирования сброшен Исходный код программы (toggle_fat_archive_flag.c) #include <fcntl.h> #include <linux/msdos_fs.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <sys/ioctl.h> #include <unistd.h> /* * Читает атрибуты файла в файловой системе FAT. * Выводит состояние флага архивирования. */ static uint32_t readattr(int fd) { int ret; uint32_t attr; ret = ioctl(fd, FAT_IOCTL_GET_ATTRIBUTES, &attr); if (ret == -1) { perror("ioctl"); exit(EXIT_FAILURE); } if (attr & ATTR_ARCH) printf("Флаг архивирования установлен\n"); else printf("Флаг архивирования сброшен\n"); return attr; } int main(int argc, char *argv[]) { int fd; int ret; uint32_t attr; if (argc != 2) { printf("Использование: %s ИМЯ_ФАЙЛА\n", argv[0]); exit(EXIT_FAILURE); } fd = open(argv[1], O_RDONLY); if (fd == -1) { perror("open"); exit(EXIT_FAILURE); } /* * Читает и показывает атрибуты файлов в FAT. */ attr = readattr(fd); /* * Invert archive attribute. */ printf("Toggling archive flag\n"); attr ^= ATTR_ARCH; /* * Записывает изменённые атрибуты файлов в FAT. */ ret = ioctl(fd, FAT_IOCTL_SET_ATTRIBUTES, &attr); if (ret == -1) { perror("ioctl"); exit(EXIT_FAILURE); } /* * Читает и показывает атрибуты файлов в FAT. */ readattr(fd); close(fd); exit(EXIT_SUCCESS); } Чтение идентификатора тома Следующий пример кода демонстрирует использование ioctl(2) для вывода идентификатора тома файловой системы FAT. Пример сеанса работы программы с файлом /mnt/user: $ ./display_fat_volume_id /mnt/user Volume ID 6443-6241 Исходный код программы (display_fat_volume_id.c) #include <fcntl.h> #include <linux/msdos_fs.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <sys/ioctl.h> #include <unistd.h> int main(int argc, char *argv[]) { int fd; int ret; uint32_t id; if (argc != 2) { printf("Использование: %s ИМЯ_ФАЙЛА\n", argv[0]); exit(EXIT_FAILURE); } fd = open(argv[1], O_RDONLY); if (fd == -1) { perror("open"); exit(EXIT_FAILURE); } /* * Читает ID тома. */ ret = ioctl(fd, FAT_IOCTL_GET_VOLUME_ID, &id); if (ret == -1) { perror("ioctl"); exit(EXIT_FAILURE); } /* * Форматирует вывод в виде двух групп по 16 бит каждая. */ printf("Volume ID %04x-%04x\n", id >> 16, id & 0xFFFF); close(fd); exit(EXIT_SUCCESS); } Вывод содержимого каталога Следующий пример кода демонстрирует использование ioctl(2) для вывода содержимого каталога. Пример сеанса работы программы с файлом /mnt/user: $ ./fat_dir /mnt/user . -> '' .. -> '' ALONGF~1.TXT -> 'a long filename.txt' UPPER.TXT -> '' LOWER.TXT -> 'lower.txt' Исходный код программы #include <fcntl.h> #include <linux/msdos_fs.h> #include <stdio.h> #include <stdlib.h> #include <sys/ioctl.h> #include <unistd.h> int main(int argc, char *argv[]) { int fd; int ret; struct __fat_dirent entry[2]; if (argc != 2) { printf("Использование: %s КАТАЛОГ\n", argv[0]); exit(EXIT_FAILURE); } /* * Открывает файловый дескриптор каталога. */ fd = open(argv[1], O_RDONLY | O_DIRECTORY); if (fd == -1) { perror("open"); exit(EXIT_FAILURE); } for (;;) { /* * Читает следующий элемент из каталога. */ ret = ioctl(fd, VFAT_IOCTL_READDIR_BOTH, entry); /* * Если произошла ошибка, то возвращает -1. * Если достигнут конец каталога, то * возвращает 0. * Для обратной совместимости при достижении конца каталога * также d_reclen == 0. */ if (ret < 1) break; /* * Write both the short name and the long name. */ printf("%s -> '%s'\n", entry[0].d_name, entry[1].d_name); } if (ret == -1) { perror("VFAT_IOCTL_READDIR_BOTH"); exit(EXIT_FAILURE); } /* * Закрывает файловый дескриптор. */ close(fd); exit(EXIT_SUCCESS); }
СМ. ТАКЖЕ
ioctl(2)
ПЕРЕВОД
Русский перевод этой страницы руководства был сделан Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com> Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.