filetime/unix/
mod.rs
1use crate::FileTime;
2use libc::{time_t, timespec};
3use std::fs;
4use std::os::unix::prelude::*;
5
6cfg_if::cfg_if! {
7 if #[cfg(target_os = "linux")] {
8 mod utimes;
9 mod linux;
10 pub use self::linux::*;
11 } else if #[cfg(target_os = "android")] {
12 mod android;
13 pub use self::android::*;
14 } else if #[cfg(target_os = "macos")] {
15 mod utimes;
16 mod macos;
17 pub use self::macos::*;
18 } else if #[cfg(any(target_os = "aix",
19 target_os = "solaris",
20 target_os = "illumos",
21 target_os = "emscripten",
22 target_os = "freebsd",
23 target_os = "netbsd",
24 target_os = "openbsd",
25 target_os = "haiku"))] {
26 mod utimensat;
27 pub use self::utimensat::*;
28 } else {
29 mod utimes;
30 pub use self::utimes::*;
31 }
32}
33
34#[allow(dead_code)]
35fn to_timespec(ft: &Option<FileTime>) -> timespec {
36 cfg_if::cfg_if! {
37 if #[cfg(any(target_os = "macos",
38 target_os = "illumos",
39 target_os = "freebsd"))] {
40 const UTIME_OMIT: i64 = -2;
44 } else if #[cfg(target_os = "openbsd")] {
45 const UTIME_OMIT: i64 = -1;
47 } else if #[cfg(target_os = "haiku")] {
48 const UTIME_OMIT: i64 = 1000000001;
50 } else if #[cfg(target_os = "aix")] {
51 const UTIME_OMIT: i64 = -3;
54 } else {
55 const UTIME_OMIT: i64 = 1_073_741_822;
58 }
59 }
60
61 let mut ts: timespec = unsafe { std::mem::zeroed() };
62 if let &Some(ft) = ft {
63 ts.tv_sec = ft.seconds() as time_t;
64 ts.tv_nsec = ft.nanoseconds() as _;
65 } else {
66 ts.tv_sec = 0;
67 ts.tv_nsec = UTIME_OMIT as _;
68 }
69
70 ts
71}
72
73pub fn from_last_modification_time(meta: &fs::Metadata) -> FileTime {
74 FileTime {
75 seconds: meta.mtime(),
76 nanos: meta.mtime_nsec() as u32,
77 }
78}
79
80pub fn from_last_access_time(meta: &fs::Metadata) -> FileTime {
81 FileTime {
82 seconds: meta.atime(),
83 nanos: meta.atime_nsec() as u32,
84 }
85}
86
87pub fn from_creation_time(meta: &fs::Metadata) -> Option<FileTime> {
88 #[cfg(target_os = "bitrig")]
89 {
90 use std::os::bitrig::fs::MetadataExt;
91 Some(FileTime {
92 seconds: meta.st_birthtime(),
93 nanos: meta.st_birthtime_nsec() as u32,
94 })
95 }
96
97 #[cfg(not(target_os = "bitrig"))]
98 {
99 meta.created().map(|i| i.into()).ok()
100 }
101}