xref: /drstd/src/std/os/macos/fs.rs (revision 0fe3ff0054d3aec7fbf9bddecfecb10bc7d23a51)
1 use crate::std::fs::{self, Metadata};
2 use crate::std::sealed::Sealed;
3 use crate::std::sys_common::{AsInner, AsInnerMut, IntoInner};
4 use crate::std::time::SystemTime;
5 use dlibc;
6 
7 #[allow(deprecated)]
8 use crate::std::os::macos::raw;
9 
10 /// OS-specific extensions to [`fs::Metadata`].
11 ///
12 /// [`fs::Metadata`]: crate::std::fs::Metadata
13 pub trait MetadataExt {
14     /// Gain a reference to the underlying `stat` structure which contains
15     /// the raw information returned by the OS.
16     ///
17     /// The contents of the returned `stat` are **not** consistent across
18     /// Unix platforms. The `os::unix::fs::MetadataExt` trait contains the
19     /// cross-Unix abstractions contained within the raw stat.
20     #[deprecated(
21         since = "1.8.0",
22         note = "deprecated in favor of the accessor \
23                 methods of this trait"
24     )]
25     #[allow(deprecated)]
26     fn as_raw_stat(&self) -> &raw::stat;
27 
28     fn st_dev(&self) -> u64;
29     fn st_ino(&self) -> u64;
30     fn st_mode(&self) -> u32;
31     fn st_nlink(&self) -> u64;
32     fn st_uid(&self) -> u32;
33     fn st_gid(&self) -> u32;
34     fn st_rdev(&self) -> u64;
35     fn st_size(&self) -> u64;
36     fn st_atime(&self) -> i64;
37     fn st_atime_nsec(&self) -> i64;
38     fn st_mtime(&self) -> i64;
39     fn st_mtime_nsec(&self) -> i64;
40     fn st_ctime(&self) -> i64;
41     fn st_ctime_nsec(&self) -> i64;
42     fn st_birthtime(&self) -> i64;
43     fn st_birthtime_nsec(&self) -> i64;
44     fn st_blksize(&self) -> u64;
45     fn st_blocks(&self) -> u64;
46     fn st_flags(&self) -> u32;
47     fn st_gen(&self) -> u32;
48     fn st_lspare(&self) -> u32;
49     fn st_qspare(&self) -> [u64; 2];
50 }
51 
52 impl MetadataExt for Metadata {
53     #[allow(deprecated)]
54     fn as_raw_stat(&self) -> &raw::stat {
55         unsafe { &*(self.as_inner().as_inner() as *const dlibc::stat as *const raw::stat) }
56     }
57     fn st_dev(&self) -> u64 {
58         self.as_inner().as_inner().st_dev as u64
59     }
60     fn st_ino(&self) -> u64 {
61         self.as_inner().as_inner().st_ino as u64
62     }
63     fn st_mode(&self) -> u32 {
64         self.as_inner().as_inner().st_mode as u32
65     }
66     fn st_nlink(&self) -> u64 {
67         self.as_inner().as_inner().st_nlink as u64
68     }
69     fn st_uid(&self) -> u32 {
70         self.as_inner().as_inner().st_uid as u32
71     }
72     fn st_gid(&self) -> u32 {
73         self.as_inner().as_inner().st_gid as u32
74     }
75     fn st_rdev(&self) -> u64 {
76         self.as_inner().as_inner().st_rdev as u64
77     }
78     fn st_size(&self) -> u64 {
79         self.as_inner().as_inner().st_size as u64
80     }
81     fn st_atime(&self) -> i64 {
82         self.as_inner().as_inner().st_atime as i64
83     }
84     fn st_atime_nsec(&self) -> i64 {
85         self.as_inner().as_inner().st_atime_nsec as i64
86     }
87     fn st_mtime(&self) -> i64 {
88         self.as_inner().as_inner().st_mtime as i64
89     }
90     fn st_mtime_nsec(&self) -> i64 {
91         self.as_inner().as_inner().st_mtime_nsec as i64
92     }
93     fn st_ctime(&self) -> i64 {
94         self.as_inner().as_inner().st_ctime as i64
95     }
96     fn st_ctime_nsec(&self) -> i64 {
97         self.as_inner().as_inner().st_ctime_nsec as i64
98     }
99     fn st_birthtime(&self) -> i64 {
100         self.as_inner().as_inner().st_birthtime as i64
101     }
102     fn st_birthtime_nsec(&self) -> i64 {
103         self.as_inner().as_inner().st_birthtime_nsec as i64
104     }
105     fn st_blksize(&self) -> u64 {
106         self.as_inner().as_inner().st_blksize as u64
107     }
108     fn st_blocks(&self) -> u64 {
109         self.as_inner().as_inner().st_blocks as u64
110     }
111     fn st_gen(&self) -> u32 {
112         self.as_inner().as_inner().st_gen as u32
113     }
114     fn st_flags(&self) -> u32 {
115         self.as_inner().as_inner().st_flags as u32
116     }
117     fn st_lspare(&self) -> u32 {
118         self.as_inner().as_inner().st_lspare as u32
119     }
120     fn st_qspare(&self) -> [u64; 2] {
121         let qspare = self.as_inner().as_inner().st_qspare;
122         [qspare[0] as u64, qspare[1] as u64]
123     }
124 }
125 
126 /// OS-specific extensions to [`fs::FileTimes`].
127 pub trait FileTimesExt: Sealed {
128     /// Set the creation time of a file.
129     fn set_created(self, t: SystemTime) -> Self;
130 }
131 
132 impl FileTimesExt for fs::FileTimes {
133     fn set_created(mut self, t: SystemTime) -> Self {
134         self.as_inner_mut().set_created(t.into_inner());
135         self
136     }
137 }
138