Provided by: manpages-fr-dev_4.19.0-7_all bug

NOM

       readlink, readlinkat - Lire le contenu d'un lien symbolique

BIBLIOTHÈQUE

       Bibliothèque C standard (libc, -lc)

SYNOPSIS

       #include <unistd.h>

       ssize_t readlink(const char *restrict pathname, char *restrict buf,
                        size_t bufsiz);

       #include <fcntl.h>           /* Définition des constantes AT_* */
       #include <unistd.h>

       ssize_t readlinkat(int dirfd, const char *restrict pathname,
                        char *restrict buf, size_t bufsiz);

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

       readlink():
           _XOPEN_SOURCE >= 500 || _POSIX_C_SOURCE >= 200112L
               || /* glibc <= 2.19 : */ _BSD_SOURCE

       readlinkat():
           Depuis la glibc 2.10 :
               _POSIX_C_SOURCE >= 200809L
           Avant la glibc 2.10 :
               _ATFILE_SOURCE

DESCRIPTION

       readlink() place le contenu du lien symbolique pathname dans le tampon buf, dont la taille
       est  bufsiz.  readlink()  n'ajoute pas d’octet NULL final dans le tampon buf. Il tronquera
       (silencieusement) le contenu (à la longueur bufsiz) si  le  tampon  est  trop  petit  pour
       recevoir tout le contenu.

   readlinkat()
       L'appel   système   readlinkat()   fonctionne  exactement  comme  readlink(),  les  seules
       différences étant décrites ici.

       Si pathname est un chemin relatif, il est interprété par rapport au  répertoire  référencé
       par  le  descripteur  de  fichier  dirfd  (plutôt que par rapport au répertoire courant du
       processus appelant, comme cela est fait par readlink() pour un chemin relatif).

       Si pathname est relatif et si dirfd a la valeur  spéciale  AT_FDCWD,  alors  pathname  est
       interprété  relativement  au  répertoire  de  travail  du  processus  appelant, comme pour
       readlink().

       Si pathname est absolu, alors dirfd est ignoré.

       Depuis Linux 2.6.39, pathname peut être une chaîne vide, auquel cas l'appel opère  sur  le
       lien  symbolique  référencé  par  dirfd  (qui  peut  avoir été obtenu par open(2) avec les
       drapeaux O_PATH et O_NOFOLLOW).

       Consultez openat(2) pour une explication de la nécessité de readlinkat().

VALEUR RENVOYÉE

       S'il réussit, ces appels renvoient le nombre  d'octets  placés  dans  buf  (si  la  valeur
       renvoyée  est  égale  à bufsiz, il se peut qu'il y ait eu une troncature). S'il échoue, il
       renvoie -1 et écrit errno pour indiquer l'erreur.

ERREURS

       EACCES Un élément  du  chemin  d'accès  ne  permet  pas  la  recherche.  (Consultez  aussi
              path_resolution(7).)

       EBADF  (readlinkat())    pathname  est  relatif  mais  dirfd  n'est  ni  AT_FDCWD,  ni  un
              descripteur de fichier valable.

       EFAULT buf pointe en dehors de l'espace d'adressage accessible.

       EINVAL bufsiz n'est pas un nombre positif.

       EINVAL Le fichier nommé (à savoir le composant final du  nom  de  fichier  dans  pathname)
              n'est pas un lien symbolique.

       EIO    Une  erreur  d'entrée-sortie  est  survenue  lors  de  la lecture sur le système de
              fichiers.

       ELOOP  Trop de liens symboliques ont été rencontrés en parcourant le chemin.

       ENAMETOOLONG
              Un nom de chemin d'accès ou l'un des composants d'un nom de chemin d'accès est trop
              long.

       ENOENT Le fichier indiqué n'existe pas.

       ENOMEM La mémoire disponible du noyau n'était pas suffisante.

       ENOTDIR
              Un élément du chemin d'accès n'est pas un répertoire.

       ENOTDIR
              (readlinkat())  pathname est relatif et dirfd est un descripteur de fichier faisant
              référence à un fichier qui n'est pas un dossier.

