Man page - readlinkat(2)

Packages contains this manual

Available languages:

en fr pl nl ja ru de

Manual

readlink

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
readlinkat()
VALEUR RENVOYÉE
ERREURS
STANDARDS
HISTORIQUE
glibc
NOTES
EXEMPLES
VOIR AUSSI
TRADUCTION

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 s’est produite durant la lecture du 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.

STANDARDS

POSIX.1-2008.

HISTORIQUE

readlink ()

4.4BSD (apparue dans 4.2BSD), POSIX.1-2001, POSIX.1-2008.

readlinkat ()

POSIX.1-2008. Linux 2.6.16, glibc 2.4.

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.

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 .

NOTES

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.

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 <sys/types.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{
char *buf;
ssize_t nbytes, bufsiz;
struct stat sb;
if (argc != 2) {
fprintf(stderr, "Utilisation : %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);
}
/* Print only 'nbytes' of 'buf', as it doesn’t contain a terminating
null byte ('\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 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 .