summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2022-01-07 06:21:25 -0600
committerAlejandro Soto <alejandro@34project.org>2022-01-07 06:21:25 -0600
commit0a2e549bb30b93158af2e301ad46b134fd595e31 (patch)
tree6cbc5b840b6675eafa2fb24e7dfea75b309cce49 /src
parent0f45ef90df6d036aec2077b702fdf465f61c16d6 (diff)
Implement Mknod
Diffstat (limited to '')
-rw-r--r--src/ops/entry.rs43
-rw-r--r--src/ops/mod.rs2
-rw-r--r--src/ops/traits.rs9
-rw-r--r--src/session.rs3
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),