standard_lib/fs/
metadata.rs

1use libc::stat;
2
3use super::FileType;
4
5#[derive(Debug, Clone)]
6pub struct Metadata {
7    pub size: i64,             // st_size
8    pub file_type: FileType,   // st_mode
9    pub mode: u16,             // st_mode
10    pub uid: u32,              // st_uid
11    pub gid: u32,              // st_gid
12    pub parent_device_id: u64, // st_dev
13    pub self_device_id: u64,   // st_rdev
14    // x86_64:
15    pub time_accessed: (i64, i64), // st_atime, st_atime_nsec
16    pub time_modified: (i64, i64), // st_mtime, st_mtime_nsec
17    pub time_changed: (i64, i64),  // st_ctime, st_ctime_nsec
18    pub links: u64,                // st_nlink
19    pub block_size: i64,           // st_blksize
20    // 64-bit:
21    pub blocks: i64,    // st_blocks
22    // TODO: Make NonZero
23    pub inode_num: u64, // st_ino
24}
25
26impl Metadata {
27    #[allow(clippy::unnecessary_cast)]
28    pub(crate) const fn from_stat(raw: stat) -> Metadata {
29        Metadata {
30            size: raw.st_size,
31            file_type: FileType::from_stat_mode(raw.st_mode),
32            mode: raw.st_mode as u16,
33            uid: raw.st_uid,
34            gid: raw.st_gid,
35            parent_device_id: raw.st_dev,
36            self_device_id: raw.st_rdev,
37            time_accessed: (raw.st_atime as i64, raw.st_atime_nsec),
38            time_modified: (raw.st_mtime as i64, raw.st_mtime_nsec),
39            time_changed: (raw.st_ctime as i64, raw.st_ctime_nsec),
40            links: raw.st_nlink as u64,
41            block_size: raw.st_blksize as i64,
42            blocks: raw.st_blocks as i64,
43            inode_num: raw.st_ino as u64,
44        }
45    }
46}