1use crate::{FileKind, Inode};
4use btrfs_disk::items::{InodeItem, Timespec};
5use std::time::{Duration, SystemTime, UNIX_EPOCH};
6
7#[must_use]
9pub fn to_system_time(ts: &Timespec) -> SystemTime {
10 UNIX_EPOCH + Duration::new(ts.sec, ts.nsec)
11}
12
13#[derive(Debug, Clone, Copy)]
20pub struct Stat {
21 pub ino: Inode,
22 pub kind: FileKind,
23 pub size: u64,
24 pub blocks: u64,
25 pub atime: SystemTime,
26 pub mtime: SystemTime,
27 pub ctime: SystemTime,
28 pub btime: SystemTime,
31 pub perm: u16,
33 pub nlink: u32,
34 pub uid: u32,
35 pub gid: u32,
36 pub rdev: u32,
37 pub blksize: u32,
38}
39
40impl Stat {
41 #[must_use]
43 pub fn from_inode(ino: Inode, item: &InodeItem, blksize: u32) -> Self {
44 #[allow(clippy::cast_possible_truncation)]
45 let perm = (item.mode & 0o7777) as u16;
46 #[allow(clippy::cast_possible_truncation)]
47 let rdev = item.rdev as u32;
49 Self {
50 ino,
51 kind: FileKind::from_mode(item.mode),
52 size: item.size,
53 blocks: item.nbytes / 512,
54 atime: to_system_time(&item.atime),
55 mtime: to_system_time(&item.mtime),
56 ctime: to_system_time(&item.ctime),
57 btime: to_system_time(&item.otime),
58 perm,
59 nlink: item.nlink,
60 uid: item.uid,
61 gid: item.gid,
62 rdev,
63 blksize,
64 }
65 }
66}