diff options
Diffstat (limited to '')
| -rw-r--r-- | src/ops/entry.rs | 27 | ||||
| -rw-r--r-- | src/ops/mod.rs | 2 | ||||
| -rw-r--r-- | src/ops/traits.rs | 9 | ||||
| -rw-r--r-- | src/session.rs | 3 |
4 files changed, 39 insertions, 2 deletions
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), |
