From 92121f5db1ccec523c1b7eb0a817f757b5ef899a Mon Sep 17 00:00:00 2001 From: Alejandro Soto Date: Wed, 5 Jan 2022 07:08:53 -0600 Subject: Implement Rmdir --- examples/passthrough.rs | 10 ++++++++++ src/ops/entry.rs | 15 +++++++++++++++ src/ops/mod.rs | 2 +- src/session.rs | 3 +++ 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/examples/passthrough.rs b/examples/passthrough.rs index e8c51ca..7b8236b 100644 --- a/examples/passthrough.rs +++ b/examples/passthrough.rs @@ -145,6 +145,15 @@ impl Passthrough { reply.known(New(&mut self.known, Inode::new(path, metadata)), Ttl::MAX) } + async fn rmdir<'o>(&mut self, (request, reply): Op<'o, ops::Rmdir>) -> Done<'o> { + let (reply, inode) = reply.and_then(self.known(request.ino()))?; + + //FIXME: this is not right + let (reply, ()) = reply.and_then(fs::remove_dir(inode.path.join(request.name())).await)?; + + reply.ok() + } + async fn open<'o>(&mut self, (request, reply): Op<'o, ops::Open>) -> Done<'o> { let (reply, inode) = reply.and_then(self.known(request.ino()))?; let options = { @@ -350,6 +359,7 @@ async fn main_loop(session: Start, mut fs: Passthrough) -> FuseResult<()> { Getattr(getattr) => fs.getattr(getattr.op()?), Readlink(readlink) => fs.readlink(readlink.op()?).await, Mkdir(mkdir) => fs.mkdir(mkdir.op()?).await, + Rmdir(rmdir) => fs.rmdir(rmdir.op()?).await, Open(open) => fs.open(open.op()?).await, Read(read) => fs.read(read.op()?).await, Write(write) => fs.write(write.op()?).await, diff --git a/src/ops/entry.rs b/src/ops/entry.rs index a65be29..6f03d9d 100644 --- a/src/ops/entry.rs +++ b/src/ops/entry.rs @@ -14,6 +14,7 @@ use std::ffi::{CStr, OsStr}; pub enum Forget {} pub enum Getattr {} pub enum Mkdir {} +pub enum Rmdir {} pub trait RequestForget<'o>: Operation<'o> { fn forget_list<'a>(request: &'a Request<'o, Self>) -> ForgetList<'a>; @@ -31,6 +32,7 @@ pub enum ForgetList<'a> { impl Sealed for Forget {} impl Sealed for Getattr {} impl Sealed for Mkdir {} +impl Sealed for Rmdir {} impl<'o> Operation<'o> for Forget { type RequestBody = proto::OpcodeSelect< @@ -52,6 +54,11 @@ impl<'o> Operation<'o> for Mkdir { type ReplyTail = (); } +impl<'o> Operation<'o> for Rmdir { + type RequestBody = &'o CStr; // name() + type ReplyTail = (); +} + impl<'o> RequestForget<'o> for Forget { fn forget_list<'a>(request: &'a Request<'o, Self>) -> ForgetList<'a> { use {proto::OpcodeSelect::*, ForgetList::*}; @@ -119,3 +126,11 @@ impl<'o> RequestMode<'o> for Mkdir { } impl<'o> ReplyKnown<'o> for Mkdir {} + +impl<'o> RequestName<'o> for Rmdir { + fn name<'a>(request: &'a Request<'o, Self>) -> &'a OsStr { + c_to_os(request.body) + } +} + +impl<'o> ReplyOk<'o> for Rmdir {} diff --git a/src/ops/mod.rs b/src/ops/mod.rs index ad019e3..68f5bce 100644 --- a/src/ops/mod.rs +++ b/src/ops/mod.rs @@ -12,7 +12,7 @@ use bytemuck::{bytes_of, Pod}; pub mod traits; pub use dir::{BufferedReaddir, Lookup, Readdir}; -pub use entry::{Forget, Getattr, Mkdir}; +pub use entry::{Forget, Getattr, Mkdir, Rmdir}; pub use global::{Init, Statfs}; pub use open::{Access, Open, Opendir, Release, Releasedir}; pub use rw::{Flush, Read, Readlink, Write}; diff --git a/src/session.rs b/src/session.rs index d1722a3..b32668a 100644 --- a/src/session.rs +++ b/src/session.rs @@ -60,6 +60,7 @@ pub enum Dispatch<'o> { Getattr(Incoming<'o, ops::Getattr>), Readlink(Incoming<'o, ops::Readlink>), Mkdir(Incoming<'o, ops::Mkdir>), + Rmdir(Incoming<'o, ops::Rmdir>), Open(Incoming<'o, ops::Open>), Read(Incoming<'o, ops::Read>), Write(Incoming<'o, ops::Write>), @@ -254,6 +255,7 @@ impl<'o> Dispatch<'o> { Getattr(incoming) => incoming.common, Readlink(incoming) => incoming.common, Mkdir(incoming) => incoming.common, + Rmdir(incoming) => incoming.common, Open(incoming) => incoming.common, Read(incoming) => incoming.common, Write(incoming) => incoming.common, @@ -335,6 +337,7 @@ impl Endpoint<'_> { Getattr => dispatch!(Getattr), Readlink => dispatch!(Readlink), Mkdir => dispatch!(Mkdir), + Rmdir => dispatch!(Rmdir), Open => dispatch!(Open), Read => dispatch!(Read), Write => dispatch!(Write), -- cgit v1.2.3