summaryrefslogtreecommitdiff
path: root/src/ops/entry.rs
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2022-01-06 03:42:56 -0600
committerAlejandro Soto <alejandro@34project.org>2022-01-06 03:42:56 -0600
commita65325e15844f880132a69b447e4aec983cb30ab (patch)
treef7485d114c139b9a1acf8d4248398b14756cb221 /src/ops/entry.rs
parent587cb05ec42417a05ed371d500b8734b10cf60f7 (diff)
Implement Symlink
Diffstat (limited to '')
-rw-r--r--src/ops/entry.rs27
1 files changed, 27 insertions, 0 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;