]> git.proxmox.com Git - rustc.git/blob - src/vendor/filetime/src/unix.rs
New upstream version 1.22.1+dfsg1
[rustc.git] / src / vendor / filetime / src / unix.rs
1 extern crate libc;
2
3 use std::ffi::CString;
4 use std::fs;
5 use std::io;
6 use std::os::unix::prelude::*;
7 use std::path::Path;
8
9 use self::libc::{c_int, c_char, timeval, time_t, suseconds_t};
10
11 use FileTime;
12
13 pub fn set_file_times(p: &Path, atime: FileTime, mtime: FileTime) -> io::Result<()> {
14 set_file_times_u(p, atime, mtime, libc::utimes)
15 }
16
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"))
20 }
21
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)
25 }
26
27 fn set_file_times_u(p: &Path,
28 atime: FileTime,
29 mtime: FileTime,
30 utimes: unsafe extern fn(*const c_char, *const timeval) -> c_int)
31 -> io::Result<()>
32 {
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 } {
36 Ok(())
37 } else {
38 Err(io::Error::last_os_error())
39 };
40
41 fn to_timeval(ft: &FileTime) -> timeval {
42 timeval {
43 tv_sec: ft.seconds() as time_t,
44 tv_usec: (ft.nanoseconds() / 1000) as suseconds_t,
45 }
46 }
47 }
48
49 pub fn from_last_modification_time(meta: &fs::Metadata) -> FileTime {
50 FileTime {
51 seconds: meta.mtime() as u64,
52 nanos: meta.mtime_nsec() as u32,
53 }
54 }
55
56 pub fn from_last_access_time(meta: &fs::Metadata) -> FileTime {
57 FileTime {
58 seconds: meta.atime() as u64,
59 nanos: meta.atime_nsec() as u32,
60 }
61 }
62
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> {
68 $(
69 #[cfg(target_os = $e)]
70 use std::os::$i::fs::MetadataExt;
71 )*
72 Some(FileTime {
73 seconds: meta.st_birthtime() as u64,
74 nanos: meta.st_birthtime_nsec() as u32,
75 })
76 }
77
78 #[cfg(all($(not(target_os = $e)),*))]
79 fn imp(_meta: &fs::Metadata) -> Option<FileTime> {
80 None
81 }
82 }
83 }
84
85 birthtim! {
86 ("bitrig", bitrig),
87 ("freebsd", freebsd),
88 ("ios", ios),
89 ("macos", macos),
90 ("openbsd", openbsd)
91 }
92
93 imp(meta)
94 }