use crate::fs::{Metadata, MetadataExt};
use posish::fs::{statat, AtFlags};
use std::{
fs, io,
sync::atomic::{AtomicBool, Ordering::Relaxed},
};
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 posish::io::Error::from_io_error(&err) {
Some(posish::io::Error::BADF) => FSTAT_PATH_BADF.store(true, Relaxed),
_ => return Err(err),
},
}
}
Ok(statat(file, "", AtFlags::EMPTY_PATH).map(MetadataExt::from_posish)?)
}