.\" -*- coding: UTF-8 -*- .\" Copyright (C) 2014, Heinrich Schuchardt .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of .\" this manual under the conditions for verbatim copying, provided that .\" the entire resulting derived work is distributed under the terms of .\" a permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume .\" no responsibility for errors or omissions, or for damages resulting .\" from the use of the information contained herein. The author(s) may .\" not have taken the same level of care in the production of this .\" manual, which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH IOCTL\-FAT 2 "6 mars 2019" Linux "Manuel du programmeur Linux" .SH NOM ioctl_fat \- manipuler le système de fichiers FAT .SH SYNOPSIS .nf \fB#include \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[2] \fP\fIentry\fP\fB);\fP \fBint ioctl(int \fP\fIfd\fP\fB, VFAT_IOCTL_READDIR_SHORT,\fP \fB struct __fat_dirent[2] \fP\fIentry\fP\fB);\fP .fi .SH DESCRIPTION L'appel système \fBioctl\fP(2) peut être utilisé pour lire et écrire les métadonnées des systèmes de fichiers FAT non accessibles par d'autres appels systèmes. .SS "Lecture et définition des attributs de fichiers" Les fichiers et les répertoires d'un système de fichiers FAT possèdent un masque de bit d'attribut qu'on peut lire avec \fBFAT_IOCTL_GET_ATTRIBUTES\fP et écrire avec \fBFAT_IOCTL_SET_ATTRIBUTES\fP. .PP Le paramètre \fIfd\fP contient un descripteur de fichier pour un fichier ou un répertoire. Il suffit pour créer le descripteur de fichier en appelant \fBopen\fP(2) avec l'attribut \fBO_RDONLY\fP. .PP Le paramètre \fIattr\fP contient un pointeur vers un masque de bit. Les bits du masque sont\ : .TP \fBATTR_RO\fP Ce bit indique que le fichier ou le répertoire est en lecture seule. .TP \fBATTR_HIDDEN\fP Ce bit indique que le fichier ou le répertoire est caché. .TP \fBATTR_SYS\fP Ce bit indique que le fichier est un système de fichiers. .TP \fBATTR_VOLUME\fP Ce bit indique que le fichier est une étiquette de volume. Cet attribut est en lecture seule. .TP \fBATTR_DIR\fP Ce bit indique qu'il s'agit d'un répertoire. Cet attribut est en lecture seule. .TP \fBATTR_ARCH\fP Ce bit indique que le fichier ou le répertoire doit être archivé. Il est positionné quand un fichier est créé ou modifié. Il est réinitialisé par un système d'archivage. .PP La valeur zéro \fBATTR_NONE\fP peut être utilisée pour indiquer qu'aucun bit d'attribut n'est positionné. .SS "Lecture de l'identifiant du volume" Les systèmes de fichiers FAT sont identifiés par des identifiants de volume. L'identifiant de volume peut être lu avec \fBFAT_IOCTL_GET_VOLUME_ID\fP. .PP Le paramètre \fIfd\fP peut être un descripteur de fichier pour n'importe quel fichier ou répertoire du système de fichiers. Il suffit pour créer le descripteur de fichier en appelant \fBopen\fP(2) avec l'attribut \fBO_RDONLY\fP. .PP Le paramètre \fIid\fP est un pointeur vers le champ qui sera rempli avec l'identifiant de volume. Généralement, l'identifiant de volume est montré à l'utilisateur sous la forme d'un groupe de deux champs de 16\ bits\ : .PP .in +4n .EX printf("Identifiant de volume %04x\-%04x\en", id >> 16, id & 0xFFFF); .EE .in .SS "Lecture des noms de fichier courts d'un répertoire" Un fichier ou un répertoire sur un système de fichiers FAT a toujours un nom de fichier court comportant jusqu'à 8\ caractères en majuscules, éventuellement suivis d'un point et jusqu'à 3\ caractères en majuscules pour l'extension de fichier. Si le nom de fichier ne correspond pas à ce schéma, il est stocké en tant que nom de fichier long jusqu'à 215\ caractères en UTF\-16. .PP Les noms de fichier courts d'un répertoire peuvent être lus avec \fBVFAT_IOCTL_READDIR_SHORT\fP. \fBVFAT_IOCTL_READDIR_BOTH\fP lit à la fois les noms de fichier longs et courts. .PP Le paramètre \fIfd\fP doit être le descripteur de fichier d'un répertoire. Il suffit pour créer le descripteur de fichier en appelant \fBopen\fP(2) avec l'attribut \fBO_RDONLY\fP. Le descripteur de fichier ne peut être utilisé qu'une fois pour répéter les entrées d'un répertoire en appelant \fBioctl\fP(2) plusieurs fois. .PP L'argument \fIentry\fP est un tableau de deux éléments des structures suivantes\ : .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 La première entrée du tableau est pour le nom de fichier court. La deuxième entrée est pour le nom de fichier long. .PP Les champs \fId_ino\fP et \fId_off\fP ne sont remplis que pour les noms de fichier longs. Le champ \fId_ino\fP contient le numéro d'inœud du répertoire. Le champ \fId_off\fP contient la position de l'entrée du fichier dans le répertoire. Ces valeurs n'étant pas disponibles pour les noms de fichier courts, le code de l'utilisateur doit simplement les ignorer. .PP Le champ \fId_reclen\fP contient la longueur du nom de fichier inscrit dans le champ \fId_name\fP. Pour assurer la rétro\-compatibilité, une longueur de \fB0\fP pour un nom de fichier court signale que la fin du répertoire a été atteinte. Toutefois, la méthode privilégiée pour détecter la fin d'un répertoire consiste à tester le code de retour de \fBioctl\fP(2). S'il n'existe pas de noms de fichier longs, le champ \fId_reclen\fP est positionné à \fB0\fP et \fId_name\fP est une chaîne de caractères de taille \fB0\fP pour les noms de fichier longs. .SH "VALEUR RENVOYÉE" En cas d'erreur, la valeur de retour est \fB\-1\fP et \fIerrno\fP est définie pour préciser l'erreur. .PP Pour \fBVFAT_IOCTL_READDIR_BOTH\fP et \fBVFAT_IOCTL_READDIR_SHORT\fP, le code de retour \fB1\fP signale qu'une nouvelle entrée de répertoire a été lue et un code de retour \fB0\fP indique que la fin du répertoire a été atteinte. .SH ERREURS .TP \fBENOENT\fP Cette erreur est renvoyée par \fBVFAT_IOCTL_READDIR_BOTH\fP et \fBVFAT_IOCTL_READDIR_SHORT\fP si le descripteur de fichier \fIfd\fP se rapporte à un répertoire supprimé mais ouvert. .TP \fBENOTDIR\fP Cette erreur est renvoyée par \fBVFAT_IOCTL_READDIR_BOTH\fP et \fBVFAT_IOCTL_READDIR_SHORT\fP si le descripteur de fichier \fIfd\fP ne se rapporte pas à un répertoire. .TP \fBENOTTY\fP Le descripteur de fichier \fIfd\fP ne se rapporte pas à un objet d'un système de fichiers FAT. .PP Pour plus de codes d'erreur, voir \fBioctl\fP(2). .SH VERSIONS \fBVFAT_IOCTL_READDIR_BOTH\fP et \fBVFAT_IOCTL_READDIR_SHORT\fP sont apparus pour la première fois dans Linux\ 2.0. .PP .\" just before we got Git history \fBFAT_IOCTL_GET_ATTRIBUTES\fP et \fBFAT_IOCTL_SET_ATTRIBUTES\fP sont apparus pour la première fois dans Linux\ 2.6.12. .PP .\" commit 6e5b93ee55d401f1619092fb675b57c28c9ed7ec \fBFAT_IOCTL_GET_VOLUME_ID\fP a été introduit dans la version\ 3.11 du noyau Linux. .SH CONFORMITÉ Cette API est spécifique à Linux. .SH EXEMPLE .SS "Basculer l'attribut d'archivage" Le programme suivant illustre l'utilisation de \fBioctl\fP(2) pour manipuler les attributs des fichiers. Le programme lit et affiche l'attribut d'archivage d'un fichier. Après avoir inversé la valeur de l'attribut, le programme lit et affiche de nouveau l'attribut. .PP Ce qui suit a été enregistré lors de l'application du programme au fichier \fI/mnt/user/foo\fP\ : .PP .in +4n .EX # ./toggle_fat_archive_flag /mnt/user/foo Archive flag is set Toggling archive flag Archive flag is not set .EE .in .SS "Source du programme (toggle_fat_archive_flag.c)" \& .EX #include #include #include #include #include #include #include /* * Lire les attributs d'un fichier sur un système de fichiers FAT. * Afficher l'état de l'attribut d'archivage. */ static uint32_t readattr(int fd) { uint32_t attr; int ret; ret = ioctl(fd, FAT_IOCTL_GET_ATTRIBUTES, &attr); if (ret == \-1) { perror("ioctl"); exit(EXIT_FAILURE); } if (attr & ATTR_ARCH) printf("Archive flag is set\en"); else printf("Archive flag is not set\en"); return attr; } int main(int argc, char *argv[]) { uint32_t attr; int fd; int ret; if (argc != 2) { printf("Usage: %s FILENAME\en", argv[0]); exit(EXIT_FAILURE); } fd = open(argv[1], O_RDONLY); if (fd == \-1) { perror("open"); exit(EXIT_FAILURE); } /* * Lire et afficher les attributs du fichier FAT. */ attr = readattr(fd); /* * Inverser l'attribut d'archivage. */ printf("Bascule du drapeau d'archivage\en"); attr ^= ATTR_ARCH; /* * Écrire les attributs de fichier FAT modifiés. */ ret = ioctl(fd, FAT_IOCTL_SET_ATTRIBUTES, &attr); if (ret == \-1) { perror("ioctl"); exit(EXIT_FAILURE); } /* * Lire et afficher les attributs du fichier FAT. */ readattr(fd); close(fd); exit(EXIT_SUCCESS); } .EE .\" .SS "Lecture de l'identifiant du volume" Le programme suivant illustre l'utilisation de \fBioctl\fP(2) pour afficher l'identifiant du volume d'un système de fichiers FAT. .PP L'affichage suivant a été enregistré lors de l'application du programme au répertoire \fI/mnt/user\fP\ : .PP .in +4n .EX $ ./display_fat_volume_id /mnt/user Volume ID 6443\-6241 .EE .in .SS "Source du programme (display_fat_volume_id.c)" \& .EX #include #include #include #include #include #include #include int main(int argc, char *argv[]) { uint32_t id; int fd; int ret; if (argc != 2) { printf("Usage: %s FILENAME\en", argv[0]); exit(EXIT_FAILURE); } fd = open(argv[1], O_RDONLY); if (fd == \-1) { perror("open"); exit(EXIT_FAILURE); } /* * Lire l'identifiant du volume. */ ret = ioctl(fd, FAT_IOCTL_GET_VOLUME_ID, &id); if (ret == \-1) { perror("ioctl"); exit(EXIT_FAILURE); } /* * Formater la sortie en deux groupes de 16 bits chacun. */ printf("Volume ID %04x\-%04x\en", id >> 16, id & 0xFFFF); close(fd); exit(EXIT_SUCCESS); } .EE .\" .SS "Afficher le contenu d'un répertoire" Le programme suivant illustre l'utilisation de \fBioctl\fP(2) pour afficher le contenu d'un répertoire. .PP Ce qui suit a été enregistré lors de l'application du programme au répertoire \fI/mnt/user\fP\ : .PP .in +4n .EX $ \fB./fat_dir /mnt/user\fP \[char46] \-> \*(rq \[char46]. \-> \*(rq ALONGF~1.TXT \-> 'a long filename.txt' UPPER.TXT \-> \*(rq LOWER.TXT \-> 'lower.txt' .EE .in .\" .SS "Source du programme" .in +4n .EX #include #include #include #include #include #include int main(int argc, char *argv[]) { struct __fat_dirent entry[2]; int fd; int ret; if (argc != 2) { printf("Usage: %s DIRECTORY\en", argv[0]); exit(EXIT_FAILURE); } /* * Ouvrir le descripteur de fichier du répertoire. */ fd = open(argv[1], O_RDONLY | O_DIRECTORY); if (fd == \-1) { perror("open"); exit(EXIT_FAILURE); } for (;;) { /* * Lire la prochaine entrée de répertoire. */ ret = ioctl( fd, VFAT_IOCTL_READDIR_BOTH, entry); /* * En cas d'erreur, le code de retour est \fB\-1\fP. * Si la fin de la liste d'un répertoire a été atteinte, * le code de retour est \fB0\fP. * Pour une rétro\-compatibilité, la fin de la liste des fichiers * d'un répertoire est aussi signalée par d_reclen == 0. */ if (ret < 1) break; /* * Écrire les noms de fichier long et court. */ printf("%s \-> '%s'\en", entry[0].d_name, entry[1].d_name); } if (ret == \-1) { perror("VFAT_IOCTL_READDIR_BOTH"); exit(EXIT_FAILURE); } /* * Fermer le descripteur de fichier. */ close(fd); exit(EXIT_SUCCESS); } .EE .in .SH "VOIR AUSSI" \fBioctl\fP(2) .SH COLOPHON Cette page fait partie de la publication\ 5.04 du projet \fIman\-pages\fP Linux. Une description du projet et des instructions pour signaler des anomalies et la dernière version de cette page peuvent être trouvées à l'adresse \%https://www.kernel.org/doc/man\-pages/. .SH TRADUCTION La traduction française de cette page de manuel a été créée par Christophe Blaess , Stéphan Rafin , Thierry Vignaud , François Micaux, Alain Portal , Jean-Philippe Guérard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas François , Florentin Duneau , Simon Paillard , Denis Barbier , David Prévot et Jean-Philippe MENGUAL . Cette traduction est une documentation libre ; veuillez vous reporter à la .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3 .UE concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE. Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à .MT debian-l10n-french@lists.debian.org .ME .