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(e) => match e.raw_os_error() {
Some(libc::EBADF) => FSTAT_PATH_BADF.store(true, Relaxed),
_ => return Err(e),
},
}
}
statat(file, "", AtFlags::EMPTY_PATH).map(MetadataExt::from_libc)
}