diff options
author | Alyssa Ross <hi@alyssa.is> | 2020-06-07 04:34:52 +0000 |
---|---|---|
committer | Alyssa Ross <hi@alyssa.is> | 2020-06-15 09:37:39 +0000 |
commit | 29604d52aee4f2dcad46e617ec21a00e24bb64f7 (patch) | |
tree | 7b76207f063a276db1db83f3182b843f398d68a5 | |
parent | 72d9d469fa35d3ed9214544e95cd7cb6301195df (diff) | |
download | crosvm-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.rs | 51 |
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() |