|
|
|
@ -16,14 +16,14 @@ use tokio::net::{TcpSocket, UdpSocket, UnixDatagram}; |
|
|
|
|
|
|
|
const REQUEST_BUFFER_SIZE: usize = 64; |
|
|
|
|
|
|
|
#[derive(Hash, Copy, Clone, Eq, PartialEq, Debug, Serialize, Deserialize)] |
|
|
|
#[derive(bincode::Encode, bincode::Decode, Hash, Copy, Clone, Eq, PartialEq, Debug, Serialize, Deserialize)] |
|
|
|
struct Request { |
|
|
|
protocol: SocketProtocol, |
|
|
|
domain: SocketDomain, |
|
|
|
number: u32, |
|
|
|
} |
|
|
|
|
|
|
|
#[derive(Hash, Copy, Clone, Eq, PartialEq, Debug, Serialize, Deserialize)] |
|
|
|
#[derive(bincode::Encode, bincode::Decode, PartialEq, Debug, Hash, Copy, Clone, Eq, Serialize, Deserialize)] |
|
|
|
enum Response { |
|
|
|
Ok, |
|
|
|
} |
|
|
|
@ -135,14 +135,21 @@ where |
|
|
|
// Borrow socket as mut to prevent multiple simultaneous requests
|
|
|
|
let socket = socket.deref_mut(); |
|
|
|
|
|
|
|
// Send request
|
|
|
|
let request = bincode::serialize(&Request { |
|
|
|
protocol: T::domain(), |
|
|
|
domain, |
|
|
|
number, |
|
|
|
})?; |
|
|
|
let mut request = [0u8; 1000]; |
|
|
|
|
|
|
|
socket.send(&request[..]).await?; |
|
|
|
// Send request
|
|
|
|
let size = bincode::encode_into_slice( |
|
|
|
Request { |
|
|
|
protocol: T::domain(), |
|
|
|
domain, |
|
|
|
number, |
|
|
|
}, |
|
|
|
&mut request, |
|
|
|
bincode::config::standard(), |
|
|
|
) |
|
|
|
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?; |
|
|
|
|
|
|
|
socket.send(&request[..size]).await?; |
|
|
|
|
|
|
|
// Receive response
|
|
|
|
loop { |
|
|
|
@ -161,7 +168,9 @@ where |
|
|
|
|
|
|
|
// Parse response
|
|
|
|
let response = &msg.iovs().next().unwrap()[..msg.bytes]; |
|
|
|
let response: Response = bincode::deserialize(response)?; |
|
|
|
let response: Response = bincode::decode_from_slice(response, bincode::config::standard()) |
|
|
|
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))? |
|
|
|
.0; |
|
|
|
if !matches!(response, Response::Ok) { |
|
|
|
return Err("Request for new sockets failed".into()); |
|
|
|
} |
|
|
|
@ -194,10 +203,14 @@ pub async fn process_socket_requests(socket: &UnixDatagram) -> error::Result<()> |
|
|
|
|
|
|
|
let len = socket.recv(&mut buf[..]).await?; |
|
|
|
|
|
|
|
let request: Request = bincode::deserialize(&buf[..len])?; |
|
|
|
let request: Request = bincode::decode_from_slice(&buf[..len], bincode::config::standard()) |
|
|
|
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))? |
|
|
|
.0; |
|
|
|
|
|
|
|
let response = Response::Ok; |
|
|
|
let buf = bincode::serialize(&response)?; |
|
|
|
let mut buf = [0u8; 1000]; |
|
|
|
let size = bincode::encode_into_slice(response, &mut buf, bincode::config::standard()) |
|
|
|
.map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidInput, e))?; |
|
|
|
|
|
|
|
let mut owned_fd_buf: Vec<OwnedFd> = Vec::with_capacity(request.number as usize); |
|
|
|
for _ in 0..request.number { |
|
|
|
@ -223,7 +236,7 @@ pub async fn process_socket_requests(socket: &UnixDatagram) -> error::Result<()> |
|
|
|
|
|
|
|
let raw_fd_buf: Vec<RawFd> = owned_fd_buf.iter().map(|fd| fd.as_raw_fd()).collect(); |
|
|
|
let cmsg = ControlMessage::ScmRights(&raw_fd_buf[..]); |
|
|
|
let iov = [IoSlice::new(&buf[..])]; |
|
|
|
let iov = [IoSlice::new(&buf[..size])]; |
|
|
|
|
|
|
|
sendmsg::<()>(socket.as_raw_fd(), &iov, &[cmsg], MsgFlags::empty(), None)?; |
|
|
|
} |
|
|
|
|