Provided by: manpages-fr-dev_3.65d1p1-1_all bug

NOM

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

SYNOPSIS

       #include <unistd.h>

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

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

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

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

       readlinkat() :
           _BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED ||
           _POSIX_C_SOURCE >= 200112L

       readlinkat():
           Depuis la glibc 2.10 :
               _XOPEN_SOURCE >= 700 || _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 de caractère NUL dans le tampon buf. Il  tronquera  le  contenu  (à  la  longueur
       bufsiz) si le tampon est trop petit pour recevoir les données.

   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 un chemin absolu, dirfd est ignoré.

       Depuis  Linux 2.6.39,  pathname  peut  être  une  chaîne  vide,  auquel  cas l'appel opère sur le fichier
       référencé par dirfd (qui peut avoir été obtenu par open(2) avec le drapeau O_PATH). DAns  ce  cas,  dirfd
       peut référer à tout type de fichier, pas uniquement un répertoire.

       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. S'il échoue, il renvoie -1 et
       écrit errno en conséquence.

ERREURS

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

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

       EINVAL bufsiz n'est pas positif.

       EINVAL Le fichier 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
              path ou l'un des composants de ce chemin d'accès est trop long.

       ENOENT Le fichier indiqué n'existe pas.

       ENOMEM Pas assez de mémoire pour le noyau.

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

       Les erreurs supplémentaires suivantes peuvent également se produire pour readlinkat() :

       EBADF  dirfd n'est pas un descripteur de fichier valable.

       ENOTDIR
              pathname est relatif, et le descripteur de fichier dirfd est  associé  à  un  fichier,  pas  à  un
              répertoire.

VERSIONS

       readlinkat() a été ajouté au noyau Linux dans sa version 2.6.16 ; la glibc le gère depuis la version 2.4.

CONFORMITÉ

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

       readlinkat() : POSIX.1-2008.

NOTES

       Dans les versions de glibc jusqu'à 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 par POSIX si le système n'a pas ce genre de limite.

EXEMPLE

       Le programme suivant alloue le tampon nécessaire à readlink() dynamiquement à partir des données fournies
       par lstat(), en s'assurant qu'il n'y a pas de situation de compétition entre les appels.

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

       int
       main(int argc, char *argv[])
       {
           struct stat sb;
           char *linkname;
           ssize_t r;

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

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

           linkname = malloc(sb.st_size + 1);
           if (linkname == NULL) {
               fprintf(stderr, "mémoire insuffisante\n");
               exit(EXIT_FAILURE);
           }

           r = readlink(argv[1], linkname, sb.st_size + 1);

           if (r == -1) {
               perror("readlink");
               exit(EXIT_FAILURE);
           }

           if (r > sb.st_size) {
               fprintf(stderr, "la taille du lien symbolique a augmenté"
                               "entre lstat() et readlink()\n");
               exit(EXIT_FAILURE);
           }

           linkname[r] = '\0';

           printf("« %s » pointe vers « %s »\n", argv[1], linkname);

           exit(EXIT_SUCCESS);
       }

VOIR AUSSI

       readlink(1), lstat(2), stat(2), symlink(2), path_resolution(7), symlink(7)

COLOPHON

       Cette page fait partie de la publication 3.65 du projet man-pages Linux. Une description du projet et des
       instructions     pour     signaler     des     anomalies    peuvent    être    trouvées    à    l'adresse
       http://www.kernel.org/doc/man-pages/.

TRADUCTION

       Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <http://po4a.alioth.debian.org/> par
       l'équipe de traduction francophone au sein du projet perkamon <http://perkamon.alioth.debian.org/>.

       Christophe      Blaess      <http://www.blaess.fr/christophe/>      (1996-2003),       Alain       Portal
       <http://manpagesfr.free.fr/>  (2003-2006).  Julien  Cristau  et  l'équipe  francophone  de  traduction de
       Debian (2006-2009).

       Veuillez signaler toute erreur de traduction en écrivant à <debian-l10n-french@lists.debian.org>  ou  par
       un rapport de bogue sur le paquet manpages-fr.

       Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « man -L C
       <section> <page_de_man> ».

Linux                                            21 février 2014                                     READLINK(2)