diff options
author | Zach Reizner <zachr@google.com> | 2019-03-07 18:45:09 -0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2019-03-08 21:21:11 -0800 |
commit | e5828e7ecdb1b92645161e0b0b66e7645da92447 (patch) | |
tree | 45794997b9a42de99f990dcb9a79592bc993f24e /msg_socket | |
parent | de86ae0d3355878b0be77186b5a7af97a577de6b (diff) | |
download | crosvm-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.rs | 34 |
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 { |