Skip to main content

linux_api/
stat.rs

1use crate::{bindings, errno::Errno};
2
3pub use bindings::linux_stat;
4use linux_syscall::{Result as _, syscall};
5#[allow(non_camel_case_types)]
6pub type stat = linux_stat;
7unsafe impl shadow_pod::Pod for stat {}
8
9bitflags::bitflags! {
10    /// Stat flags, as used e.g. with `stat`.
11    #[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
12    pub struct SFlag: u32 {
13        const S_IFMT = bindings::LINUX_S_IFMT;
14        const S_IFSOCK = bindings::LINUX_S_IFSOCK;
15        const S_IFLNK = bindings::LINUX_S_IFLNK;
16        const S_IFREG = bindings::LINUX_S_IFREG;
17        const S_IFBLK = bindings::LINUX_S_IFBLK;
18        const S_IFDIR = bindings::LINUX_S_IFDIR;
19        const S_IFCHR = bindings::LINUX_S_IFCHR;
20        const S_IFIFO = bindings::LINUX_S_IFIFO;
21        const S_ISUID = bindings::LINUX_S_ISUID;
22        const S_ISGID = bindings::LINUX_S_ISGID;
23        const S_ISVTX = bindings::LINUX_S_ISVTX;
24        const S_IRWXU = bindings::LINUX_S_IRWXU;
25        const S_IRUSR = bindings::LINUX_S_IRUSR;
26        const S_IWUSR = bindings::LINUX_S_IWUSR;
27        const S_IXUSR = bindings::LINUX_S_IXUSR;
28        const S_IRWXG = bindings::LINUX_S_IRWXG;
29        const S_IRGRP = bindings::LINUX_S_IRGRP;
30        const S_IWGRP = bindings::LINUX_S_IWGRP;
31        const S_IXGRP = bindings::LINUX_S_IXGRP;
32        const S_IRWXO = bindings::LINUX_S_IRWXO;
33        const S_IROTH = bindings::LINUX_S_IROTH;
34        const S_IWOTH = bindings::LINUX_S_IWOTH;
35        const S_IXOTH = bindings::LINUX_S_IXOTH;
36    }
37}
38
39/// # Safety
40///
41/// `statbuf` must be safe for the kernel to write to.
42pub unsafe fn fstat_raw(fd: core::ffi::c_uint, statbuf: *mut stat) -> Result<(), Errno> {
43    unsafe { syscall!(linux_syscall::SYS_fstat, fd, statbuf) }
44        .check()
45        .map_err(Errno::from)
46}
47
48mod export {
49    use super::linux_stat;
50
51    /// # Safety
52    ///
53    /// `statbuf` must be safe for the kernel to write to.
54    #[unsafe(no_mangle)]
55    pub unsafe extern "C-unwind" fn linux_fstat(
56        fd: core::ffi::c_uint,
57        statbuf: *mut linux_stat,
58    ) -> i32 {
59        match unsafe { super::fstat_raw(fd, statbuf) } {
60            Ok(()) => 0,
61            Err(e) => e.to_negated_i32(),
62        }
63    }
64}