summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2020-02-19 20:01:30 +0000
committerAlyssa Ross <hi@alyssa.is>2020-06-15 09:36:08 +0000
commitf3ae1358974c22e351c49744dc4103d90f764e1d (patch)
tree6cf82cdd6069d7e1686c48efeca472247c6725c6
parent83c9638a44fb1d4b6952fad6ab77992d902576ea (diff)
downloadcrosvm-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.rs57
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 {