OVH Cloud OVH Cloud

modification du ctime

6 réponses
Avatar
gerbier
bonjour

je sais récupérer les infos sur un fichier (fonction stat), je sais
modifier les champs atime et mtime (fonction utime). Par contre, je
cherche comment modifier le champ ctime.

Le problème provient d'un logiciel de contrôle d'intégrité : quand je
calcule le checksum sur un fichier, cela modifie le champs atime, et
quand je le force avec utime, cela change le champ ctime ...

6 réponses

Avatar
Nicolas George
gerbier wrote in message <epcd7s$uir$:
je sais récupérer les infos sur un fichier (fonction stat), je sais
modifier les champs atime et mtime (fonction utime). Par contre, je
cherche comment modifier le champ ctime.


On peut pas, c'est précisément à ça qu'il sert.

Le problème provient d'un logiciel de contrôle d'intégrité : quand je
calcule le checksum sur un fichier, cela modifie le champs atime, et
quand je le force avec utime, cela change le champ ctime ...


Certains systèmes ont un flag à l'ouverture pour dire de ne pas mettre à
jour l'atime. Sous Linux, c'est O_NOATIME.

Avatar
gerbier
Nicolas George wrote:
gerbier wrote in message <epcd7s$uir$:
je sais récupérer les infos sur un fichier (fonction stat), je sais
modifier les champs atime et mtime (fonction utime). Par contre, je
cherche comment modifier le champ ctime.


Certains systèmes ont un flag à l'ouverture pour dire de ne pas mettre à
jour l'atime. Sous Linux, c'est O_NOATIME.


impeccable (testé, approuvé) : c'est exactement ce qu'il me fallait. En
plus cela semble aussi marcher sur windows.

merci !


Avatar
gerbier
Certains systèmes ont un flag à l'ouverture pour dire de ne pas mettre à
jour l'atime. Sous Linux, c'est O_NOATIME.



je viens de tomber sur des architectures ou O_NOATIME n'est pas défini

j'ai donc écrit un code pour tester la disponibilité :

use strict;
use warnings;
use Fcntl qw(:DEFAULT );

eval {
Fcntl->import( qw( O_NOATIME) );
};
if ($@) {
print "pas de noatimen";
} else {
print "noatimen";
}

qui semble marcher correctement.
(j'ai aussi essayé de tester : defined Fcntl::O_NOATIME mais ça ne
marche pas ...)

mon problème arrive quand je veux récupérer fabriquer un flag contenant
les options de sysopen selon ce que fournit Fcntl :

my $flag;
eval {
Fcntl->import( qw( O_NOATIME)) ;
$flag = O_RDONLY | O_NOATIME;
};
if ($@) {
print "pas de noatimen";
$flag = O_RDONLY;
} else {
print "noatimen";
}
print "flag=$flagn";

Bareword "O_NOATIME" not allowed while "strict subs" in use at
./test_atime.pl line 34

et si je mets un "no strict 'subs' :
Argument "O_NOATIME" isn't numeric in bitwise or (|) at ./test_atime.pl
line 35


Avatar
espie
In article <epkjku$q1b$,
gerbier wrote:
Certains systèmes ont un flag à l'ouverture pour dire de ne pas mettre à
jour l'atime. Sous Linux, c'est O_NOATIME.



je viens de tomber sur des architectures ou O_NOATIME n'est pas défini


Je dirais meme plus: c'est la norme, en fait.

En dehors de linux, un test rapide me montre que ni FreeBSD, ni OpenBSD,
ni Solaris n'ont de O_NOATIME.

Par contre, il y a ce genre de choses dans les options de mount, en
general (mais c'est global au fs, of course).



Avatar
gerbier
Marc Espie wrote:
In article <epkjku$q1b$,
gerbier wrote:
Certains systèmes ont un flag à l'ouverture pour dire de ne pas mettre à
jour l'atime. Sous Linux, c'est O_NOATIME.
je viens de tomber sur des architectures ou O_NOATIME n'est pas défini




Je dirais meme plus: c'est la norme, en fait.

En dehors de linux, un test rapide me montre que ni FreeBSD, ni OpenBSD,
ni Solaris n'ont de O_NOATIME.


même sous linux : je ne l'ai pas sur une vieille redhat 7.3, avec perl
5.6 (kernel 2.4)

Par contre, il y a ce genre de choses dans les options de mount, en
general (mais c'est global au fs, of course).


ça je connaissais déjà, mais j'ai besoin du atime pour connaitre les
packages réellement utilisés.




Avatar
gerbier
après de nombreux essais, voici un code qui marche (même si je ne
comprends pas je dois mettre le nom du module malgrès l'import) :

use strict;
use warnings;
use Fcntl qw(:DEFAULT );

my $flag = O_RDONLY;
eval {
import Fcntl qw( O_NOATIME) ;
$flag = O_RDONLY | Fcntl::O_NOATIME();
printf ("flag=%x RDONLY=%x NOATIME=%xn" , $flag, O_RDONLY,
Fcntl::O_NOATIME()) ;
};
if ($@) {
print "pas de noatimen";
} else {
print "noatimen";
}