use std::ops::Deref;
use crate::msg_handler::{MessageHandler, ReceiveOptions};
use maybe_async::*;
use smb_msg::{FileId, FsctlCodes, IoctlReqData, IoctlRequest, IoctlRequestFlags, dfsc::*};
use super::Tree;
pub struct DfsRootTreeRef<'a> {
tree: &'a Tree,
}
impl<'a> DfsRootTreeRef<'a> {
pub(crate) fn new(tree: &'a Tree) -> Self {
Self { tree }
}
#[maybe_async]
pub async fn dfs_get_referrals(&self, path: &str) -> crate::Result<RespGetDfsReferral> {
let res = self
.handler
.send_recvo(
IoctlRequest {
ctl_code: FsctlCodes::DfsGetReferrals as u32,
file_id: FileId::FULL,
max_input_response: 1024,
max_output_response: 1024,
flags: IoctlRequestFlags::new().with_is_fsctl(true),
buffer: IoctlReqData::FsctlDfsGetReferrals(ReqGetDfsReferral {
max_referral_level: ReferralLevel::V4,
request_file_name: path.into(),
}),
}
.into(),
ReceiveOptions::new().with_allow_async(true),
)
.await?;
let res = res
.message
.content
.to_ioctl()?
.parse_fsctl::<RespGetDfsReferral>()?;
Ok(res)
}
}
impl<'a> Deref for DfsRootTreeRef<'a> {
type Target = Tree;
fn deref(&self) -> &Self::Target {
self.tree
}
}