.\" -*- coding: UTF-8 -*- .\" Copyright (C) 2014, Heinrich Schuchardt .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH ioctl_fat 2 "10 февраля 2023 г." "Linux man\-pages 6.03" .SH ИМЯ ioctl_fat \- управление файловой системой FAT .SH LIBRARY Standard C library (\fIlibc\fP, \fI\-lc\fP) .SH СИНТАКСИС .nf \fB#include \fP /* Definition of [\fBV\fP]\fBFAT_*\fP and \fB ATTR_* \fPconstants\fB*/"\fP \fB#include \fP .PP \fBint ioctl(int \fP\fIfd\fP\fB, FAT_IOCTL_GET_ATTRIBUTES, uint32_t *\fP\fIattr\fP\fB);\fP \fBint ioctl(int \fP\fIfd\fP\fB, FAT_IOCTL_SET_ATTRIBUTES, uint32_t *\fP\fIattr\fP\fB);\fP \fBint ioctl(int \fP\fIfd\fP\fB, FAT_IOCTL_GET_VOLUME_ID, uint32_t *\fP\fIid\fP\fB);\fP \fBint ioctl(int \fP\fIfd\fP\fB, VFAT_IOCTL_READDIR_BOTH,\fP \fB struct __fat_dirent \fP\fIentry\fP\fB[2]);\fP \fBint ioctl(int \fP\fIfd\fP\fB, VFAT_IOCTL_READDIR_SHORT,\fP \fB struct __fat_dirent \fP\fIentry\fP\fB[2]);\fP .fi .SH ОПИСАНИЕ Системный вызов \fBioctl\fP(2) можно использовать для чтения и записи метаданных файловых систем FAT, которые недоступны через другие системные вызовы. .SS "Чтение и установка файловых атрибутов" У файлов и каталогов и в файловой системе FAT есть битовая маска атрибутов, которую можно прочитать с помощью \fBFAT_IOCTL_GET_ATTRIBUTES\fP и записать с \fBFAT_IOCTL_SET_ATTRIBUTES\fP. .PP Аргумент \fIfd\fP содержит файловый дескриптор файла или каталога. Для создания файлового дескриптора достаточно вызвать \fBopen\fP(2) с флагом \fBO_RDONLY\fP. .PP Аргумент \fIattr\fP содержит указатель на битовую маску. Назначение битов в маске: .TP \fBATTR_RO\fP Данный бит означает, что файл или каталог доступен только для чтения. .TP \fBATTR_HIDDEN\fP Данный бит означает, что файл или каталог скрыт. .TP \fBATTR_SYS\fP Данный бит означает, что файл является системным. .TP \fBATTR_VOLUME\fP Данный бит означает, что файл является меткой тома. Данный атрибут доступен только для чтения. .TP \fBATTR_DIR\fP Данный бит означает, что это каталог. Данный атрибут доступен только для чтения. .TP \fBATTR_ARCH\fP Данный бит означает, что файл или каталог должны архивироваться. Он устанавливается при создании или изменении файла. Он сбрасывается системой архивирования. .PP Нулевое значение \fBATTR_NONE\fP можно использовать для указания, что все биты атрибутов не установлены. .SS "Чтение идентификатора тома" Файловые системы FAT маркируются идентификатором тома. Идентификатор тома может быть прочитан с помощью \fBFAT_IOCTL_GET_VOLUME_ID\fP. .PP Аргумент \fIfd\fP может быть файловым дескриптором файла или каталога файловой системы. Для создания файлового дескриптора достаточно вызвать \fBopen\fP(2) с флагом \fBO_RDONLY\fP. .PP Аргумент \fIid\fP — это указатель на поле, которое будет заполнено ID тома. Обычно, идентификатор тома выдаётся пользователю как группа из двух 16\-битных полей: .PP .in +4n .EX printf("Volume ID %04x\-%04x\en", id >> 16, id & 0xFFFF); .EE .in .SS "Чтение коротких имён файлов каталога" Файл или каталог файловой системы FAT всегда имеет короткое имя файла, состоящее из не более чем 8 заглавных букв, необязательной точки и до 3 заглавных букв расширения файла. Если реальное имя файла не следует такой схеме, то оно сохраняется как длинное имя файла — до 255 символов UTF\-16. .PP Короткие имена файлов в каталоге можно прочитать с помощью \fBVFAT_IOCTL_READDIR_SHORT\fP. С помощью \fBVFAT_IOCTL_READDIR_BOTH\fP можно прочитать как короткие так и длинные имена файлов. .PP Аргумент \fIfd\fP должен содержать файловый дескриптор каталога. Для создания файлового дескриптора достаточно вызвать \fBopen\fP(2) с флагом \fBO_RDONLY\fP. Файловый дескриптор можно использовать только однажды для обхода всех элементов каталога повторными вызовами \fBioctl\fP(2). .PP Параметр \fIinfo\fP представляет собой двухэлементный массив структур следующего вида: .PP .in +4n .EX struct __fat_dirent { long d_ino; __kernel_off_t d_off; uint32_t short d_reclen; char d_name[256]; }; .EE .in .PP Первый элемент массива содержит короткое имя файла. Во втором содержится длинное имя файла. .PP Поля \fId_ino\fP и \fId_off\fP заполняются только для длинных имён. Поле \fId_ino\fP содержит номер inode каталога. Поле \fId_off\fP содержит смещение записи файла в каталоге. Так как эти поля недоступны для коротких имён, пользовательский код должен просто игнорировать их. .PP В поле \fId_reclen\fP содержится длина имени файла из поля \fId_name\fP. Для сохранения обратной совместимости длина 0 для короткого имени указывает на достижение конца каталога. Однако предпочтительным методом определения конца каталога является проверка возвращаемого \fBioctl\fP(2) значения. Если длинное имя не существует, то поле \fId_reclen\fP устанавливается в 0 и \fId_name\fP — строка символов длиной 0 для длинного имени файла. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" В случае ошибки возвращается \-1, а \fIerrno\fP устанавливается в значение ошибки. .PP При использовании \fBVFAT_IOCTL_READDIR_BOTH\fP и \fBVFAT_IOCTL_READDIR_SHORT\fP возвращается значение 1, означающее, что был прочитан новый элемент каталога и 0, когда достигнут конец каталога. .SH ОШИБКИ .TP \fBENOENT\fP Данная ошибка может возвращаться при \fBVFAT_IOCTL_READDIR_BOTH\fP и \fBVFAT_IOCTL_READDIR_SHORT\fP, если файловый дескриптор \fIfd\fP указывает на на удалённый, но ещё открытый каталог. .TP \fBENOTDIR\fP Данная ошибка может возвращаться при \fBVFAT_IOCTL_READDIR_BOTH\fP и \fBVFAT_IOCTL_READDIR_SHORT\fP, если файловый дескриптор \fIfd\fP не указывает на каталог. .TP \fBENOTTY\fP Файловый дескриптор \fIfd\fP указывает не на объект в файловой системе FAT. .PP Дополнительные значения ошибок смотрите в \fBioctl\fP(2). .SH ВЕРСИИ \fBVFAT_IOCTL_READDIR_BOTH\fP и \fBVFAT_IOCTL_READDIR_SHORT\fP впервые появились в Linux 2.0. .PP .\" just before we got Git history \fBFAT_IOCTL_GET_ATTRIBUTES\fP и \fBFAT_IOCTL_SET_ATTRIBUTES\fP впервые появились в Linux 2.6.12. .PP .\" commit 6e5b93ee55d401f1619092fb675b57c28c9ed7ec \fBFAT_IOCTL_GET_VOLUME_ID\fP появился в версии 3.11 ядра Linux. .SH СТАНДАРТЫ Данный программный интерфейс существует только в Linux. .SH ПРИМЕРЫ .SS "Переключение флага архивирования" В следующей программе показано использование \fBioctl\fP(2) для изменения атрибутов файлов. Программа читает и показывает атрибут архивирования файла. После изменения значения атрибута на противоположный, программа читает и показывает атрибут ещё раз. .PP Пример сеанса работы программы с файлом \fI/mnt/user/foo\fP: .PP .in +4n .EX # ./toggle_fat_archive_flag /mnt/user/foo Флаг архивирования установлен Переключение флага архивирования Флаг архивирования сброшен .EE .in .SS "Исходный код программы (toggle_fat_archive_flag.c)" .\" SRC BEGIN (toggle_fat_archive_flag.c) \& .EX #include #include #include #include #include #include #include /* * Читает атрибуты файла в файловой системе 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("Флаг архивирования установлен\en"); else printf("Флаг архивирования сброшен\en"); return attr; } int main(int argc, char *argv[]) { int fd; int ret; uint32_t attr; if (argc != 2) { printf("Использование: %s ИМЯ_ФАЙЛА\en", 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\en"); attr \[ha]= 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); } .EE .\" SRC END .SS "Чтение идентификатора тома" Следующий пример кода демонстрирует использование \fBioctl\fP(2) для вывода идентификатора тома файловой системы FAT. .PP Пример сеанса работы программы с файлом \fI/mnt/user\fP: .PP .in +4n .EX $ ./display_fat_volume_id /mnt/user Volume ID 6443\-6241 .EE .in .SS "Исходный код программы (display_fat_volume_id.c)" .\" SRC BEGIN (display_fat_volume_id.c) \& .EX #include #include #include #include #include #include #include int main(int argc, char *argv[]) { int fd; int ret; uint32_t id; if (argc != 2) { printf("Использование: %s ИМЯ_ФАЙЛА\en", 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\en", id >> 16, id & 0xFFFF); close(fd); exit(EXIT_SUCCESS); } .EE .\" SRC END .SS "Вывод содержимого каталога" Следующий пример кода демонстрирует использование \fBioctl\fP(2) для вывода содержимого каталога. .PP Пример сеанса работы программы с файлом \fI/mnt/user\fP: .PP .in +4n .EX $ \fB./fat_dir /mnt/user\fP \&. \-> \[aq]\[aq] \&.. \-> \[aq]\[aq] ALONGF\[ti]1.TXT \-> \[aq]a long filename.txt\[aq] UPPER.TXT \-> \[aq]\[aq] LOWER.TXT \-> \[aq]lower.txt\[aq] .EE .in .\" .SS "Исходный код программы" .in +4n .\" SRC BEGIN (ioctl_fat.c) .EX #include #include #include #include #include #include int main(int argc, char *argv[]) { int fd; int ret; struct __fat_dirent entry[2]; if (argc != 2) { printf("Использование: %s КАТАЛОГ\en", 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 \-> \[aq]%s\[aq]\en", entry[0].d_name, entry[1].d_name); } if (ret == \-1) { perror("VFAT_IOCTL_READDIR_BOTH"); exit(EXIT_FAILURE); } /* * Закрывает файловый дескриптор. */ close(fd); exit(EXIT_SUCCESS); } .EE .\" SRC END .in .SH "СМ. ТАКЖЕ" \fBioctl\fP(2) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан Azamat Hackimov , Dmitriy S. Seregin , Yuri Kozlov и Иван Павлов . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .