Provided by: manpages-fr-dev_4.27.0-1_all bug

NOM

       ftw, nftw - Parcourir des arborescences de fichiers

BIBLIOTHÈQUE

       Bibliothèque C standard (libc, -lc)

SYNOPSIS

       #include <ftw.h>

       int nftw(const char *chemin_répertoire,
               int (*fn)(const char *chemin_fichier, const struct stat *sb,
                         int symb_type, struct FTW *tampon_ftw),
               int nb_descripteurs_fichier_ouverts, int drapeaux);

       [[deprecated]]
       int ftw(const char *chemin_répertoire,
               int (*fn) (const char *chemin_fichier, const struct stat *sb,
                          int symb_type),
               int nb_descripteurs_fichier_ouverts);

   Exigences de macros de test de fonctionnalités pour la glibc (consulter feature_test_macros(7)) :

       nftw() :
           _XOPEN_SOURCE >= 500

DESCRIPTION

       La  fonction  nftw()  parcourt  l'arborescence de fichiers située dans le répertoire chemin_répertoire et
       appelle fn() une fois pour chaque entrée de l'arborescence. Par  défaut,  les  répertoires  sont  traités
       avant les fichiers et sous-répertoires qu'ils contiennent (méthode de parcours « preorder »).

       Afin    d'éviter    d'utiliser    tous    les    descripteurs   de   fichier   du   processus   appelant,
       nb_descripteurs_fichier_ouverts  indique  le  nombre  maximal  de  répertoires  que  nftw()  peut  ouvrir
       simultanément.  Lorsque la profondeur de recherche est supérieure à cette valeur, nftw() ralentit car les
       répertoires doivent être fermés puis réouverts. nftw() utilise au plus un  descripteur  de  fichier  pour
       chaque niveau dans l'arborescence des fichiers.

       Pour  chaque entrée trouvée dans l'arbre, nftw() appelle fn() avec quatre arguments : chemin_fichier, sb,
       symb_type et tampon_ftw. chemin_fichier est le chemin de l'entrée ; il est défini comme un chemin relatif
       au répertoire de travail actuel du processus appelant au moment de l'appel à nftw() si  chemin_répertoire
       est  un  chemin  relatif,  ou comme un chemin absolu si chemin_répertoire est un chemin absolu. sb est un
       pointeur vers la structure stat renvoyée par un appel à stat(2) pour chemin_fichier.

       L'argument symb_type passé à fn() est un entier qui peut prendre une des valeurs suivantes :

       FTW_F  chemin_fichier est un fichier ordinaire.

       FTW_D  chemin_fichier est un répertoire.

       FTW_DNR
              chemin_fichier est un répertoire qui ne peut être lu.

       FTW_DP chemin_fichier est un répertoire et FTW_DEPTH a été défini dans drapeaux (si FTW_DEPTH  n’est  pas
              défini  dans  drapeaux,  alors  les  répertoires  seront  toujours visités avec symb_type défini à
              FTW_D). Tous les fichiers et sous-répertoires dans chemin_fichier ont été traités.

       FTW_NS L'appel stat(2)  a  échoué  sur  chemin_fichier  qui  n'est  pas  un  lien  symbolique.  Cela  est
              probablement  dû  au  fait  que l’appelant avait les droits de lecture sur le répertoire parent de
              telle sorte que chemin_fichier était visible, mais n’avait pas les droits d’exécution, et donc  le
              fichier  ne  pouvait  pas  être  atteint  pour  stat(2).  Le  contenu  du tampon pointé par sb est
              indéterminé.

       FTW_SL chemin_fichier est un lien symbolique et FTW_PHYS a été défini dans drapeaux.

       FTW_SLN
              chemin_fichier est un lien symbolique pointant vers un fichier qui n'existe  pas  (ce  qui  ne  se
              produira que si FTW_PHYS n'est pas défini). Dans ce cas, l'argument sb passé à fn() contiendra les
              informations  renvoyées  par  l'exécution  de  lstat(2) sur le lien symbolique pointant nulle part
              (voir à ce sujet BOGUES).

       Le quatrième argument (tampon_ftw), spécifié par nftw() lors de l'appel de fn, est un pointeur  vers  une
       structure du type FTW :

           struct FTW {
               int base;
               int level;
           };

       base  est  le  décalage  du  nom  de fichier (c’est-à-dire le composant « basename ») du chemin donné par
       chemin_fichier. level est la profondeur de chemin_fichier dans l'arbre des  répertoires,  relative  à  la
       racine de l'arbre (chemin_répertoire qui a une profondeur de 0).

       Pour  arrêter  le parcours de l'arborescence des fichiers, la fonction fn() renvoie une valeur différente
       de 0, qui deviendra la valeur de retour de nftw(). Tant que fn() renvoie 0, nftw() continuera jusqu'à  la
       fin  du  parcours  de  l'arborescence, et dans ce cas renverra 0, ou jusqu'à ce qu'une erreur se produise
       (comme un échec de malloc(3)) et dans ce cas renverra -1.

       Comme nftw() utilise des structures de données allouées dynamiquement, la seule manière propre de  sortir
       d'un parcours d'arborescence consiste à faire que fn() renvoie une valeur différente de 0. Pour permettre
       à un signal de terminer le parcours sans causer de fuite de mémoire, utilisez un gestionnaire qui définit
       un  attribut  global  vérifié par fn(). N'utilisez pas longjmp(3) à moins que le programme ne soit sur le
       point de se terminer.

       L'argument drapeaux de nftw() est un OU binaire entre zéro ou plusieurs des attributs suivants :

       FTW_ACTIONRETVAL (depuis la glibc 2.3.3)
              Si cet attribut, spécifique à la glibc, est positionné, alors nftw() gère la valeur de  retour  de
              fn() différemment. fn() doit renvoyer l'une des valeurs suivantes :

              FTW_CONTINUE
                     nftw() doit continuer normalement.

              FTW_SKIP_SIBLINGS
                     Si fn() renvoie cette valeur, alors les entrées de même niveau que l'entrée courante seront
                     sautées, et la procédure continuera avec le parent.

              FTW_SKIP_SUBTREE
                     Si  fn() est appelée avec une entrée qui est un répertoire (symb_type a pour valeur FTW_D),
                     cette valeur de retour empêchera le passage des objets de ce répertoire comme  arguments  à
                     fn() et nftw() continuera avec l'entrée suivante de même niveau du répertoire.

              FTW_STOP
                     nftw() doit quitter immédiatement avec la valeur de retour FTW_STOP.

              D'autres  valeurs  de  retour pourront être associées à de nouvelles actions dans le futur ; fn ne
              devrait renvoyer que les valeurs citées ci-dessus.

              La macro de test _GNU_SOURCE doit être définie (avant toute inclusion de fichiers d'en-tête)  afin
              d'obtenir la définition de FTW_ACTIONRETVAL depuis <ftw.h>.

       FTW_CHDIR
              Si cet attribut est défini, faire un chdir(2) vers chaque répertoire avant de traiter son contenu.
              Cela  est  utile  si  le  programme doit exécuter des actions dans le répertoire où chemin_fichier
              réside (préciser ce drapeau n’a aucun effet  sur  le  nom  de  chemin  passé  dans  l’argument  de
              chemin_fichier de fn).

       FTW_DEPTH
              Si cet attribut est défini, faire une recherche « postorder » ; c'est-à-dire, appeler fn() pour le
              répertoire  lui-même  après  avoir traité son contenu et celui de ses sous-répertoires (par défaut
              chaque répertoire est traité avant son contenu).

       FTW_MOUNT
              Si cet attribut est défini, rester  dans  le  même  système  de  fichiers  (c’est-à-dire,  ne  pas
              traverser vers d'autres points de montage).

       FTW_PHYS
              Si  cet  attribut  est  défini, ne pas suivre les liens symboliques (c'est ce que l'on veut). S'il
              n'est pas défini, les liens symboliques sont suivis, mais aucun fichier n'est  traité  plus  d'une
              fois.

              Si FTW_PHYS n'est pas défini, mais si FTW_DEPTH l'est, alors la fonction fn() n'est jamais appelée
              pour un répertoire qui ferait partie de ses propres descendants.

   ftw()
       ftw()  est une fonction plus ancienne qui prend en charge un sous-ensemble des fonctionnalités de nftw().
       Les différences notables sont les suivantes :

       -  ftw() n'a pas d'argument drapeaux. Elle se comporte comme nftw() lorsque cette  dernière  est  appelée
          avec l'argument drapeaux défini à zéro.

       -  La fonction de rappel fn() est fournie sans le quatrième argument.

       -  Le  jeu de valeurs passées à l'aide de l'argument symb_type à fn() est plus petit : les seules valeurs
          valables sont FTW_F, FTW_D, FTW_DNR, FTW_NS et (peut-être) FTW_SL.

VALEUR RENVOYÉE

       Ces fonctions renvoient 0 en cas de succès et -1 en cas d'erreur.

       Si fn() renvoie une valeur différente de 0, alors le parcours de l'arbre se termine et la valeur renvoyée
       par fn() est renvoyée comme résultat de ftw() ou nftw().

       Si nftw() est appelée avec l’attribut FTW_ACTIONRETVAL, alors la seule valeur différente de 0 qui  pourra
       être  utilisée  par  fn() pour terminer le parcours de l'arbre est FTW_STOP, et cette valeur est renvoyée
       comme résultat de nftw().

ATTRIBUTS

       Pour une explication des termes utilisés dans cette section, consulter attributes(7).
       ┌──────────────────────────────────────────────────────────────────┬──────────────────────┬─────────────┐
       │ InterfaceAttributValeur      │
       ├──────────────────────────────────────────────────────────────────┼──────────────────────┼─────────────┤
       │ nftw()                                                           │ Sécurité des threads │ MT-Safe cwd │
       ├──────────────────────────────────────────────────────────────────┼──────────────────────┼─────────────┤
       │ ftw()                                                            │ Sécurité des threads │ MT-Safe     │
       └──────────────────────────────────────────────────────────────────┴──────────────────────┴─────────────┘

VERSIONS

       Dans certaines implémentations (par exemple la glibc), ftw()  n'utilise  jamais  FTW_SL  ;  sur  d'autres
       systèmes,  FTW_SL n'apparaît que pour les liens symboliques qui ne pointent vers aucun fichier existant ;
       sur d'autres encore, ftw() utilise FTW_SL pour chaque lien symbolique.  Si  chemin_fichier  est  un  lien
       symbolique  et  si  stat(2) échoue, POSIX.1-2008 indique que le résultat est indéfini si FTW_NS ou FTW_SL
       sont définis dans symbole_type. Pour un fonctionnement prévisible, employez nftw().

STANDARDS

       POSIX.1-2008.

HISTORIQUE

       ftw()  POSIX.1-2001, SVr4, SVr4, SUSv1. POSIX.1-2008 marque la fonction comme étant obsolète.

       nftw() glibc 2.1. POSIX.1-2001, SUSv1.

       FTW_SL POSIX.1-2001, SUSv1.

NOTES

       POSIX.1-2008 indique que les résultats sont imprévisibles si fn ne préserve pas le répertoire de  travail
       actuel.

BOGUES

       Selon  POSIX.1-2008,  lorsque l'argument symb_type passé à fn() contient FTW_SLN, le tampon pointé par sb
       doit contenir des informations à propos du lien symbolique pointant  nulle  part  (obtenues  en  appelant
       lstat(2)  sur  le lien), et les premières versions de la glibc respectaient la spécification POSIX sur ce
       point. Cependant, suite à une régression introduite dans la version 2.4 de la glibc, le contenu du tampon
       pointé par sb devint indéfini lorsque FTW_SLN était défini dans symb_type (plus précisément,  le  contenu
       du tampon restait inchangé dans ce cas). Cette régression fut finalement corrigée dans la version 2.30 de
       la glibc de façon à ce que l'implémentation de la glibc suive à nouveau la spécification POSIX.

EXEMPLES

       Le  programme suivant parcourt l'arbre des répertoires du chemin donné en premier argument de la ligne de
       commande ou du répertoire courant s'il n'est pas indiqué. Il affiche diverses informations  à  propos  de
       chaque fichier. Le second argument de la ligne de commande peut être utilisé pour indiquer les caractères
       qui contrôlent la valeur assignée à l'argument drapeaux lors des appels à nftw().

   Source du programme

       #define _XOPEN_SOURCE 500
       #include <ftw.h>
       #include <stdint.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <string.h>

       static int
       display_info(const char *fpath, const struct stat *sb,
                    int tflag, struct FTW *ftwbuf)
       {
           printf("%-3s %2d ",
                  (symb_type == FTW_D) ? "d"   : (symb_type == FTW_DNR) ? "dnr" :
                  (symb_type == FTW_DP) ? "dp"  : (symb_type == FTW_F) ? "f" :
                  (symb_type == FTW_NS) ? "ns"  : (symb_type == FTW_SL) ? "sl" :
                  (symb_type == FTW_SLN) ? "sln" : "???",
                  tampon_ftw->level);

           if (tflag == FTW_NS)
               printf("-------");
           else
               printf("%7jd", (intmax_t) sb->st_size);

           printf("   %-40s %d %s\n",
                  chemin_fichier, tampon_ftw->base, chemin_fichier + tampon_ftw->base);

           return 0;           /* Pour dire à nftw() de continuer */
       }

       int
       main(int argc, char *argv[])
       {
           int flags = 0;

           if (argc > 2 && strchr(argv[2], 'd') != NULL)
               flags |= FTW_DEPTH;
           if (argc > 2 && strchr(argv[2], 'p') != NULL)
               flags |= FTW_PHYS;

           if (nftw((argc < 2) ? "." : argv[1], display_info, 20, flags)
               == -1)
           {
               perror("nftw");
               exit(EXIT_FAILURE);
           }

           exit(EXIT_SUCCESS);
       }

VOIR AUSSI

       stat(2), fts(3), readdir(3)

TRADUCTION

       La   traduction   française   de   cette   page   de   manuel   a   été   créée   par  Christophe  Blaess
       <https://www.blaess.fr/christophe/>,   Stéphan   Rafin   <stephan.rafin@laposte.net>,   Thierry   Vignaud
       <tvignaud@mandriva.com>,  François  Micaux,  Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard
       <fevrier@tigreraye.org>,   Jean-Luc   Coulon   (f5ibh)   <jean-luc.coulon@wanadoo.fr>,   Julien   Cristau
       <jcristau@debian.org>,      Thomas      Huriaux      <thomas.huriaux@gmail.com>,     Nicolas     François
       <nicolas.francois@centraliens.net>,    Florentin    Duneau    <fduneau@gmail.com>,     Simon     Paillard
       <simon.paillard@resel.enst-bretagne.fr>,     Denis    Barbier    <barbier@debian.org>,    David    Prévot
       <david@tilapin.org> et Lucien Gentis <lucien.gentis@waika9.com>

       Cette traduction est une documentation libre ; veuillez vous  reporter  à  la  GNU General Public License
       version 3 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 à
       debian-l10n-french@lists.debian.org.

Pages du manuel de Linux 6.9.1                    15 juin 2024                                            ftw(3)