diff options
author | Alyssa Ross <hi@alyssa.is> | 2020-03-21 13:50:24 +0000 |
---|---|---|
committer | Alyssa Ross <hi@alyssa.is> | 2020-06-15 09:37:08 +0000 |
commit | 81f96554ebf490c83a8993065de9b1636b26f916 (patch) | |
tree | 43f9efe6eb507b449918b510b7d7a72056e053ab /msg_socket2 | |
parent | 4d2e22e374e8ac93be227f0357efd2c0d7a9f699 (diff) | |
download | crosvm-81f96554ebf490c83a8993065de9b1636b26f916.tar crosvm-81f96554ebf490c83a8993065de9b1636b26f916.tar.gz crosvm-81f96554ebf490c83a8993065de9b1636b26f916.tar.bz2 crosvm-81f96554ebf490c83a8993065de9b1636b26f916.tar.lz crosvm-81f96554ebf490c83a8993065de9b1636b26f916.tar.xz crosvm-81f96554ebf490c83a8993065de9b1636b26f916.tar.zst crosvm-81f96554ebf490c83a8993065de9b1636b26f916.zip |
SerializerWithFds trait
Diffstat (limited to 'msg_socket2')
-rw-r--r-- | msg_socket2/src/lib.rs | 2 | ||||
-rw-r--r-- | msg_socket2/src/ser.rs | 34 | ||||
-rw-r--r-- | msg_socket2/src/socket.rs | 6 | ||||
-rw-r--r-- | msg_socket2/tests/round_trip.rs | 17 |
4 files changed, 41 insertions, 18 deletions
diff --git a/msg_socket2/src/lib.rs b/msg_socket2/src/lib.rs index 748a9f7..a1d8ceb 100644 --- a/msg_socket2/src/lib.rs +++ b/msg_socket2/src/lib.rs @@ -28,6 +28,8 @@ mod error; mod ser; mod socket; +pub(crate) use ser::SerializerWithFdsImpl; + pub use de::{DeserializeWithFds, DeserializerWithFds}; pub use error::Error; pub use ser::{SerializeWithFds, SerializerWithFds}; diff --git a/msg_socket2/src/ser.rs b/msg_socket2/src/ser.rs index 0a60ea8..7bffa22 100644 --- a/msg_socket2/src/ser.rs +++ b/msg_socket2/src/ser.rs @@ -1,20 +1,40 @@ use serde::Serializer; use std::os::unix::prelude::*; +pub trait SerializerWithFds { + type Ser: Serializer; + + fn serializer(self) -> Self::Ser; + fn fds(&mut self) -> &mut Vec<RawFd>; +} + pub trait SerializeWithFds { - fn serialize<Ser>(&self, serializer: SerializerWithFds<Ser>) -> Result<Ser::Ok, Ser::Error> - where - Ser: Serializer; + fn serialize<Ser: SerializerWithFds>( + &self, + serializer: Ser, + ) -> Result<<Ser::Ser as Serializer>::Ok, <Ser::Ser as Serializer>::Error>; } #[derive(Debug)] -pub struct SerializerWithFds<'fds, Ser> { - pub serializer: Ser, - pub fds: &'fds mut Vec<RawFd>, +pub struct SerializerWithFdsImpl<'fds, Ser> { + serializer: Ser, + fds: &'fds mut Vec<RawFd>, } -impl<'fds, Ser> SerializerWithFds<'fds, Ser> { +impl<'fds, Ser> SerializerWithFdsImpl<'fds, Ser> { pub fn new(fds: &'fds mut Vec<RawFd>, serializer: Ser) -> Self { Self { serializer, fds } } } + +impl<'fds, Ser: Serializer> SerializerWithFds for SerializerWithFdsImpl<'fds, Ser> { + type Ser = Ser; + + fn serializer(self) -> Self::Ser { + self.serializer + } + + fn fds(&mut self) -> &mut Vec<RawFd> { + &mut self.fds + } +} diff --git a/msg_socket2/src/socket.rs b/msg_socket2/src/socket.rs index dc0733d..4e75e82 100644 --- a/msg_socket2/src/socket.rs +++ b/msg_socket2/src/socket.rs @@ -4,7 +4,9 @@ use std::marker::PhantomData; use std::os::unix::prelude::*; use sys_util::{net::UnixSeqpacket, ScmSocket}; -use crate::{DeserializeWithFds, DeserializerWithFds, Error, SerializeWithFds, SerializerWithFds}; +use crate::{ + DeserializeWithFds, DeserializerWithFds, Error, SerializeWithFds, SerializerWithFdsImpl, +}; #[derive(Debug)] pub struct Socket<Send, Recv> { @@ -27,7 +29,7 @@ impl<Send: SerializeWithFds, Recv> Socket<Send, Recv> { let mut fds: Vec<RawFd> = vec![]; let mut serializer = Serializer::new(&mut bytes, DefaultOptions::new()); - let serializer_with_fds = SerializerWithFds::new(&mut fds, &mut serializer); + let serializer_with_fds = SerializerWithFdsImpl::new(&mut fds, &mut serializer); value.serialize(serializer_with_fds)?; self.sock.send_with_fds(&[IoSlice::new(&bytes)], &fds)?; diff --git a/msg_socket2/tests/round_trip.rs b/msg_socket2/tests/round_trip.rs index 1c6b5a3..efec94b 100644 --- a/msg_socket2/tests/round_trip.rs +++ b/msg_socket2/tests/round_trip.rs @@ -18,13 +18,12 @@ struct Test { } impl SerializeWithFds for Test { - fn serialize<Ser>(&self, serializer: SerializerWithFds<Ser>) -> Result<Ser::Ok, Ser::Error> - where - Ser: Serializer, - { - let mut state = serializer.serializer.serialize_struct("Test", 1)?; - serializer.fds.push(self.fd); - state.skip_field("fd")?; + fn serialize<Ser: SerializerWithFds>( + &self, + mut serializer: Ser, + ) -> Result<<Ser::Ser as Serializer>::Ok, <Ser::Ser as Serializer>::Error> { + serializer.fds().push(self.fd); + serializer.fds().push(self.inner.0); struct SerializableInner<'a>(&'a Inner); @@ -36,9 +35,9 @@ impl SerializeWithFds for Test { } } - serializer.fds.push(self.inner.0); + let mut state = serializer.serializer().serialize_struct("Test", 1)?; + state.skip_field("fd")?; state.serialize_field("inner", &SerializableInner(&self.inner))?; - state.end() } } |