summary refs log tree commit diff
diff options
context:
space:
mode:
-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);
 }