From 0b3a4af1051f70ee5d3dd215a81a9eef07df3f7e Mon Sep 17 00:00:00 2001 From: Daniel Prilik Date: Mon, 1 Apr 2019 16:44:10 -0700 Subject: 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 Tested-by: kokoro Reviewed-by: Zach Reizner --- msg_socket/src/msg_on_socket.rs | 25 +++++++++++++++++++++++++ msg_socket/tests/struct.rs | 3 +++ 2 files changed, 28 insertions(+) (limited to 'msg_socket') 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::() + } + unsafe fn read_from_buffer(buffer: &[u8], _fds: &[RawFd]) -> MsgResult<(Self, usize)> { + if buffer.len() < std::mem::size_of::() { + 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 { + if buffer.len() < std::mem::size_of::() { + 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); } -- cgit 1.4.1