From e5828e7ecdb1b92645161e0b0b66e7645da92447 Mon Sep 17 00:00:00 2001 From: Zach Reizner Date: Thu, 7 Mar 2019 18:45:09 -0800 Subject: msg_socket: implement MsgOnSocket for Option 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 Tested-by: kokoro Reviewed-by: David Tolnay Reviewed-by: Jingkui Wang --- msg_socket/src/msg_on_socket.rs | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'msg_socket/src/msg_on_socket.rs') 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 MsgOnSocket for Option { + 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 { + 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 { -- cgit 1.4.1