diff options
author | Alyssa Ross <hi@alyssa.is> | 2020-02-19 20:01:30 +0000 |
---|---|---|
committer | Alyssa Ross <hi@alyssa.is> | 2020-06-15 09:36:08 +0000 |
commit | f3ae1358974c22e351c49744dc4103d90f764e1d (patch) | |
tree | 6cf82cdd6069d7e1686c48efeca472247c6725c6 | |
parent | 83c9638a44fb1d4b6952fad6ab77992d902576ea (diff) | |
download | crosvm-f3ae1358974c22e351c49744dc4103d90f764e1d.tar crosvm-f3ae1358974c22e351c49744dc4103d90f764e1d.tar.gz crosvm-f3ae1358974c22e351c49744dc4103d90f764e1d.tar.bz2 crosvm-f3ae1358974c22e351c49744dc4103d90f764e1d.tar.lz crosvm-f3ae1358974c22e351c49744dc4103d90f764e1d.tar.xz crosvm-f3ae1358974c22e351c49744dc4103d90f764e1d.tar.zst crosvm-f3ae1358974c22e351c49744dc4103d90f764e1d.zip |
msg_socket: impl MsgOnSocket for Wrapping
-rw-r--r-- | msg_socket/src/msg_on_socket.rs | 57 |
1 files changed, 56 insertions, 1 deletions
diff --git a/msg_socket/src/msg_on_socket.rs b/msg_socket/src/msg_on_socket.rs index 2101192..731276a 100644 --- a/msg_socket/src/msg_on_socket.rs +++ b/msg_socket/src/msg_on_socket.rs @@ -9,6 +9,7 @@ use std::fmt::{self, Display}; use std::fs::File; use std::mem::{size_of, transmute_copy, MaybeUninit}; use std::net::{TcpListener, TcpStream, UdpSocket}; +use std::num::Wrapping; use std::os::unix::io::{AsRawFd, FromRawFd, RawFd}; use std::os::unix::net::{UnixDatagram, UnixListener, UnixStream}; use std::result; @@ -17,7 +18,7 @@ use std::sync::Arc; use data_model::*; use slice::{slice_read_helper, slice_write_helper}; use sync::Mutex; -use sys_util::{Error as SysError, EventFd}; +use sys_util::{Error as SysError, EventFd, GuestAddress}; #[derive(Debug, PartialEq)] /// An error during transaction or serialization/deserialization. @@ -312,6 +313,60 @@ impl MsgOnSocket for usize { } } +// Encode Wrapping as the underlying numeric type +impl<T: MsgOnSocket> MsgOnSocket for Wrapping<T> { + fn uses_fd() -> bool { + T::uses_fd() + } + + fn fixed_size() -> Option<usize> { + T::fixed_size() + } + + fn msg_size(&self) -> usize { + self.0.msg_size() + } + + fn fd_count(&self) -> usize { + self.0.fd_count() + } + + unsafe fn read_from_buffer(buffer: &[u8], fds: &[RawFd]) -> MsgResult<(Self, usize)> { + T::read_from_buffer(buffer, fds).map(|(v, count)| (Self(v), count)) + } + + fn write_to_buffer(&self, buffer: &mut [u8], fds: &mut [RawFd]) -> MsgResult<usize> { + self.0.write_to_buffer(buffer, fds) + } +} + +// Encode GuestAddress as the underlying u64 +impl MsgOnSocket for GuestAddress { + fn uses_fd() -> bool { + u64::uses_fd() + } + + fn fixed_size() -> Option<usize> { + u64::fixed_size() + } + + fn msg_size(&self) -> usize { + self.0.msg_size() + } + + fn fd_count(&self) -> usize { + self.0.fd_count() + } + + unsafe fn read_from_buffer(buffer: &[u8], fds: &[RawFd]) -> MsgResult<(Self, usize)> { + u64::read_from_buffer(buffer, fds).map(|(v, count)| (Self(v), count)) + } + + fn write_to_buffer(&self, buffer: &mut [u8], fds: &mut [RawFd]) -> MsgResult<usize> { + self.0.write_to_buffer(buffer, fds) + } +} + // Encode bool as a u8 of value 0 or 1 impl MsgOnSocket for bool { fn msg_size(&self) -> usize { |