6 use std
::os
::unix
::prelude
::*;
9 use self::libc
::{c_int, c_char, timeval, time_t, suseconds_t}
;
13 pub fn set_file_times(p
: &Path
, atime
: FileTime
, mtime
: FileTime
) -> io
::Result
<()> {
14 set_file_times_u(p
, atime
, mtime
, libc
::utimes
)
17 #[cfg(target_os = "android")]
18 pub fn set_symlink_file_times(_p
: &Path
, _atime
: FileTime
, _mtime
: FileTime
) -> io
::Result
<()> {
19 Err(io
::Error
::new(io
::ErrorKind
::Other
, "not supported on Android"))
22 #[cfg(not(target_os = "android"))]
23 pub fn set_symlink_file_times(p
: &Path
, atime
: FileTime
, mtime
: FileTime
) -> io
::Result
<()> {
24 set_file_times_u(p
, atime
, mtime
, libc
::lutimes
)
27 fn set_file_times_u(p
: &Path
,
30 utimes
: unsafe extern fn(*const c_char
, *const timeval
) -> c_int
)
33 let times
= [to_timeval(&atime
), to_timeval(&mtime
)];
34 let p
= try
!(CString
::new(p
.as_os_str().as_bytes()));
35 return if unsafe { utimes(p.as_ptr() as *const _, times.as_ptr()) == 0 }
{
38 Err(io
::Error
::last_os_error())
41 fn to_timeval(ft
: &FileTime
) -> timeval
{
43 tv_sec
: ft
.seconds() as time_t
,
44 tv_usec
: (ft
.nanoseconds() / 1000) as suseconds_t
,
49 pub fn from_last_modification_time(meta
: &fs
::Metadata
) -> FileTime
{
51 seconds
: meta
.mtime() as u64,
52 nanos
: meta
.mtime_nsec() as u32,
56 pub fn from_last_access_time(meta
: &fs
::Metadata
) -> FileTime
{
58 seconds
: meta
.atime() as u64,
59 nanos
: meta
.atime_nsec() as u32,
63 pub fn from_creation_time(meta
: &fs
::Metadata
) -> Option
<FileTime
> {
64 macro_rules
! birthtim
{
65 ($
(($e
:expr
, $i
:ident
)),*) => {
66 #[cfg(any($(target_os = $e),*))]
67 fn imp(meta
: &fs
::Metadata
) -> Option
<FileTime
> {
69 #[cfg(target_os = $e)]
70 use std
::os
::$i
::fs
::MetadataExt
;
73 seconds
: meta
.st_birthtime() as u64,
74 nanos
: meta
.st_birthtime_nsec() as u32,
78 #[cfg(all($(not(target_os = $e)),*))]
79 fn imp(_meta
: &fs
::Metadata
) -> Option
<FileTime
> {