diff --git a/rcore-fs-fuse/src/main.rs b/rcore-fs-fuse/src/main.rs index 94230e8..5f373a0 100644 --- a/rcore-fs-fuse/src/main.rs +++ b/rcore-fs-fuse/src/main.rs @@ -9,7 +9,7 @@ use fuse::{FileAttr, Filesystem, FileType, ReplyAttr, ReplyData, ReplyDirectory, use structopt::StructOpt; use time::Timespec; -use rcore_fs::{sfs, vfs}; +use rcore_fs::{sfs, sefs, vfs}; const TTL: Timespec = Timespec { sec: 1, nsec: 0 }; // 1 second @@ -227,10 +227,18 @@ struct Opt { fn main() { env_logger::init().unwrap(); let opt = Opt::from_args(); - let img = OpenOptions::new().read(true).write(true).open(&opt.image) - .expect("failed to open image"); - let sfs = sfs::SimpleFileSystem::open(Box::new(img)) - .expect("failed to open sfs"); +// let img = OpenOptions::new().read(true).write(true).open(&opt.image) +// .expect("failed to open image"); + let sfs = if opt.image.is_dir() { + let img = sefs::std_impl::StdStorage::new(&opt.image); + sefs::SEFS::open(Box::new(img)) + .expect("failed to open sefs") + } else { + std::fs::create_dir_all(&opt.image).unwrap(); + let img = sefs::std_impl::StdStorage::new(&opt.image); + sefs::SEFS::create(Box::new(img)) + .expect("failed to create sefs") + }; fuse::mount(VfsWrapper::new(sfs), &opt.mount_point, &[]) .expect("failed to mount fs"); } diff --git a/rcore-fs/src/sefs/mod.rs b/rcore-fs/src/sefs/mod.rs index f2bb7c4..ef1c09e 100644 --- a/rcore-fs/src/sefs/mod.rs +++ b/rcore-fs/src/sefs/mod.rs @@ -13,7 +13,7 @@ use crate::vfs::{self, FileSystem, FsError, INode, Timespec}; use self::structs::*; mod structs; -mod std_impl; +pub mod std_impl; /// A file stores a normal file or directory. /// @@ -174,21 +174,21 @@ impl vfs::INode for INodeImpl { fn info(&self) -> vfs::Result { let disk_inode = self.disk_inode.read(); Ok(vfs::FileInfo { - inode: 0, + inode: self.id, size: match disk_inode.type_ { FileType::File => disk_inode.size as usize, FileType::Dir => disk_inode.blocks as usize, _ => panic!("Unknown file type"), }, - mode: 0, + mode: 0o777, type_: vfs::FileType::from(disk_inode.type_.clone()), blocks: disk_inode.blocks as usize, - atime: Timespec { sec: 0, nsec: 0 }, - mtime: Timespec { sec: 0, nsec: 0 }, - ctime: Timespec { sec: 0, nsec: 0 }, + atime: Timespec { sec: disk_inode.atime as i64, nsec: 0 }, + mtime: Timespec { sec: disk_inode.mtime as i64, nsec: 0 }, + ctime: Timespec { sec: disk_inode.ctime as i64, nsec: 0 }, nlinks: disk_inode.nlinks as usize, - uid: 0, - gid: 0 + uid: disk_inode.uid as usize, + gid: disk_inode.gid as usize, }) } fn sync(&self) -> vfs::Result<()> {