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