]> git.proxmox.com Git - rustc.git/blob - vendor/filetime/src/unix/mod.rs
New upstream version 1.44.1+dfsg1
[rustc.git] / vendor / filetime / src / unix / mod.rs
1 use crate::FileTime;
2 use libc::{time_t, timespec};
3 use std::fs;
4 use std::os::unix::prelude::*;
5
6 cfg_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 = "macos")] {
12 mod utimes;
13 mod macos;
14 pub use self::macos::*;
15 } else if #[cfg(any(target_os = "android",
16 target_os = "solaris",
17 target_os = "illumos",
18 target_os = "emscripten",
19 target_os = "freebsd",
20 target_os = "netbsd",
21 target_os = "openbsd",
22 target_os = "haiku"))] {
23 mod utimensat;
24 pub use self::utimensat::*;
25 } else {
26 mod utimes;
27 pub use self::utimes::*;
28 }
29 }
30
31 #[allow(dead_code)]
32 fn to_timespec(ft: &Option<FileTime>) -> timespec {
33 cfg_if::cfg_if! {
34 if #[cfg(target_os = "macos")] {
35 // https://github.com/apple/darwin-xnu/blob/a449c6a3b8014d9406c2ddbdc81795da24aa7443/bsd/sys/stat.h#L541
36 const UTIME_OMIT: i64 = -2;
37 } else {
38 const UTIME_OMIT: i64 = 1_073_741_822;
39 }
40 }
41
42 if let &Some(ft) = ft {
43 timespec {
44 tv_sec: ft.seconds() as time_t,
45 tv_nsec: ft.nanoseconds() as _,
46 }
47 } else {
48 timespec {
49 tv_sec: 0,
50 tv_nsec: UTIME_OMIT as _,
51 }
52 }
53 }
54
55 pub fn from_last_modification_time(meta: &fs::Metadata) -> FileTime {
56 FileTime {
57 seconds: meta.mtime(),
58 nanos: meta.mtime_nsec() as u32,
59 }
60 }
61
62 pub fn from_last_access_time(meta: &fs::Metadata) -> FileTime {
63 FileTime {
64 seconds: meta.atime(),
65 nanos: meta.atime_nsec() as u32,
66 }
67 }
68
69 pub fn from_creation_time(meta: &fs::Metadata) -> Option<FileTime> {
70 macro_rules! birthtim {
71 ($(($e:expr, $i:ident)),*) => {
72 #[cfg(any($(target_os = $e),*))]
73 fn imp(meta: &fs::Metadata) -> Option<FileTime> {
74 $(
75 #[cfg(target_os = $e)]
76 use std::os::$i::fs::MetadataExt;
77 )*
78 Some(FileTime {
79 seconds: meta.st_birthtime(),
80 nanos: meta.st_birthtime_nsec() as u32,
81 })
82 }
83
84 #[cfg(all($(not(target_os = $e)),*))]
85 fn imp(_meta: &fs::Metadata) -> Option<FileTime> {
86 None
87 }
88 }
89 }
90
91 birthtim! {
92 ("bitrig", bitrig),
93 ("freebsd", freebsd),
94 ("ios", ios),
95 ("macos", macos),
96 ("openbsd", openbsd)
97 }
98
99 imp(meta)
100 }