summaryrefslogtreecommitdiff
path: root/src/ops
diff options
context:
space:
mode:
Diffstat (limited to 'src/ops')
-rw-r--r--src/ops/entry.rs27
-rw-r--r--src/ops/mod.rs2
-rw-r--r--src/ops/traits.rs9
3 files changed, 36 insertions, 2 deletions
diff --git a/src/ops/entry.rs b/src/ops/entry.rs
index 74072ef..435188a 100644
--- a/src/ops/entry.rs
+++ b/src/ops/entry.rs
@@ -16,12 +16,17 @@ pub enum Getattr {}
pub enum Mkdir {}
pub enum Unlink {}
pub enum Rmdir {}
+pub enum Symlink {}
pub enum Link {}
pub trait RequestForget<'o>: Operation<'o> {
fn forget_list<'a>(request: &'a Request<'o, Self>) -> ForgetList<'a>;
}
+pub trait RequestTarget<'o>: Operation<'o> {
+ fn target<'a>(request: &'a Request<'o, Self>) -> &'a OsStr;
+}
+
pub trait RequestLink<'o>: Operation<'o> {
fn source_ino(request: &Request<'o, Self>) -> Ino;
}
@@ -40,6 +45,7 @@ impl Sealed for Getattr {}
impl Sealed for Mkdir {}
impl Sealed for Unlink {}
impl Sealed for Rmdir {}
+impl Sealed for Symlink {}
impl Sealed for Link {}
impl<'o> Operation<'o> for Forget {
@@ -72,6 +78,11 @@ impl<'o> Operation<'o> for Rmdir {
type ReplyState = ();
}
+impl<'o> Operation<'o> for Symlink {
+ type RequestBody = (&'o CStr, &'o CStr); // name(), target()
+ type ReplyState = ();
+}
+
impl<'o> Operation<'o> for Link {
type RequestBody = (&'o proto::LinkIn, &'o CStr);
type ReplyState = ();
@@ -161,6 +172,22 @@ impl<'o> RequestName<'o> for Rmdir {
impl<'o> ReplyOk<'o> for Rmdir {}
+impl<'o> RequestName<'o> for Symlink {
+ fn name<'a>(request: &'a Request<'o, Self>) -> &'a OsStr {
+ let (name, _target) = request.body;
+ c_to_os(name)
+ }
+}
+
+impl<'o> RequestTarget<'o> for Symlink {
+ fn target<'a>(request: &'a Request<'o, Self>) -> &'a OsStr {
+ let (_name, target) = request.body;
+ c_to_os(target)
+ }
+}
+
+impl<'o> ReplyKnown<'o> for Symlink {}
+
impl<'o> RequestName<'o> for Link {
fn name<'a>(request: &'a Request<'o, Self>) -> &'a OsStr {
let (_header, name) = request.body;
diff --git a/src/ops/mod.rs b/src/ops/mod.rs
index 2970ef8..bc486b1 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, Link, Mkdir, Rmdir, Unlink};
+pub use entry::{Forget, Getattr, Link, Mkdir, Rmdir, Symlink, 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 6a4b1ce..52aaed3 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, RequestLink},
+ entry::{ReplyStat, RequestForget, RequestLink, RequestTarget},
global::ReplyFsInfo,
open::{ReplyOpen, ReplyPermissionDenied},
rw::ReplyAll,
@@ -146,6 +146,13 @@ impl<'o, O: Operation<'o>> Request<'o, O> {
O::forget_list(self)
}
+ pub fn target(&self) -> &OsStr
+ where
+ O: RequestTarget<'o>,
+ {
+ O::target(self)
+ }
+
pub fn source_ino(&self) -> Ino
where
O: RequestLink<'o>,