diff --git a/Cargo.lock b/Cargo.lock index 95053c3..1e9572a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,7 +2,7 @@ name = "redoxfs" version = "0.2.0" dependencies = [ - "fuse 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "fuse 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)", "spin 0.4.5 (git+https://github.com/messense/spin-rs?rev=020f1b3f)", @@ -11,10 +11,10 @@ dependencies = [ [[package]] name = "fuse" -version = "0.2.8" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "thread-scoped 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -30,11 +30,6 @@ dependencies = [ "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "libc" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "libc" version = "0.2.31" @@ -87,9 +82,8 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] -"checksum fuse 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "adf08478eb39cff95e34daa7a2743a256d1c18388c0328d2f717e8ef748001f6" +"checksum fuse 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5087262ce5b36fed6ccd4abf0a8224e48d055a2bb07fecb5605765de6f114a28" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -"checksum libc 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "e32a70cf75e5846d53a673923498228bbec6a8624708a9ea5645f075d6276122" "checksum libc 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)" = "d1419b2939a0bc44b77feb34661583c7546b532b192feab36249ab584b86856c" "checksum log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "880f77541efa6e5cc74e76910c9884d9859683118839d6a1dc3b11e63512565b" "checksum pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3a8b4c6b8165cd1a1cd4b9b120978131389f64bdaf456435caa41e630edba903" diff --git a/Cargo.toml b/Cargo.toml index e963163..38f55a0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,6 +24,6 @@ spin = { git = "https://github.com/messense/spin-rs", rev = "020f1b3f" } redox_syscall = "0.1" [target.'cfg(unix)'.dependencies] -fuse = "0.2" +fuse = "0.3" libc = "0.2" time = "0.1" diff --git a/src/bin/mount.rs b/src/bin/mount.rs index 564bdb7..716d591 100644 --- a/src/bin/mount.rs +++ b/src/bin/mount.rs @@ -61,9 +61,16 @@ fn main() { Ok(filesystem) => { println!("redoxfs: opened filesystem {}", path); - if let Some(mountpoint) = env::args_os().nth(2) { - mount(filesystem, &mountpoint, write); - process::exit(0); + if let Some(mountpoint) = env::args().nth(2) { + match mount(filesystem, &mountpoint, write) { + Ok(()) => { + process::exit(0); + }, + Err(err) => { + println!("redoxfs: failed to mount {} to {}: {}", path, mountpoint, err); + process::exit(1); + } + } } else { println!("redoxfs: no mount point provided"); usage(); diff --git a/src/mount/fuse.rs b/src/mount/fuse.rs index 0e2b8d2..2f0f2e1 100644 --- a/src/mount/fuse.rs +++ b/src/mount/fuse.rs @@ -1,8 +1,9 @@ extern crate fuse; extern crate time; -use std::path::Path; +use std::ffi::OsStr; use std::os::unix::ffi::OsStrExt; +use std::path::Path; use std::time::{SystemTime, UNIX_EPOCH}; use disk::Disk; @@ -54,7 +55,7 @@ fn node_attr(node: &(u64, Node)) -> FileAttr { } impl Filesystem for Fuse { - fn lookup(&mut self, _req: &Request, parent_block: u64, name: &Path, reply: ReplyEntry) { + fn lookup(&mut self, _req: &Request, parent_block: u64, name: &OsStr, reply: ReplyEntry) { match self.fs.find_node(name.to_str().unwrap(), parent_block) { Ok(node) => { reply.entry(&TTL, &node_attr(&node), 0); @@ -235,7 +236,7 @@ impl Filesystem for Fuse { } } - fn create(&mut self, _req: &Request, parent_block: u64, name: &Path, mode: u32, flags: u32, reply: ReplyCreate) { + fn create(&mut self, _req: &Request, parent_block: u64, name: &OsStr, mode: u32, flags: u32, reply: ReplyCreate) { let ctime = SystemTime::now().duration_since(UNIX_EPOCH).unwrap(); match self.fs.create_node(Node::MODE_FILE | (mode as u16 & Node::MODE_PERM), name.to_str().unwrap(), parent_block, ctime.as_secs(), ctime.subsec_nanos()) { Ok(node) => { @@ -248,7 +249,7 @@ impl Filesystem for Fuse { } } - fn mkdir(&mut self, _req: &Request, parent_block: u64, name: &Path, mode: u32, reply: ReplyEntry) { + fn mkdir(&mut self, _req: &Request, parent_block: u64, name: &OsStr, mode: u32, reply: ReplyEntry) { let ctime = SystemTime::now().duration_since(UNIX_EPOCH).unwrap(); match self.fs.create_node(Node::MODE_DIR | (mode as u16 & Node::MODE_PERM), name.to_str().unwrap(), parent_block, ctime.as_secs(), ctime.subsec_nanos()) { Ok(node) => { @@ -261,7 +262,7 @@ impl Filesystem for Fuse { } } - fn rmdir(&mut self, _req: &Request, parent_block: u64, name: &Path, reply: ReplyEmpty) { + fn rmdir(&mut self, _req: &Request, parent_block: u64, name: &OsStr, reply: ReplyEmpty) { match self.fs.remove_node(Node::MODE_DIR, name.to_str().unwrap(), parent_block) { Ok(()) => { reply.ok(); @@ -272,7 +273,7 @@ impl Filesystem for Fuse { } } - fn unlink(&mut self, _req: &Request, parent_block: u64, name: &Path, reply: ReplyEmpty) { + fn unlink(&mut self, _req: &Request, parent_block: u64, name: &OsStr, reply: ReplyEmpty) { match self.fs.remove_node(Node::MODE_FILE, name.to_str().unwrap(), parent_block) { Ok(()) => { reply.ok(); @@ -298,7 +299,7 @@ impl Filesystem for Fuse { } } - fn symlink(&mut self, _req: &Request, parent_block: u64, name: &Path, link: &Path, reply: ReplyEntry) { + fn symlink(&mut self, _req: &Request, parent_block: u64, name: &OsStr, link: &Path, reply: ReplyEntry) { let ctime = SystemTime::now().duration_since(UNIX_EPOCH).unwrap(); match self.fs.create_node(Node::MODE_SYMLINK | 0o777, name.to_str().unwrap(), parent_block, ctime.as_secs(), ctime.subsec_nanos()) { Ok(node) => { diff --git a/src/mount/mod.rs b/src/mount/mod.rs index d8dfb1f..1324ba4 100644 --- a/src/mount/mod.rs +++ b/src/mount/mod.rs @@ -1,3 +1,4 @@ +use std::io; use std::fs::File; use std::path::Path; @@ -11,7 +12,7 @@ mod fuse; mod redox; #[cfg(all(unix, target_os = "macos"))] -pub fn mount>(filesystem: FileSystem, mountpoint: &P, mut write: File) { +pub fn mount>(filesystem: FileSystem, mountpoint: &P, mut write: File) -> io::Result<()> { use std::ffi::OsStr; use std::io::Write; @@ -27,11 +28,11 @@ pub fn mount>(filesystem: FileSystem, mountpoint: &P, // be `root`, thus that we need to allow `root` to have access. OsStr::new("-o"), OsStr::new("defer_permissions"), - ]); + ]) } #[cfg(all(unix, not(target_os = "macos")))] -pub fn mount>(filesystem: FileSystem, mountpoint: &P, mut write: File) { +pub fn mount>(filesystem: FileSystem, mountpoint: &P, mut write: File) -> io::Result<()> { use std::io::Write; let _ = write.write(&[0]); @@ -39,10 +40,10 @@ pub fn mount>(filesystem: FileSystem, mountpoint: &P, fuse::mount(fuse::Fuse { fs: filesystem - }, mountpoint, &[]); + }, mountpoint, &[]) } #[cfg(target_os = "redox")] -pub fn mount>(filesystem: FileSystem, mountpoint: &P, write: File) { - redox::mount(filesystem, mountpoint, write); +pub fn mount>(filesystem: FileSystem, mountpoint: &P, write: File) -> io::Result<()> { + redox::mount(filesystem, mountpoint, write) } diff --git a/src/mount/redox/mod.rs b/src/mount/redox/mod.rs index 9cd42b4..985f792 100644 --- a/src/mount/redox/mod.rs +++ b/src/mount/redox/mod.rs @@ -2,7 +2,7 @@ extern crate spin; use syscall::{Packet, Scheme}; use std::fs::File; -use std::io::{Read, Write}; +use std::io::{self, Read, Write}; use std::path::Path; use self::scheme::FileScheme; @@ -10,23 +10,22 @@ use self::scheme::FileScheme; pub mod resource; pub mod scheme; -pub fn mount>(filesystem: filesystem::FileSystem, mountpoint: &P, mut write: File) { +pub fn mount>(filesystem: filesystem::FileSystem, mountpoint: &P, mut write: File) -> io::Result<()> { let mountpoint = mountpoint.as_ref(); - match File::create(format!(":{}", mountpoint.display())) { - Ok(mut socket) => { - println!("redoxfs: mounted filesystem on {}:", mountpoint.display()); - - let _ = write.write(&[0]); - drop(write); - - let scheme = FileScheme::new(format!("{}", mountpoint.display()), filesystem); - loop { - let mut packet = Packet::default(); - socket.read(&mut packet).unwrap(); - scheme.handle(&mut packet); - socket.write(&packet).unwrap(); - } - }, - Err(err) => println!("redoxfs: failed to create {} scheme: {}", mountpoint.display(), err) + let mut socket = File::create(format!(":{}", mountpoint.display()))?; + + println!("redoxfs: mounted filesystem on {}:", mountpoint.display()); + + let _ = write.write(&[0]); + drop(write); + + let scheme = FileScheme::new(format!("{}", mountpoint.display()), filesystem); + loop { + let mut packet = Packet::default(); + socket.read(&mut packet).unwrap(); + scheme.handle(&mut packet); + socket.write(&packet).unwrap(); } + + Ok(()) }