summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2020-06-07 04:34:52 +0000
committerAlyssa Ross <hi@alyssa.is>2020-06-15 09:37:39 +0000
commit29604d52aee4f2dcad46e617ec21a00e24bb64f7 (patch)
tree7b76207f063a276db1db83f3182b843f398d68a5
parent72d9d469fa35d3ed9214544e95cd7cb6301195df (diff)
downloadcrosvm-29604d52aee4f2dcad46e617ec21a00e24bb64f7.tar
crosvm-29604d52aee4f2dcad46e617ec21a00e24bb64f7.tar.gz
crosvm-29604d52aee4f2dcad46e617ec21a00e24bb64f7.tar.bz2
crosvm-29604d52aee4f2dcad46e617ec21a00e24bb64f7.tar.lz
crosvm-29604d52aee4f2dcad46e617ec21a00e24bb64f7.tar.xz
crosvm-29604d52aee4f2dcad46e617ec21a00e24bb64f7.tar.zst
crosvm-29604d52aee4f2dcad46e617ec21a00e24bb64f7.zip
msg_socket: implement MsgOnSocket for Result
-rw-r--r--msg_socket/src/msg_on_socket.rs51
1 files changed, 51 insertions, 0 deletions
diff --git a/msg_socket/src/msg_on_socket.rs b/msg_socket/src/msg_on_socket.rs
index 4149098..3dc59c0 100644
--- a/msg_socket/src/msg_on_socket.rs
+++ b/msg_socket/src/msg_on_socket.rs
@@ -196,6 +196,57 @@ impl<T: MsgOnSocket> MsgOnSocket for Option<T> {
     }
 }
 
+impl<O: MsgOnSocket, E: MsgOnSocket> MsgOnSocket for Result<O, E> {
+    fn uses_fd() -> bool {
+        O::uses_fd() || E::uses_fd()
+    }
+
+    fn msg_size(&self) -> usize {
+        1 + match self {
+            Ok(v) => v.msg_size(),
+            Err(e) => e.msg_size(),
+        }
+    }
+
+    fn fd_count(&self) -> usize {
+        match self {
+            Ok(v) => v.fd_count(),
+            Err(e) => e.fd_count(),
+        }
+    }
+
+    unsafe fn read_from_buffer(buffer: &[u8], fds: &[RawFd]) -> MsgResult<(Self, usize)> {
+        match buffer.get(0).ok_or(MsgError::WrongMsgBufferSize)? {
+            0 => {
+                let (value, size) = O::read_from_buffer(&buffer[1..], &fds)?;
+                Ok((Ok(value), size))
+            }
+            1 => {
+                let (value, size) = E::read_from_buffer(&buffer[1..], &fds)?;
+                Ok((Err(value), size))
+            }
+            _ => Err(MsgError::InvalidType),
+        }
+    }
+
+    fn write_to_buffer(&self, buffer: &mut [u8], mut fds: &mut [RawFd]) -> MsgResult<usize> {
+        if buffer.is_empty() {
+            return Err(MsgError::WrongMsgBufferSize);
+        }
+
+        match self {
+            Ok(value) => {
+                buffer[0] = 0;
+                Ok(value.write_to_buffer(&mut buffer[1..], &mut fds)?)
+            }
+            Err(error) => {
+                buffer[0] = 1;
+                Ok(error.write_to_buffer(&mut buffer[1..], &mut fds)?)
+            }
+        }
+    }
+}
+
 impl<T: MsgOnSocket> MsgOnSocket for Mutex<T> {
     fn uses_fd() -> bool {
         T::uses_fd()