|
7 | 7 |
|
8 | 8 | // spell-checker:ignore (vars) fperm srwx |
9 | 9 |
|
| 10 | +#[cfg(not(unix))] |
10 | 11 | use libc::umask; |
11 | 12 |
|
12 | 13 | pub fn parse_numeric(fperm: u32, mut mode: &str, considering_dir: bool) -> Result<u32, String> { |
@@ -175,24 +176,23 @@ pub fn get_umask() -> u32 { |
175 | 176 | // some other thread is affected. |
176 | 177 | // On modern Linux kernels the current umask could instead be read |
177 | 178 | // from /proc/self/status. But that's a lot of work. |
178 | | - // SAFETY: umask always succeeds and doesn't operate on memory. Races are |
179 | | - // possible but it can't violate Rust's guarantees. |
180 | | - let mask = unsafe { umask(0) }; |
181 | | - unsafe { umask(mask) }; |
182 | | - #[cfg(all( |
183 | | - not(target_os = "freebsd"), |
184 | | - not(target_vendor = "apple"), |
185 | | - not(target_os = "android"), |
186 | | - not(target_os = "redox") |
187 | | - ))] |
188 | | - return mask; |
189 | | - #[cfg(any( |
190 | | - target_os = "freebsd", |
191 | | - target_vendor = "apple", |
192 | | - target_os = "android", |
193 | | - target_os = "redox" |
194 | | - ))] |
195 | | - return mask as u32; |
| 179 | + #[cfg(unix)] |
| 180 | + { |
| 181 | + use nix::sys::stat::{Mode, umask}; |
| 182 | + |
| 183 | + let mask = umask(Mode::empty()); |
| 184 | + let _ = umask(mask); |
| 185 | + return mask.bits() as u32; |
| 186 | + } |
| 187 | + |
| 188 | + #[cfg(not(unix))] |
| 189 | + { |
| 190 | + // SAFETY: umask always succeeds and doesn't operate on memory. Races are |
| 191 | + // possible but it can't violate Rust's guarantees. |
| 192 | + let mask = unsafe { umask(0) }; |
| 193 | + unsafe { umask(mask) }; |
| 194 | + return mask as u32; |
| 195 | + } |
196 | 196 | } |
197 | 197 |
|
198 | 198 | #[cfg(test)] |
|
0 commit comments