1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
use crate::fs::{Metadata, MetadataExt};
use rustix::fs::{statat, AtFlags};
use std::sync::atomic::AtomicBool;
use std::sync::atomic::Ordering::Relaxed;
use std::{fs, io};
pub(super) fn file_metadata(file: &fs::File) -> io::Result<Metadata> {
static FSTAT_PATH_BADF: AtomicBool = AtomicBool::new(false);
if !FSTAT_PATH_BADF.load(Relaxed) {
match Metadata::from_file(file) {
Ok(metadata) => return Ok(metadata),
Err(err) => match rustix::io::Errno::from_io_error(&err) {
Some(rustix::io::Errno::BADF) => FSTAT_PATH_BADF.store(true, Relaxed),
_ => return Err(err),
},
}
}
Ok(statat(file, "", AtFlags::EMPTY_PATH).map(MetadataExt::from_rustix)?)
}