LINK(2)

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 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()).

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 OU binaire dans le paramètre flags :

AT_EMPTY_PATH (depuis Linux 2.6.39)
    If oldpath is an empty string, create a link to the file referenced by olddirfd (which may have been obtained using the open(2) O_PATH flag). In this case, olddirfd can refer to any type of file except a directory. This will generally not work if the file has a link count of zero (files created with O_TMPFILE and without O_EXCL are an exception). The caller must have the CAP_DAC_READ_SEARCH capability in order to use this flag. This flag is Linux-specific; define _GNU_SOURCE to obtain its definition.

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 pour l'UID effectif du processus, ou l'un des répertoires de oldpath ou newpath ne permet pas le parcours (exécution). 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
    The file referred to by oldpath already has the maximum number of links to it. For example, on an ext4(5) filesystem that does not employ the dir_index feature, the limit on the number of hard links to a file is 65,000; on btrfs(5), the limit is 65,535 links.

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 du chemin d'accès 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 de créer un lien matériel vers ce fichier (consultez la description de /proc/sys/fs/protected_hardlinks dans proc(5)).

EPERM
    oldpath is marked immutable or append-only. (See 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 pas sur différents points de montage, même si le système de fichiers sous-jacent est le même.

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 invalide.

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
    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, BSD 4.3, 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 ceci est nécessaire.

POSIX.1-2001 says that link() should dereference oldpath if it is a symbolic link. However, since kernel 2.0, Linux does not do so: if oldpath is a symbolic link, then newpath is created as a (hard) link to the same symbolic link file (i.e., newpath becomes a symbolic link to the same file that oldpath refers to). Some other implementations behave in the same manner as Linux. POSIX.1-2008 changes the specification of link(), making it implementation-dependent whether or not oldpath is dereferenced if it is a symbolic link. For precise control over the treatment of symbolic links when creating a link, use linkat().

  Notes de la glibc
On older kernels where linkat() is unavailable, the glibc wrapper function falls back to the use of link(), unless the AT_SYMLINK_FOLLOW is specified. When oldpath and newpath are relative pathnames, glibc constructs pathnames based on the symbolic links in /proc/self/fd that correspond to the olddirfd and newdirfd arguments.

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.08 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> et Frédéric Hantrais <fhantrais@gmail.com> 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>.