summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2022-01-05 07:08:53 -0600
committerAlejandro Soto <alejandro@34project.org>2022-01-05 07:11:51 -0600
commit92121f5db1ccec523c1b7eb0a817f757b5ef899a (patch)
treebae9af4e32711f08cac4338159de6b6f64299774
parentc1bd6716bd53cb4270eeb032f150ac2c7c1a8f96 (diff)
Implement Rmdir
-rw-r--r--examples/passthrough.rs10
-rw-r--r--src/ops/entry.rs15
-rw-r--r--src/ops/mod.rs2
-rw-r--r--src/session.rs3
4 files changed, 29 insertions, 1 deletions
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),