use std::io::{Read, Write};
use crate::protocol::nfs::portmap::PortmapKey;
use crate::protocol::rpc::Context;
use crate::xdr;
use crate::xdr::portmap::mapping;
use crate::xdr::{deserialize, Serialize};
pub fn pmapproc_setport(
xid: u32,
read: &mut impl Read,
output: &mut impl Write,
context: &mut Context,
) -> Result<(), anyhow::Error> {
let mapping = deserialize::<mapping>(read)?;
let entry = PortmapKey { prog: mapping.prog, vers: mapping.vers, prot: mapping.prot };
let mut binding = context.portmap_table.write().unwrap();
let port = binding.table.get(&entry).copied();
let result = match port {
None => {
binding.table.insert(entry, mapping.port as u16);
true
}
Some(_) => false,
};
xdr::rpc::make_success_reply(xid).serialize(output)?;
result.serialize(output)?;
Ok(())
}