table of contents
UTIMENSAT(2) | Manuel du programmeur Linux | UTIMENSAT(2) |
NOM¶
utimensat, futimens - Modifier les horodatages d'un fichier avec une précision d'une nanosecondeSYNOPSIS¶
#include <fcntl.h> /* Définition des constantes AT_* */ #include <sys/stat.h>int utimensat(int dirfd, const char *pathname, const struct timespec times[2], int flags); int futimens(int fd, const struct timespec times[2]);
Exigences de macros de test de fonctionnalités pour la glibc (consultez feature_test_macros(7)) :
- Depuis la glibc 2.10 :
- _XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L
- Avant la glibc 2.10 :
- _ATFILE_SOURCE
- Depuis la glibc 2.10 :
- _XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L
- Avant la glibc 2.10 :
- _GNU_SOURCE
DESCRIPTION¶
utimensat() et futimens() mettent à jour les horodatages d'un fichier avec une précision d'une nanoseconde. Ceci change de l'appel historique ou de utimes(2), qui permettent seulement une précision d'une seconde et d'une microseconde respectivement pour l'établissement des horodatages de fichier.struct timespec { time_t tv_sec; /* secondes */ long tv_nsec; /* nanosecondes */ };
L'horodatage mis à jour pour le fichier est configuré à la valeur la plus importante gérée par le système de fichiers et qui n'est pas supérieure à l'horodatage fourni
Droits d'accès nécessaires¶
Pour définir les deux horodatages à l'heure actuelle (c'est-à-dire quand times vaut NULL ou que les deux champs tv_nsec valent UTIME_NOW), il faut :- 1.
- soit que l'utilisateur ait les droits d'écriture sur le fichier ;
- 2.
- soit que l'identifiant effectif de l'appelant corresponde au propriétaire du fichier ;
- 3.
- ou que le processus appelant ait les privilèges nécessaires.
Spécificités de utimensat()¶
Si le chemin donné dans pathname est relatif, il est par défaut interprété par rapport au répertoire référencé par le descripteur de fichier ouvert dirfd (plutôt que par rapport au répertoire courant du processus, comme pour utimes(2) pour les chemins relatifs). Consultez openat(2) pour avoir les raisons pour lesquelles ceci peut être utile.- AT_SYMLINK_NOFOLLOW
- Si pathname indique un lien symbolique, alors mettre à jour l'horodatage du lien, plutôt que le fichier pointé.
VALEUR RENVOYÉE¶
S'ils réussissent les appels utimensat() et futimens() renvoient zéro, sinon ils renvoient -1 et remplissent errno avec le code d'erreur.ERREURS¶
- EACCES
- times est NULL ou les deux champs tv_nsec valent UTIME_NOW, et
- *
- l'identifiant de l'utilisateur effectif de l'appelant ne correspond pas au propriétaire du fichier, l'appelant n'a pas la permission d'écriture sur le fichier et l'appelant n'est pas privilégié (Linux : n'a ni la capacité CAP_FOWNER, ni la capacité CAP_DAC_OVERRIDE) ; ou
- *
- le fichier est marqué comme étant immuable (consultez chattr(1)).
- EBADF
- (futimens()) fd n'est pas un descripteur de fichier valable.
- EBADF
- (utimensat()) pathname est un chemin relatif, mais dirfd n'est ni AT_FDCWD ni un descripteur de fichier valable.
- EFAULT
- times pointe vers une adresse incorrecte ; ou dirfd valait AT_FDCWD et pathname est NULL ou une adresse incorrecte.
- EINVAL
- Valeur incorrecte dans flags.
- EINVAL
- Valeur incorrecte dans un des champs tv_nsec (valeur en dehors de l'intervalle allant de 0 à 999.999.999 et ne vallant ni UTIME_NOW ni UTIME_OMIT) ; ou une valeur incorrecte dans un des champs tv_sec.
- EINVAL
- pathname est NULL, dirfd ne vaut pas AT_FDCWD et flags contient AT_SYMLINK_NOFOLLOW.
- ELOOP
- (utimensat()) Trop de liens symboliques ont été rencontrés en parcourant pathname.
- ENAMETOOLONG
- (utimensat()) pathname est trop long.
- ENOENT
- (utimensat()) Un élément du chemin d'accès pathname ne correspond pas un répertoire ou àun fichier existant ou pathname est une chaîne vide.
- ENOTDIR
- (utimensat()) pathname est un chemin relatif, mais dirfd n'est ni AT_FDCWD ni un descripteur de fichier correspondant à un répertoire ; ou l'un des composants au début de pathname n'est pas un répertoire.
- EPERM
- L'appelant a essayé de modifier un horodatage (ou les deux) en une valeur autre que l'heure actuelle, ou de modifier un des horodatages en l'heure actuelle et en ne changeant pas l'autre horodatage (c'est-à-dire times n'est pas NULL, les deux champs tv_nsec ne valent pas UTIME_NOW et les deux champs tv_nsec ne valent pas UTIME_OMIT) et :
- *
- l'identifiant d'utilisateur effectif de l'appelant ne correspond pas au propriétaire du fichier et l'appelant n'est pas privilégié (Linux : n'a pas la capacité CAP_FOWNER).
- *
- le fichier est marqué comme n'acceptant que des ajouts ou est immuable (voir chattr(1)).
- EROFS
- Le fichier se trouve sur un système de fichiers en lecture seule.
- ESRCH
- (utimensat()) Un élément au début du chemin d'accès pathname ne permet pas le parcours.
VERSIONS¶
utimensat() a été ajouté à Linux dans le noyau 2.6.22 ; la glibc le gère depuis la version 2.6.CONFORMITɶ
futimens() et utimensat() sont spécifiés dans POSIX.1-2008.NOTES¶
utimensat() rend futimesat(2) obsolète.utimensat(fd, NULL, times, 0);
BOGUES¶
Plusieurs bogues affectent utimensat() et futimens() sur les noyaux antérieurs à 2.6.26. Ces bogues sont soit des non conformités avec le brouillon de la spécification POSIX.1 soit des incohérences avec le comportement historique de Linux.- *
- POSIX.1 spécifie que si un des champs tv_nsec prend la valeur UTIME_NOW ou UTIME_OMIT, alors la valeur du champs tv_sec correspondant doit être ignorée. À la place, la valeur du champ tv_sec doit être nul (ou une erreur EINVAL sera produite).
- *
- Ces bogues indiquent que pour ce qui est de la vérification des droits, le cas où les deux champs tv_nsec ne valent pas UTIME_NOW n'est pas toujours traité de la même façon que lorsque times est NULL, et le cas où une des valeurs tv_nsec vaut UTIME_NOW et l'autre vaut UTIME_OMIT n'est pas traité de la même façon que quand times pointe vers un tableau de structures contenant des valeurs de temps arbitraires. De ce fait, il se peut que : a) des horodatages de fichier puissent être mis à jour par un processus qui ne devrait pas avoir le droit de faire ces mises à jour ; b) des horodatages de fichier ne puissent pas être mis à jour par un processus qui devrait avoir le droit de faire ces mises à jour ; et c) la mauvaise valeur d' errno puisse être renvoyée en cas d'erreur.
- *
- POSIX.1 indique qu'un processus qui a les droits d'accès en écriture pour un fichier peut faire un appel avec times valant NULL ou avec times pointant vers un tableau de structures dans lesquelles les deux champs tv_nsec valent UTIME_NOW pour mettre à jour les deux horodatages à l'heure actuelle. Cependant, futimens() vérifie à la place si le mode d'accès du descripteur de fichier permet l'écriture.
VOIR AUSSI¶
chattr(1), futimesat(2), openat(2), stat(2), utimes(2), futimes(3), path_resolution(7), symlink(7)COLOPHON¶
Cette page fait partie de la publication 3.44 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/>. Alain Portal <http://manpagesfr.free.fr/> (2008). Veuillez signaler toute erreur de traduction en écrivant à <debian-l10n-french@lists.debian.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> ».25 mars 2012 | Linux |