diff options
Diffstat (limited to 'src/fuse/ops.rs')
| -rw-r--r-- | src/fuse/ops.rs | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/src/fuse/ops.rs b/src/fuse/ops.rs index 21458c2..e27e900 100644 --- a/src/fuse/ops.rs +++ b/src/fuse/ops.rs @@ -226,7 +226,7 @@ op! { op! { Write { type RequestBody = (&'o proto::WriteIn, &'o [u8]); - type ReplyTail = (); + type ReplyTail = state::Write; } impl Request { @@ -242,6 +242,16 @@ op! { self.body.1 } } + + impl Reply { + pub fn all(self) -> Done<'o> { + let size = self.tail.size; + self.single(&proto::WriteOut { + size, + padding: Default::default(), + }) + } + } } op! { @@ -511,6 +521,10 @@ pub(crate) mod state { pub is_plus: bool, pub buffer: B, } + + pub struct Write { + pub size: u32, + } } impl<'o, O: Operation<'o>> FromRequest<'o, O> for () { @@ -525,6 +539,22 @@ impl<'o> FromRequest<'o, Open> for proto::OpenOutFlags { } } +impl<'o> FromRequest<'o, Write> for state::Write { + fn from_request(request: &Request<'o, Write>) -> Self { + let (body, data) = request.body; + + if body.size as usize != data.len() { + log::warn!( + "Write size={} differs from data.len={}", + body.size, + data.len() + ); + } + + state::Write { size: body.size } + } +} + impl<'o> FromRequest<'o, Readdir> for state::Readdir<()> { fn from_request(request: &Request<'o, Readdir>) -> Self { state::Readdir { |
