standard_lib/fs/
metadata.rs

1use libc::stat;
2
3use super::FileType;
4
5#[derive(#[automatically_derived]
impl ::core::fmt::Debug for Metadata {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["size", "file_type", "mode", "uid", "gid", "parent_device_id",
                        "self_device_id", "time_accessed", "time_modified",
                        "time_changed", "links", "block_size", "blocks",
                        "inode_num"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.size, &self.file_type, &self.mode, &self.uid, &self.gid,
                        &self.parent_device_id, &self.self_device_id,
                        &self.time_accessed, &self.time_modified,
                        &self.time_changed, &self.links, &self.block_size,
                        &self.blocks, &&self.inode_num];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "Metadata",
            names, values)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for Metadata {
    #[inline]
    fn clone(&self) -> Metadata {
        Metadata {
            size: ::core::clone::Clone::clone(&self.size),
            file_type: ::core::clone::Clone::clone(&self.file_type),
            mode: ::core::clone::Clone::clone(&self.mode),
            uid: ::core::clone::Clone::clone(&self.uid),
            gid: ::core::clone::Clone::clone(&self.gid),
            parent_device_id: ::core::clone::Clone::clone(&self.parent_device_id),
            self_device_id: ::core::clone::Clone::clone(&self.self_device_id),
            time_accessed: ::core::clone::Clone::clone(&self.time_accessed),
            time_modified: ::core::clone::Clone::clone(&self.time_modified),
            time_changed: ::core::clone::Clone::clone(&self.time_changed),
            links: ::core::clone::Clone::clone(&self.links),
            block_size: ::core::clone::Clone::clone(&self.block_size),
            blocks: ::core::clone::Clone::clone(&self.blocks),
            inode_num: ::core::clone::Clone::clone(&self.inode_num),
        }
    }
}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}