getdents(2) System Calls Manual getdents(2) NOM getdents, getdents64 - Obtenir les points d'entree d'un repertoire BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include /* Definition des constantes SYS_* */ #include long syscall(SYS_getdents, unsigned int fd, struct linux_dirent *dirp, unsigned int count); #define _GNU_SOURCE /* Voir feature_test_macros(7) */ #include ssize_t getdents64(int fd, void dirp[.count], size_t count); Remarque : la glibc ne fournit pas de fonction autour de getdents(), necessitant l'utilisation de syscall(2). Remarque : il n'existe pas de definition de struct linux_dirent dans la glibc ; voir les NOTES. DESCRIPTION Ce ne sont pas des interfaces qui vous interessent. Veuillez regarder readdir(3) pour l'interface de la fonction de meme nom de la bibliotheque C conforme a la specification POSIX. Cette page documente les interfaces de l'appel systeme du noyau. getdents() L'appel systeme getdents() lit plusieurs structures linux_dirent depuis le repertoire reference par le descripteur de fichier ouvert fd et les place dans la zone de memoire pointee par dirp. Le parametre count specifie la taille de cette zone memoire. La structure linux_dirent est declaree comme ceci : struct linux_dirent { unsigned long d_ino; /* Numero d'inoeud */ unsigned long d_off; /* Distance au prochain linux_dirent */ unsigned short d_reclen; /* Longueur de ce linux_dirent */ char d_name[]; /* Nom de fichier (fini par NULL) */ /* La longueur est en fait (d_reclen - 2 - offsetof(struct linux_dirent, d_name)) */ /* char pad; // Octet de remplissage avec des zeros char d_type; // Type de fichier (seulement depuis // Linux 2.6.4) ; sa position est // (d_reclen - 1) */ d_ino est un numero d'inoeud. d_off est la distance entre le debut du repertoire et le debut de la prochaine structure linux_dirent. d_reclen est la taille complete de linux_dirent. d_name est le nom de fichier termine par un caractere NULL. d_type est un octet place a la fin de la structure qui indique le type du fichier. Il contient l'une des valeurs suivantes (definies dans ) : DT_BLK Il s'agit d'un peripherique bloc. DT_CHR Il s'agit d'un peripherique caractere. DT_DIR Il s'agit d'un repertoire DT_FIFO Il s'agit d'un tube nomme (FIFO). DT_LNK Il s'agit d'un lien symbolique. DT_REG Il s'agit d'un fichier ordinaire. DT_SOCK Il s'agit d'un socket de domaine UNIX. DT_UNKNOWN Le type du fichier est inconnu. Le champ d_type est implemente depuis Linux 2.6.4. Il occupe un espace qui etait auparavant un octet de remplissage compose de zeros dans la structure linux_dirent. Ainsi, sur les noyaux anterieurs ou egaux a 2.6.3, les acces a ce champ fournissent toujours la valeur 0 (DT_UNKNOWN). Actuellement, seuls certains systemes de fichiers (parmi lesquels Btrfs, ext2, ext3 et ext4) prennent completement en charge le renvoi du type de fichier dans d_type. Toutes les applications doivent gerer correctement une valeur de retour valant DT_UNKNOWN. getdents64() L'appel systeme getdents() original de Linux ne permettait pas de gerer les gros systemes de fichiers et les positions dans les gros fichiers. En consequence, Linux 2.4 a ajoute getdents64(), avec des types plus larges pour les champs d_ino et d_off. De plus, getdents64() gere un champ explicite d_type. L'appel systeme getdents64() est comme getdents(), sauf que son deuxieme parametre est un pointeur vers un tampon contenant des structures de type suivant : struct dirent { ino_t d_ino; /* numero d'inoeud 64 bits */ off_t d_off; /* distance 64 bits vers la prochaine structure */ unsigned short d_reclen; /* longueur de ce dirent */ unsigned char d_type; /* type du fichier */ char d_name[]; /* nom du fichier (termine par NULL) */ }; VALEUR RENVOYEE En cas de reussite, le nombre d'octets est renvoye. En fin de repertoire, 0 est renvoye. En cas d'erreur, -1 est renvoye, auquel cas errno est positionne pour indiquer l'erreur. ERREURS EBADF fd n'est pas un descripteur de fichier valable. EFAULT L'argument pointe en dehors de l'espace d'adressage du processus appelant. EINVAL Le tampon de resultat est trop petit. ENOENT Repertoire inexistant. ENOTDIR Le descripteur de fichier ne pointe pas sur un repertoire. STANDARDS Aucun. HISTORIQUE SVr4. getdents64() glibc 2.30. NOTES Il n'existe pas d'enveloppe glibc pour getdents(). Appelez getdents() en utilisant syscall(2). Dans ce cas, vous devrez definir vous-meme la structure linux_dirent ou linux_dirent64. Vous voudrez probablement utiliser readdir(3) a la place de ces appels systeme. Ces appels remplacent readdir(2). EXEMPLES Le programme ci-dessous demontre l'utilisation de getdents(). La sortie suivante montre un exemple de ce que donne le programme sur un repertoire ext2 : $ ./a.out /testfs/ --------------- nread=120 --------------- inode# file type d_reclen d_off d_name 2 directory 16 12 . 2 directory 16 24 .. 11 directory 24 44 lost+found 12 regular 16 56 a 228929 directory 16 68 sub 16353 directory 16 80 sub2 130817 directory 16 4096 sub3 Source du programme #define _GNU_SOURCE #include /* Definir les constantes DT_* */ #include #include #include #include #include #include #include struct linux_dirent { unsigned long d_ino; off_t d_off; unsigned short d_reclen; char d_name[]; }; #define BUF_SIZE 1024 int main(int argc, char *argv[]) { int fd; char d_type; char buf[BUF_SIZE]; long nread; struct linux_dirent *d; fd = open(argc > 1 ? argv[1] : ".", O_RDONLY | O_DIRECTORY); if (fd == -1) err(EXIT_FAILURE, "open"); for (;;) { nread = syscall(SYS_getdents, fd, buf, BUF_SIZE); if (nread == -1) err(EXIT_FAILURE, "getdents"); if (nread == 0) break; printf("--------------- nread=%ld ---------------\n", nread); printf("inoeud# type de fichier d_reclen d_off d_name\n"); for (size_t bpos = 0; bpos < nread;) { d = (struct linux_dirent *) (buf + bpos); printf("%8lu ", d->d_ino); d_type = *(buf + bpos + d->d_reclen - 1); printf("%-10s ", (d_type == DT_REG) ? "regulier" : (d_type == DT_DIR) ? "repertoire" : (d_type == DT_FIFO) ? "FIFO" : (d_type == DT_SOCK) ? "socket" : (d_type == DT_LNK) ? "liens symboliques" : (d_type == DT_BLK) ? "bloc de periph" : (d_type == DT_CHR) ? "char dev" : "???"); printf("%4d %10jd %s\n", d->d_reclen, (intmax_t) d->d_off, d->d_name); bpos += d->d_reclen; } } exit(EXIT_SUCCESS); } VOIR AUSSI readdir(2), readdir(3), inode(7) 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 getdents(2)