Provided by: manpages-fr-dev_4.13-4_all bug

NOM

       link, linkat - Créer un nouveau nom pour un fichier

SYNOPSIS

       #include <unistd.h>

       int link(const char *oldpath, const char *newpath);

       #include <fcntl.h>           /* Définition des constantes AT_* */
       #include <unistd.h>

       int linkat(int olddirfd, const char *oldpath,
                  int newdirfd, const char *newpath, int flags);

   Exigences    de    macros    de   test   de   fonctionnalités   pour   la   glibc   (consulter
   feature_test_macros(7)) :

       linkat() :
           Depuis la glibc 2.10 :
               _POSIX_C_SOURCE >= 200809L
           Avant la glibc 2.10 :
               _ATFILE_SOURCE

DESCRIPTION

       link() crée un nouveau lien (aussi appelé lien matériel  ou  hard  link)  sur  un  fichier
       existant.

       Si newpath existe, il ne sera pas écrasé.

       Ce  nouveau nom pourra être utilisé exactement comme l'ancien quelle que soit l'opération.
       Les deux noms réfèrent au même fichier (et ont donc les mêmes permissions et propriétaire)
       et il est impossible de déterminer quel nom était l'original.

   linkat()
       L'appel  système linkat() fonctionne exactement comme link(), les seules différences étant
       celles décrites ici.

       Si le chemin donné dans oldpath est relatif, il est interprété par rapport  au  répertoire
       référencé  par  le  descripteur  de fichier olddirfd (plutôt que par rapport au répertoire
       courant du processus appelant, comme dans link() pour un chemin relatif).

       Si oldpath est relatif et olddirfd a la valeur spéciale AT_FDCWD, oldpath  est  interprété
       relativement au répertoire courant du processus appelant, (comme link()).

       Si oldpath est un chemin absolu, olddirfd est ignoré.

       L'interprétation de newpath est identique à celle de oldpath, excepté qu'un chemin relatif
       est interprété par rapport au répertoire correspondant à newdirfd.

       Les valeurs suivantes peuvent être combinées avec un  opérateur  OU  bit  à  bit  dans  le
       paramètre flags :

       AT_EMPTY_PATH (depuis Linux 2.6.39)
              Si  oldpath  est  une  chaîne  vide,  créer  un  lien vers le fichier référencé par
              olddirfd (qui peut avoir été obtenu en utilisant open(2) avec  l'attribut  O_PATH).
              Dans  ce  cas,  olddirfd  peut  faire  référence à n'importe quel type de fichier à
              l’exception d’un répertoire. Cette opération ne fonctionne généralement pas  si  le
              nombre  de  liens du fichier est égal à zéro (les fichiers créés par O_TMPFILE sans
              O_EXCL  constituent  une  exception).  L'appelant  doit  disposer  de  la  capacité
              CAP_DAC_READ_SEARCH  pour  pouvoir utiliser cet attribut. Cet attribut est propre à
              Linux, et _GNU_SOURCE doit être initialisé pour obtenir sa définition.

       AT_SYMLINK_FOLLOW (depuis Linux 2.6.18)
              Par défaut, linkat() ne déréférence pas oldpath si c'est  un  lien  symbolique  (de
              même  que  link()).  L'attribut  AT_SYMLINK_FOLLOW  peut être passé dans flags pour
              forcer le déréférencement de oldpath si c'est un lien  symbolique.  Si  procfs  est
              monté,  cet  attribut  offre  une alternative à AT_EMPTY_PATH si on l'utilise de la
              façon suivante :

                  linkat(AT_FDCWD, "/proc/self/fd/<fd>", newdirfd,
                         newname, AT_SYMLINK_FOLLOW);

       Avant le noyau 2.6.18, l'argument flags n'était pas utilisé, et devait être nul.

       Consultez openat(2) pour une explication de la nécessité de linkat().

VALEUR RENVOYÉE

       En cas de succès, zéro est renvoyé. En cas d'erreur, -1 est renvoyé et  errno  reçoit  une
       valeur adéquate.

