use axfs_ng_vfs::{NodeType, VfsError};
use rsext4::{Ext4Error, entries::Ext4DirEntry2};
pub fn into_vfs_err(err: Ext4Error) -> VfsError {
let linux_err = match err.code {
rsext4::error::Errno::ENOENT => ax_errno::LinuxError::ENOENT,
rsext4::error::Errno::EEXIST => ax_errno::LinuxError::EEXIST,
rsext4::error::Errno::EISDIR => ax_errno::LinuxError::EISDIR,
rsext4::error::Errno::ENOTDIR => ax_errno::LinuxError::ENOTDIR,
rsext4::error::Errno::ENOTEMPTY => ax_errno::LinuxError::ENOTEMPTY,
rsext4::error::Errno::EACCES => ax_errno::LinuxError::EACCES,
rsext4::error::Errno::EINVAL => ax_errno::LinuxError::EINVAL,
rsext4::error::Errno::ENOSPC => ax_errno::LinuxError::ENOSPC,
rsext4::error::Errno::EROFS => ax_errno::LinuxError::EROFS,
rsext4::error::Errno::EBUSY => ax_errno::LinuxError::EBUSY,
rsext4::error::Errno::EBADF => ax_errno::LinuxError::EBADF,
rsext4::error::Errno::ENAMETOOLONG => ax_errno::LinuxError::ENAMETOOLONG,
rsext4::error::Errno::ELOOP => ax_errno::LinuxError::ELOOP,
rsext4::error::Errno::ENOMEM => ax_errno::LinuxError::ENOMEM,
rsext4::error::Errno::EPERM => ax_errno::LinuxError::EPERM,
rsext4::error::Errno::EFBIG => ax_errno::LinuxError::EFBIG,
_ => ax_errno::LinuxError::EIO,
};
VfsError::from(linux_err).canonicalize()
}
pub fn dir_entry_type_to_vfs(file_type: u8) -> NodeType {
match file_type {
Ext4DirEntry2::EXT4_FT_REG_FILE => NodeType::RegularFile,
Ext4DirEntry2::EXT4_FT_DIR => NodeType::Directory,
Ext4DirEntry2::EXT4_FT_CHRDEV => NodeType::CharacterDevice,
Ext4DirEntry2::EXT4_FT_BLKDEV => NodeType::BlockDevice,
Ext4DirEntry2::EXT4_FT_FIFO => NodeType::Fifo,
Ext4DirEntry2::EXT4_FT_SOCK => NodeType::Socket,
Ext4DirEntry2::EXT4_FT_SYMLINK => NodeType::Symlink,
_ => NodeType::Unknown,
}
}
pub fn inode_to_vfs_type(i_mode: u16) -> NodeType {
use rsext4::disknode::Ext4Inode;
match i_mode & Ext4Inode::S_IFMT {
Ext4Inode::S_IFDIR => NodeType::Directory,
Ext4Inode::S_IFREG => NodeType::RegularFile,
Ext4Inode::S_IFLNK => NodeType::Symlink,
Ext4Inode::S_IFCHR => NodeType::CharacterDevice,
Ext4Inode::S_IFBLK => NodeType::BlockDevice,
Ext4Inode::S_IFIFO => NodeType::Fifo,
Ext4Inode::S_IFSOCK => NodeType::Socket,
_ => NodeType::Unknown,
}
}
pub fn vfs_type_to_dir_entry(ty: NodeType) -> Option<u8> {
Some(match ty {
NodeType::RegularFile => Ext4DirEntry2::EXT4_FT_REG_FILE,
NodeType::Directory => Ext4DirEntry2::EXT4_FT_DIR,
NodeType::CharacterDevice => Ext4DirEntry2::EXT4_FT_CHRDEV,
NodeType::BlockDevice => Ext4DirEntry2::EXT4_FT_BLKDEV,
NodeType::Fifo => Ext4DirEntry2::EXT4_FT_FIFO,
NodeType::Socket => Ext4DirEntry2::EXT4_FT_SOCK,
NodeType::Symlink => Ext4DirEntry2::EXT4_FT_SYMLINK,
NodeType::Unknown => return None,
})
}