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

Version Path
wasmtime-18.0.3 ./ext/cargo-vendor/cap-primitives-2.0.1/src/rustix/linux/fs/file_metadata.rs
wasmtime-17.0.1 ./ext/cargo-vendor/cap-primitives-2.0.1/src/rustix/linux/fs/file_metadata.rs
wasmtime-17.0.0 ./ext/cargo-vendor/cap-primitives-2.0.1/src/rustix/linux/fs/file_metadata.rs
wasmtime-16.0.0 ./ext/cargo-vendor/cap-primitives-2.0.1/src/rustix/linux/fs/file_metadata.rs
wasmtime-15.0.1 ./ext/cargo-vendor/cap-primitives-2.0.1/src/rustix/linux/fs/file_metadata.rs
wasmtime-15.0.0 ./ext/cargo-vendor/cap-primitives-2.0.1/src/rustix/linux/fs/file_metadata.rs
wasmtime-14.0.4 ./ext/cargo-vendor/cap-primitives-2.0.0/src/rustix/linux/fs/file_metadata.rs
wasmtime-14.0.3 ./ext/cargo-vendor/cap-primitives-2.0.0/src/rustix/linux/fs/file_metadata.rs
wasmtime-14.0.1 ./ext/cargo-vendor/cap-primitives-2.0.0/src/rustix/linux/fs/file_metadata.rs
wasmtime-14.0.0 ./ext/cargo-vendor/cap-primitives-2.0.0/src/rustix/linux/fs/file_metadata.rs
wasmtime-13.0.0 ./ext/cargo-vendor/cap-primitives-2.0.0/src/rustix/linux/fs/file_metadata.rs
wasmtime-12.0.1 ./ext/cargo-vendor/cap-primitives-2.0.0/src/rustix/linux/fs/file_metadata.rs
wasmtime-12.0.0 ./ext/cargo-vendor/cap-primitives-2.0.0/src/rustix/linux/fs/file_metadata.rs
wasmtime-11.0.0 ./ext/cargo-vendor/cap-primitives-1.0.15/src/rustix/linux/fs/file_metadata.rs
wasmtime-10.0.1 ./ext/cargo-vendor/cap-primitives-1.0.15/src/rustix/linux/fs/file_metadata.rs
wasmtime-10.0.0 ./ext/cargo-vendor/cap-primitives-1.0.15/src/rustix/linux/fs/file_metadata.rs
wasmtime-9.0.4 ./ext/cargo-vendor/cap-primitives-1.0.15/src/rustix/linux/fs/file_metadata.rs
wasmtime-9.0.1 ./ext/cargo-vendor/cap-primitives-1.0.15/src/rustix/linux/fs/file_metadata.rs
wasmtime-8.0.0 ./ext/cargo-vendor/cap-primitives-1.0.14/src/rustix/linux/fs/file_metadata.rs
wasmtime-7.0.0 ./ext/cargo-vendor/cap-primitives-1.0.9/src/rustix/linux/fs/file_metadata.rs