use std::io::{Read, Write};
use crate::protocol::nfs::portmap::PortmapKey;
use crate::protocol::rpc::Context;
use crate::xdr;
use crate::xdr::portmap::{mapping, IPPROTO_TCP, IPPROTO_UDP};
use crate::xdr::{deserialize, Serialize};
pub fn pmapproc_unsetport(
xid: u32,
read: &mut impl Read,
output: &mut impl Write,
context: &Context,
) -> Result<(), anyhow::Error> {
let mapping = deserialize::<mapping>(read)?;
let mut binding = context.portmap_table.write().unwrap();
let tcp_removed = binding
.table
.remove(&PortmapKey { prog: mapping.prog, vers: mapping.vers, prot: IPPROTO_TCP })
.is_some();
let udp_removed = binding
.table
.remove(&PortmapKey { prog: mapping.prog, vers: mapping.vers, prot: IPPROTO_UDP })
.is_some();
let result = tcp_removed || udp_removed;
xdr::rpc::make_success_reply(xid).serialize(output)?;
result.serialize(output)?;
Ok(())
}