msg_socket: implement MsgOnSocket for Option<MsgOnSocket>

This is convenient for types that embed Option<...>.

BUG=chromium:831850
TEST=cargo test

Change-Id: I65aa3515f49e4424eff54f17ae18dac8e85b0afa
Reviewed-on: https://chromium-review.googlesource.com/1510812
Commit-Ready: David Tolnay <dtolnay@chromium.org>
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: David Tolnay <dtolnay@chromium.org>
Reviewed-by: Jingkui Wang <jkwang@google.com>
This commit is contained in:
Zach Reizner 2019-03-07 18:45:09 -08:00 committed by chrome-bot
parent de86ae0d33
commit e5828e7ecd

View file

@ -138,6 +138,40 @@ impl MsgOnSocket for RawFd {
}
}
impl<T: MsgOnSocket> MsgOnSocket for Option<T> {
fn msg_size() -> usize {
T::msg_size() + 1
}
fn max_fd_count() -> usize {
T::max_fd_count()
}
unsafe fn read_from_buffer(buffer: &[u8], fds: &[RawFd]) -> MsgResult<(Self, usize)> {
match buffer[0] {
0 => Ok((None, 0)),
1 => {
let (inner, len) = T::read_from_buffer(&buffer[1..], fds)?;
Ok((Some(inner), len))
}
_ => Err(MsgError::InvalidType),
}
}
fn write_to_buffer(&self, buffer: &mut [u8], fds: &mut [RawFd]) -> MsgResult<usize> {
match self {
None => {
buffer[0] = 0;
Ok(0)
}
Some(inner) => {
buffer[0] = 1;
inner.write_to_buffer(&mut buffer[1..], fds)
}
}
}
}
macro_rules! rawfd_impl {
($type:ident) => {
impl MsgOnSocket for $type {