Sha256: 0de066fd5b7fe19820e050920ea5f8aeb90bf6bf23c35cfc719ecad65ab78f62
Contents?: true
Size: 1.14 KB
Versions: 25
Compression:
Stored size: 1.14 KB
Contents
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}; /// Like `file.metadata()`, but works with `O_PATH` descriptors on old (pre /// 3.6) versions of Linux too. pub(super) fn file_metadata(file: &fs::File) -> io::Result<Metadata> { // Record whether we've seen an `EBADF` from an `fstat` on an `O_PATH` // file descriptor, meaning we're on a Linux that doesn't support it. 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) { // Before Linux 3.6, `fstat` with `O_PATH` returned `EBADF`. Some(rustix::io::Errno::BADF) => FSTAT_PATH_BADF.store(true, Relaxed), _ => return Err(err), }, } } // If `fstat` with `O_PATH` isn't supported, use `statat` with `AT_EMPTY_PATH`. Ok(statat(file, "", AtFlags::EMPTY_PATH).map(MetadataExt::from_rustix)?) }
Version data entries
25 entries across 25 versions & 1 rubygems