Skip to main content

rustsmb/io/
decode.rs

1//! `Decode` adapters over the existing `smb-server-proto-smb2` request parsers. Each is
2//! a thin, zero-copy bridge: the frame is borrowed and the parser's `None`
3//! (malformed) becomes `STATUS_INVALID_PARAMETER`.
4
5use smb_server_proto::types::Status;
6use smb_server_proto_smb2::commands::{
7    ChangeNotifyReq, CloseReq, CreateReq, FlushReq, IoctlReq, LockReq, QueryDirReq, QueryInfoReq,
8    ReadReq, SetInfoReq, WriteReq,
9};
10use smb_server_proto_smb2::session_setup::cmd;
11
12use super::wire::Decode;
13
14/// Generate a `Decode` impl that adapts an existing `Ty::parse(frame) -> Option<Ty>`.
15macro_rules! decode_via_parse {
16    ($ty:ty, $code:path) => {
17        impl Decode for $ty {
18            const COMMAND: u16 = $code;
19            fn decode(frame: &[u8]) -> Result<Self, Status> {
20                <$ty>::parse(frame).ok_or(Status::INVALID_PARAMETER)
21            }
22        }
23    };
24}
25
26decode_via_parse!(CreateReq, cmd::CREATE);
27decode_via_parse!(CloseReq, cmd::CLOSE);
28decode_via_parse!(FlushReq, cmd::FLUSH);
29decode_via_parse!(ReadReq, cmd::READ);
30decode_via_parse!(WriteReq, cmd::WRITE);
31decode_via_parse!(LockReq, cmd::LOCK);
32decode_via_parse!(IoctlReq, cmd::IOCTL);
33decode_via_parse!(QueryDirReq, cmd::QUERY_DIRECTORY);
34decode_via_parse!(ChangeNotifyReq, cmd::CHANGE_NOTIFY);
35decode_via_parse!(QueryInfoReq, cmd::QUERY_INFO);
36decode_via_parse!(SetInfoReq, cmd::SET_INFO);