ERREURS

       EACCES L'écriture  dans  le  répertoire contenant newpath n'est pas autorisée, ou l'un des
              répertoires ne permet pas le parcours (exécution) dans le chemin d’accès de oldpath
              ou newpath. Consultez aussi path_resolution(7).

       EDQUOT Le  quota  de  blocs  de  disque  de l'utilisateur sur le système de fichiers a été
              atteint.

       EEXIST newpath existe déjà.

       EFAULT oldpath ou newpath pointent en dehors de l'espace d'adressage accessible.

       EIO    Une erreur d'entrée-sortie s'est produite.

       ELOOP  Trop de liens symboliques ont été rencontrés en parcourant oldpath ou newpath.

       EMLINK Le fichier auquel renvoie oldpath a déjà atteint le nombre maximal  de  liens  vers
              lui.  Par  exemple,  sur  un  système  de  fichiers  ext4(5)  qui  n'utilise pas la
              fonctionnalité dir_index, la limite du nombre de liens matériels  vers  un  fichier
              est de 65 000 ; sur btrfs(5), la limite est de 65 535.

       ENAMETOOLONG
              oldpath ou newpath est trop long.

       ENOENT Un  répertoire  contenu  dans  oldpath  ou  newpath  n'existe  pas,  ou est un lien
              symbolique pointant nulle part.

       ENOMEM La mémoire disponible du noyau n'était pas suffisante.

       ENOSPC Le périphérique contenant le fichier n'a pas de place pour une nouvelle  entrée  de
              répertoire.

       ENOTDIR
              Un élément utilisé comme répertoire dans oldpath ou newpath n'est pas réellement un
              répertoire.

       EPERM  oldpath est un répertoire.

       EPERM  Le système de fichiers contenant oldpath et newpath ne permet pas  la  création  de
              liens matériels.

       EPERM (depuis Linux 3.6)
              L'appelant  n'a pas le droit pour créer un lien matériel vers ce fichier (consultez
              la description de /proc/sys/fs/protected_hardlinks dans proc(5)).

       EPERM  oldpath est marqué comme immuable ou seulement complétable (voir ioctl_iflags(2)).

       EROFS  Le fichier se trouve sur un système de fichiers en lecture seule.

       EXDEV  oldpath et newpath ne résident pas sur le même système de fichiers.  (Linux  permet
              de monter un système de fichiers à différents endroits, mais link() ne fonctionne à
              travers différents points de montage, même si le même système  de  fichiers  y  est
              monté.

       Les erreurs supplémentaires suivantes peuvent également se produire pour linkat() :

       EBADF  olddirfd ou newdirfd n'est pas un descripteur de fichier valable.

       EINVAL flags contient un drapeau non valable.

       ENOENT AT_EMPTY_PATH   est  indiqué  dans  flags  mais  l'appelant  n'a  pas  la  capacité
              CAP_DAC_READ_SEARCH.

       ENOENT Une  tentative  de  lier  vers  le  fichier  /proc/self/fd/NN  correspondant  à  un
              descripteur de fichier créé avec

                  open(path, O_TMPFILE | O_EXCL, mode);

              Consultez open(2).

       ENOENT Il y a eu une tentative de lien vers le fichier /proc/self/fd/NN correspondant à un
              fichier qui a été effacé.

       ENOENT oldpath est un chemin relatif et olddirfd fait référence à un répertoire qui a  été
              supprimé,  ou  bien  newpath  est un chemin relatif et newdirfd fait référence à un
              répertoire qui a été supprimé.

       ENOTDIR
              oldpath est un chemin relatif,  et  olddirfd  est  un  descripteur  de  fichier  ne
              référençant pas un répertoire ; ou bien c'est le cas pour newpath et newdirfd.

       EPERM  AT_EMPTY_PATH  a  été  précisé dans flags, oldpath est une chaîne vide, et olddirfd
              fait référence à un répertoire.

VERSIONS

       linkat() a été ajouté au noyau Linux dans sa version 2.6.16 ; la glibc le gère  depuis  la
       version 2.4.

CONFORMITÉ

       link() : SVr4, 4.3BSD, POSIX.1-2001 (mais consultez la section NOTES), POSIX.1-2008.

       linkat() : POSIX.1-2008.

NOTES

       Les  liens  matériels créés par link(), ne peuvent pas s'étendre sur plusieurs systèmes de
       fichiers. Utilisez plutôt symlink(2) si cela est nécessaire.

       Selon POSIX.1-2001, link() devrait déréférencer oldpath s'il s'agit d'un lien  symbolique.
       Cependant,  depuis  le  noyau 2.0, Linux ne se comporte pas comme cela : si oldpath est un
       lien symbolique, alors newpath est créé comme un lien (matériel) vers le même  fichier  de
       lien  symbolique  (c'est-à-dire que newpath devient un lien symbolique vers le fichier sur
       lequel pointe oldpath). Certaines autres implémentations  ont  le  même  comportement  que
       Linux.   POSIX.1-2008   change  la  spécification  de  link(),  en  rendant  dépendant  de
       l'implémentation le fait que oldpath soit déréférencé s'il s'agit  d'un  lien  symbolique.
       Pour  un  contrôle précis sur le traitement des liens symboliques lors de la création d'un
       lien, utilisez linkat().

   Notes de la glibc
       Sur les anciens noyaux où linkat() n'est pas disponible, la fonction enveloppe de la glibc
       se rabat sur l'utilisation de link(), sauf si AT_SYMLINK_FOLLOW est indiqué. Quand oldpath
       et newpath sont des chemins relatifs, la glibc construit des chemins à  partir  des  liens
       symboliques dans /proc/self/fd correspondant aux paramètres olddirfd et newdirfd.

BOGUES

       Sur  les  systèmes  de  fichiers NFS, le code de retour peut être faux si le serveur NFS a
       créé correctement le lien mais s'est arrêté avant de donner le code  de  retour.  Utiliser
       dans ce cas stat(2) pour vérifier si le lien a été effectivement créé.

VOIR AUSSI

       ln(1), open(2), rename(2), stat(2), symlink(2), unlink(2), path_resolution(7), symlink(7)

COLOPHON

       Cette  page  fait partie de la publication 5.10 du projet man-pages Linux. Une description
       du projet et des instructions pour signaler des anomalies et la dernière version de  cette
       page peuvent être trouvées à l'adresse https://www.kernel.org/doc/man-pages/.

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  ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩   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 ⟨⟩.