diff options
Diffstat (limited to 'msg_socket2/src/socket.rs')
-rw-r--r-- | msg_socket2/src/socket.rs | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/msg_socket2/src/socket.rs b/msg_socket2/src/socket.rs index b836365..bd1bc00 100644 --- a/msg_socket2/src/socket.rs +++ b/msg_socket2/src/socket.rs @@ -1,11 +1,16 @@ +// SPDX-License-Identifier: MIT OR Apache-2.0 +// Copyright 2020, Alyssa Ross + use bincode::{DefaultOptions, Deserializer, Serializer}; use std::io::IoSlice; use std::marker::PhantomData; use std::os::unix::prelude::*; use sys_util::{net::UnixSeqpacket, ScmSocket}; -use crate::{DeserializeWithFds, DeserializerWithFds, Error, FdSerializerImpl, SerializeWithFds}; +use crate::{de, DeserializeWithFds, Error, Fd, FdSerializerImpl, SerializeWithFds}; +/// A Unix **SOCK_SEQPACKET** socket that can send and receive values +/// consisting of binary data and file descriptors. #[derive(Debug)] pub struct Socket<Send, Recv> { sock: UnixSeqpacket, @@ -39,11 +44,16 @@ impl<Send: SerializeWithFds, Recv> Socket<Send, Recv> { impl<Send, Recv: for<'de> DeserializeWithFds<'de>> Socket<Send, Recv> { pub fn recv(&self) -> Result<Recv, Error> { - let (bytes, fds) = self.sock.recv_as_vec_with_fds()?; - let mut fds_iter = fds.into_iter(); + let (bytes, raw_fds) = self.sock.recv_as_vec_with_fds()?; + + // Safe because we just received ownership of the fds. + let mut fds = raw_fds.into_iter().map(|fd| unsafe { Fd::new(fd) }); let mut deserializer = Deserializer::from_slice(&bytes, DefaultOptions::new()); - let deserializer_with_fds = DeserializerWithFds::new(&mut fds_iter, &mut deserializer); + let deserializer_with_fds = de::WithFds { + inner: &mut deserializer, + fds: &mut fds, + }; Ok(Recv::deserialize(deserializer_with_fds)?) } |