VERSIONS

       readlinkat() a été ajouté dans Linux 2.6.16 ; la prise en charge de la bibliothèque a  été
       ajoutée dans la glibc 2.4.

STANDARDS

       readlink() :   4.4BSD  (readlink()  est  apparue  pour  la  première  fois  dans  4.2BSD),
       POSIX.1-2001, POSIX.1-2008.

       readlinkat(): POSIX.1-2008.

NOTES

       Jusqu'à la glibc 2.4 incluse, le type de retour de readlink() était déclaré comme  int.  À
       présent, le type de retour est déclaré comme ssize_t, ainsi que le prescrit POSIX.1-2001.

       L'utilisation  d'un tampon de taille statique risque de ne pas fournir assez de place pour
       le contenu du lien symbolique. La taille nécessaire au tampon peut être lue dans la valeur
       stat.st_size  renvoyée  par un appel à lstat(2) sur le lien. Cependant, le nombre d'octets
       écrits par readlink() et par readlinkat() devrait  être  vérifié  pour  s'assurer  que  la
       taille  du  lien  symbolique  n'a pas augmenté entre les appels. L'allocation dynamique du
       tampon pour readlink()  et  pour   readlinkat()  résout  aussi  un  problème  habituel  de
       portabilité  si  PATH_MAX  est  utilisé comme taille de tampon, car la définition de cette
       constante n'est pas garantie selon les POSIX si le système n'a pas ce genre de limite.

   Notes de la glibc
       Sur les anciens noyaux où readlinkat() n'était pas disponible, la fonction enveloppe de la
       glibc  se  rabat sur l'utilisation de readlink(). Quand pathname est un chemin relatif, la
       glibc construit un chemin à partir du lien symbolique dans /proc/self/fd correspondant  au
       paramètre dirfd.

EXEMPLES

       Le  programme  suivant alloue le tampon nécessaire à readlink() dynamiquement à partir des
       données fournies par lstat(), en se rabattant sur un tampon de taille PATH_MAX si lstat(2)
       signale une taille de zéro.

       #include <limits.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <sys/stat.h>
       #include <unistd.h>

       int
       main(int argc, char *argv[])
       {
           char         *buf;
           ssize_t      nbytes, bufsiz;
           struct stat  sb;

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

           if (lstat(argv[1], &sb) == -1) {
               perror("lstat");
               exit(EXIT_FAILURE);
           }

           /* Ajouter un à la taille du lien, pour pouvoir déterminer si le tampon
              renvoyé par readlink() a été tronqué. */

           bufsiz = sb.st_size + 1;

           /* Certains liens symboliques magiques dans (par exemple) /proc et /sys
              indiquent 'st_size' comme zéro. Dans ce cas, prendre PATH_MAX
              comme estimation « acceptable ». */

           if (sb.st_size == 0)
               bufsiz = PATH_MAX;

           buf = malloc(bufsiz);
           if (buf == NULL) {
               perror("malloc");
               exit(EXIT_FAILURE);
           }

           nbytes = readlink(argv[1], buf, bufsiz);
           if (nbytes == -1) {
               perror("readlink");
               exit(EXIT_FAILURE);
           }

           /* N'afficher que 'nbytes' de 'buf', car il ne contient
              pas d'octet NULL final ('\0'). */
           printf("'%s' pointe vers '%.*s'\n", argv[1], (int) nbytes, buf);

           /* Si la valeur renvoyée était égale à la taille du tampon, la cible du
              lien était plus grande que prévu (peut-être parce que la cible
              a changé entre l'appel à lstat() et l'appel à readlink()).
              Avertir l'utilisateur que la cible renvoyée peut avoir
              été tronquée. */

           if (nbytes == bufsiz)
               printf("(Il se peut que le tampon renvoyé ait été tronqué)\n");

           free(buf);
           exit(EXIT_SUCCESS);
       }

VOIR AUSSI

       readlink(1), lstat(2), stat(2), symlink(2), realpath(3), path_resolution(7), symlink(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>,   Frédéric   Hantrais
       <fhantrais@gmail.com> et Jean-Philippe MENGUAL <jpmengual@debian.org>

       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⟩.