diff options
Diffstat (limited to '')
| -rw-r--r-- | src/ops/entry.rs | 43 | ||||
| -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, 53 insertions, 4 deletions
diff --git a/src/ops/entry.rs b/src/ops/entry.rs index bcbe6b8..1af5483 100644 --- a/src/ops/entry.rs +++ b/src/ops/entry.rs @@ -6,12 +6,17 @@ use super::{ use crate::{io::Mode, private_trait::Sealed, proto, Ino, Operation, Request}; use std::ffi::{CStr, OsStr}; +pub enum Mknod {} pub enum Mkdir {} pub enum Unlink {} pub enum Rmdir {} pub enum Symlink {} pub enum Link {} +pub trait RequestDevice<'o>: Operation<'o> { + fn device(request: &Request<'o, Self>) -> u32; +} + pub trait RequestTarget<'o>: Operation<'o> { fn target<'a>(request: &'a Request<'o, Self>) -> &'a OsStr; } @@ -20,24 +25,30 @@ pub trait RequestLink<'o>: Operation<'o> { fn source_ino(request: &Request<'o, Self>) -> Ino; } +impl Sealed for Mknod {} 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 Mknod { + type RequestBody = (&'o proto::MknodIn, &'o CStr); + type ReplyState = (); +} + impl<'o> Operation<'o> for Mkdir { type RequestBody = (&'o proto::MkdirIn, &'o CStr); type ReplyState = (); } impl<'o> Operation<'o> for Unlink { - type RequestBody = &'o CStr; // name() + type RequestBody = &'o CStr; type ReplyState = (); } impl<'o> Operation<'o> for Rmdir { - type RequestBody = &'o CStr; // name() + type RequestBody = &'o CStr; type ReplyState = (); } @@ -51,6 +62,34 @@ impl<'o> Operation<'o> for Link { type ReplyState = (); } +impl<'o> RequestName<'o> for Mknod { + fn name<'a>(request: &'a Request<'o, Self>) -> &'a OsStr { + let (_header, name) = request.body; + c_to_os(name) + } +} + +impl<'o> RequestMode<'o> for Mknod { + fn mode(request: &Request<'o, Self>) -> Mode { + let (header, _name) = request.body; + Mode::from_bits_truncate(header.mode) + } + + fn umask(request: &Request<'o, Self>) -> Mode { + let (header, _name) = request.body; + Mode::from_bits_truncate(header.umask) + } +} + +impl<'o> RequestDevice<'o> for Mknod { + fn device(request: &Request<'o, Self>) -> u32 { + let (header, _name) = request.body; + header.device + } +} + +impl<'o> ReplyKnown<'o> for Mknod {} + impl<'o> RequestName<'o> for Mkdir { 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 d16a761..0569b65 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::{Link, Mkdir, Rmdir, Symlink, Unlink}; +pub use entry::{Link, Mkdir, Mknod, Rmdir, Symlink, Unlink}; pub use global::{Init, Statfs}; pub use inode::{Bmap, Forget, Getattr}; pub use open::{Access, Create, Open, Opendir, Release, Releasedir}; diff --git a/src/ops/traits.rs b/src/ops/traits.rs index e8b8008..d710264 100644 --- a/src/ops/traits.rs +++ b/src/ops/traits.rs @@ -5,7 +5,7 @@ use crate::{ pub use super::{ dir::{ReplyEntries, ReplyFound}, - entry::{RequestLink, RequestTarget}, + entry::{RequestDevice, RequestLink, RequestTarget}, global::ReplyFsInfo, inode::{ReplyBlock, ReplyStat, RequestBlock, RequestForget}, open::{ReplyOpen, ReplyPermissionDenied}, @@ -155,6 +155,13 @@ impl<'o, O: Operation<'o>> Request<'o, O> { O::forget_list(self) } + pub fn device(&self) -> u32 + where + O: RequestDevice<'o>, + { + O::device(self) + } + pub fn target(&self) -> &OsStr where O: RequestTarget<'o>, diff --git a/src/session.rs b/src/session.rs index 80101cc..6f7fd6c 100644 --- a/src/session.rs +++ b/src/session.rs @@ -60,6 +60,7 @@ pub enum Dispatch<'o> { Getattr(Incoming<'o, ops::Getattr>), Readlink(Incoming<'o, ops::Readlink>), Symlink(Incoming<'o, ops::Symlink>), + Mknod(Incoming<'o, ops::Mknod>), Mkdir(Incoming<'o, ops::Mkdir>), Unlink(Incoming<'o, ops::Unlink>), Rmdir(Incoming<'o, ops::Rmdir>), @@ -262,6 +263,7 @@ impl<'o> Dispatch<'o> { Getattr(incoming) => incoming.common, Readlink(incoming) => incoming.common, Symlink(incoming) => incoming.common, + Mknod(incoming) => incoming.common, Mkdir(incoming) => incoming.common, Unlink(incoming) => incoming.common, Rmdir(incoming) => incoming.common, @@ -351,6 +353,7 @@ impl Endpoint<'_> { Getattr => dispatch!(Getattr), Readlink => dispatch!(Readlink), Symlink => dispatch!(Symlink), + Mknod => dispatch!(Mknod), Mkdir => dispatch!(Mkdir), Unlink => dispatch!(Unlink), Rmdir => dispatch!(Rmdir), |
