.\" -*- coding: UTF-8 -*-
.\" Copyright (c) 1983, 1991 The Regents of the University of California.
.\" And Copyright (C) 2011 Guillem Jover <guillem@hadrons.org>
.\" And Copyright (C) 2006, 2014 Michael Kerrisk
.\" All rights reserved.
.\"
.\" SPDX-License-Identifier: BSD-4-Clause-UC
.\"
.\"     @(#)readlink.2	6.8 (Berkeley) 3/10/91
.\"
.\" Modified Sat Jul 24 00:10:21 1993 by Rik Faith (faith@cs.unc.edu)
.\" Modified Tue Jul  9 23:55:17 1996 by aeb
.\" Modified Fri Jan 24 00:26:00 1997 by aeb
.\" 2011-09-20, Guillem Jover <guillem@hadrons.org>:
.\"     Added text on dynamically allocating buffer + example program
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.TH readlink 2 "5 février 2023" "Pages du manuel de Linux 6.03" 
.SH NOM
readlink, readlinkat \- Lire le contenu d'un lien symbolique
.SH BIBLIOTHÈQUE
Bibliothèque C standard (\fIlibc\fP, \fI\-lc\fP)
.SH SYNOPSIS
.nf
\fB#include <unistd.h>\fP
.PP
\fBssize_t readlink(const char *restrict \fP\fIpathname\fP\fB, char *restrict \fP\fIbuf\fP\fB,\fP
\fB                 size_t \fP\fIbufsiz\fP\fB);\fP
.PP
\fB#include <fcntl.h>           \fP/* Définition des constantes \fBAT_*\fP */
\fB#include <unistd.h>\fP
.PP
\fBssize_t readlinkat(int \fP\fIdirfd\fP\fB, const char *restrict \fP\fIpathname\fP\fB,\fP
\fB                 char *restrict \fP\fIbuf\fP\fB, size_t \fP\fIbufsiz\fP\fB);\fP
.PP
.fi
.RS -4
Exigences de macros de test de fonctionnalités pour la glibc (consulter
\fBfeature_test_macros\fP(7))\ :
.RE
.PP
\fBreadlink\fP():
.nf
.\"    || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
    _XOPEN_SOURCE >= 500 || _POSIX_C_SOURCE >= 200112L
        || /* glibc <= 2.19\ : */ _BSD_SOURCE
.fi
.PP
\fBreadlinkat\fP():
.nf
    Depuis la version 2.10 de la glibc :
        _POSIX_C_SOURCE >= 200809L
    Avant la version 2.10 de la glibc :
        _ATFILE_SOURCE
