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

NOM

       listxattr, llistxattr, flistxattr - Lister les noms des attributs étendus

BIBLIOTHÈQUE

       Bibliothèque C standard (libc, -lc)

SYNOPSIS

       #include <sys/xattr.h>

       ssize_t listxattr (const char *chemin, char *_Nullable liste, size_t taille);
       ssize_t llistxattr (const char *chemin, char *_Nullable liste, size_t taille);
       ssize_t flistxattr (int descripteur, char *_Nullable liste, size_t taille);

DESCRIPTION

       Les  attributs  étendus  sont  des  paires  nom:valeur associées aux inœuds (fichiers, répertoires, liens
       symboliques, etc.). Ce sont des extensions des attributs normaux qui sont associés avec tous  les  inœuds
       du  système  (les  informations  renvoyées par stat(2). Une description complète des concepts d'attributs
       étendus est disponible dans xattr(7).

       listxattr() récupère la liste des attributs étendus  associés  avec  le  chemin  indiqué  du  système  de
       fichier.  La  liste  récupérée est placée dans liste, un tampon alloué par l'appelant, dont la taille (en
       octets) est indiquée dans l'argument taille. La liste est l'ensemble des noms (terminés par  NULL),  l'un
       après  l'autre.  Les noms des attributs étendus auxquels le processus appelant n'a pas accès peuvent être
       omis dans la liste. La longueur de la liste de noms d'attributs est renvoyée.

       llistxattr() est identique à listxattr(), sauf dans le cas d'un lien symbolique, où il renvoie  la  liste
       des noms des attributs associés au lien lui-même et non au fichier auquel il se réfère.

       flistxattr()  est  identique à listxattr(), sauf que le fichier ouvert associé au descripteur (fourni par
       open(2)) est interrogé à la place du chemin.

       Le nom d'un attribut étendu est une simple chaîne terminée par un octet NULL. Le nom  inclut  un  préfixe
       d'espace  de  noms  —  il  peut  y  avoir  plusieurs  espaces  de  noms  disjoints associés avec un inœud
       particulier.

       Si taille est indiqué comme étant de zéro, ces appels renvoient la taille actuelle de la liste  des  noms
       d'attributs  étendus  (et ils laissent liste inchangée). Cela peut être utilisé pour déterminer la taille
       du tampon à fournir dans un appel consécutif (mais il faut tenir compte qu'il est possible que l'ensemble
       d'attributs étendus change entre deux appels et qu’il est donc nécessaire de vérifier le code  de  retour
       de nouveau lors du deuxième appel).

   Exemple
       La  liste des noms est renvoyée sous forme de table de chaînes de caractères terminées par un octet NULL,
       sans ordre particulier, les noms des attributs étant séparés par des octets NULL ('\0')), comme ceci :

           user.name1\0system.name1\0user.name2\0

       Les systèmes de fichiers qui implémentent les ACL (contrôles d'accès) POSIX en  utilisant  les  attributs
       étendus peuvent renvoyer une liste comme celle-ci :

           system.posix_acl_access\0system.posix_acl_default\0

VALEUR RENVOYÉE

       S'ils  réussissent,  ces  appels renvoient un nombre non négatif correspondant à la taille de la liste de
       noms d'attributs. En cas d'échec, ils renvoient -1 et errno est défini pour indiquer l'erreur.

ERREURS

       E2BIG  La taille de la liste de noms d'attributs étendus est supérieure à celle maximale autorisée  ;  la
              liste  ne  peut  pas  être récupérée. Cela peut arriver sur des systèmes de fichiers qui gèrent un
              nombre illimité d'attributs étendus par fichier, tels que XFS par exemple. Voir BOGUES.

       ENOTSUP
              Les attributs étendus ne sont pas pris en charge par le système de fichiers ou sont désactivés.

       ERANGE La taille du tampon de liste est trop petite pour contenir le résultat.

       De plus, les erreurs documentées dans stat(2) peuvent aussi survenir.

STANDARDS

       Linux.

HISTORIQUE

       Linux 2.4, glibc 2.3.

BOGUES

       Comme indiqué dans xattr(7), le VFS impose une limite de 64 Ko comme taille de liste de noms  d'attributs
       étendus renvoyée par listxattr(). Si la taille totale des noms d'attributs rattachés à un fichier dépasse
       cette limite, il n'est plus possible de récupérer la liste des noms d'attributs.

EXEMPLES

       Le  programme  suivant  montre  l'utilisation  de  listxattr() et de getxattr(2). Pour le fichier dont le
       chemin est fourni en paramètre de la ligne de commande, il liste tous les attributs de fichier étendus et
       leur valeur.

       Pour garder un code simple, le programme  suppose  que  les  clés  et  les  valeurs  des  attributs  sont
       constantes  pendant  l'exécution du programme. Un programme réel devrait prévoir et gérer des changements
       pendant son exécution. Par exemple, le nombre d'octets requis pour les clés  d'attributs  peut  augmenter
       entre  les  deux  appels à listxattr(). Une application pourrait gérer cette éventualité en utilisant une
       boucle qui retente l'appel (peut-être un nombre prédéterminé de fois) avec un tampon plus gros  à  chaque
       fois qu'il échoue avec l'erreur ERANGE. Les appels getxattr(2) pourraient être gérés de la même manière.

       La  sortie  suivante  a  été  enregistrée  lors de la première création du fichier, où certains attributs
       étendus ont été positionnés, puis les attributs sont listés avec cet exemple de programme.

   Sortie de l’exemple
           $ touch /tmp/foo
           $ setfattr -n user.fred -v chocolate /tmp/foo
           $ setfattr -n user.frieda -v bar /tmp/foo
           $ setfattr -n user.empty /tmp/foo
           $ ./listxattr /tmp/foo
           user.fred: chocolate
           user.frieda: bar
           user.empty: <no value>

   Source du programme (listxattr.c)
       #include <stdio.h>
       #include <stdlib.h>
       #include <string.h>
       #include <sys/xattr.h>

       int
       main(int argc, char *argv[])
       {
           char     *buf, *key, *val;
           ssize_t  buflen, keylen, vallen;

           if (argc != 2) {
               fprintf(stderr, "Usage : %s path\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           /*
            * Déterminer la taille du tampon nécessaire.
            */
           buflen = listxattr(argv[1], NULL, 0);
           if (buflen == -1) {
               perror("listxattr");
               exit(EXIT_FAILURE);
           }
           if (buflen == 0) {
               printf("%s n'a pas d'attributs.\n", argv[1]);
               exit(EXIT_SUCCESS);
           }

           /*
            * Allouer le tampon.
            */
           buf = malloc(buflen);
           if (buf == NULL) {
               perror("malloc");
               exit(EXIT_FAILURE);
           }

           /*
            * Copier la liste des clés d'attributs dans le tampon.
            */
           buflen = listxattr(argv[1], buf, buflen);
           if (buflen == -1) {
               perror("listxattr");
               exit(EXIT_FAILURE);
           }

           /*
            * Boucle dans la liste de chaînes finies par zéro avec les clés
            * d'attribut. Utiliser le reste de la taille du tampon pour
            * déterminer la fin de la liste.
            */
           key = buf;
           while (buflen > 0) {

               /*
                * Afficher la clé d'attribut.
                */
               printf("%s: ", key);

               /*
                * Déterminer la longueur de la valeur.
                */
               vallen = getxattr(argv[1], key, NULL, 0);
               if (vallen == -1)
                   perror("getxattr");

               if (vallen > 0) {

                   /*
                    * Allouer des tampons de valeur.
                    * Un octet supplémentaire est nécessaire pour compléter 0x00.
                    */
                   val = malloc(vallen + 1);
                   if (val == NULL) {
                       perror("malloc");
                       exit(EXIT_FAILURE);
                   }

                   /*
                    * Copier la valeur dans le tampon.
                    */
                   vallen = getxattr(argv[1], key, val, vallen);
                   if (vallen == -1) {
                       perror("getxattr");
                   } else {
                       /*
                        * Afficher la valeur de l'attribut.
                        */
                       val[vallen] = 0;
                       printf("%s", val);
                   }

                   free(val);
               } else if (vallen == 0) {
                   printf("<pas de valeur>");
               }

               printf("\n");

               /*
                * Faire suivre à la prochaine clé d'attribut.
                */
               keylen = strlen(key) + 1;
               buflen -= keylen;
               key += keylen;
           }

           free(buf);
           exit(EXIT_SUCCESS);
       }

VOIR AUSSI

       getfattr(1),  setfattr(1),  getxattr(2),  open(2),  removexattr(2),  setxattr(2),  stat(2),   symlink(7),
       xattr(7)

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 Jean-Philippe MENGUAL <jpmengual@debian.org>

       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                                      listxattr(2)