realpath

Autres langues

Langue: fr

Version: 14 décembre 2004 (mandriva - 01/05/08)

Autres sections - même nom

Section: 3 (Bibliothèques de fonctions)

NOM

realpath - Renvoie le chemin d'accès absolu

SYNOPSIS

 #include <sys/param.h>
 #include <stdlib.h>
 
 char *realpath (char *path, char resolved_path[]);
 
 

DESCRIPTION

realpath() développe tous les liens symboliques, et résout les références à « /./ », « /../ » ainsi que les caractères « / » supplémentaires dans la chaîne, terminée par un octet nul, pointée par path et stocke le résultat dans le tampon de taille MAXPATHLEN pointé par resolved_path. Le chemin résultant ne traversera plus de liens symboliques, et ne contiendra plus d'éléments « /./ » ou « /../ ».

VALEUR RENVOYÉE

S'il n'y a pas d'erreur, realpath() renvoie un pointeur sur resolved_path.

Sinon elle renvoie NULL, et resolved_path contient le chemin d'accès absolu vers l'élément de path qui ne peut pas être résolu, et errno contient le code d'erreur.

ERREURS

EACCES
La permission de recherche n'est pas accordée pour un composant du chemin d'accès.
EINVAL
Soit path soit resolv_path est NULL (Dans la libc5, cela déclenchait une faute de segmentation). Mais, voir NOTES plus loin.
EIO
Une erreur d'entrée-sortie s'est produite sur le système de fichiers.
ELOOP
Trop de liens symboliques rencontrés.
ENAMETOOLONG
Un élément du chemin d'accès dépasse NAME_MAX caractères de long, ou le chemin d'accès complet dépasse PATH_MAX caractères.
ENOENT
Le fichier indiqué n'existe pas.
ENOTDIR
Un élément du chemin d'accès n'est pas un répertoire.

VERSIONS

Sous Linux, cette fonction est apparue dans la libc 4.5.21.

CONFORMITÉ

BSD 4.4, POSIX.1-2001.

Dans BSD 4.4 et Solaris la limite de longueur du chemin est MAXPATHLEN (dans <sys/param.h>). SUSv2 conseille PATH_MAX et NAME_MAX, dans <limits.h> ou fournis par pathconf(3). Un fragment de code typique serait

 #ifdef PATH_MAX
   path_max = PATH_MAX;
 #else
   path_max = pathconf(path, _PC_PATH_MAX);
   if (path_max <= 0)
     path_max = 4096;
 #endif
 
(Mais voir quand même la section BOGUES plus haut).

Les versions BSD 4.4, Linux et SUSv2 renvoient toujours un chemin absolu. Solaris peut renvoyer un chemin relatif si l'argument path est relatif. Le prototype de realpath() est donné dans <unistd.h> dans les libc4 et libc5, mais dans <stdlib.h> partout ailleurs.

NOTES

L'implémentation glibc de realpath() fournit une extension non standard. Si resolved_path est NULL, realpath() utilise malloc(3) pour allouer un tampon jusqu'à PATH_MAX octets pour stocker le chemin résolu et renvoie un pointeur sur ce tampon. L'appelant doit désallouer ce tampon en utilisant free(3).

BOGUES

Évitez d'utiliser cette fonction. Sa conception est erronée car (à moins d'utiliser la fonctionnalité non standard resolved_path == NULL ) elle ne permet pas de connaître la taille nécessaire pour le tampon de sortie resolved_path. D'après POSIX, un tampon de taille PATH_MAX suffit, mais PATH_MAX n'est pas nécessairement une constante définie et peut être obtenue avec pathconf(3). En outre, interroger pathconf(3) n'aide pas vraiment, car d'une part POSIX prévient que les résultats de pathconf(3) peuvent être immenses et inappropriés pour allouer de la mémoire et d'autre part pathconf(3) peut renvoyer -1 indiquant que PATH_MAX est illimité.

Les implémentations dans les libc4 et libc5 contenaient un débordement de tampon (corrigé dans la libc-5.4.13). Ainsi, les programmes Set-UID, comme mount ont besoin d'une version privée de cette routine.

VOIR AUSSI

readlink(2), canonicalize_file_name(3), getcwd(3), pathconf(3), sysconf(3)

TRADUCTION

Ce document est une traduction réalisée par Christophe Blaess <http://www.blaess.fr/christophe/> le 6 novembre 1996 et révisée le 22 novembre 2007.

L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 3 realpath ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.