diff options
author | Daniel Prilik <prilik@google.com> | 2019-04-01 16:44:10 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2019-04-04 15:11:04 -0700 |
commit | 0b3a4af1051f70ee5d3dd215a81a9eef07df3f7e (patch) | |
tree | 6b6e00f2833f809c12cdad6bbc2818251623b5f0 /msg_socket | |
parent | e8243e326ad918d4e5ab1633abaa769e811e8670 (diff) | |
download | crosvm-0b3a4af1051f70ee5d3dd215a81a9eef07df3f7e.tar crosvm-0b3a4af1051f70ee5d3dd215a81a9eef07df3f7e.tar.gz crosvm-0b3a4af1051f70ee5d3dd215a81a9eef07df3f7e.tar.bz2 crosvm-0b3a4af1051f70ee5d3dd215a81a9eef07df3f7e.tar.lz crosvm-0b3a4af1051f70ee5d3dd215a81a9eef07df3f7e.tar.xz crosvm-0b3a4af1051f70ee5d3dd215a81a9eef07df3f7e.tar.zst crosvm-0b3a4af1051f70ee5d3dd215a81a9eef07df3f7e.zip |
msg_socket: derive MsgOnSocket for bool
BUG=chromium:936567 TEST=cargo test -p msg_socket Change-Id: I5f9228ceaa7a3fcfbe154bf173a76e0ee26b8c50 Reviewed-on: https://chromium-review.googlesource.com/1548694 Commit-Ready: Daniel Prilik <prilik@google.com> Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Zach Reizner <zachr@chromium.org>
Diffstat (limited to 'msg_socket')
-rw-r--r-- | msg_socket/src/msg_on_socket.rs | 25 | ||||
-rw-r--r-- | msg_socket/tests/struct.rs | 3 |
2 files changed, 28 insertions, 0 deletions
diff --git a/msg_socket/src/msg_on_socket.rs b/msg_socket/src/msg_on_socket.rs index cf3aad0..cf5e528 100644 --- a/msg_socket/src/msg_on_socket.rs +++ b/msg_socket/src/msg_on_socket.rs @@ -257,6 +257,31 @@ impl MsgOnSocket for usize { } } +// Encode bool as a u8 of value 0 or 1 +impl MsgOnSocket for bool { + fn msg_size() -> usize { + std::mem::size_of::<u8>() + } + unsafe fn read_from_buffer(buffer: &[u8], _fds: &[RawFd]) -> MsgResult<(Self, usize)> { + if buffer.len() < std::mem::size_of::<u8>() { + return Err(MsgError::WrongMsgBufferSize); + } + let t: u8 = buffer[0]; + match t { + 0 => Ok((false, 0)), + 1 => Ok((true, 0)), + _ => Err(MsgError::InvalidType), + } + } + fn write_to_buffer(&self, buffer: &mut [u8], _fds: &mut [RawFd]) -> MsgResult<usize> { + if buffer.len() < std::mem::size_of::<u8>() { + return Err(MsgError::WrongMsgBufferSize); + } + buffer[0] = *self as u8; + Ok(0) + } +} + macro_rules! le_impl { ($type:ident, $le_type:ident) => { impl MsgOnSocket for $type { diff --git a/msg_socket/tests/struct.rs b/msg_socket/tests/struct.rs index 07cde3e..a2d5c9c 100644 --- a/msg_socket/tests/struct.rs +++ b/msg_socket/tests/struct.rs @@ -11,6 +11,7 @@ struct Request { field0: u8, field1: EventFd, field2: u32, + field3: bool, } #[derive(MsgOnSocket)] @@ -25,11 +26,13 @@ fn sock_send_recv_struct() { field0: 2, field1: e0, field2: 0xf0f0, + field3: true, }) .unwrap(); let r = res.recv().unwrap(); assert_eq!(r.field0, 2); assert_eq!(r.field2, 0xf0f0); + assert_eq!(r.field3, true); r.field1.write(0x0f0f).unwrap(); assert_eq!(e1.read().unwrap(), 0x0f0f); } |