table of contents
READLINK(2) | Manuel du programmeur Linux | READLINK(2) |
NOM¶
readlink - Lire le contenu d'un lien symbolique
SYNOPSIS¶
#include <unistd.h>
ssize_t readlink(const char *path, char *buf, size_t bufsiz);
Exigences de macros de test de fonctionnalités pour la glibc (consultez
feature_test_macros(7)) :
readlinkat() :
DESCRIPTION¶
readlink() place le contenu du lien symbolique path 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.
VALEUR RENVOYÉE¶
S'il réussit, readlink() renvoie 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.
CONFORMITɶ
BSD 4.4 (readlink() est apparue pour la première fois dans BSD 4.2), POSIX.1-2001.
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() 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() 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 < 0) {
perror("lstat");
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[sb.st_size] = '\0';
printf("« %s » pointe vers « %s »\n", argv[1], linkname);
exit(EXIT_SUCCESS); }
VOIR AUSSI¶
readlink(1), lstat(2), readlinkat(2), stat(2), symlink(2), path_resolution(7), symlink(7)
COLOPHON¶
Cette page fait partie de la publication 3.52 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 à <perkamon-fr@traduc.org>.
Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « LC_ALL=C man <section> <page_de_man> ».
20 septembre 2011 | Linux |