ioctl_fat(2) System Calls Manual ioctl_fat(2) NOM ioctl_fat - manipuler le systeme de fichiers FAT BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include /* Definition des constantes [V]FAT_* et ATTR_* */" #include 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]); DESCRIPTION L'appel systeme ioctl(2) peut etre utilise pour lire et ecrire les metadonnees des systemes de fichiers FAT non accessibles par d'autres appels systemes. Lecture et definition des attributs de fichiers Les fichiers et les repertoires d'un systeme de fichiers FAT possedent un masque de bit d'attribut qu'on peut lire avec FAT_IOCTL_GET_ATTRIBUTES et ecrire avec FAT_IOCTL_SET_ATTRIBUTES. Le parametre fd contient un descripteur de fichier pour un fichier ou un repertoire. Il suffit pour creer le descripteur de fichier en appelant open(2) avec l'attribut O_RDONLY. Le parametre attr contient un pointeur vers un masque de bit. Les bits du masque sont : ATTR_RO Ce bit indique que le fichier ou le repertoire est en lecture seule. ATTR_HIDDEN Ce bit indique que le fichier ou le repertoire est cache. ATTR_SYS Ce bit indique que le fichier est un systeme de fichiers. ATTR_VOLUME Ce bit indique que le fichier est une etiquette de volume. Cet attribut est en lecture seule. ATTR_DIR Ce bit indique qu'il s'agit d'un repertoire. Cet attribut est en lecture seule. ATTR_ARCH Ce bit indique que le fichier ou le repertoire doit etre archive. Il est positionne quand un fichier est cree ou modifie. Il est reinitialise par un systeme d'archivage. La valeur zero ATTR_NONE peut etre utilisee pour indiquer qu'aucun bit d'attribut n'est positionne. Lecture de l'identifiant du volume Les systemes de fichiers FAT sont identifies par des identifiants de volume. L'identifiant de volume peut etre lu avec FAT_IOCTL_GET_VOLUME_ID. Le parametre fd peut etre un descripteur de fichier pour n'importe quel fichier ou repertoire du systeme de fichiers. Il suffit pour creer le descripteur de fichier en appelant open(2) avec l'attribut O_RDONLY. Le parametre id est un pointeur vers le champ qui sera rempli avec l'identifiant de volume. Generalement, l'identifiant de volume est montre a l'utilisateur sous la forme d'un groupe de deux champs de 16 bits : printf("Identifiant de volume %04x-%04x\n", id >> 16, id & 0xFFFF); Lecture des noms de fichier courts d'un repertoire Un fichier ou un repertoire sur un systeme de fichiers FAT a toujours un nom de fichier court comportant jusqu'a 8 caracteres en majuscules, eventuellement suivis d'un point et jusqu'a 3 caracteres en majuscules pour l'extension de fichier. Si le nom de fichier ne correspond pas a ce schema, il est stocke en tant que nom de fichier long jusqu'a 215 caracteres en UTF-16. Les noms de fichier courts d'un repertoire peuvent etre lus avec VFAT_IOCTL_READDIR_SHORT. VFAT_IOCTL_READDIR_BOTH lit a la fois les noms de fichier longs et courts. Le parametre fd doit etre le descripteur de fichier d'un repertoire. Il suffit pour creer le descripteur de fichier en appelant open(2) avec l'attribut O_RDONLY. Le descripteur de fichier ne peut etre utilise qu'une fois pour repeter les entrees d'un repertoire en appelant ioctl(2) plusieurs fois. L'argument entry est un tableau de deux elements des structures suivantes : struct __fat_dirent { long d_ino; __kernel_off_t d_off; uint32_t short d_reclen; char d_name[256]; }; La premiere entree du tableau est pour le nom de fichier court. La deuxieme entree est pour le nom de fichier long. Les champs d_ino et d_off ne sont remplis que pour les noms de fichier longs. Le champ d_ino contient le numero d'inoeud du repertoire. Le champ d_off contient la position de l'entree du fichier dans le repertoire. Ces valeurs n'etant pas disponibles pour les noms de fichier courts, le code de l'utilisateur doit simplement les ignorer. Le champ d_reclen contient la longueur du nom de fichier inscrit dans le champ d_name. Pour assurer la retro-compatibilite, une longueur de 0 pour un nom de fichier court signale que la fin du repertoire a ete atteinte. Toutefois, la methode privilegiee pour detecter la fin d'un repertoire consiste a tester le code de retour de ioctl(2). S'il n'existe pas de noms de fichier longs, le champ d_reclen est positionne a 0 et d_name est une chaine de caracteres de taille 0 pour les noms de fichier longs. VALEUR RENVOYEE En cas d'erreur, la valeur de retour est -1 et errno est definie pour preciser l'erreur. Pour VFAT_IOCTL_READDIR_BOTH et VFAT_IOCTL_READDIR_SHORT, le code de retour 1 signale qu'une nouvelle entree de repertoire a ete lue et un code de retour 0 indique que la fin du repertoire a ete atteinte. ERREURS ENOENT Cette erreur est renvoyee par VFAT_IOCTL_READDIR_BOTH et VFAT_IOCTL_READDIR_SHORT si le descripteur de fichier fd se rapporte a un repertoire supprime mais ouvert. ENOTDIR Cette erreur est renvoyee par VFAT_IOCTL_READDIR_BOTH et VFAT_IOCTL_READDIR_SHORT si le descripteur de fichier fd ne se rapporte pas a un repertoire. ENOTTY Le descripteur de fichier fd ne se rapporte pas a un objet d'un systeme de fichiers FAT. Pour plus de codes d'erreur, voir ioctl(2). STANDARDS Linux. HISTORIQUE 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 Linux 3.11. EXEMPLES Basculer l'attribut d'archivage Le programme suivant illustre l'utilisation de ioctl(2) pour manipuler les attributs des fichiers. Le programme lit et affiche l'attribut d'archivage d'un fichier. Apres avoir inverse la valeur de l'attribut, le programme lit et affiche de nouveau l'attribut. Ce qui suit a ete enregistre lors de l'application du programme au fichier /mnt/user/foo : # ./toggle_fat_archive_flag /mnt/user/foo Archive flag is set Toggling archive flag Archive flag is not set Source du programme (toggle_fat_archive_flag.c) #include #include #include #include #include #include #include /* * Lire les attributs d'un fichier sur un systeme de fichiers FAT. * Afficher l'etat de l'attribut d'archivage. */ 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("Archive flag is set\n"); else printf("Archive flag is not set\n"); return attr; } int main(int argc, char *argv[]) { int fd; int ret; uint32_t attr; if (argc != 2) { printf("Usage: %s FILENAME\n", 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("Basculer le drapeau d'archivage\n"); attr ^= ATTR_ARCH; /* * Ecrire les attributs de fichier FAT modifies. */ 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); } Lecture de l'identifiant du volume Le programme suivant illustre l'utilisation de ioctl(2) pour afficher l'identifiant du volume d'un systeme de fichiers FAT. L'affichage suivant a ete enregistre lors de l'application du programme au repertoire /mnt/user : $ ./display_fat_volume_id /mnt/user Volume ID 6443-6241 Source du programme (display_fat_volume_id.c) #include #include #include #include #include #include #include int main(int argc, char *argv[]) { int fd; int ret; uint32_t id; if (argc != 2) { printf("Usage: %s FILENAME\n", 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\n", id >> 16, id & 0xFFFF); close(fd); exit(EXIT_SUCCESS); } Afficher le contenu d'un repertoire Le programme suivant illustre l'utilisation de ioctl(2) pour afficher le contenu d'un repertoire. Ce qui suit a ete enregistre lors de l'application du programme au repertoire /mnt/user : $ ./fat_dir /mnt/user . -> '' .. -> '' ALONGF~.TXT -> 'a long filename.txt' UPPER.TXT -> '' LOWER.TXT -> 'lower.txt' Source du programme #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("Usage: %s DIRECTORY\n", argv[0]); exit(EXIT_FAILURE); } /* * Ouvrir le descripteur de fichier du repertoire. */ fd = open(argv[1], O_RDONLY | O_DIRECTORY); if (fd == -1) { perror("open"); exit(EXIT_FAILURE); } for (;;) { /* * Lire la prochaine entree de repertoire. */ ret = ioctl(fd, VFAT_IOCTL_READDIR_BOTH, entry); /* * En cas d'erreur, le code de retour est -1. * Si la fin de la liste d'un repertoire a ete atteinte, * le code de retour est 0. * Pour une retro-compatibilite, la fin de la liste des fichiers * d'un repertoire est aussi signalee par d_reclen == 0. */ if (ret < 1) break; /* * Ecrire les noms de fichier long et court. */ printf("%s -> '%s'\n", 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); } VOIR AUSSI ioctl(2) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Jean-Philippe MENGUAL Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 ioctl_fat(2)