Manpages

NOM

rename, renameat − Changer le nom ou l’emplacement d’un fichier

SYNOPSIS

#include <stdio.h>

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

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

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

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

renameat():

Depuis la glibc 2.10 :

_XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L

Avant la glibc 2.10 :

_ATFILE_SOURCE

DESCRIPTION

rename() renomme un fichier, en le déplaçant dans un autre répertoire si nécessaire. Tous les autres liens vers le fichier (créés avec link(2)) sont inchangés. Les descripteurs de fichier ouverts sur oldpath ne sont pas non plus affectés.

Si newpath existe déjà, il sera écrasé (avec quelques restrictions, voir le paragraphe ERREURS), de manière à ce qu’à aucun moment, un autre processus tentant d’accéder à newpath ne le voie absent.

Si oldpath et newpath sont des liens existants correspondant au même fichier, rename() ne fait rien et renvoie un code de succès.

Si newpath existe mais que l’opération échoue pour une raison quelconque, rename() garantit la présence d’une instance de newpath en place.

oldpath peut être un répertoire. Dans ce cas, newpath doit être soit absent, soit un répertoire vide.

Néanmoins, pendant un écrasement, il se trouve un court instant pendant lequel à la fois oldpath et newpath font référence au fichier.

Si oldpath correspond à un lien symbolique, le lien est renommé ; si newpath correspond à un lien symbolique, le lien est écrasé.

renameat ()
L’appel système renameat() fonctionne exactement comme rename(), les seules différences étant 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 de travail du processus, comme c’est le cas pour rename()).

Si oldpath est un chemin relatif, et si olddirfd a la valeur spéciale AT_FDCWD, alors oldpath est interprété par rapport au répertoire de travail du processus (comme pour rename()).

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.

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

VALEUR RENVOYÉE

S’il réussit, cet appel système renvoie 0. S’il échoue, il renvoie −1 et remplit errno en conséquence.

ERREURS

EACCES

La permission d’écrire est refusée dans le répertoire contenant oldpath ou newpath ou la permission de parcours est refusée pour l’un des répertoires des chemins oldpath ou newpath, ou encore oldpath était un répertoire et ne permet pas l’écriture (nécessaire pour mettre à jour l’entrée ..). (Consultez aussi path_resolution(7).)

EBUSY

Le renommage a échoué car oldpath ou newpath est un répertoire utilisé par un processus (peut−être comme répertoire de travail, ou comme répertoire racine, ou ouvert en lecture), ou il est utilisé par le système (comme point de montage par exemple). Le système a donc considéré qu’il y avait une erreur. (Notez qu’il n’est pas indispensable de renvoyer EBUSY dans un tel cas — rien n’empêche d’effectuer le renommage malgré tout — mais il est permis de retourner EBUSY si le système n’arrive pas à gérer une telle situation).

EDQUOT

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

EFAULT

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

EINVAL

Une partie du nouveau chemin contient en préfixe l’ancien chemin, ou plus généralement, un répertoire ne peut pas être déplacé dans ses propres sous−répertoires.

EISDIR

newpath est un répertoire existant mais oldpath n’est pas un répertoire

ELOOP

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

EMLINK

oldpath a déjà un nombre maximal de liens, ou bien c’est un répertoire, et le répertoire contenant newpath a le nombre maximal de liens.

ENAMETOOLONG

oldpath ou newpath est trop long.

ENOENT

Le lien indiqué par oldpath n’existe pas ; ou un répertoire du chemin newpath n’existe pas ; ou oldpath ou newpath est une chaîne vide.

ENOMEM

Pas assez de mémoire pour le noyau.

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 un répertoire, ou oldpath est un répertoire et newpath existe mais n’est pas un répertoire.

ENOTEMPTY ou EEXIST

newpath est un répertoire non vide (contient autre chose que « . » et « .. »).

EPERM ou EACCES

Le répertoire contenant oldpath a le Sticky−bit (S_ISVTX) positionné, et l’UID effectif du processus n’est ni celui du fichier à déplacer, ni celui du répertoire le contenant, et le processus n’est pas privilégié (sous Linux : n’a pas la capacité CAP_FOWNER ; ou newpath est un fichier existant et le répertoire le contenant a son sticky bit positionné et l’UID effectif du processus n’est ni celui du fichier à déplacer, ni celui du répertoire le contenant, et le processus n’est pas privilégié (sous Linux : n’a pas la capacité CAP_FOWNER ; ou alors le système de fichiers contenant pathname ne permet pas le renommage de fichiers.

EROFS

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

EXDEV

oldpath et newpath ne sont pas sur le même système de fichiers. (Linux permet de monter un système de fichiers à plusieurs endroits, mais rename() ne marche pas entre différents points de montage, même si le système de fichiers monté sur les deux est le même.)

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

EBADF

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

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.

VERSIONS

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

CONFORMITÉ

rename() : 4.3BSD, C89, C99, POSIX.1−2001, POSIX.1−2008.

renameat() : POSIX.1−2008.

BOGUES

Sur les systèmes de fichiers NFS, ce n’est pas parce que l’opération a échoué que le fichier n’a pas été renommé. Si le serveur effectue le déplacement, et s’effondre, la RPC transmise qui sera traitée lorsque le serveur sera à nouveau en état va indiquer un échec. L’application doit supporter ce genre de problème. Consultez link(2) pour un cas similaire.

VOIR AUSSI

mv(1), chmod(2), link(2), symlink(2), unlink(2), path_resolution(7), symlink(7)

COLOPHON

Cette page fait partie de la publication 3.65 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 à <debian−l10n−french [AT] lists.org> ou par un rapport de bogue sur le paquet manpages−fr.

Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « man −L C <section> <page_de_man> ».