summary refs log tree commit diff
path: root/msg_socket
diff options
context:
space:
mode:
authorZach Reizner <zachr@google.com>2019-03-07 18:45:09 -0800
committerchrome-bot <chrome-bot@chromium.org>2019-03-08 21:21:11 -0800
commite5828e7ecdb1b92645161e0b0b66e7645da92447 (patch)
tree45794997b9a42de99f990dcb9a79592bc993f24e /msg_socket
parentde86ae0d3355878b0be77186b5a7af97a577de6b (diff)
downloadcrosvm-e5828e7ecdb1b92645161e0b0b66e7645da92447.tar
crosvm-e5828e7ecdb1b92645161e0b0b66e7645da92447.tar.gz
crosvm-e5828e7ecdb1b92645161e0b0b66e7645da92447.tar.bz2
crosvm-e5828e7ecdb1b92645161e0b0b66e7645da92447.tar.lz
crosvm-e5828e7ecdb1b92645161e0b0b66e7645da92447.tar.xz
crosvm-e5828e7ecdb1b92645161e0b0b66e7645da92447.tar.zst
crosvm-e5828e7ecdb1b92645161e0b0b66e7645da92447.zip
msg_socket: implement MsgOnSocket for Option<MsgOnSocket>
This is convenient for types that embed Option<...>.

BUG=chromium:831850
TEST=cargo test

Change-Id: I65aa3515f49e4424eff54f17ae18dac8e85b0afa
Reviewed-on: https://chromium-review.googlesource.com/1510812
Commit-Ready: David Tolnay <dtolnay@chromium.org>
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: David Tolnay <dtolnay@chromium.org>
Reviewed-by: Jingkui Wang <jkwang@google.com>
Diffstat (limited to 'msg_socket')
-rw-r--r--msg_socket/src/msg_on_socket.rs34
1 files changed, 34 insertions, 0 deletions
diff --git a/msg_socket/src/msg_on_socket.rs b/msg_socket/src/msg_on_socket.rs
index 8b01850..cf3aad0 100644
--- a/msg_socket/src/msg_on_socket.rs
+++ b/msg_socket/src/msg_on_socket.rs
@@ -138,6 +138,40 @@ impl MsgOnSocket for RawFd {
     }
 }
 
+impl<T: MsgOnSocket> MsgOnSocket for Option<T> {
+    fn msg_size() -> usize {
+        T::msg_size() + 1
+    }
+
+    fn max_fd_count() -> usize {
+        T::max_fd_count()
+    }
+
+    unsafe fn read_from_buffer(buffer: &[u8], fds: &[RawFd]) -> MsgResult<(Self, usize)> {
+        match buffer[0] {
+            0 => Ok((None, 0)),
+            1 => {
+                let (inner, len) = T::read_from_buffer(&buffer[1..], fds)?;
+                Ok((Some(inner), len))
+            }
+            _ => Err(MsgError::InvalidType),
+        }
+    }
+
+    fn write_to_buffer(&self, buffer: &mut [u8], fds: &mut [RawFd]) -> MsgResult<usize> {
+        match self {
+            None => {
+                buffer[0] = 0;
+                Ok(0)
+            }
+            Some(inner) => {
+                buffer[0] = 1;
+                inner.write_to_buffer(&mut buffer[1..], fds)
+            }
+        }
+    }
+}
+
 macro_rules! rawfd_impl {
     ($type:ident) => {
         impl MsgOnSocket for $type {