Provided by: manpages-fr-dev_4.23.1-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  ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩   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⟩.