readlink(2) System Calls Manual readlink(2) NOM readlink, readlinkat - Lire le contenu d'un lien symbolique BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include ssize_t readlink(const char *restrict pathname, char *restrict buf, size_t bufsiz); #include /* Definition des constantes AT_* */ #include ssize_t readlinkat(int dirfd, const char *restrict pathname, char *restrict buf, size_t bufsiz); Exigences de macros de test de fonctionnalites 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 (a la longueur bufsiz) si le tampon est trop petit pour recevoir tout le contenu. readlinkat() L'appel systeme readlinkat() fonctionne exactement comme readlink(), les seules differences etant decrites ici. Si pathname est un chemin relatif, il est interprete par rapport au repertoire reference par le descripteur de fichier dirfd (plutot que par rapport au repertoire courant du processus appelant, comme cela est fait par readlink() pour un chemin relatif). Si pathname est relatif et si dirfd a la valeur speciale AT_FDCWD, alors pathname est interprete relativement au repertoire de travail du processus appelant, comme pour readlink(). Si pathname est absolu, alors dirfd est ignore. Depuis Linux 2.6.39, pathname peut etre une chaine vide, auquel cas l'appel opere sur le lien symbolique reference par dirfd (qui peut avoir ete obtenu par open(2) avec les drapeaux O_PATH et O_NOFOLLOW). Consultez openat(2) pour une explication de la necessite de readlinkat(). VALEUR RENVOYEE S'il reussit, ces appels renvoient le nombre d'octets places dans buf (si la valeur renvoyee est egale a bufsiz, il se peut qu'il y ait eu une troncature). S'il echoue, il renvoie -1 et ecrit errno pour indiquer l'erreur. ERREURS EACCES Un element du chemin d'acces 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 nomme (a savoir le composant final du nom de fichier dans pathname) n'est pas un lien symbolique. EIO Une erreur d'entree-sortie est survenue lors de la lecture sur le systeme de fichiers. ELOOP Trop de liens symboliques ont ete rencontres en parcourant le chemin. ENAMETOOLONG Un nom de chemin d'acces ou l'un des composants d'un nom de chemin d'acces est trop long. ENOENT Le fichier indique n'existe pas. ENOMEM La memoire disponible du noyau n'etait pas suffisante. ENOTDIR Un element du chemin d'acces n'est pas un repertoire. ENOTDIR (readlinkat()) pathname est relatif et dirfd est un descripteur de fichier faisant reference a 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'a la glibc 2.4 incluse, le type de retour de readlink() etait declare comme int. A present, le type de retour est declare comme ssize_t, ainsi que le prescrit POSIX.1-2001. glibc Sur les anciens noyaux ou readlinkat() n'etait 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 a partir du lien symbolique dans /proc/self/fd correspondant au parametre 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 necessaire au tampon peut etre lue dans la valeur stat.st_size renvoyee par un appel a lstat(2) sur le lien. Cependant, le nombre d'octets ecrits par readlink() et par readlinkat() devrait etre verifie pour s'assurer que la taille du lien symbolique n'a pas augmente entre les appels. L'allocation dynamique du tampon pour readlink() et pour readlinkat() resout aussi un probleme habituel de portabilite si PATH_MAX est utilise comme taille de tampon, car la definition de cette constante n'est pas garantie selon les POSIX si le systeme n'a pas ce genre de limite. EXEMPLES Le programme suivant alloue le tampon necessaire a readlink() dynamiquement a partir des donnees fournies par lstat(), en se rabattant sur un tampon de taille PATH_MAX si lstat(2) signale une taille de zero. #include #include #include #include #include int main(int argc, char *argv[]) { char *buf; ssize_t nbytes, bufsiz; struct stat sb; if (argc != 2) { fprintf(stderr, "Utilisation : %s \n", argv[0]); exit(EXIT_FAILURE); } if (lstat(argv[1], &sb) == -1) { perror("lstat"); exit(EXIT_FAILURE); } /* Ajouter un a la taille du lien, pour pouvoir determiner si le tampon renvoye par readlink() a ete tronque. */ bufsiz = sb.st_size + 1; /* Certains liens symboliques magiques dans (par exemple) /proc et /sys indiquent 'st_size' comme zero. 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 renvoyee etait egale a la taille du tampon, la cible du lien etait plus grande que prevu (peut-etre parce que la cible a change entre l'appel a lstat() et l'appel a readlink()). Avertir l'utilisateur que la cible renvoyee peut avoir ete tronquee. */ if (nbytes == bufsiz) printf("(Il se peut que le tampon renvoye ait ete tronque)\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 francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot , Frederic Hantrais et Jean- Philippe MENGUAL Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 1 novembre 2023 readlink(2)