summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2022-01-05 07:58:36 -0600
committerAlejandro Soto <alejandro@34project.org>2022-01-05 07:58:36 -0600
commit587cb05ec42417a05ed371d500b8734b10cf60f7 (patch)
treed043876ba64f4573453a743a609f4e485142332f
parentfe2ec80b262e6457b896f23ec91e4fe9da4b8117 (diff)
Implement Link
Diffstat (limited to '')
-rw-r--r--examples/passthrough.rs1
-rw-r--r--src/ops/entry.rs27
-rw-r--r--src/ops/mod.rs2
-rw-r--r--src/ops/traits.rs9
-rw-r--r--src/session.rs3
5 files changed, 40 insertions, 2 deletions
diff --git a/examples/passthrough.rs b/examples/passthrough.rs
index 0e0f2c9..32f50ca 100644
--- a/examples/passthrough.rs
+++ b/examples/passthrough.rs
@@ -368,6 +368,7 @@ async fn main_loop(session: Start, mut fs: Passthrough) -> FuseResult<()> {
Mkdir(mkdir) => fs.mkdir(mkdir.op()?).await,
Unlink(unlink) => fs.unlink(unlink.op()?).await,
Rmdir(rmdir) => fs.rmdir(rmdir.op()?).await,
+ //TODO: Link
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 4f0b76f..74072ef 100644
--- a/src/ops/entry.rs
+++ b/src/ops/entry.rs
@@ -16,11 +16,16 @@ pub enum Getattr {}
pub enum Mkdir {}
pub enum Unlink {}
pub enum Rmdir {}
+pub enum Link {}
pub trait RequestForget<'o>: Operation<'o> {
fn forget_list<'a>(request: &'a Request<'o, Self>) -> ForgetList<'a>;
}
+pub trait RequestLink<'o>: Operation<'o> {
+ fn source_ino(request: &Request<'o, Self>) -> Ino;
+}
+
pub trait ReplyStat<'o>: Operation<'o> {
fn stat(reply: Reply<'o, Self>, inode: &impl Stat) -> Done<'o>;
}
@@ -35,6 +40,7 @@ impl Sealed for Getattr {}
impl Sealed for Mkdir {}
impl Sealed for Unlink {}
impl Sealed for Rmdir {}
+impl Sealed for Link {}
impl<'o> Operation<'o> for Forget {
type RequestBody = proto::OpcodeSelect<
@@ -66,6 +72,11 @@ impl<'o> Operation<'o> for Rmdir {
type ReplyState = ();
}
+impl<'o> Operation<'o> for Link {
+ type RequestBody = (&'o proto::LinkIn, &'o CStr);
+ type ReplyState = ();
+}
+
impl<'o> RequestForget<'o> for Forget {
fn forget_list<'a>(request: &'a Request<'o, Self>) -> ForgetList<'a> {
use {proto::OpcodeSelect::*, ForgetList::*};
@@ -149,3 +160,19 @@ impl<'o> RequestName<'o> for Rmdir {
}
impl<'o> ReplyOk<'o> for Rmdir {}
+
+impl<'o> RequestName<'o> for Link {
+ fn name<'a>(request: &'a Request<'o, Self>) -> &'a OsStr {
+ let (_header, name) = request.body;
+ c_to_os(name)
+ }
+}
+
+impl<'o> RequestLink<'o> for Link {
+ fn source_ino(request: &Request<'o, Self>) -> Ino {
+ let (header, _name) = request.body;
+ Ino(header.old_ino)
+ }
+}
+
+impl<'o> ReplyKnown<'o> for Link {}
diff --git a/src/ops/mod.rs b/src/ops/mod.rs
index 49ceaa9..2970ef8 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, Rmdir, Unlink};
+pub use entry::{Forget, Getattr, Link, Mkdir, Rmdir, Unlink};
pub use global::{Init, Statfs};
pub use open::{Access, Open, Opendir, Release, Releasedir};
pub use rw::{Flush, Read, Readlink, Write};
diff --git a/src/ops/traits.rs b/src/ops/traits.rs
index 9808358..6a4b1ce 100644
--- a/src/ops/traits.rs
+++ b/src/ops/traits.rs
@@ -5,7 +5,7 @@ use crate::{
pub use super::{
dir::{ReplyEntries, ReplyFound},
- entry::{ReplyStat, RequestForget},
+ entry::{ReplyStat, RequestForget, RequestLink},
global::ReplyFsInfo,
open::{ReplyOpen, ReplyPermissionDenied},
rw::ReplyAll,
@@ -145,6 +145,13 @@ impl<'o, O: Operation<'o>> Request<'o, O> {
{
O::forget_list(self)
}
+
+ pub fn source_ino(&self) -> Ino
+ where
+ O: RequestLink<'o>,
+ {
+ O::source_ino(self)
+ }
}
impl<'o, O: Operation<'o>> Reply<'o, O> {
diff --git a/src/session.rs b/src/session.rs
index 7001e71..5f6336f 100644
--- a/src/session.rs
+++ b/src/session.rs
@@ -62,6 +62,7 @@ pub enum Dispatch<'o> {
Mkdir(Incoming<'o, ops::Mkdir>),
Unlink(Incoming<'o, ops::Unlink>),
Rmdir(Incoming<'o, ops::Rmdir>),
+ Link(Incoming<'o, ops::Link>),
Open(Incoming<'o, ops::Open>),
Read(Incoming<'o, ops::Read>),
Write(Incoming<'o, ops::Write>),
@@ -258,6 +259,7 @@ impl<'o> Dispatch<'o> {
Mkdir(incoming) => incoming.common,
Unlink(incoming) => incoming.common,
Rmdir(incoming) => incoming.common,
+ Link(incoming) => incoming.common,
Open(incoming) => incoming.common,
Read(incoming) => incoming.common,
Write(incoming) => incoming.common,
@@ -341,6 +343,7 @@ impl Endpoint<'_> {
Mkdir => dispatch!(Mkdir),
Unlink => dispatch!(Unlink),
Rmdir => dispatch!(Rmdir),
+ Link => dispatch!(Link),
Open => dispatch!(Open),
Read => dispatch!(Read),
Write => dispatch!(Write),