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 #[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
39pub 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 #[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}