summary refs log tree commit diff
path: root/msg_socket
diff options
context:
space:
mode:
authorDaniel Prilik <prilik@google.com>2019-04-01 16:44:10 -0700
committerchrome-bot <chrome-bot@chromium.org>2019-04-04 15:11:04 -0700
commit0b3a4af1051f70ee5d3dd215a81a9eef07df3f7e (patch)
tree6b6e00f2833f809c12cdad6bbc2818251623b5f0 /msg_socket
parente8243e326ad918d4e5ab1633abaa769e811e8670 (diff)
downloadcrosvm-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.rs25
-rw-r--r--msg_socket/tests/struct.rs3
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);
 }