os/vfs/
adapter.rs

1//! linux系统调用的适配器
2//!
3//! 用于处理数据结构之间的转换
4
5use super::{InodeMetadata, InodeType};
6use crate::uapi::fs::{LinuxDirent64, Stat};
7
8/// Stat 结构适配方法
9impl Stat {
10    /// 从InodeMetadata创建Stat结构
11    pub fn from_metadata(meta: &InodeMetadata) -> Self {
12        Self {
13            st_dev: 0, // TODO: 需要从文件系统获取设备号
14            st_ino: meta.inode_no as u64,
15            st_mode: meta.mode.bits(),
16            st_nlink: meta.nlinks as u32,
17            st_uid: meta.uid,
18            st_gid: meta.gid,
19            st_rdev: meta.rdev,
20            __pad1: 0,
21            st_size: meta.size as i64,
22            st_blksize: 512,
23            __pad2: 0,
24            st_blocks: meta.blocks as i64,
25            st_atime_sec: meta.atime.tv_sec,
26            st_atime_nsec: meta.atime.tv_nsec,
27            st_mtime_sec: meta.mtime.tv_sec,
28            st_mtime_nsec: meta.mtime.tv_nsec,
29            st_ctime_sec: meta.ctime.tv_sec,
30            st_ctime_nsec: meta.ctime.tv_nsec,
31            __unused: [0; 2],
32        }
33    }
34}
35
36/// 将InodeType转换为d_type值
37pub fn inode_type_to_d_type(t: InodeType) -> u8 {
38    match t {
39        InodeType::File => 8,        // DT_REG
40        InodeType::Directory => 4,   // DT_DIR
41        InodeType::Symlink => 10,    // DT_LNK
42        InodeType::CharDevice => 2,  // DT_CHR
43        InodeType::BlockDevice => 6, // DT_BLK
44        InodeType::Fifo => 1,        // DT_FIFO
45        InodeType::Socket => 12,     // DT_SOCK
46    }
47}