@@ -11,6 +11,7 @@ use std::io::{Seek, SeekFrom, Read, Write};
11
11
use std:: os:: unix:: prelude:: * ;
12
12
use rs9p:: * ;
13
13
use rs9p:: srv:: { Fid , Filesystem } ;
14
+ use self :: filetime:: FileTime ;
14
15
15
16
#[ macro_use]
16
17
mod utils;
@@ -72,26 +73,26 @@ impl Filesystem for Unpfs {
72
73
}
73
74
74
75
fn rsetattr ( & mut self , fid : & mut Fid < Self :: Fid > , valid : SetattrMask , stat : & SetAttr ) -> Result < Fcall > {
76
+ let filepath = & fid. aux ( ) . realpath ;
75
77
if valid. contains ( setattr:: MODE ) {
76
- let perm = PermissionsExt :: from_mode ( stat. mode ) ;
77
- fs:: set_permissions ( & fid. aux ( ) . realpath , perm) ?;
78
+ fs:: set_permissions ( filepath, PermissionsExt :: from_mode ( stat. mode ) ) ?;
78
79
}
79
80
if valid. intersects ( setattr:: UID | setattr:: GID ) {
80
81
let uid = if valid. contains ( setattr:: UID ) { Some ( stat. uid ) } else { None } ;
81
82
let gid = if valid. contains ( setattr:: GID ) { Some ( stat. gid ) } else { None } ;
82
- nix:: unistd:: chown ( & fid . aux ( ) . realpath , uid, gid) ?;
83
+ nix:: unistd:: chown ( filepath , uid, gid) ?;
83
84
}
84
85
if valid. contains ( setattr:: SIZE ) {
85
- let _ = fs:: File :: open ( & fid . aux ( ) . realpath ) ?. set_len ( stat. size ) ;
86
+ let _ = fs:: File :: open ( filepath ) ?. set_len ( stat. size ) ;
86
87
}
87
88
if valid. intersects ( setattr:: ATIME_SET | setattr:: MTIME_SET ) {
88
89
let atime = if valid. contains ( setattr:: ATIME_SET ) {
89
- filetime :: FileTime :: from_seconds_since_1970 ( stat. atime . sec , stat. atime . nsec as u32 )
90
- } else { filetime :: FileTime :: zero ( ) } ;
90
+ FileTime :: from_seconds_since_1970 ( stat. atime . sec , stat. atime . nsec as u32 )
91
+ } else { FileTime :: from_last_access_time ( & fs :: metadata ( filepath ) ? ) } ;
91
92
let mtime = if valid. contains ( setattr:: MTIME_SET ) {
92
- filetime :: FileTime :: from_seconds_since_1970 ( stat. mtime . sec , stat. mtime . nsec as u32 )
93
- } else { filetime :: FileTime :: zero ( ) } ;
94
- filetime:: set_file_times ( & fid . aux ( ) . realpath , atime, mtime) ?
93
+ FileTime :: from_seconds_since_1970 ( stat. mtime . sec , stat. mtime . nsec as u32 )
94
+ } else { FileTime :: from_last_modification_time ( & fs :: metadata ( filepath ) ? ) } ;
95
+ filetime:: set_file_times ( filepath , atime, mtime) ?
95
96
}
96
97
Ok ( Fcall :: Rsetattr )
97
98
}
0 commit comments