.fi
.SH DESCRIPTION
\fBreadlink\fP() place le contenu du lien symbolique \fIpathname\fP dans le tampon
\fIbuf\fP, dont la taille est \fIbufsiz\fP. \fBreadlink\fP() n'ajoute pas d’octet
NULL final dans le tampon \fIbuf\fP. Il tronquera (silencieusement) le contenu
(à la longueur \fIbufsiz\fP) si le tampon est trop petit pour recevoir tout le
contenu.
.SS readlinkat()
L'appel système \fBreadlinkat\fP() fonctionne exactement comme \fBreadlink\fP(),
les seules différences étant décrites ici.
.PP
Si \fIpathname\fP est un chemin relatif, il est interprété par rapport au
répertoire référencé par le descripteur de fichier \fIdirfd\fP (plutôt que par
rapport au répertoire courant du processus appelant, comme cela est fait par
\fBreadlink\fP() pour un chemin relatif).
.PP
Si \fIpathname\fP est relatif et si \fIdirfd\fP a la valeur spéciale \fBAT_FDCWD\fP,
alors \fIpathname\fP est interprété relativement au répertoire de travail du
processus appelant, comme pour \fBreadlink\fP().
.PP
Si \fIpathname\fP est absolu, alors \fIdirfd\fP est ignoré.
.PP
.\" commit 65cfc6722361570bfe255698d9cd4dccaf47570d
Depuis Linux\ 2.6.39, \fIpathname\fP peut être une chaîne vide, auquel cas
l'appel opère sur le lien symbolique référencé par \fIdirfd\fP (qui peut avoir
été obtenu par \fBopen\fP(2) avec les drapeaux \fBO_PATH\fP et \fBO_NOFOLLOW\fP).
.PP
Consultez \fBopenat\fP(2) pour une explication de la nécessité de
\fBreadlinkat\fP().
.SH "VALEUR RENVOYÉE"
S'il réussit, ces appels renvoient le nombre d'octets placés dans \fIbuf\fP (si
la valeur renvoyée est égale à \fIbufsiz\fP, il se peut qu'il y ait eu une
troncature). S'il échoue, il renvoie \fB\-1\fP et écrit \fIerrno\fP pour indiquer
l'erreur.
.SH ERREURS
.TP 
\fBEACCES\fP
Un élément du chemin d'accès ne permet pas la recherche. (Consultez aussi
\fBpath_resolution\fP(7).)
.TP 
\fBEBADF\fP
(\fBreadlinkat\fP())  \fIpathname\fP est relatif mais \fIdirfd\fP n'est ni
\fBAT_FDCWD\fP, ni un descripteur de fichier valable.
.TP 
\fBEFAULT\fP
\fIbuf\fP pointe en dehors de l'espace d'adressage accessible.
.TP 
\fBEINVAL\fP
.\" At the glibc level, bufsiz is unsigned, so this error can only occur
.\" if bufsiz==0.  However, the in the kernel syscall, bufsiz is signed,
.\" and this error can also occur if bufsiz < 0.
.\" See: http://thread.gmane.org/gmane.linux.man/380
.\" Subject: [patch 0/3] [RFC] kernel/glibc mismatch of "readlink" syscall?
\fIbufsiz\fP n'est pas un nombre positif.
.TP 
\fBEINVAL\fP
Le fichier nommé (à savoir le composant final du nom de fichier dans
\fIpathname\fP) n'est pas un lien symbolique.
.TP 
\fBEIO\fP
Une erreur d'entrée\-sortie est survenue lors de la lecture sur le système de
fichiers.
.TP 
\fBELOOP\fP
Trop de liens symboliques ont été rencontrés en parcourant le chemin.
.TP 
\fBENAMETOOLONG\fP
Un nom de chemin d'accès ou l'un des composants d'un nom de chemin d'accès
est trop long.
.TP 
\fBENOENT\fP
Le fichier indiqué n'existe pas.
.TP 
\fBENOMEM\fP
La mémoire disponible du noyau n'était pas suffisante.
.TP 
\fBENOTDIR\fP
Un élément du chemin d'accès n'est pas un répertoire.
.TP 
\fBENOTDIR\fP
(\fBreadlinkat\fP()) \fIpathname\fP est relatif et \fIdirfd\fP est un descripteur de
fichier faisant référence à un fichier qui n'est pas un dossier.
.SH VERSIONS
\fBreadlinkat\fP() 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.
.SH STANDARDS
\fBreadlink\fP()\ : 4.4BSD (\fBreadlink\fP() est apparue pour la première fois dans
4.2BSD), POSIX.1\-2001, POSIX.1\-2008.
.PP
\fBreadlinkat\fP(): POSIX.1\-2008.
.SH NOTES
Jusqu'à la glibc\ 2.4 incluse, le type de retour de \fBreadlink\fP() était
déclaré comme \fIint\fP. À présent, le type de retour est déclaré comme
\fIssize_t\fP, ainsi que le prescrit POSIX.1\-2001.
.PP
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 \fIstat.st_size\fP renvoyée par un appel à
\fBlstat\fP(2) sur le lien. Cependant, le nombre d'octets écrits par
\fBreadlink\fP() et par \fBreadlinkat\fP() 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 \fBreadlink\fP() et pour  \fBreadlinkat\fP() résout aussi
un problème habituel de portabilité si \fBPATH_MAX\fP 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.
.SS "Notes de la glibc"
Sur les anciens noyaux où \fBreadlinkat\fP() n'était pas disponible, la
fonction enveloppe de la glibc se rabat sur l'utilisation de
\fBreadlink\fP(). Quand \fIpathname\fP est un chemin relatif, la glibc construit
un chemin à partir du lien symbolique dans \fI/proc/self/fd\fP correspondant au
paramètre \fIdirfd\fP.
.SH EXEMPLES
Le programme suivant alloue le tampon nécessaire à \fBreadlink\fP()
dynamiquement à partir des données fournies par \fBlstat\fP(), en se rabattant
sur un tampon de taille \fBPATH_MAX\fP si \fBlstat\fP(2) signale une taille de
zéro.
.PP
.\" SRC BEGIN (readlink.c)
.EX
#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>\en", 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 \[aq]st_size\[aq] 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 \[aq]nbytes\[aq] de \[aq]buf\[aq], car il ne contient
       pas d'octet NULL final (\[aq]\e0\[aq]). */
    printf("\[aq]%s\[aq] pointe vers \[aq]%.*s\[aq]\en", 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é)\en");

    free(buf);
    exit(EXIT_SUCCESS);
}
.EE
.\" SRC END
.SH "VOIR AUSSI"
\fBreadlink\fP(1), \fBlstat\fP(2), \fBstat\fP(2), \fBsymlink\fP(2), \fBrealpath\fP(3),
\fBpath_resolution\fP(7), \fBsymlink\fP(7)
.PP
.SH 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>
.
.PP
Cette traduction est une documentation libre ; veuillez vous reporter à la
.UR https://www.gnu.org/licenses/gpl-3.0.html
GNU General Public License version 3
.UE
concernant les conditions de copie et 
de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
.PP
Si vous découvrez un bogue dans la traduction de cette page de manuel, 
veuillez envoyer un message à
.MT debian-l10n-french@lists.debian.org
.ME .