From c3c7a5b25a47e54df5d6b887d19f23c6fb20be8b Mon Sep 17 00:00:00 2001 From: Alejandro Soto Date: Tue, 4 Jan 2022 06:23:02 -0600 Subject: Split crate::fuse::ops into submodules --- src/fuse/ops/open.rs | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 src/fuse/ops/open.rs (limited to 'src/fuse/ops/open.rs') diff --git a/src/fuse/ops/open.rs b/src/fuse/ops/open.rs new file mode 100644 index 0000000..ff41d05 --- /dev/null +++ b/src/fuse/ops/open.rs @@ -0,0 +1,131 @@ +use crate::fuse::{ + io::{AccessFlags, OpenFlags}, + private_trait::Sealed, + Done, Operation, Reply, Request, +}; + +use crate::{proto, Errno}; +use super::FromRequest; + +pub enum Open {} +pub enum Release {} +pub enum Opendir {} +pub enum Releasedir {} +pub enum Access {} + +impl Sealed for Open {} +impl Sealed for Release {} +impl Sealed for Opendir {} +impl Sealed for Releasedir {} +impl Sealed for Access {} + +impl<'o> Operation<'o> for Open { + type RequestBody = &'o proto::OpenIn; + type ReplyTail = proto::OpenOutFlags; +} + +impl<'o> Operation<'o> for Release { + type RequestBody = &'o proto::ReleaseIn; + type ReplyTail = (); +} + +impl<'o> Operation<'o> for Opendir { + type RequestBody = &'o proto::OpendirIn; + type ReplyTail = (); +} + +impl<'o> Operation<'o> for Releasedir { + type RequestBody = &'o proto::ReleasedirIn; + type ReplyTail = (); +} + +impl<'o> Operation<'o> for Access { + type RequestBody = &'o proto::AccessIn; + type ReplyTail = (); +} + +impl<'o> Request<'o, Open> { + pub fn flags(&self) -> OpenFlags { + OpenFlags::from_bits_truncate(self.body.flags.try_into().unwrap_or_default()) + } +} + +impl<'o> Reply<'o, Open> { + pub fn force_direct_io(&mut self) { + self.tail |= proto::OpenOutFlags::DIRECT_IO; + } + + pub fn ok(self) -> Done<'o> { + self.ok_with_handle(0) + } + + pub fn ok_with_handle(self, handle: u64) -> Done<'o> { + let open_flags = self.tail.bits(); + + self.single(&proto::OpenOut { + fh: handle, + open_flags, + padding: Default::default(), + }) + } +} + +impl<'o> Request<'o, Release> { + pub fn handle(&self) -> u64 { + self.body.fh + } +} + +impl<'o> Reply<'o, Release> { + pub fn ok(self) -> Done<'o> { + self.empty() + } +} + +impl<'o> Reply<'o, Opendir> { + pub fn ok(self) -> Done<'o> { + self.ok_with_handle(0) + } + + pub fn ok_with_handle(self, handle: u64) -> Done<'o> { + self.single(&proto::OpenOut { + fh: handle, + open_flags: 0, + padding: Default::default(), + }) + } +} + +impl<'o> Request<'o, Releasedir> { + pub fn handle(&self) -> u64 { + self.body.release_in.fh + } +} + +impl<'o> Reply<'o, Releasedir> { + pub fn ok(self) -> Done<'o> { + self.empty() + } +} + +impl<'o> Request<'o, Access> { + pub fn mask(&self) -> AccessFlags { + AccessFlags::from_bits_truncate(self.body.mask as i32) + } +} + +impl<'o> Reply<'o, Access> { + pub fn ok(self) -> Done<'o> { + self.empty() + } + + pub fn permission_denied(self) -> Done<'o> { + self.fail(Errno::EACCES) + } +} + +impl<'o> FromRequest<'o, Open> for proto::OpenOutFlags { + fn from_request(_request: &Request<'o, Open>) -> Self { + proto::OpenOutFlags::empty() + } +} -- cgit v1.2.3