summary refs log tree commit diff
path: root/msg_socket2/src/socket.rs
diff options
context:
space:
mode:
Diffstat (limited to 'msg_socket2/src/socket.rs')
-rw-r--r--msg_socket2/src/socket.rs16
1 files changed, 9 insertions, 7 deletions
diff --git a/msg_socket2/src/socket.rs b/msg_socket2/src/socket.rs
index bd1bc00..33b10ba 100644
--- a/msg_socket2/src/socket.rs
+++ b/msg_socket2/src/socket.rs
@@ -9,7 +9,7 @@ use sys_util::{net::UnixSeqpacket, ScmSocket};
 
 use crate::{de, DeserializeWithFds, Error, Fd, FdSerializerImpl, SerializeWithFds};
 
-/// A Unix **SOCK_SEQPACKET** socket that can send and receive values
+/// 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> {
@@ -29,14 +29,16 @@ impl<Send, Recv> Socket<Send, Recv> {
 impl<Send: SerializeWithFds, Recv> Socket<Send, Recv> {
     pub fn send(&self, value: Send) -> Result<(), Error> {
         let mut bytes: Vec<u8> = vec![];
-        let mut fds: Vec<RawFd> = vec![];
 
-        value.serialize(&mut Serializer::new(&mut bytes, DefaultOptions::new()))?;
-        value
-            .serialize_fds(&mut FdSerializerImpl { fds: &mut fds })
-            .unwrap();
+        let mut serializer = Serializer::new(&mut bytes, DefaultOptions::new());
+        let mut fd_serializer = FdSerializerImpl { fds: vec![] };
 
-        self.sock.send_with_fds(&[IoSlice::new(&bytes)], &fds)?;
+        value.serialize(&mut serializer)?;
+        value.serialize_fds(&mut fd_serializer).unwrap();
+
+        let fd_borrows: Vec<_> = fd_serializer.fds.iter().map(|x| x.as_raw_fd()).collect();
+        self.sock
+            .send_with_fds(&[IoSlice::new(&bytes)], &fd_borrows)?;
 
         Ok(())
     }